aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergej Sawazki <ce3a@gmx.de>2017-07-25 14:32:11 -0400
committerStephen Boyd <sboyd@codeaurora.org>2017-12-21 21:12:27 -0500
commit1fffaf6aed88671b458c66891f66c914d5bd148d (patch)
tree9eacd158698ad9b731870f1a5443a77185584b7a
parentcdba9a4fb0b53703959ac861e415816cb61aded4 (diff)
clk: si5351: Do not enable parent clocks on probe
The si5351 driver should not prepare or enable other clocks in the tree on probe. Let the clients decide when to prepare or enable the clocks. Cc: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Cc: Rabeeh Khoury <rabeeh@solid-run.com> Signed-off-by: Sergej Sawazki <ce3a@gmx.de> [sboyd@codeaurora.org: Remove most of the .remove function too] Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/clk-si5351.c35
1 files changed, 9 insertions, 26 deletions
diff --git a/drivers/clk/clk-si5351.c b/drivers/clk/clk-si5351.c
index 841d9fe9bfea..10f99400ca61 100644
--- a/drivers/clk/clk-si5351.c
+++ b/drivers/clk/clk-si5351.c
@@ -1469,11 +1469,6 @@ static int si5351_i2c_probe(struct i2c_client *client,
1469 } 1469 }
1470 } 1470 }
1471 1471
1472 if (!IS_ERR(drvdata->pxtal))
1473 clk_prepare_enable(drvdata->pxtal);
1474 if (!IS_ERR(drvdata->pclkin))
1475 clk_prepare_enable(drvdata->pclkin);
1476
1477 /* register xtal input clock gate */ 1472 /* register xtal input clock gate */
1478 memset(&init, 0, sizeof(init)); 1473 memset(&init, 0, sizeof(init));
1479 init.name = si5351_input_names[0]; 1474 init.name = si5351_input_names[0];
@@ -1488,7 +1483,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1488 ret = devm_clk_hw_register(&client->dev, &drvdata->xtal); 1483 ret = devm_clk_hw_register(&client->dev, &drvdata->xtal);
1489 if (ret) { 1484 if (ret) {
1490 dev_err(&client->dev, "unable to register %s\n", init.name); 1485 dev_err(&client->dev, "unable to register %s\n", init.name);
1491 goto err_clk; 1486 return ret;
1492 } 1487 }
1493 1488
1494 /* register clkin input clock gate */ 1489 /* register clkin input clock gate */
@@ -1506,7 +1501,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1506 if (ret) { 1501 if (ret) {
1507 dev_err(&client->dev, "unable to register %s\n", 1502 dev_err(&client->dev, "unable to register %s\n",
1508 init.name); 1503 init.name);
1509 goto err_clk; 1504 return ret;
1510 } 1505 }
1511 } 1506 }
1512 1507
@@ -1528,7 +1523,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1528 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw); 1523 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[0].hw);
1529 if (ret) { 1524 if (ret) {
1530 dev_err(&client->dev, "unable to register %s\n", init.name); 1525 dev_err(&client->dev, "unable to register %s\n", init.name);
1531 goto err_clk; 1526 return ret;
1532 } 1527 }
1533 1528
1534 /* register PLLB or VXCO (Si5351B) */ 1529 /* register PLLB or VXCO (Si5351B) */
@@ -1552,7 +1547,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1552 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw); 1547 ret = devm_clk_hw_register(&client->dev, &drvdata->pll[1].hw);
1553 if (ret) { 1548 if (ret) {
1554 dev_err(&client->dev, "unable to register %s\n", init.name); 1549 dev_err(&client->dev, "unable to register %s\n", init.name);
1555 goto err_clk; 1550 return ret;
1556 } 1551 }
1557 1552
1558 /* register clk multisync and clk out divider */ 1553 /* register clk multisync and clk out divider */
@@ -1571,7 +1566,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1571 1566
1572 if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) { 1567 if (WARN_ON(!drvdata->msynth || !drvdata->clkout)) {
1573 ret = -ENOMEM; 1568 ret = -ENOMEM;
1574 goto err_clk; 1569 return ret;
1575 } 1570 }
1576 1571
1577 for (n = 0; n < num_clocks; n++) { 1572 for (n = 0; n < num_clocks; n++) {
@@ -1591,7 +1586,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1591 if (ret) { 1586 if (ret) {
1592 dev_err(&client->dev, "unable to register %s\n", 1587 dev_err(&client->dev, "unable to register %s\n",
1593 init.name); 1588 init.name);
1594 goto err_clk; 1589 return ret;
1595 } 1590 }
1596 } 1591 }
1597 1592
@@ -1619,7 +1614,7 @@ static int si5351_i2c_probe(struct i2c_client *client,
1619 if (ret) { 1614 if (ret) {
1620 dev_err(&client->dev, "unable to register %s\n", 1615 dev_err(&client->dev, "unable to register %s\n",
1621 init.name); 1616 init.name);
1622 goto err_clk; 1617 return ret;
1623 } 1618 }
1624 1619
1625 /* set initial clkout rate */ 1620 /* set initial clkout rate */
@@ -1638,28 +1633,16 @@ static int si5351_i2c_probe(struct i2c_client *client,
1638 drvdata); 1633 drvdata);
1639 if (ret) { 1634 if (ret) {
1640 dev_err(&client->dev, "unable to add clk provider\n"); 1635 dev_err(&client->dev, "unable to add clk provider\n");
1641 goto err_clk; 1636 return ret;
1642 } 1637 }
1643 1638
1644 return 0; 1639 return 0;
1645
1646err_clk:
1647 if (!IS_ERR(drvdata->pxtal))
1648 clk_disable_unprepare(drvdata->pxtal);
1649 if (!IS_ERR(drvdata->pclkin))
1650 clk_disable_unprepare(drvdata->pclkin);
1651 return ret;
1652} 1640}
1653 1641
1654static int si5351_i2c_remove(struct i2c_client *client) 1642static int si5351_i2c_remove(struct i2c_client *client)
1655{ 1643{
1656 struct si5351_driver_data *drvdata = i2c_get_clientdata(client);
1657
1658 of_clk_del_provider(client->dev.of_node); 1644 of_clk_del_provider(client->dev.of_node);
1659 if (!IS_ERR(drvdata->pxtal)) 1645
1660 clk_disable_unprepare(drvdata->pxtal);
1661 if (!IS_ERR(drvdata->pclkin))
1662 clk_disable_unprepare(drvdata->pclkin);
1663 return 0; 1646 return 0;
1664} 1647}
1665 1648