summaryrefslogtreecommitdiffstats
path: root/drivers/clk/clk-si5351.c
diff options
context:
space:
mode:
authorStephen Boyd <stephen.boyd@linaro.org>2016-06-01 19:15:27 -0400
committerStephen Boyd <sboyd@codeaurora.org>2016-08-24 20:30:00 -0400
commit4d89c3d54e0b2d0edea0ab5cf62fd464a0473bad (patch)
treefec215576c58884f87e1e249e020ce3f87799b99 /drivers/clk/clk-si5351.c
parentd06e46c25a8945fe3e6f5385221a3551f0866f79 (diff)
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>
Diffstat (limited to 'drivers/clk/clk-si5351.c')
-rw-r--r--drivers/clk/clk-si5351.c71
1 files changed, 41 insertions, 30 deletions
diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
index b1bc12c045d3..b051db43fae1 100644
--- a/drivers/clk/clk-si5351.c
+++ b/drivers/clk/clk-si5351.c
@@ -54,7 +54,6 @@ struct si5351_driver_data {
54 enum si5351_variant variant; 54 enum si5351_variant variant;
55 struct i2c_client *client; 55 struct i2c_client *client;
56 struct regmap *regmap; 56 struct regmap *regmap;
57 struct clk_onecell_data onecell;
58 57
59 struct clk *pxtal; 58 struct clk *pxtal;
60 const char *pxtal_name; 59 const char *pxtal_name;
@@ -66,6 +65,7 @@ struct si5351_driver_data {
66 struct si5351_hw_data pll[2]; 65 struct si5351_hw_data pll[2];
67 struct si5351_hw_data *msynth; 66 struct si5351_hw_data *msynth;
68 struct si5351_hw_data *clkout; 67 struct si5351_hw_data *clkout;
68 size_t num_clkout;
69}; 69};
70 70
71static const char * const si5351_input_names[] = { 71static const char * const si5351_input_names[] = {
@@ -1307,11 +1307,31 @@ put_child:
1307 of_node_put(child); 1307 of_node_put(child);
1308 return -EINVAL; 1308 return -EINVAL;
1309} 1309}
1310
1311static struct clk_hw *
1312si53351_of_clk_get(struct of_phandle_args *clkspec, void *data)
1313{
1314 struct si5351_driver_data *drvdata = data;
1315 unsigned int idx = clkspec->args[0];
1316
1317 if (idx >= drvdata->num_clkout) {
1318 pr_err("%s: invalid index %u\n", __func__, idx);
1319 return ERR_PTR(-EINVAL);
1320 }
1321
1322 return &drvdata->clkout[idx].hw;
1323}
1310#else 1324#else
1311static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant) 1325static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant)
1312{ 1326{
1313 return 0; 1327 return 0;
1314} 1328}
1329
1330static struct clk_hw *
1331si53351_of_clk_get(struct of_phandle_args *clkspec, void *data)
1332{
1333 return NULL;
1334}
1315#endif /* CONFIG_OF */ 1335#endif /* CONFIG_OF */
1316 1336
1317static int si5351_i2c_probe(struct i2c_client *client, 1337static int si5351_i2c_probe(struct i2c_client *client,
@@ -1321,7 +1341,6 @@ static int si5351_i2c_probe(struct i2c_client *client,
1321 struct si5351_platform_data *pdata; 1341 struct si5351_platform_data *pdata;
1322 struct si5351_driver_data *drvdata; 1342 struct si5351_driver_data *drvdata;
1323 struct clk_init_data init; 1343 struct clk_init_data init;
1324 struct clk *clk;
1325 const char *parent_names[4]; 1344 const char *parent_names[4];
1326 u8 num_parents, num_clocks; 1345 u8 num_parents, num_clocks;
1327 int ret, n; 1346 int ret, n;
@@ -1438,10 +1457,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
1438 init.num_parents = 1; 1457 init.num_parents = 1;
1439 } 1458 }
1440 drvdata->xtal.init = &init; 1459 drvdata->xtal.init = &init;
1441 clk = devm_clk_register(&client->dev, &drvdata->xtal); 1460 ret = devm_clk_hw_register(&client->dev, &drvdata->xtal);
1442 if (IS_ERR(clk)) { 1461 if (ret) {
1443 dev_err(&client->dev, "unable to register %s\n", init.name); 1462 dev_err(&client->dev, "unable to register %s\n", init.name);
1444 ret = PTR_ERR(clk);
1445 goto err_clk; 1463 goto err_clk;
1446 } 1464 }
1447 1465
@@ -1456,11 +1474,10 @@ static int si5351_i2c_probe(struct i2c_client *client,
1456 init.num_parents = 1; 1474 init.num_parents = 1;
1457 } 1475 }
1458 drvdata->clkin.init = &init; 1476 drvdata->clkin.init = &init;
1459 clk = devm_clk_register(&client->dev, &drvdata->clkin); 1477 ret = devm_clk_hw_register(&client->dev, &drvdata->clkin);
1460 if (IS_ERR(clk)) { 1478 if (ret) {
1461 dev_err(&client->dev, "unable to register %s\n", 1479 dev_err(&client->dev, "unable to register %s\n",
1462 init.name); 1480 init.name);
1463 ret = PTR_ERR(clk);
1464 goto err_clk; 1481 goto err_clk;
1465 } 1482 }
1466 } 1483 }
@@ -1480,10 +1497,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
1480 init.flags = 0; 1497 init.flags = 0;
1481 init.parent_names = parent_names; 1498 init.parent_names = parent_names;
1482 init.num_parents = num_parents; 1499 init.num_parents = num_parents;
1483 clk = devm_clk_register(&client->dev, &drvdata->pll[0].hw); 1500 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw);
1484 if (IS_ERR(clk)) { 1501 if (ret) {
1485 dev_err(&client->dev, "unable to register %s\n", init.name); 1502 dev_err(&client->dev, "unable to register %s\n", init.name);
1486 ret = PTR_ERR(clk);
1487 goto err_clk; 1503 goto err_clk;
1488 } 1504 }
1489 1505
@@ -1505,10 +1521,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
1505 init.parent_names = parent_names; 1521 init.parent_names = parent_names;
1506 init.num_parents = num_parents; 1522 init.num_parents = num_parents;
1507 } 1523 }
1508 clk = devm_clk_register(&client->dev, &drvdata->pll[1].hw); 1524 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw);
1509 if (IS_ERR(clk)) { 1525 if (ret) {
1510 dev_err(&client->dev, "unable to register %s\n", init.name); 1526 dev_err(&client->dev, "unable to register %s\n", init.name);
1511 ret = PTR_ERR(clk);
1512 goto err_clk; 1527 goto err_clk;
1513 } 1528 }
1514 1529
@@ -1524,13 +1539,9 @@ static int si5351_i2c_probe(struct i2c_client *client,
1524 sizeof(*drvdata->msynth), GFP_KERNEL); 1539 sizeof(*drvdata->msynth), GFP_KERNEL);
1525 drvdata->clkout = devm_kzalloc(&client->dev, num_clocks * 1540 drvdata->clkout = devm_kzalloc(&client->dev, num_clocks *
1526 sizeof(*drvdata->clkout), GFP_KERNEL); 1541 sizeof(*drvdata->clkout), GFP_KERNEL);
1542 drvdata->num_clkout = num_clocks;
1527 1543
1528 drvdata->onecell.clk_num = num_clocks; 1544 if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) {
1529 drvdata->onecell.clks = devm_kzalloc(&client->dev,
1530 num_clocks * sizeof(*drvdata->onecell.clks), GFP_KERNEL);
1531
1532 if (WARN_ON(!drvdata->msynth || !drvdata->clkout ||
1533 !drvdata->onecell.clks)) {
1534 ret = -ENOMEM; 1545 ret = -ENOMEM;
1535 goto err_clk; 1546 goto err_clk;
1536 } 1547 }
@@ -1547,11 +1558,11 @@ static int si5351_i2c_probe(struct i2c_client *client,
1547 init.flags |= CLK_SET_RATE_PARENT; 1558 init.flags |= CLK_SET_RATE_PARENT;
1548 init.parent_names = parent_names; 1559 init.parent_names = parent_names;
1549 init.num_parents = 2; 1560 init.num_parents = 2;
1550 clk = devm_clk_register(&client->dev, &drvdata->msynth[n].hw); 1561 ret = devm_clk_hw_register(&client->dev,
1551 if (IS_ERR(clk)) { 1562 &drvdata->msynth[n].hw);
1563 if (ret) {
1552 dev_err(&client->dev, "unable to register %s\n", 1564 dev_err(&client->dev, "unable to register %s\n",
1553 init.name); 1565 init.name);
1554 ret = PTR_ERR(clk);
1555 goto err_clk; 1566 goto err_clk;
1556 } 1567 }
1557 } 1568 }
@@ -1575,19 +1586,19 @@ static int si5351_i2c_probe(struct i2c_client *client,
1575 init.flags |= CLK_SET_RATE_PARENT; 1586 init.flags |= CLK_SET_RATE_PARENT;
1576 init.parent_names = parent_names; 1587 init.parent_names = parent_names;
1577 init.num_parents = num_parents; 1588 init.num_parents = num_parents;
1578 clk = devm_clk_register(&client->dev, &drvdata->clkout[n].hw); 1589 ret = devm_clk_hw_register(&client->dev,
1579 if (IS_ERR(clk)) { 1590 &drvdata->clkout[n].hw);
1591 if (ret) {
1580 dev_err(&client->dev, "unable to register %s\n", 1592 dev_err(&client->dev, "unable to register %s\n",
1581 init.name); 1593 init.name);
1582 ret = PTR_ERR(clk);
1583 goto err_clk; 1594 goto err_clk;
1584 } 1595 }
1585 drvdata->onecell.clks[n] = clk;
1586 1596
1587 /* set initial clkout rate */ 1597 /* set initial clkout rate */
1588 if (pdata->clkout[n].rate != 0) { 1598 if (pdata->clkout[n].rate != 0) {
1589 int ret; 1599 int ret;
1590 ret = clk_set_rate(clk, pdata->clkout[n].rate); 1600 ret = clk_set_rate(drvdata->clkout[n].hw.clk,
1601 pdata->clkout[n].rate);
1591 if (ret != 0) { 1602 if (ret != 0) {
1592 dev_err(&client->dev, "Cannot set rate : %d\n", 1603 dev_err(&client->dev, "Cannot set rate : %d\n",
1593 ret); 1604 ret);
@@ -1595,8 +1606,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1595 } 1606 }
1596 } 1607 }
1597 1608
1598 ret = of_clk_add_provider(client->dev.of_node, of_clk_src_onecell_get, 1609 ret = of_clk_add_hw_provider(client->dev.of_node, si53351_of_clk_get,
1599 &drvdata->onecell); 1610 drvdata);
1600 if (ret) { 1611 if (ret) {
1601 dev_err(&client->dev, "unable to add clk provider\n"); 1612 dev_err(&client->dev, "unable to add clk provider\n");
1602 goto err_clk; 1613 goto err_clk;