16
16
#include <linux/of.h>
17
17
#include <linux/pm_runtime.h>
18
18
#include <linux/pinctrl/consumer.h>
19
+ #include <linux/reset.h>
19
20
20
21
/* Register offsets for the I2C device. */
21
22
#define CDNS_I2C_CR_OFFSET 0x00 /* Control Register, RW */
@@ -178,6 +179,7 @@ enum cdns_i2c_slave_state {
178
179
* @bus_hold_flag: Flag used in repeated start for clearing HOLD bit
179
180
* @clk: Pointer to struct clk
180
181
* @clk_rate_change_nb: Notifier block for clock rate changes
182
+ * @reset: Reset control for the device
181
183
* @quirks: flag for broken hold bit usage in r1p10
182
184
* @ctrl_reg: Cached value of the control register.
183
185
* @ctrl_reg_diva_divb: value of fields DIV_A and DIV_B from CR register
@@ -204,6 +206,7 @@ struct cdns_i2c {
204
206
unsigned int bus_hold_flag ;
205
207
struct clk * clk ;
206
208
struct notifier_block clk_rate_change_nb ;
209
+ struct reset_control * reset ;
207
210
u32 quirks ;
208
211
u32 ctrl_reg ;
209
212
struct i2c_bus_recovery_info rinfo ;
@@ -1325,10 +1328,22 @@ static int cdns_i2c_probe(struct platform_device *pdev)
1325
1328
return dev_err_probe (& pdev -> dev , PTR_ERR (id -> clk ),
1326
1329
"input clock not found.\n" );
1327
1330
1331
+ id -> reset = devm_reset_control_get_optional_shared (& pdev -> dev , NULL );
1332
+ if (IS_ERR (id -> reset ))
1333
+ return dev_err_probe (& pdev -> dev , PTR_ERR (id -> reset ),
1334
+ "Failed to request reset.\n" );
1335
+
1328
1336
ret = clk_prepare_enable (id -> clk );
1329
1337
if (ret )
1330
1338
dev_err (& pdev -> dev , "Unable to enable clock.\n" );
1331
1339
1340
+ ret = reset_control_deassert (id -> reset );
1341
+ if (ret ) {
1342
+ dev_err_probe (& pdev -> dev , ret ,
1343
+ "Failed to de-assert reset.\n" );
1344
+ goto err_clk_dis ;
1345
+ }
1346
+
1332
1347
pm_runtime_set_autosuspend_delay (id -> dev , CNDS_I2C_PM_TIMEOUT );
1333
1348
pm_runtime_use_autosuspend (id -> dev );
1334
1349
pm_runtime_set_active (id -> dev );
@@ -1360,28 +1375,30 @@ static int cdns_i2c_probe(struct platform_device *pdev)
1360
1375
if (ret ) {
1361
1376
dev_err (& pdev -> dev , "invalid SCL clock: %u Hz\n" , id -> i2c_clk );
1362
1377
ret = - EINVAL ;
1363
- goto err_clk_dis ;
1378
+ goto err_clk_notifier_unregister ;
1364
1379
}
1365
1380
1366
1381
ret = devm_request_irq (& pdev -> dev , irq , cdns_i2c_isr , 0 ,
1367
1382
DRIVER_NAME , id );
1368
1383
if (ret ) {
1369
1384
dev_err (& pdev -> dev , "cannot get irq %d\n" , irq );
1370
- goto err_clk_dis ;
1385
+ goto err_clk_notifier_unregister ;
1371
1386
}
1372
1387
cdns_i2c_init (id );
1373
1388
1374
1389
ret = i2c_add_adapter (& id -> adap );
1375
1390
if (ret < 0 )
1376
- goto err_clk_dis ;
1391
+ goto err_clk_notifier_unregister ;
1377
1392
1378
1393
dev_info (& pdev -> dev , "%u kHz mmio %08lx irq %d\n" ,
1379
1394
id -> i2c_clk / 1000 , (unsigned long )r_mem -> start , irq );
1380
1395
1381
1396
return 0 ;
1382
1397
1383
- err_clk_dis :
1398
+ err_clk_notifier_unregister :
1384
1399
clk_notifier_unregister (id -> clk , & id -> clk_rate_change_nb );
1400
+ reset_control_assert (id -> reset );
1401
+ err_clk_dis :
1385
1402
clk_disable_unprepare (id -> clk );
1386
1403
pm_runtime_disable (& pdev -> dev );
1387
1404
pm_runtime_set_suspended (& pdev -> dev );
@@ -1406,6 +1423,7 @@ static int cdns_i2c_remove(struct platform_device *pdev)
1406
1423
1407
1424
i2c_del_adapter (& id -> adap );
1408
1425
clk_notifier_unregister (id -> clk , & id -> clk_rate_change_nb );
1426
+ reset_control_assert (id -> reset );
1409
1427
clk_disable_unprepare (id -> clk );
1410
1428
1411
1429
return 0 ;
0 commit comments