hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/clk/clk-si5341.c
....@@ -19,6 +19,7 @@
1919 #include <linux/i2c.h>
2020 #include <linux/module.h>
2121 #include <linux/regmap.h>
22
+#include <linux/regulator/consumer.h>
2223 #include <linux/slab.h>
2324 #include <asm/unaligned.h>
2425
....@@ -59,6 +60,7 @@
5960 struct clk_si5341_output {
6061 struct clk_hw hw;
6162 struct clk_si5341 *data;
63
+ struct regulator *vddo_reg;
6264 u8 index;
6365 };
6466 #define to_clk_si5341_output(_hw) \
....@@ -84,6 +86,7 @@
8486 struct clk_si5341_output_config {
8587 u8 out_format_drv_bits;
8688 u8 out_cm_ampl_bits;
89
+ u8 vdd_sel_bits;
8790 bool synth_master;
8891 bool always_on;
8992 };
....@@ -135,6 +138,8 @@
135138 #define SI5341_OUT_MUX_SEL(output) (SI5341_OUT_CONFIG(output) + 3)
136139 #define SI5341_OUT_R_REG(output) \
137140 ((output)->data->reg_rdiv_offset[(output)->index])
141
+
142
+#define SI5341_OUT_MUX_VDD_SEL_MASK 0x38
138143
139144 /* Synthesize N divider */
140145 #define SI5341_SYNTH_N_NUM(x) (0x0302 + ((x) * 11))
....@@ -1250,11 +1255,11 @@
12501255 .volatile_table = &si5341_regmap_volatile,
12511256 };
12521257
1253
-static int si5341_dt_parse_dt(struct i2c_client *client,
1254
- struct clk_si5341_output_config *config)
1258
+static int si5341_dt_parse_dt(struct clk_si5341 *data,
1259
+ struct clk_si5341_output_config *config)
12551260 {
12561261 struct device_node *child;
1257
- struct device_node *np = client->dev.of_node;
1262
+ struct device_node *np = data->i2c_client->dev.of_node;
12581263 u32 num;
12591264 u32 val;
12601265
....@@ -1263,13 +1268,13 @@
12631268
12641269 for_each_child_of_node(np, child) {
12651270 if (of_property_read_u32(child, "reg", &num)) {
1266
- dev_err(&client->dev, "missing reg property of %s\n",
1271
+ dev_err(&data->i2c_client->dev, "missing reg property of %s\n",
12671272 child->name);
12681273 goto put_child;
12691274 }
12701275
12711276 if (num >= SI5341_MAX_NUM_OUTPUTS) {
1272
- dev_err(&client->dev, "invalid clkout %d\n", num);
1277
+ dev_err(&data->i2c_client->dev, "invalid clkout %d\n", num);
12731278 goto put_child;
12741279 }
12751280
....@@ -1288,7 +1293,7 @@
12881293 config[num].out_format_drv_bits |= 0xc0;
12891294 break;
12901295 default:
1291
- dev_err(&client->dev,
1296
+ dev_err(&data->i2c_client->dev,
12921297 "invalid silabs,format %u for %u\n",
12931298 val, num);
12941299 goto put_child;
....@@ -1301,7 +1306,7 @@
13011306
13021307 if (!of_property_read_u32(child, "silabs,common-mode", &val)) {
13031308 if (val > 0xf) {
1304
- dev_err(&client->dev,
1309
+ dev_err(&data->i2c_client->dev,
13051310 "invalid silabs,common-mode %u\n",
13061311 val);
13071312 goto put_child;
....@@ -1312,7 +1317,7 @@
13121317
13131318 if (!of_property_read_u32(child, "silabs,amplitude", &val)) {
13141319 if (val > 0xf) {
1315
- dev_err(&client->dev,
1320
+ dev_err(&data->i2c_client->dev,
13161321 "invalid silabs,amplitude %u\n",
13171322 val);
13181323 goto put_child;
....@@ -1329,6 +1334,34 @@
13291334
13301335 config[num].always_on =
13311336 of_property_read_bool(child, "always-on");
1337
+
1338
+ config[num].vdd_sel_bits = 0x08;
1339
+ if (data->clk[num].vddo_reg) {
1340
+ int vdd = regulator_get_voltage(data->clk[num].vddo_reg);
1341
+
1342
+ switch (vdd) {
1343
+ case 3300000:
1344
+ config[num].vdd_sel_bits |= 0 << 4;
1345
+ break;
1346
+ case 1800000:
1347
+ config[num].vdd_sel_bits |= 1 << 4;
1348
+ break;
1349
+ case 2500000:
1350
+ config[num].vdd_sel_bits |= 2 << 4;
1351
+ break;
1352
+ default:
1353
+ dev_err(&data->i2c_client->dev,
1354
+ "unsupported vddo voltage %d for %s\n",
1355
+ vdd, child->name);
1356
+ goto put_child;
1357
+ }
1358
+ } else {
1359
+ /* chip seems to default to 2.5V when not set */
1360
+ dev_warn(&data->i2c_client->dev,
1361
+ "no regulator set, defaulting vdd_sel to 2.5V for %s\n",
1362
+ child->name);
1363
+ config[num].vdd_sel_bits |= 2 << 4;
1364
+ }
13321365 }
13331366
13341367 return 0;
....@@ -1417,6 +1450,94 @@
14171450 return res;
14181451 }
14191452
1453
+static ssize_t input_present_show(struct device *dev,
1454
+ struct device_attribute *attr,
1455
+ char *buf)
1456
+{
1457
+ struct clk_si5341 *data = dev_get_drvdata(dev);
1458
+ u32 status;
1459
+ int res = regmap_read(data->regmap, SI5341_STATUS, &status);
1460
+
1461
+ if (res < 0)
1462
+ return res;
1463
+ res = !(status & SI5341_STATUS_LOSREF);
1464
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
1465
+}
1466
+static DEVICE_ATTR_RO(input_present);
1467
+
1468
+static ssize_t input_present_sticky_show(struct device *dev,
1469
+ struct device_attribute *attr,
1470
+ char *buf)
1471
+{
1472
+ struct clk_si5341 *data = dev_get_drvdata(dev);
1473
+ u32 status;
1474
+ int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status);
1475
+
1476
+ if (res < 0)
1477
+ return res;
1478
+ res = !(status & SI5341_STATUS_LOSREF);
1479
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
1480
+}
1481
+static DEVICE_ATTR_RO(input_present_sticky);
1482
+
1483
+static ssize_t pll_locked_show(struct device *dev,
1484
+ struct device_attribute *attr,
1485
+ char *buf)
1486
+{
1487
+ struct clk_si5341 *data = dev_get_drvdata(dev);
1488
+ u32 status;
1489
+ int res = regmap_read(data->regmap, SI5341_STATUS, &status);
1490
+
1491
+ if (res < 0)
1492
+ return res;
1493
+ res = !(status & SI5341_STATUS_LOL);
1494
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
1495
+}
1496
+static DEVICE_ATTR_RO(pll_locked);
1497
+
1498
+static ssize_t pll_locked_sticky_show(struct device *dev,
1499
+ struct device_attribute *attr,
1500
+ char *buf)
1501
+{
1502
+ struct clk_si5341 *data = dev_get_drvdata(dev);
1503
+ u32 status;
1504
+ int res = regmap_read(data->regmap, SI5341_STATUS_STICKY, &status);
1505
+
1506
+ if (res < 0)
1507
+ return res;
1508
+ res = !(status & SI5341_STATUS_LOL);
1509
+ return snprintf(buf, PAGE_SIZE, "%d\n", res);
1510
+}
1511
+static DEVICE_ATTR_RO(pll_locked_sticky);
1512
+
1513
+static ssize_t clear_sticky_store(struct device *dev,
1514
+ struct device_attribute *attr,
1515
+ const char *buf, size_t count)
1516
+{
1517
+ struct clk_si5341 *data = dev_get_drvdata(dev);
1518
+ long val;
1519
+
1520
+ if (kstrtol(buf, 10, &val))
1521
+ return -EINVAL;
1522
+ if (val) {
1523
+ int res = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0);
1524
+
1525
+ if (res < 0)
1526
+ return res;
1527
+ }
1528
+ return count;
1529
+}
1530
+static DEVICE_ATTR_WO(clear_sticky);
1531
+
1532
+static const struct attribute *si5341_attributes[] = {
1533
+ &dev_attr_input_present.attr,
1534
+ &dev_attr_input_present_sticky.attr,
1535
+ &dev_attr_pll_locked.attr,
1536
+ &dev_attr_pll_locked_sticky.attr,
1537
+ &dev_attr_clear_sticky.attr,
1538
+ NULL
1539
+};
1540
+
14201541 static int si5341_probe(struct i2c_client *client,
14211542 const struct i2c_device_id *id)
14221543 {
....@@ -1424,7 +1545,7 @@
14241545 struct clk_init_data init;
14251546 struct clk *input;
14261547 const char *root_clock_name;
1427
- const char *synth_clock_names[SI5341_NUM_SYNTH];
1548
+ const char *synth_clock_names[SI5341_NUM_SYNTH] = { NULL };
14281549 int err;
14291550 unsigned int i;
14301551 struct clk_si5341_output_config config[SI5341_MAX_NUM_OUTPUTS];
....@@ -1454,9 +1575,33 @@
14541575 }
14551576 }
14561577
1457
- err = si5341_dt_parse_dt(client, config);
1578
+ for (i = 0; i < SI5341_MAX_NUM_OUTPUTS; ++i) {
1579
+ char reg_name[10];
1580
+
1581
+ snprintf(reg_name, sizeof(reg_name), "vddo%d", i);
1582
+ data->clk[i].vddo_reg = devm_regulator_get_optional(
1583
+ &client->dev, reg_name);
1584
+ if (IS_ERR(data->clk[i].vddo_reg)) {
1585
+ err = PTR_ERR(data->clk[i].vddo_reg);
1586
+ data->clk[i].vddo_reg = NULL;
1587
+ if (err == -ENODEV)
1588
+ continue;
1589
+ goto cleanup;
1590
+ } else {
1591
+ err = regulator_enable(data->clk[i].vddo_reg);
1592
+ if (err) {
1593
+ dev_err(&client->dev,
1594
+ "failed to enable %s regulator: %d\n",
1595
+ reg_name, err);
1596
+ data->clk[i].vddo_reg = NULL;
1597
+ goto cleanup;
1598
+ }
1599
+ }
1600
+ }
1601
+
1602
+ err = si5341_dt_parse_dt(data, config);
14581603 if (err)
1459
- return err;
1604
+ goto cleanup;
14601605
14611606 if (of_property_read_string(client->dev.of_node, "clock-output-names",
14621607 &init.name))
....@@ -1464,21 +1609,23 @@
14641609 root_clock_name = init.name;
14651610
14661611 data->regmap = devm_regmap_init_i2c(client, &si5341_regmap_config);
1467
- if (IS_ERR(data->regmap))
1468
- return PTR_ERR(data->regmap);
1612
+ if (IS_ERR(data->regmap)) {
1613
+ err = PTR_ERR(data->regmap);
1614
+ goto cleanup;
1615
+ }
14691616
14701617 i2c_set_clientdata(client, data);
14711618
14721619 err = si5341_probe_chip_id(data);
14731620 if (err < 0)
1474
- return err;
1621
+ goto cleanup;
14751622
14761623 if (of_property_read_bool(client->dev.of_node, "silabs,reprogram")) {
14771624 initialization_required = true;
14781625 } else {
14791626 err = si5341_is_programmed_already(data);
14801627 if (err < 0)
1481
- return err;
1628
+ goto cleanup;
14821629
14831630 initialization_required = !err;
14841631 }
....@@ -1487,11 +1634,11 @@
14871634 /* Populate the regmap cache in preparation for "cache only" */
14881635 err = si5341_read_settings(data);
14891636 if (err < 0)
1490
- return err;
1637
+ goto cleanup;
14911638
14921639 err = si5341_send_preamble(data);
14931640 if (err < 0)
1494
- return err;
1641
+ goto cleanup;
14951642
14961643 /*
14971644 * We intend to send all 'final' register values in a single
....@@ -1504,19 +1651,19 @@
15041651 err = si5341_write_multiple(data, si5341_reg_defaults,
15051652 ARRAY_SIZE(si5341_reg_defaults));
15061653 if (err < 0)
1507
- return err;
1654
+ goto cleanup;
15081655 }
15091656
15101657 /* Input must be up and running at this point */
15111658 err = si5341_clk_select_active_input(data);
15121659 if (err < 0)
1513
- return err;
1660
+ goto cleanup;
15141661
15151662 if (initialization_required) {
15161663 /* PLL configuration is required */
15171664 err = si5341_initialize_pll(data);
15181665 if (err < 0)
1519
- return err;
1666
+ goto cleanup;
15201667 }
15211668
15221669 /* Register the PLL */
....@@ -1529,7 +1676,7 @@
15291676 err = devm_clk_hw_register(&client->dev, &data->hw);
15301677 if (err) {
15311678 dev_err(&client->dev, "clock registration failed\n");
1532
- return err;
1679
+ goto cleanup;
15331680 }
15341681
15351682 init.num_parents = 1;
....@@ -1538,6 +1685,10 @@
15381685 for (i = 0; i < data->num_synth; ++i) {
15391686 synth_clock_names[i] = devm_kasprintf(&client->dev, GFP_KERNEL,
15401687 "%s.N%u", client->dev.of_node->name, i);
1688
+ if (!synth_clock_names[i]) {
1689
+ err = -ENOMEM;
1690
+ goto free_clk_names;
1691
+ }
15411692 init.name = synth_clock_names[i];
15421693 data->synth[i].index = i;
15431694 data->synth[i].data = data;
....@@ -1546,6 +1697,7 @@
15461697 if (err) {
15471698 dev_err(&client->dev,
15481699 "synth N%u registration failed\n", i);
1700
+ goto free_clk_names;
15491701 }
15501702 }
15511703
....@@ -1555,6 +1707,10 @@
15551707 for (i = 0; i < data->num_outputs; ++i) {
15561708 init.name = kasprintf(GFP_KERNEL, "%s.%d",
15571709 client->dev.of_node->name, i);
1710
+ if (!init.name) {
1711
+ err = -ENOMEM;
1712
+ goto free_clk_names;
1713
+ }
15581714 init.flags = config[i].synth_master ? CLK_SET_RATE_PARENT : 0;
15591715 data->clk[i].index = i;
15601716 data->clk[i].data = data;
....@@ -1566,13 +1722,17 @@
15661722 regmap_write(data->regmap,
15671723 SI5341_OUT_CM(&data->clk[i]),
15681724 config[i].out_cm_ampl_bits);
1725
+ regmap_update_bits(data->regmap,
1726
+ SI5341_OUT_MUX_SEL(&data->clk[i]),
1727
+ SI5341_OUT_MUX_VDD_SEL_MASK,
1728
+ config[i].vdd_sel_bits);
15691729 }
15701730 err = devm_clk_hw_register(&client->dev, &data->clk[i].hw);
15711731 kfree(init.name); /* clock framework made a copy of the name */
15721732 if (err) {
15731733 dev_err(&client->dev,
15741734 "output %u registration failed\n", i);
1575
- return err;
1735
+ goto free_clk_names;
15761736 }
15771737 if (config[i].always_on)
15781738 clk_prepare(data->clk[i].hw.clk);
....@@ -1582,7 +1742,7 @@
15821742 data);
15831743 if (err) {
15841744 dev_err(&client->dev, "unable to add clk provider\n");
1585
- return err;
1745
+ goto free_clk_names;
15861746 }
15871747
15881748 if (initialization_required) {
....@@ -1590,11 +1750,11 @@
15901750 regcache_cache_only(data->regmap, false);
15911751 err = regcache_sync(data->regmap);
15921752 if (err < 0)
1593
- return err;
1753
+ goto free_clk_names;
15941754
15951755 err = si5341_finalize_defaults(data);
15961756 if (err < 0)
1597
- return err;
1757
+ goto free_clk_names;
15981758 }
15991759
16001760 /* wait for device to report input clock present and PLL lock */
....@@ -1603,19 +1763,46 @@
16031763 10000, 250000);
16041764 if (err) {
16051765 dev_err(&client->dev, "Error waiting for input clock or PLL lock\n");
1606
- return err;
1766
+ goto free_clk_names;
16071767 }
16081768
16091769 /* clear sticky alarm bits from initialization */
16101770 err = regmap_write(data->regmap, SI5341_STATUS_STICKY, 0);
16111771 if (err) {
16121772 dev_err(&client->dev, "unable to clear sticky status\n");
1613
- return err;
1773
+ goto free_clk_names;
16141774 }
16151775
1776
+ err = sysfs_create_files(&client->dev.kobj, si5341_attributes);
1777
+ if (err)
1778
+ dev_err(&client->dev, "unable to create sysfs files\n");
1779
+
1780
+free_clk_names:
16161781 /* Free the names, clk framework makes copies */
16171782 for (i = 0; i < data->num_synth; ++i)
16181783 devm_kfree(&client->dev, (void *)synth_clock_names[i]);
1784
+
1785
+cleanup:
1786
+ if (err) {
1787
+ for (i = 0; i < SI5341_MAX_NUM_OUTPUTS; ++i) {
1788
+ if (data->clk[i].vddo_reg)
1789
+ regulator_disable(data->clk[i].vddo_reg);
1790
+ }
1791
+ }
1792
+ return err;
1793
+}
1794
+
1795
+static int si5341_remove(struct i2c_client *client)
1796
+{
1797
+ struct clk_si5341 *data = i2c_get_clientdata(client);
1798
+ int i;
1799
+
1800
+ sysfs_remove_files(&client->dev.kobj, si5341_attributes);
1801
+
1802
+ for (i = 0; i < SI5341_MAX_NUM_OUTPUTS; ++i) {
1803
+ if (data->clk[i].vddo_reg)
1804
+ regulator_disable(data->clk[i].vddo_reg);
1805
+ }
16191806
16201807 return 0;
16211808 }
....@@ -1646,6 +1833,7 @@
16461833 .of_match_table = clk_si5341_of_match,
16471834 },
16481835 .probe = si5341_probe,
1836
+ .remove = si5341_remove,
16491837 .id_table = si5341_id,
16501838 };
16511839 module_i2c_driver(si5341_driver);