19
19
#include <linux/i2c.h>
20
20
#include <linux/module.h>
21
21
#include <linux/regmap.h>
22
+ #include <linux/regulator/consumer.h>
22
23
#include <linux/slab.h>
23
24
#include <asm/unaligned.h>
24
25
@@ -59,6 +60,7 @@ struct clk_si5341_synth {
59
60
struct clk_si5341_output {
60
61
struct clk_hw hw ;
61
62
struct clk_si5341 * data ;
63
+ struct regulator * vddo_reg ;
62
64
u8 index ;
63
65
};
64
66
#define to_clk_si5341_output (_hw ) \
@@ -84,6 +86,7 @@ struct clk_si5341 {
84
86
struct clk_si5341_output_config {
85
87
u8 out_format_drv_bits ;
86
88
u8 out_cm_ampl_bits ;
89
+ u8 vdd_sel_bits ;
87
90
bool synth_master ;
88
91
bool always_on ;
89
92
};
@@ -136,6 +139,8 @@ struct clk_si5341_output_config {
136
139
#define SI5341_OUT_R_REG (output ) \
137
140
((output)->data->reg_rdiv_offset[(output)->index])
138
141
142
+ #define SI5341_OUT_MUX_VDD_SEL_MASK 0x38
143
+
139
144
/* Synthesize N divider */
140
145
#define SI5341_SYNTH_N_NUM (x ) (0x0302 + ((x) * 11))
141
146
#define SI5341_SYNTH_N_DEN (x ) (0x0308 + ((x) * 11))
@@ -1248,11 +1253,11 @@ static const struct regmap_config si5341_regmap_config = {
1248
1253
.volatile_table = & si5341_regmap_volatile ,
1249
1254
};
1250
1255
1251
- static int si5341_dt_parse_dt (struct i2c_client * client ,
1252
- struct clk_si5341_output_config * config )
1256
+ static int si5341_dt_parse_dt (struct clk_si5341 * data ,
1257
+ struct clk_si5341_output_config * config )
1253
1258
{
1254
1259
struct device_node * child ;
1255
- struct device_node * np = client -> dev .of_node ;
1260
+ struct device_node * np = data -> i2c_client -> dev .of_node ;
1256
1261
u32 num ;
1257
1262
u32 val ;
1258
1263
@@ -1261,13 +1266,13 @@ static int si5341_dt_parse_dt(struct i2c_client *client,
1261
1266
1262
1267
for_each_child_of_node (np , child ) {
1263
1268
if (of_property_read_u32 (child , "reg" , & num )) {
1264
- dev_err (& client -> dev , "missing reg property of %s\n" ,
1269
+ dev_err (& data -> i2c_client -> dev , "missing reg property of %s\n" ,
1265
1270
child -> name );
1266
1271
goto put_child ;
1267
1272
}
1268
1273
1269
1274
if (num >= SI5341_MAX_NUM_OUTPUTS ) {
1270
- dev_err (& client -> dev , "invalid clkout %d\n" , num );
1275
+ dev_err (& data -> i2c_client -> dev , "invalid clkout %d\n" , num );
1271
1276
goto put_child ;
1272
1277
}
1273
1278
@@ -1286,7 +1291,7 @@ static int si5341_dt_parse_dt(struct i2c_client *client,
1286
1291
config [num ].out_format_drv_bits |= 0xc0 ;
1287
1292
break ;
1288
1293
default :
1289
- dev_err (& client -> dev ,
1294
+ dev_err (& data -> i2c_client -> dev ,
1290
1295
"invalid silabs,format %u for %u\n" ,
1291
1296
val , num );
1292
1297
goto put_child ;
@@ -1299,7 +1304,7 @@ static int si5341_dt_parse_dt(struct i2c_client *client,
1299
1304
1300
1305
if (!of_property_read_u32 (child , "silabs,common-mode" , & val )) {
1301
1306
if (val > 0xf ) {
1302
- dev_err (& client -> dev ,
1307
+ dev_err (& data -> i2c_client -> dev ,
1303
1308
"invalid silabs,common-mode %u\n" ,
1304
1309
val );
1305
1310
goto put_child ;
@@ -1310,7 +1315,7 @@ static int si5341_dt_parse_dt(struct i2c_client *client,
1310
1315
1311
1316
if (!of_property_read_u32 (child , "silabs,amplitude" , & val )) {
1312
1317
if (val > 0xf ) {
1313
- dev_err (& client -> dev ,
1318
+ dev_err (& data -> i2c_client -> dev ,
1314
1319
"invalid silabs,amplitude %u\n" ,
1315
1320
val );
1316
1321
goto put_child ;
@@ -1327,6 +1332,34 @@ static int si5341_dt_parse_dt(struct i2c_client *client,
1327
1332
1328
1333
config [num ].always_on =
1329
1334
of_property_read_bool (child , "always-on" );
1335
+
1336
+ config [num ].vdd_sel_bits = 0x08 ;
1337
+ if (data -> clk [num ].vddo_reg ) {
1338
+ int vdd = regulator_get_voltage (data -> clk [num ].vddo_reg );
1339
+
1340
+ switch (vdd ) {
1341
+ case 3300000 :
1342
+ config [num ].vdd_sel_bits |= 0 << 4 ;
1343
+ break ;
1344
+ case 1800000 :
1345
+ config [num ].vdd_sel_bits |= 1 << 4 ;
1346
+ break ;
1347
+ case 2500000 :
1348
+ config [num ].vdd_sel_bits |= 2 << 4 ;
1349
+ break ;
1350
+ default :
1351
+ dev_err (& data -> i2c_client -> dev ,
1352
+ "unsupported vddo voltage %d for %s\n" ,
1353
+ vdd , child -> name );
1354
+ goto put_child ;
1355
+ }
1356
+ } else {
1357
+ /* chip seems to default to 2.5V when not set */
1358
+ dev_warn (& data -> i2c_client -> dev ,
1359
+ "no regulator set, defaulting vdd_sel to 2.5V for %s\n" ,
1360
+ child -> name );
1361
+ config [num ].vdd_sel_bits |= 2 << 4 ;
1362
+ }
1330
1363
}
1331
1364
1332
1365
return 0 ;
@@ -1452,31 +1485,57 @@ static int si5341_probe(struct i2c_client *client,
1452
1485
}
1453
1486
}
1454
1487
1455
- err = si5341_dt_parse_dt (client , config );
1488
+ for (i = 0 ; i < SI5341_MAX_NUM_OUTPUTS ; ++ i ) {
1489
+ char reg_name [10 ];
1490
+
1491
+ snprintf (reg_name , sizeof (reg_name ), "vddo%d" , i );
1492
+ data -> clk [i ].vddo_reg = devm_regulator_get_optional (
1493
+ & client -> dev , reg_name );
1494
+ if (IS_ERR (data -> clk [i ].vddo_reg )) {
1495
+ err = PTR_ERR (data -> clk [i ].vddo_reg );
1496
+ data -> clk [i ].vddo_reg = NULL ;
1497
+ if (err == - ENODEV )
1498
+ continue ;
1499
+ goto cleanup ;
1500
+ } else {
1501
+ err = regulator_enable (data -> clk [i ].vddo_reg );
1502
+ if (err ) {
1503
+ dev_err (& client -> dev ,
1504
+ "failed to enable %s regulator: %d\n" ,
1505
+ reg_name , err );
1506
+ data -> clk [i ].vddo_reg = NULL ;
1507
+ goto cleanup ;
1508
+ }
1509
+ }
1510
+ }
1511
+
1512
+ err = si5341_dt_parse_dt (data , config );
1456
1513
if (err )
1457
- return err ;
1514
+ goto cleanup ;
1458
1515
1459
1516
if (of_property_read_string (client -> dev .of_node , "clock-output-names" ,
1460
1517
& init .name ))
1461
1518
init .name = client -> dev .of_node -> name ;
1462
1519
root_clock_name = init .name ;
1463
1520
1464
1521
data -> regmap = devm_regmap_init_i2c (client , & si5341_regmap_config );
1465
- if (IS_ERR (data -> regmap ))
1466
- return PTR_ERR (data -> regmap );
1522
+ if (IS_ERR (data -> regmap )) {
1523
+ err = PTR_ERR (data -> regmap );
1524
+ goto cleanup ;
1525
+ }
1467
1526
1468
1527
i2c_set_clientdata (client , data );
1469
1528
1470
1529
err = si5341_probe_chip_id (data );
1471
1530
if (err < 0 )
1472
- return err ;
1531
+ goto cleanup ;
1473
1532
1474
1533
if (of_property_read_bool (client -> dev .of_node , "silabs,reprogram" )) {
1475
1534
initialization_required = true;
1476
1535
} else {
1477
1536
err = si5341_is_programmed_already (data );
1478
1537
if (err < 0 )
1479
- return err ;
1538
+ goto cleanup ;
1480
1539
1481
1540
initialization_required = !err ;
1482
1541
}
@@ -1485,11 +1544,11 @@ static int si5341_probe(struct i2c_client *client,
1485
1544
/* Populate the regmap cache in preparation for "cache only" */
1486
1545
err = si5341_read_settings (data );
1487
1546
if (err < 0 )
1488
- return err ;
1547
+ goto cleanup ;
1489
1548
1490
1549
err = si5341_send_preamble (data );
1491
1550
if (err < 0 )
1492
- return err ;
1551
+ goto cleanup ;
1493
1552
1494
1553
/*
1495
1554
* We intend to send all 'final' register values in a single
@@ -1502,19 +1561,19 @@ static int si5341_probe(struct i2c_client *client,
1502
1561
err = si5341_write_multiple (data , si5341_reg_defaults ,
1503
1562
ARRAY_SIZE (si5341_reg_defaults ));
1504
1563
if (err < 0 )
1505
- return err ;
1564
+ goto cleanup ;
1506
1565
}
1507
1566
1508
1567
/* Input must be up and running at this point */
1509
1568
err = si5341_clk_select_active_input (data );
1510
1569
if (err < 0 )
1511
- return err ;
1570
+ goto cleanup ;
1512
1571
1513
1572
if (initialization_required ) {
1514
1573
/* PLL configuration is required */
1515
1574
err = si5341_initialize_pll (data );
1516
1575
if (err < 0 )
1517
- return err ;
1576
+ goto cleanup ;
1518
1577
}
1519
1578
1520
1579
/* Register the PLL */
@@ -1527,7 +1586,7 @@ static int si5341_probe(struct i2c_client *client,
1527
1586
err = devm_clk_hw_register (& client -> dev , & data -> hw );
1528
1587
if (err ) {
1529
1588
dev_err (& client -> dev , "clock registration failed\n" );
1530
- return err ;
1589
+ goto cleanup ;
1531
1590
}
1532
1591
1533
1592
init .num_parents = 1 ;
@@ -1564,13 +1623,17 @@ static int si5341_probe(struct i2c_client *client,
1564
1623
regmap_write (data -> regmap ,
1565
1624
SI5341_OUT_CM (& data -> clk [i ]),
1566
1625
config [i ].out_cm_ampl_bits );
1626
+ regmap_update_bits (data -> regmap ,
1627
+ SI5341_OUT_MUX_SEL (& data -> clk [i ]),
1628
+ SI5341_OUT_MUX_VDD_SEL_MASK ,
1629
+ config [i ].vdd_sel_bits );
1567
1630
}
1568
1631
err = devm_clk_hw_register (& client -> dev , & data -> clk [i ].hw );
1569
1632
kfree (init .name ); /* clock framework made a copy of the name */
1570
1633
if (err ) {
1571
1634
dev_err (& client -> dev ,
1572
1635
"output %u registration failed\n" , i );
1573
- return err ;
1636
+ goto cleanup ;
1574
1637
}
1575
1638
if (config [i ].always_on )
1576
1639
clk_prepare (data -> clk [i ].hw .clk );
@@ -1580,19 +1643,19 @@ static int si5341_probe(struct i2c_client *client,
1580
1643
data );
1581
1644
if (err ) {
1582
1645
dev_err (& client -> dev , "unable to add clk provider\n" );
1583
- return err ;
1646
+ goto cleanup ;
1584
1647
}
1585
1648
1586
1649
if (initialization_required ) {
1587
1650
/* Synchronize */
1588
1651
regcache_cache_only (data -> regmap , false);
1589
1652
err = regcache_sync (data -> regmap );
1590
1653
if (err < 0 )
1591
- return err ;
1654
+ goto cleanup ;
1592
1655
1593
1656
err = si5341_finalize_defaults (data );
1594
1657
if (err < 0 )
1595
- return err ;
1658
+ goto cleanup ;
1596
1659
}
1597
1660
1598
1661
/* wait for device to report input clock present and PLL lock */
@@ -1601,21 +1664,41 @@ static int si5341_probe(struct i2c_client *client,
1601
1664
10000 , 250000 );
1602
1665
if (err ) {
1603
1666
dev_err (& client -> dev , "Error waiting for input clock or PLL lock\n" );
1604
- return err ;
1667
+ goto cleanup ;
1605
1668
}
1606
1669
1607
1670
/* clear sticky alarm bits from initialization */
1608
1671
err = regmap_write (data -> regmap , SI5341_STATUS_STICKY , 0 );
1609
1672
if (err ) {
1610
1673
dev_err (& client -> dev , "unable to clear sticky status\n" );
1611
- return err ;
1674
+ goto cleanup ;
1612
1675
}
1613
1676
1614
1677
/* Free the names, clk framework makes copies */
1615
1678
for (i = 0 ; i < data -> num_synth ; ++ i )
1616
1679
devm_kfree (& client -> dev , (void * )synth_clock_names [i ]);
1617
1680
1618
1681
return 0 ;
1682
+
1683
+ cleanup :
1684
+ for (i = 0 ; i < SI5341_MAX_NUM_OUTPUTS ; ++ i ) {
1685
+ if (data -> clk [i ].vddo_reg )
1686
+ regulator_disable (data -> clk [i ].vddo_reg );
1687
+ }
1688
+ return err ;
1689
+ }
1690
+
1691
+ static int si5341_remove (struct i2c_client * client )
1692
+ {
1693
+ struct clk_si5341 * data = i2c_get_clientdata (client );
1694
+ int i ;
1695
+
1696
+ for (i = 0 ; i < SI5341_MAX_NUM_OUTPUTS ; ++ i ) {
1697
+ if (data -> clk [i ].vddo_reg )
1698
+ regulator_disable (data -> clk [i ].vddo_reg );
1699
+ }
1700
+
1701
+ return 0 ;
1619
1702
}
1620
1703
1621
1704
static const struct i2c_device_id si5341_id [] = {
@@ -1644,6 +1727,7 @@ static struct i2c_driver si5341_driver = {
1644
1727
.of_match_table = clk_si5341_of_match ,
1645
1728
},
1646
1729
.probe = si5341_probe ,
1730
+ .remove = si5341_remove ,
1647
1731
.id_table = si5341_id ,
1648
1732
};
1649
1733
module_i2c_driver (si5341_driver );
0 commit comments