@@ -1128,13 +1128,6 @@ static int si5351_dt_parse(struct i2c_client *client,
1128
1128
if (!pdata )
1129
1129
return - ENOMEM ;
1130
1130
1131
- pdata -> clk_xtal = of_clk_get (np , 0 );
1132
- if (!IS_ERR (pdata -> clk_xtal ))
1133
- clk_put (pdata -> clk_xtal );
1134
- pdata -> clk_clkin = of_clk_get (np , 1 );
1135
- if (!IS_ERR (pdata -> clk_clkin ))
1136
- clk_put (pdata -> clk_clkin );
1137
-
1138
1131
/*
1139
1132
* property silabs,pll-source : <num src>, [<..>]
1140
1133
* allow to selectively set pll source
@@ -1328,8 +1321,22 @@ static int si5351_i2c_probe(struct i2c_client *client,
1328
1321
i2c_set_clientdata (client , drvdata );
1329
1322
drvdata -> client = client ;
1330
1323
drvdata -> variant = variant ;
1331
- drvdata -> pxtal = pdata -> clk_xtal ;
1332
- drvdata -> pclkin = pdata -> clk_clkin ;
1324
+ drvdata -> pxtal = devm_clk_get (& client -> dev , "xtal" );
1325
+ drvdata -> pclkin = devm_clk_get (& client -> dev , "clkin" );
1326
+
1327
+ if (PTR_ERR (drvdata -> pxtal ) == - EPROBE_DEFER ||
1328
+ PTR_ERR (drvdata -> pclkin ) == - EPROBE_DEFER )
1329
+ return - EPROBE_DEFER ;
1330
+
1331
+ /*
1332
+ * Check for valid parent clock: VARIANT_A and VARIANT_B need XTAL,
1333
+ * VARIANT_C can have CLKIN instead.
1334
+ */
1335
+ if (IS_ERR (drvdata -> pxtal ) &&
1336
+ (drvdata -> variant != SI5351_VARIANT_C || IS_ERR (drvdata -> pclkin ))) {
1337
+ dev_err (& client -> dev , "missing parent clock\n" );
1338
+ return - EINVAL ;
1339
+ }
1333
1340
1334
1341
drvdata -> regmap = devm_regmap_init_i2c (client , & si5351_regmap_config );
1335
1342
if (IS_ERR (drvdata -> regmap )) {
@@ -1393,6 +1400,11 @@ static int si5351_i2c_probe(struct i2c_client *client,
1393
1400
}
1394
1401
}
1395
1402
1403
+ if (!IS_ERR (drvdata -> pxtal ))
1404
+ clk_prepare_enable (drvdata -> pxtal );
1405
+ if (!IS_ERR (drvdata -> pclkin ))
1406
+ clk_prepare_enable (drvdata -> pclkin );
1407
+
1396
1408
/* register xtal input clock gate */
1397
1409
memset (& init , 0 , sizeof (init ));
1398
1410
init .name = si5351_input_names [0 ];
@@ -1407,7 +1419,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1407
1419
clk = devm_clk_register (& client -> dev , & drvdata -> xtal );
1408
1420
if (IS_ERR (clk )) {
1409
1421
dev_err (& client -> dev , "unable to register %s\n" , init .name );
1410
- return PTR_ERR (clk );
1422
+ ret = PTR_ERR (clk );
1423
+ goto err_clk ;
1411
1424
}
1412
1425
1413
1426
/* register clkin input clock gate */
@@ -1425,7 +1438,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1425
1438
if (IS_ERR (clk )) {
1426
1439
dev_err (& client -> dev , "unable to register %s\n" ,
1427
1440
init .name );
1428
- return PTR_ERR (clk );
1441
+ ret = PTR_ERR (clk );
1442
+ goto err_clk ;
1429
1443
}
1430
1444
}
1431
1445
@@ -1447,7 +1461,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1447
1461
clk = devm_clk_register (& client -> dev , & drvdata -> pll [0 ].hw );
1448
1462
if (IS_ERR (clk )) {
1449
1463
dev_err (& client -> dev , "unable to register %s\n" , init .name );
1450
- return - EINVAL ;
1464
+ ret = PTR_ERR (clk );
1465
+ goto err_clk ;
1451
1466
}
1452
1467
1453
1468
/* register PLLB or VXCO (Si5351B) */
@@ -1471,7 +1486,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1471
1486
clk = devm_clk_register (& client -> dev , & drvdata -> pll [1 ].hw );
1472
1487
if (IS_ERR (clk )) {
1473
1488
dev_err (& client -> dev , "unable to register %s\n" , init .name );
1474
- return - EINVAL ;
1489
+ ret = PTR_ERR (clk );
1490
+ goto err_clk ;
1475
1491
}
1476
1492
1477
1493
/* register clk multisync and clk out divider */
@@ -1492,8 +1508,10 @@ static int si5351_i2c_probe(struct i2c_client *client,
1492
1508
num_clocks * sizeof (* drvdata -> onecell .clks ), GFP_KERNEL );
1493
1509
1494
1510
if (WARN_ON (!drvdata -> msynth || !drvdata -> clkout ||
1495
- !drvdata -> onecell .clks ))
1496
- return - ENOMEM ;
1511
+ !drvdata -> onecell .clks )) {
1512
+ ret = - ENOMEM ;
1513
+ goto err_clk ;
1514
+ }
1497
1515
1498
1516
for (n = 0 ; n < num_clocks ; n ++ ) {
1499
1517
drvdata -> msynth [n ].num = n ;
@@ -1511,7 +1529,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1511
1529
if (IS_ERR (clk )) {
1512
1530
dev_err (& client -> dev , "unable to register %s\n" ,
1513
1531
init .name );
1514
- return - EINVAL ;
1532
+ ret = PTR_ERR (clk );
1533
+ goto err_clk ;
1515
1534
}
1516
1535
}
1517
1536
@@ -1538,7 +1557,8 @@ static int si5351_i2c_probe(struct i2c_client *client,
1538
1557
if (IS_ERR (clk )) {
1539
1558
dev_err (& client -> dev , "unable to register %s\n" ,
1540
1559
init .name );
1541
- return - EINVAL ;
1560
+ ret = PTR_ERR (clk );
1561
+ goto err_clk ;
1542
1562
}
1543
1563
drvdata -> onecell .clks [n ] = clk ;
1544
1564
@@ -1557,10 +1577,17 @@ static int si5351_i2c_probe(struct i2c_client *client,
1557
1577
& drvdata -> onecell );
1558
1578
if (ret ) {
1559
1579
dev_err (& client -> dev , "unable to add clk provider\n" );
1560
- return ret ;
1580
+ goto err_clk ;
1561
1581
}
1562
1582
1563
1583
return 0 ;
1584
+
1585
+ err_clk :
1586
+ if (!IS_ERR (drvdata -> pxtal ))
1587
+ clk_disable_unprepare (drvdata -> pxtal );
1588
+ if (!IS_ERR (drvdata -> pclkin ))
1589
+ clk_disable_unprepare (drvdata -> pclkin );
1590
+ return ret ;
1564
1591
}
1565
1592
1566
1593
static const struct i2c_device_id si5351_i2c_ids [] = {
0 commit comments