Commit 4d89c3d5 authored by Stephen Boyd's avatar Stephen Boyd Committed by Stephen Boyd

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: default avatarStephen Boyd <stephen.boyd@linaro.org>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent d06e46c2
...@@ -54,7 +54,6 @@ struct si5351_driver_data { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment