@@ -265,6 +265,9 @@ struct pxa_i2c {
265
265
u32 hs_mask ;
266
266
267
267
struct i2c_bus_recovery_info recovery ;
268
+ struct pinctrl * pinctrl ;
269
+ struct pinctrl_state * pinctrl_default ;
270
+ struct pinctrl_state * pinctrl_recovery ;
268
271
};
269
272
270
273
#define _IBMR (i2c ) ((i2c)->reg_ibmr)
@@ -1299,12 +1302,13 @@ static void i2c_pxa_prepare_recovery(struct i2c_adapter *adap)
1299
1302
*/
1300
1303
gpiod_set_value (i2c -> recovery .scl_gpiod , ibmr & IBMR_SCLS );
1301
1304
gpiod_set_value (i2c -> recovery .sda_gpiod , ibmr & IBMR_SDAS );
1305
+
1306
+ WARN_ON (pinctrl_select_state (i2c -> pinctrl , i2c -> pinctrl_recovery ));
1302
1307
}
1303
1308
1304
1309
static void i2c_pxa_unprepare_recovery (struct i2c_adapter * adap )
1305
1310
{
1306
1311
struct pxa_i2c * i2c = adap -> algo_data ;
1307
- struct i2c_bus_recovery_info * bri = adap -> bus_recovery_info ;
1308
1312
u32 isr ;
1309
1313
1310
1314
/*
@@ -1318,7 +1322,7 @@ static void i2c_pxa_unprepare_recovery(struct i2c_adapter *adap)
1318
1322
i2c_pxa_do_reset (i2c );
1319
1323
}
1320
1324
1321
- WARN_ON (pinctrl_select_state (bri -> pinctrl , bri -> pins_default ));
1325
+ WARN_ON (pinctrl_select_state (i2c -> pinctrl , i2c -> pinctrl_default ));
1322
1326
1323
1327
dev_dbg (& i2c -> adap .dev , "recovery: IBMR 0x%08x ISR 0x%08x\n" ,
1324
1328
readl (_IBMR (i2c )), readl (_ISR (i2c )));
@@ -1340,20 +1344,76 @@ static int i2c_pxa_init_recovery(struct pxa_i2c *i2c)
1340
1344
if (IS_ENABLED (CONFIG_I2C_PXA_SLAVE ))
1341
1345
return 0 ;
1342
1346
1343
- bri -> pinctrl = devm_pinctrl_get (dev );
1344
- if (PTR_ERR (bri -> pinctrl ) == - ENODEV ) {
1345
- bri -> pinctrl = NULL ;
1347
+ i2c -> pinctrl = devm_pinctrl_get (dev );
1348
+ if (PTR_ERR (i2c -> pinctrl ) == - ENODEV )
1349
+ i2c -> pinctrl = NULL ;
1350
+ if (IS_ERR (i2c -> pinctrl ))
1351
+ return PTR_ERR (i2c -> pinctrl );
1352
+
1353
+ if (!i2c -> pinctrl )
1354
+ return 0 ;
1355
+
1356
+ i2c -> pinctrl_default = pinctrl_lookup_state (i2c -> pinctrl ,
1357
+ PINCTRL_STATE_DEFAULT );
1358
+ i2c -> pinctrl_recovery = pinctrl_lookup_state (i2c -> pinctrl , "recovery" );
1359
+
1360
+ if (IS_ERR (i2c -> pinctrl_default ) || IS_ERR (i2c -> pinctrl_recovery )) {
1361
+ dev_info (dev , "missing pinmux recovery information: %ld %ld\n" ,
1362
+ PTR_ERR (i2c -> pinctrl_default ),
1363
+ PTR_ERR (i2c -> pinctrl_recovery ));
1364
+ return 0 ;
1365
+ }
1366
+
1367
+ /*
1368
+ * Claiming GPIOs can influence the pinmux state, and may glitch the
1369
+ * I2C bus. Do this carefully.
1370
+ */
1371
+ bri -> scl_gpiod = devm_gpiod_get (dev , "scl" , GPIOD_OUT_HIGH_OPEN_DRAIN );
1372
+ if (bri -> scl_gpiod == ERR_PTR (- EPROBE_DEFER ))
1373
+ return - EPROBE_DEFER ;
1374
+ if (IS_ERR (bri -> scl_gpiod )) {
1375
+ dev_info (dev , "missing scl gpio recovery information: %pe\n" ,
1376
+ bri -> scl_gpiod );
1377
+ return 0 ;
1378
+ }
1379
+
1380
+ /*
1381
+ * We have SCL. Pull SCL low and wait a bit so that SDA glitches
1382
+ * have no effect.
1383
+ */
1384
+ gpiod_direction_output (bri -> scl_gpiod , 0 );
1385
+ udelay (10 );
1386
+ bri -> sda_gpiod = devm_gpiod_get (dev , "sda" , GPIOD_OUT_HIGH_OPEN_DRAIN );
1387
+
1388
+ /* Wait a bit in case of a SDA glitch, and then release SCL. */
1389
+ udelay (10 );
1390
+ gpiod_direction_output (bri -> scl_gpiod , 1 );
1391
+
1392
+ if (bri -> sda_gpiod == ERR_PTR (- EPROBE_DEFER ))
1393
+ return - EPROBE_DEFER ;
1394
+
1395
+ if (IS_ERR (bri -> sda_gpiod )) {
1396
+ dev_info (dev , "missing sda gpio recovery information: %pe\n" ,
1397
+ bri -> sda_gpiod );
1346
1398
return 0 ;
1347
1399
}
1348
- if (IS_ERR (bri -> pinctrl ))
1349
- return PTR_ERR (bri -> pinctrl );
1350
1400
1351
1401
bri -> prepare_recovery = i2c_pxa_prepare_recovery ;
1352
1402
bri -> unprepare_recovery = i2c_pxa_unprepare_recovery ;
1403
+ bri -> recover_bus = i2c_generic_scl_recovery ;
1353
1404
1354
1405
i2c -> adap .bus_recovery_info = bri ;
1355
1406
1356
- return 0 ;
1407
+ /*
1408
+ * Claiming GPIOs can change the pinmux state, which confuses the
1409
+ * pinctrl since pinctrl's idea of the current setting is unaffected
1410
+ * by the pinmux change caused by claiming the GPIO. Work around that
1411
+ * by switching pinctrl to the GPIO state here. We do it this way to
1412
+ * avoid glitching the I2C bus.
1413
+ */
1414
+ pinctrl_select_state (i2c -> pinctrl , i2c -> pinctrl_recovery );
1415
+
1416
+ return pinctrl_select_state (i2c -> pinctrl , i2c -> pinctrl_default );
1357
1417
}
1358
1418
1359
1419
static int i2c_pxa_probe (struct platform_device * dev )
0 commit comments