Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Stephen Boyd and committed by
Stephen Boyd
4d89c3d5 d06e46c2

+41 -30
+41 -30
drivers/clk/clk-si5351.c
··· 54 54 enum si5351_variant variant; 55 55 struct i2c_client *client; 56 56 struct regmap *regmap; 57 - struct clk_onecell_data onecell; 58 57 59 58 struct clk *pxtal; 60 59 const char *pxtal_name; ··· 65 66 struct si5351_hw_data pll[2]; 66 67 struct si5351_hw_data *msynth; 67 68 struct si5351_hw_data *clkout; 69 + size_t num_clkout; 68 70 }; 69 71 70 72 static const char * const si5351_input_names[] = { ··· 1307 1307 of_node_put(child); 1308 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 1324 #else 1311 1325 static int si5351_dt_parse(struct i2c_client *client, enum si5351_variant variant) 1312 1326 { 1313 1327 return 0; 1328 + } 1329 + 1330 + static struct clk_hw * 1331 + si53351_of_clk_get(struct of_phandle_args *clkspec, void *data) 1332 + { 1333 + return NULL; 1314 1334 } 1315 1335 #endif /* CONFIG_OF */ 1316 1336 ··· 1341 1321 struct si5351_platform_data *pdata; 1342 1322 struct si5351_driver_data *drvdata; 1343 1323 struct clk_init_data init; 1344 - struct clk *clk; 1345 1324 const char *parent_names[4]; 1346 1325 u8 num_parents, num_clocks; 1347 1326 int ret, n; ··· 1457 1438 init.num_parents = 1; 1458 1439 } 1459 1440 drvdata->xtal.init = &init; 1460 - clk = devm_clk_register(&client->dev, &drvdata->xtal); 1461 - if (IS_ERR(clk)) { 1441 + ret = devm_clk_hw_register(&client->dev, &drvdata->xtal); 1442 + if (ret) { 1462 1443 dev_err(&client->dev, "unable to register %s\n", init.name); 1463 - ret = PTR_ERR(clk); 1464 1444 goto err_clk; 1465 1445 } 1466 1446 ··· 1474 1456 init.num_parents = 1; 1475 1457 } 1476 1458 drvdata->clkin.init = &init; 1477 - clk = devm_clk_register(&client->dev, &drvdata->clkin); 1478 - if (IS_ERR(clk)) { 1459 + ret = devm_clk_hw_register(&client->dev, &drvdata->clkin); 1460 + if (ret) { 1479 1461 dev_err(&client->dev, "unable to register %s\n", 1480 1462 init.name); 1481 - ret = PTR_ERR(clk); 1482 1463 goto err_clk; 1483 1464 } 1484 1465 } ··· 1497 1480 init.flags = 0; 1498 1481 init.parent_names = parent_names; 1499 1482 init.num_parents = num_parents; 1500 - clk = devm_clk_register(&client->dev, &drvdata->pll[0].hw); 1501 - if (IS_ERR(clk)) { 1483 + ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw); 1484 + if (ret) { 1502 1485 dev_err(&client->dev, "unable to register %s\n", init.name); 1503 - ret = PTR_ERR(clk); 1504 1486 goto err_clk; 1505 1487 } 1506 1488 ··· 1521 1505 init.parent_names = parent_names; 1522 1506 init.num_parents = num_parents; 1523 1507 } 1524 - clk = devm_clk_register(&client->dev, &drvdata->pll[1].hw); 1525 - if (IS_ERR(clk)) { 1508 + ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw); 1509 + if (ret) { 1526 1510 dev_err(&client->dev, "unable to register %s\n", init.name); 1527 - ret = PTR_ERR(clk); 1528 1511 goto err_clk; 1529 1512 } 1530 1513 ··· 1539 1524 sizeof(*drvdata->msynth), GFP_KERNEL); 1540 1525 drvdata->clkout = devm_kzalloc(&client->dev, num_clocks * 1541 1526 sizeof(*drvdata->clkout), GFP_KERNEL); 1527 + drvdata->num_clkout = num_clocks; 1542 1528 1543 - drvdata->onecell.clk_num = num_clocks; 1544 - drvdata->onecell.clks = devm_kzalloc(&client->dev, 1545 - num_clocks * sizeof(*drvdata->onecell.clks), GFP_KERNEL); 1546 - 1547 - if (WARN_ON(!drvdata->msynth || !drvdata->clkout || 1548 - !drvdata->onecell.clks)) { 1529 + if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) { 1549 1530 ret = -ENOMEM; 1550 1531 goto err_clk; 1551 1532 } ··· 1558 1547 init.flags |= CLK_SET_RATE_PARENT; 1559 1548 init.parent_names = parent_names; 1560 1549 init.num_parents = 2; 1561 - clk = devm_clk_register(&client->dev, &drvdata->msynth[n].hw); 1562 - if (IS_ERR(clk)) { 1550 + ret = devm_clk_hw_register(&client->dev, 1551 + &drvdata->msynth[n].hw); 1552 + if (ret) { 1563 1553 dev_err(&client->dev, "unable to register %s\n", 1564 1554 init.name); 1565 - ret = PTR_ERR(clk); 1566 1555 goto err_clk; 1567 1556 } 1568 1557 } ··· 1586 1575 init.flags |= CLK_SET_RATE_PARENT; 1587 1576 init.parent_names = parent_names; 1588 1577 init.num_parents = num_parents; 1589 - clk = devm_clk_register(&client->dev, &drvdata->clkout[n].hw); 1590 - if (IS_ERR(clk)) { 1578 + ret = devm_clk_hw_register(&client->dev, 1579 + &drvdata->clkout[n].hw); 1580 + if (ret) { 1591 1581 dev_err(&client->dev, "unable to register %s\n", 1592 1582 init.name); 1593 - ret = PTR_ERR(clk); 1594 1583 goto err_clk; 1595 1584 } 1596 - drvdata->onecell.clks[n] = clk; 1597 1585 1598 1586 /* set initial clkout rate */ 1599 1587 if (pdata->clkout[n].rate != 0) { 1600 1588 int ret; 1601 - ret = clk_set_rate(clk, pdata->clkout[n].rate); 1589 + ret = clk_set_rate(drvdata->clkout[n].hw.clk, 1590 + pdata->clkout[n].rate); 1602 1591 if (ret != 0) { 1603 1592 dev_err(&client->dev, "Cannot set rate : %d\n", 1604 1593 ret); ··· 1606 1595 } 1607 1596 } 1608 1597 1609 - ret = of_clk_add_provider(client->dev.of_node, of_clk_src_onecell_get, 1610 - &drvdata->onecell); 1598 + ret = of_clk_add_hw_provider(client->dev.of_node, si53351_of_clk_get, 1599 + drvdata); 1611 1600 if (ret) { 1612 1601 dev_err(&client->dev, "unable to add clk provider\n"); 1613 1602 goto err_clk;