86
86
87
87
#define I2C_DRV_NAME "i2c-mt65xx"
88
88
89
+ /**
90
+ * enum i2c_mt65xx_clks - Clocks enumeration for MT65XX I2C
91
+ *
92
+ * @I2C_MT65XX_CLK_MAIN: main clock for i2c bus
93
+ * @I2C_MT65XX_CLK_DMA: DMA clock for i2c via DMA
94
+ * @I2C_MT65XX_CLK_PMIC: PMIC clock for i2c from PMIC
95
+ * @I2C_MT65XX_CLK_ARB: Arbitrator clock for i2c
96
+ * @I2C_MT65XX_CLK_MAX: Number of supported clocks
97
+ */
98
+ enum i2c_mt65xx_clks {
99
+ I2C_MT65XX_CLK_MAIN = 0 ,
100
+ I2C_MT65XX_CLK_DMA ,
101
+ I2C_MT65XX_CLK_PMIC ,
102
+ I2C_MT65XX_CLK_ARB ,
103
+ I2C_MT65XX_CLK_MAX
104
+ };
105
+
106
+ static const char * const i2c_mt65xx_clk_ids [I2C_MT65XX_CLK_MAX ] = {
107
+ "main" , "dma" , "pmic" , "arb"
108
+ };
109
+
89
110
enum DMA_REGS_OFFSET {
90
111
OFFSET_INT_FLAG = 0x0 ,
91
112
OFFSET_INT_EN = 0x04 ,
@@ -244,10 +265,7 @@ struct mtk_i2c {
244
265
/* set in i2c probe */
245
266
void __iomem * base ; /* i2c base addr */
246
267
void __iomem * pdmabase ; /* dma base address*/
247
- struct clk * clk_main ; /* main clock for i2c bus */
248
- struct clk * clk_dma ; /* DMA clock for i2c via DMA */
249
- struct clk * clk_pmic ; /* PMIC clock for i2c from PMIC */
250
- struct clk * clk_arb ; /* Arbitrator clock for i2c */
268
+ struct clk_bulk_data clocks [I2C_MT65XX_CLK_MAX ]; /* clocks for i2c */
251
269
bool have_pmic ; /* can use i2c pins from PMIC */
252
270
bool use_push_pull ; /* IO config push-pull mode */
253
271
@@ -449,52 +467,6 @@ static void mtk_i2c_writew(struct mtk_i2c *i2c, u16 val,
449
467
writew (val , i2c -> base + i2c -> dev_comp -> regs [reg ]);
450
468
}
451
469
452
- static int mtk_i2c_clock_enable (struct mtk_i2c * i2c )
453
- {
454
- int ret ;
455
-
456
- ret = clk_prepare_enable (i2c -> clk_dma );
457
- if (ret )
458
- return ret ;
459
-
460
- ret = clk_prepare_enable (i2c -> clk_main );
461
- if (ret )
462
- goto err_main ;
463
-
464
- if (i2c -> have_pmic ) {
465
- ret = clk_prepare_enable (i2c -> clk_pmic );
466
- if (ret )
467
- goto err_pmic ;
468
- }
469
-
470
- if (i2c -> clk_arb ) {
471
- ret = clk_prepare_enable (i2c -> clk_arb );
472
- if (ret )
473
- goto err_arb ;
474
- }
475
-
476
- return 0 ;
477
-
478
- err_arb :
479
- clk_disable_unprepare (i2c -> clk_pmic );
480
- err_pmic :
481
- clk_disable_unprepare (i2c -> clk_main );
482
- err_main :
483
- clk_disable_unprepare (i2c -> clk_dma );
484
-
485
- return ret ;
486
- }
487
-
488
- static void mtk_i2c_clock_disable (struct mtk_i2c * i2c )
489
- {
490
- clk_disable_unprepare (i2c -> clk_arb );
491
-
492
- clk_disable_unprepare (i2c -> clk_pmic );
493
-
494
- clk_disable_unprepare (i2c -> clk_main );
495
- clk_disable_unprepare (i2c -> clk_dma );
496
- }
497
-
498
470
static void mtk_i2c_init_hw (struct mtk_i2c * i2c )
499
471
{
500
472
u16 control_reg ;
@@ -1191,7 +1163,7 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
1191
1163
int left_num = num ;
1192
1164
struct mtk_i2c * i2c = i2c_get_adapdata (adap );
1193
1165
1194
- ret = mtk_i2c_clock_enable ( i2c );
1166
+ ret = clk_bulk_prepare_enable ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1195
1167
if (ret )
1196
1168
return ret ;
1197
1169
@@ -1245,7 +1217,7 @@ static int mtk_i2c_transfer(struct i2c_adapter *adap,
1245
1217
ret = num ;
1246
1218
1247
1219
err_exit :
1248
- mtk_i2c_clock_disable ( i2c );
1220
+ clk_bulk_disable_unprepare ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1249
1221
return ret ;
1250
1222
}
1251
1223
@@ -1323,9 +1295,8 @@ static int mtk_i2c_probe(struct platform_device *pdev)
1323
1295
{
1324
1296
int ret = 0 ;
1325
1297
struct mtk_i2c * i2c ;
1326
- struct clk * clk ;
1327
1298
struct resource * res ;
1328
- int irq ;
1299
+ int i , irq , speed_clk ;
1329
1300
1330
1301
i2c = devm_kzalloc (& pdev -> dev , sizeof (* i2c ), GFP_KERNEL );
1331
1302
if (!i2c )
@@ -1371,35 +1342,42 @@ static int mtk_i2c_probe(struct platform_device *pdev)
1371
1342
if (i2c -> have_pmic && !i2c -> dev_comp -> pmic_i2c )
1372
1343
return - EINVAL ;
1373
1344
1374
- i2c -> clk_main = devm_clk_get (& pdev -> dev , "main" );
1375
- if (IS_ERR (i2c -> clk_main )) {
1345
+ /* Fill in clk-bulk IDs */
1346
+ for (i = 0 ; i < I2C_MT65XX_CLK_MAX ; i ++ )
1347
+ i2c -> clocks [i ].id = i2c_mt65xx_clk_ids [i ];
1348
+
1349
+ /* Get clocks one by one, some may be optional */
1350
+ i2c -> clocks [I2C_MT65XX_CLK_MAIN ].clk = devm_clk_get (& pdev -> dev , "main" );
1351
+ if (IS_ERR (i2c -> clocks [I2C_MT65XX_CLK_MAIN ].clk )) {
1376
1352
dev_err (& pdev -> dev , "cannot get main clock\n" );
1377
- return PTR_ERR (i2c -> clk_main );
1353
+ return PTR_ERR (i2c -> clocks [ I2C_MT65XX_CLK_MAIN ]. clk );
1378
1354
}
1379
1355
1380
- i2c -> clk_dma = devm_clk_get (& pdev -> dev , "dma" );
1381
- if (IS_ERR (i2c -> clk_dma )) {
1356
+ i2c -> clocks [ I2C_MT65XX_CLK_DMA ]. clk = devm_clk_get (& pdev -> dev , "dma" );
1357
+ if (IS_ERR (i2c -> clocks [ I2C_MT65XX_CLK_DMA ]. clk )) {
1382
1358
dev_err (& pdev -> dev , "cannot get dma clock\n" );
1383
- return PTR_ERR (i2c -> clk_dma );
1359
+ return PTR_ERR (i2c -> clocks [ I2C_MT65XX_CLK_DMA ]. clk );
1384
1360
}
1385
1361
1386
- i2c -> clk_arb = devm_clk_get (& pdev -> dev , "arb" );
1387
- if (IS_ERR (i2c -> clk_arb ))
1388
- i2c -> clk_arb = NULL ;
1362
+ i2c -> clocks [ I2C_MT65XX_CLK_ARB ]. clk = devm_clk_get_optional (& pdev -> dev , "arb" );
1363
+ if (IS_ERR (i2c -> clocks [ I2C_MT65XX_CLK_ARB ]. clk ))
1364
+ return PTR_ERR ( i2c -> clocks [ I2C_MT65XX_CLK_ARB ]. clk ) ;
1389
1365
1390
- clk = i2c -> clk_main ;
1391
1366
if (i2c -> have_pmic ) {
1392
- i2c -> clk_pmic = devm_clk_get (& pdev -> dev , "pmic" );
1393
- if (IS_ERR (i2c -> clk_pmic )) {
1367
+ i2c -> clocks [ I2C_MT65XX_CLK_PMIC ]. clk = devm_clk_get (& pdev -> dev , "pmic" );
1368
+ if (IS_ERR (i2c -> clocks [ I2C_MT65XX_CLK_PMIC ]. clk )) {
1394
1369
dev_err (& pdev -> dev , "cannot get pmic clock\n" );
1395
- return PTR_ERR (i2c -> clk_pmic );
1370
+ return PTR_ERR (i2c -> clocks [ I2C_MT65XX_CLK_PMIC ]. clk );
1396
1371
}
1397
- clk = i2c -> clk_pmic ;
1372
+ speed_clk = I2C_MT65XX_CLK_PMIC ;
1373
+ } else {
1374
+ i2c -> clocks [I2C_MT65XX_CLK_PMIC ].clk = NULL ;
1375
+ speed_clk = I2C_MT65XX_CLK_MAIN ;
1398
1376
}
1399
1377
1400
1378
strlcpy (i2c -> adap .name , I2C_DRV_NAME , sizeof (i2c -> adap .name ));
1401
1379
1402
- ret = mtk_i2c_set_speed (i2c , clk_get_rate (clk ));
1380
+ ret = mtk_i2c_set_speed (i2c , clk_get_rate (i2c -> clocks [ speed_clk ]. clk ));
1403
1381
if (ret ) {
1404
1382
dev_err (& pdev -> dev , "Failed to set the speed.\n" );
1405
1383
return - EINVAL ;
@@ -1414,13 +1392,13 @@ static int mtk_i2c_probe(struct platform_device *pdev)
1414
1392
}
1415
1393
}
1416
1394
1417
- ret = mtk_i2c_clock_enable ( i2c );
1395
+ ret = clk_bulk_prepare_enable ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1418
1396
if (ret ) {
1419
1397
dev_err (& pdev -> dev , "clock enable failed!\n" );
1420
1398
return ret ;
1421
1399
}
1422
1400
mtk_i2c_init_hw (i2c );
1423
- mtk_i2c_clock_disable ( i2c );
1401
+ clk_bulk_disable_unprepare ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1424
1402
1425
1403
ret = devm_request_irq (& pdev -> dev , irq , mtk_i2c_irq ,
1426
1404
IRQF_NO_SUSPEND | IRQF_TRIGGER_NONE ,
@@ -1465,15 +1443,15 @@ static int mtk_i2c_resume_noirq(struct device *dev)
1465
1443
int ret ;
1466
1444
struct mtk_i2c * i2c = dev_get_drvdata (dev );
1467
1445
1468
- ret = mtk_i2c_clock_enable ( i2c );
1446
+ ret = clk_bulk_prepare_enable ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1469
1447
if (ret ) {
1470
1448
dev_err (dev , "clock enable failed!\n" );
1471
1449
return ret ;
1472
1450
}
1473
1451
1474
1452
mtk_i2c_init_hw (i2c );
1475
1453
1476
- mtk_i2c_clock_disable ( i2c );
1454
+ clk_bulk_disable_unprepare ( I2C_MT65XX_CLK_MAX , i2c -> clocks );
1477
1455
1478
1456
i2c_mark_adapter_resumed (& i2c -> adap );
1479
1457
0 commit comments