@@ -482,10 +482,8 @@ static int omap_i2c_wait_for_bb(struct omap_i2c_dev *dev)
482482
483483 timeout = jiffies + OMAP_I2C_TIMEOUT ;
484484 while (omap_i2c_read_reg (dev , OMAP_I2C_STAT_REG ) & OMAP_I2C_STAT_BB ) {
485- if (time_after (jiffies , timeout )) {
486- dev_warn (dev -> dev , "timeout waiting for bus ready\n" );
487- return - ETIMEDOUT ;
488- }
485+ if (time_after (jiffies , timeout ))
486+ return i2c_recover_bus (& dev -> adapter );
489487 msleep (1 );
490488 }
491489
@@ -1210,6 +1208,68 @@ MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
12101208#define OMAP_I2C_SCHEME_0 0
12111209#define OMAP_I2C_SCHEME_1 1
12121210
1211+ static int omap_i2c_get_scl (struct i2c_adapter * adap )
1212+ {
1213+ struct omap_i2c_dev * dev = i2c_get_adapdata (adap );
1214+ u32 reg ;
1215+
1216+ reg = omap_i2c_read_reg (dev , OMAP_I2C_SYSTEST_REG );
1217+
1218+ return reg & OMAP_I2C_SYSTEST_SCL_I_FUNC ;
1219+ }
1220+
1221+ static int omap_i2c_get_sda (struct i2c_adapter * adap )
1222+ {
1223+ struct omap_i2c_dev * dev = i2c_get_adapdata (adap );
1224+ u32 reg ;
1225+
1226+ reg = omap_i2c_read_reg (dev , OMAP_I2C_SYSTEST_REG );
1227+
1228+ return reg & OMAP_I2C_SYSTEST_SDA_I_FUNC ;
1229+ }
1230+
1231+ static void omap_i2c_set_scl (struct i2c_adapter * adap , int val )
1232+ {
1233+ struct omap_i2c_dev * dev = i2c_get_adapdata (adap );
1234+ u32 reg ;
1235+
1236+ reg = omap_i2c_read_reg (dev , OMAP_I2C_SYSTEST_REG );
1237+ if (val )
1238+ reg |= OMAP_I2C_SYSTEST_SCL_O ;
1239+ else
1240+ reg &= ~OMAP_I2C_SYSTEST_SCL_O ;
1241+ omap_i2c_write_reg (dev , OMAP_I2C_SYSTEST_REG , reg );
1242+ }
1243+
1244+ static void omap_i2c_prepare_recovery (struct i2c_adapter * adap )
1245+ {
1246+ struct omap_i2c_dev * dev = i2c_get_adapdata (adap );
1247+ u32 reg ;
1248+
1249+ reg = omap_i2c_read_reg (dev , OMAP_I2C_SYSTEST_REG );
1250+ reg |= OMAP_I2C_SYSTEST_ST_EN ;
1251+ omap_i2c_write_reg (dev , OMAP_I2C_SYSTEST_REG , reg );
1252+ }
1253+
1254+ static void omap_i2c_unprepare_recovery (struct i2c_adapter * adap )
1255+ {
1256+ struct omap_i2c_dev * dev = i2c_get_adapdata (adap );
1257+ u32 reg ;
1258+
1259+ reg = omap_i2c_read_reg (dev , OMAP_I2C_SYSTEST_REG );
1260+ reg &= ~OMAP_I2C_SYSTEST_ST_EN ;
1261+ omap_i2c_write_reg (dev , OMAP_I2C_SYSTEST_REG , reg );
1262+ }
1263+
1264+ static struct i2c_bus_recovery_info omap_i2c_bus_recovery_info = {
1265+ .get_scl = omap_i2c_get_scl ,
1266+ .get_sda = omap_i2c_get_sda ,
1267+ .set_scl = omap_i2c_set_scl ,
1268+ .prepare_recovery = omap_i2c_prepare_recovery ,
1269+ .unprepare_recovery = omap_i2c_unprepare_recovery ,
1270+ .recover_bus = i2c_generic_scl_recovery ,
1271+ };
1272+
12131273static int
12141274omap_i2c_probe (struct platform_device * pdev )
12151275{
@@ -1359,6 +1419,7 @@ omap_i2c_probe(struct platform_device *pdev)
13591419 adap -> algo = & omap_i2c_algo ;
13601420 adap -> dev .parent = & pdev -> dev ;
13611421 adap -> dev .of_node = pdev -> dev .of_node ;
1422+ adap -> bus_recovery_info = & omap_i2c_bus_recovery_info ;
13621423
13631424 /* i2c device drivers may be active on return from add_adapter() */
13641425 adap -> nr = pdev -> id ;
0 commit comments