mirror of https://gitee.com/openkylin/linux.git
clk: si5351: Migrate to clk_hw based OF and registration APIs
Now that we have clk_hw based provider APIs to register clks, we can get rid of struct clk pointers while registering clks in these drivers, allowing us to move closer to a clear split of consumer and provider clk APIs. Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Cc: Guenter Roeck <linux@roeck-us.net> Cc: Sören Brinkmann <soren.brinkmann@xilinx.com> Cc: Mike Looijmans <mike.looijmans@topic.nl> Signed-off-by: Stephen Boyd <stephen.boyd@linaro.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
This commit is contained in:
parent
d06e46c25a
commit
4d89c3d54e
|
@ -54,7 +54,6 @@ struct si5351_driver_data {
|
||||||
enum si5351_variant variant;
|
enum si5351_variant variant;
|
||||||
struct i2c_client *client;
|
struct i2c_client *client;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
struct clk_onecell_data onecell;
|
|
||||||
|
|
||||||
struct clk *pxtal;
|
struct clk *pxtal;
|
||||||
const char *pxtal_name;
|
const char *pxtal_name;
|
||||||
|
@ -66,6 +65,7 @@ struct si5351_driver_data {
|
||||||
struct si5351_hw_data pll[2];
|
struct si5351_hw_data pll[2];
|
||||||
struct si5351_hw_data *msynth;
|
struct si5351_hw_data *msynth;
|
||||||
struct si5351_hw_data *clkout;
|
struct si5351_hw_data *clkout;
|
||||||
|
size_t num_clkout;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const si5351_input_names[] = {
|
static const char * const si5351_input_names[] = {
|
||||||
|
@ -1307,11 +1307,31 @@ static int si5351_dt_parse(struct i2c_client *client,
|
||||||
of_node_put(child);
|
of_node_put(child);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_hw *
|
||||||
|
si53351_of_clk_get(struct of_phandle_args *clkspec, void *data)
|
||||||
|
{
|
||||||
|
struct si5351_driver_data *drvdata = data;
|
||||||
|
unsigned int idx = clkspec->args[0];
|
||||||
|
|
||||||
|
if (idx >= drvdata->num_clkout) {
|
||||||
|
pr_err("%s: invalid index %u\n", __func__, idx);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return &drvdata->clkout[idx].hw;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant)
|
static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct clk_hw *
|
||||||
|
si53351_of_clk_get(struct of_phandle_args *clkspec, void *data)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
#endif /* CONFIG_OF */
|
#endif /* CONFIG_OF */
|
||||||
|
|
||||||
static int si5351_i2c_probe(struct i2c_client *client,
|
static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
|
@ -1321,7 +1341,6 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
struct si5351_platform_data *pdata;
|
struct si5351_platform_data *pdata;
|
||||||
struct si5351_driver_data *drvdata;
|
struct si5351_driver_data *drvdata;
|
||||||
struct clk_init_data init;
|
struct clk_init_data init;
|
||||||
struct clk *clk;
|
|
||||||
const char *parent_names[4];
|
const char *parent_names[4];
|
||||||
u8 num_parents, num_clocks;
|
u8 num_parents, num_clocks;
|
||||||
int ret, n;
|
int ret, n;
|
||||||
|
@ -1438,10 +1457,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.num_parents = 1;
|
init.num_parents = 1;
|
||||||
}
|
}
|
||||||
drvdata->xtal.init = &init;
|
drvdata->xtal.init = &init;
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->xtal);
|
ret = devm_clk_hw_register(&client->dev, &drvdata->xtal);
|
||||||
if (IS_ERR(clk)) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n", init.name);
|
dev_err(&client->dev, "unable to register %s\n", init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1456,11 +1474,10 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.num_parents = 1;
|
init.num_parents = 1;
|
||||||
}
|
}
|
||||||
drvdata->clkin.init = &init;
|
drvdata->clkin.init = &init;
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->clkin);
|
ret = devm_clk_hw_register(&client->dev, &drvdata->clkin);
|
||||||
if (IS_ERR(clk)) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n",
|
dev_err(&client->dev, "unable to register %s\n",
|
||||||
init.name);
|
init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1480,10 +1497,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.flags = 0;
|
init.flags = 0;
|
||||||
init.parent_names = parent_names;
|
init.parent_names = parent_names;
|
||||||
init.num_parents = num_parents;
|
init.num_parents = num_parents;
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->pll[0].hw);
|
ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw);
|
||||||
if (IS_ERR(clk)) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n", init.name);
|
dev_err(&client->dev, "unable to register %s\n", init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1505,10 +1521,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.parent_names = parent_names;
|
init.parent_names = parent_names;
|
||||||
init.num_parents = num_parents;
|
init.num_parents = num_parents;
|
||||||
}
|
}
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->pll[1].hw);
|
ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw);
|
||||||
if (IS_ERR(clk)) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n", init.name);
|
dev_err(&client->dev, "unable to register %s\n", init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1524,13 +1539,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
sizeof(*drvdata->msynth), GFP_KERNEL);
|
sizeof(*drvdata->msynth), GFP_KERNEL);
|
||||||
drvdata->clkout = devm_kzalloc(&client->dev, num_clocks *
|
drvdata->clkout = devm_kzalloc(&client->dev, num_clocks *
|
||||||
sizeof(*drvdata->clkout), GFP_KERNEL);
|
sizeof(*drvdata->clkout), GFP_KERNEL);
|
||||||
|
drvdata->num_clkout = num_clocks;
|
||||||
|
|
||||||
drvdata->onecell.clk_num = num_clocks;
|
if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) {
|
||||||
drvdata->onecell.clks = devm_kzalloc(&client->dev,
|
|
||||||
num_clocks * sizeof(*drvdata->onecell.clks), GFP_KERNEL);
|
|
||||||
|
|
||||||
if (WARN_ON(!drvdata->msynth || !drvdata->clkout ||
|
|
||||||
!drvdata->onecell.clks)) {
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
|
@ -1547,11 +1558,11 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.flags |= CLK_SET_RATE_PARENT;
|
init.flags |= CLK_SET_RATE_PARENT;
|
||||||
init.parent_names = parent_names;
|
init.parent_names = parent_names;
|
||||||
init.num_parents = 2;
|
init.num_parents = 2;
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->msynth[n].hw);
|
ret = devm_clk_hw_register(&client->dev,
|
||||||
if (IS_ERR(clk)) {
|
&drvdata->msynth[n].hw);
|
||||||
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n",
|
dev_err(&client->dev, "unable to register %s\n",
|
||||||
init.name);
|
init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1575,19 +1586,19 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
init.flags |= CLK_SET_RATE_PARENT;
|
init.flags |= CLK_SET_RATE_PARENT;
|
||||||
init.parent_names = parent_names;
|
init.parent_names = parent_names;
|
||||||
init.num_parents = num_parents;
|
init.num_parents = num_parents;
|
||||||
clk = devm_clk_register(&client->dev, &drvdata->clkout[n].hw);
|
ret = devm_clk_hw_register(&client->dev,
|
||||||
if (IS_ERR(clk)) {
|
&drvdata->clkout[n].hw);
|
||||||
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to register %s\n",
|
dev_err(&client->dev, "unable to register %s\n",
|
||||||
init.name);
|
init.name);
|
||||||
ret = PTR_ERR(clk);
|
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
}
|
}
|
||||||
drvdata->onecell.clks[n] = clk;
|
|
||||||
|
|
||||||
/* set initial clkout rate */
|
/* set initial clkout rate */
|
||||||
if (pdata->clkout[n].rate != 0) {
|
if (pdata->clkout[n].rate != 0) {
|
||||||
int ret;
|
int ret;
|
||||||
ret = clk_set_rate(clk, pdata->clkout[n].rate);
|
ret = clk_set_rate(drvdata->clkout[n].hw.clk,
|
||||||
|
pdata->clkout[n].rate);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
dev_err(&client->dev, "Cannot set rate : %d\n",
|
dev_err(&client->dev, "Cannot set rate : %d\n",
|
||||||
ret);
|
ret);
|
||||||
|
@ -1595,8 +1606,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = of_clk_add_provider(client->dev.of_node, of_clk_src_onecell_get,
|
ret = of_clk_add_hw_provider(client->dev.of_node, si53351_of_clk_get,
|
||||||
&drvdata->onecell);
|
drvdata);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&client->dev, "unable to add clk provider\n");
|
dev_err(&client->dev, "unable to add clk provider\n");
|
||||||
goto err_clk;
|
goto err_clk;
|
||||||
|
|
Loading…
Reference in New Issue