diff options
author | Stephen Boyd <stephen.boyd@linaro.org> | 2016-06-01 19:15:27 -0400 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2016-08-24 20:30:00 -0400 |
commit | 4d89c3d54e0b2d0edea0ab5cf62fd464a0473bad (patch) | |
tree | fec215576c58884f87e1e249e020ce3f87799b99 /drivers/clk/clk-si5351.c | |
parent | d06e46c25a8945fe3e6f5385221a3551f0866f79 (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.c | 71 |
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 | ||
71 | static const char * const si5351_input_names[] = { | 71 | static 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 | |||
1311 | static struct clk_hw * | ||
1312 | si53351_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 |
1311 | static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant) | 1325 | static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant) |
1312 | { | 1326 | { |
1313 | return 0; | 1327 | return 0; |
1314 | } | 1328 | } |
1329 | |||
1330 | static struct clk_hw * | ||
1331 | si53351_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 | ||
1317 | static int si5351_i2c_probe(struct i2c_client *client, | 1337 | static 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; |