@@ -143,10 +143,10 @@ static int rtl9300_i2c_write(struct rtl9300_i2c *i2c, u8 *buf, int len)
143
143
return - EIO ;
144
144
145
145
for (i = 0 ; i < len ; i ++ ) {
146
- if (i % 4 == 0 )
147
- vals [ i / 4 ] = 0 ;
148
- vals [ i / 4 ] <<= 8 ;
149
- vals [i / 4 ] |= buf [i ];
146
+ unsigned int shift = (i % 4 ) * 8 ;
147
+ unsigned int reg = i / 4 ;
148
+
149
+ vals [reg ] |= buf [i ] << shift ;
150
150
}
151
151
152
152
return regmap_bulk_write (i2c -> regmap , i2c -> reg_base + RTL9300_I2C_MST_DATA_WORD0 ,
@@ -175,7 +175,7 @@ static int rtl9300_i2c_execute_xfer(struct rtl9300_i2c *i2c, char read_write,
175
175
return ret ;
176
176
177
177
ret = regmap_read_poll_timeout (i2c -> regmap , i2c -> reg_base + RTL9300_I2C_MST_CTRL1 ,
178
- val , !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG ), 100 , 2000 );
178
+ val , !(val & RTL9300_I2C_MST_CTRL1_I2C_TRIG ), 100 , 100000 );
179
179
if (ret )
180
180
return ret ;
181
181
@@ -281,15 +281,19 @@ static int rtl9300_i2c_smbus_xfer(struct i2c_adapter *adap, u16 addr, unsigned s
281
281
ret = rtl9300_i2c_reg_addr_set (i2c , command , 1 );
282
282
if (ret )
283
283
goto out_unlock ;
284
- ret = rtl9300_i2c_config_xfer (i2c , chan , addr , data -> block [0 ]);
284
+ if (data -> block [0 ] < 1 || data -> block [0 ] > I2C_SMBUS_BLOCK_MAX ) {
285
+ ret = - EINVAL ;
286
+ goto out_unlock ;
287
+ }
288
+ ret = rtl9300_i2c_config_xfer (i2c , chan , addr , data -> block [0 ] + 1 );
285
289
if (ret )
286
290
goto out_unlock ;
287
291
if (read_write == I2C_SMBUS_WRITE ) {
288
- ret = rtl9300_i2c_write (i2c , & data -> block [1 ], data -> block [0 ]);
292
+ ret = rtl9300_i2c_write (i2c , & data -> block [0 ], data -> block [0 ] + 1 );
289
293
if (ret )
290
294
goto out_unlock ;
291
295
}
292
- len = data -> block [0 ];
296
+ len = data -> block [0 ] + 1 ;
293
297
break ;
294
298
295
299
default :
0 commit comments