@ -18,8 +18,8 @@
DECLARE_GLOBAL_DATA_PTR ;
struct dm_ sandbox_i2c_emul _priv {
struct udevice * emul ;
struct sandbox_i2c_priv {
bool test_mode ;
} ;
static int get_emul ( struct udevice * dev , struct udevice * * devp ,
@ -47,17 +47,25 @@ static int get_emul(struct udevice *dev, struct udevice **devp,
return 0 ;
}
void sandbox_i2c_set_test_mode ( struct udevice * bus , bool test_mode )
{
struct sandbox_i2c_priv * priv = dev_get_priv ( bus ) ;
priv - > test_mode = test_mode ;
}
static int sandbox_i2c_xfer ( struct udevice * bus , struct i2c_msg * msg ,
int nmsgs )
{
struct dm_i2c_bus * i2c = dev_get_uclass_priv ( bus ) ;
struct sandbox_i2c_priv * priv = dev_get_priv ( bus ) ;
struct dm_i2c_ops * ops ;
struct udevice * emul , * dev ;
bool is_read ;
int ret ;
/* Special test code to return success but with no emulation */
if ( msg - > addr = = SANDBOX_I2C_TEST_ADDR )
if ( priv - > test_mode & & msg - > addr = = SANDBOX_I2C_TEST_ADDR )
return 0 ;
ret = i2c_get_chip ( bus , msg - > addr , 1 , & dev ) ;
@ -68,15 +76,18 @@ static int sandbox_i2c_xfer(struct udevice *bus, struct i2c_msg *msg,
if ( ret )
return ret ;
/*
* For testing , don ' t allow writing above 100 KHz for writes and
* 400 KHz for reads
*/
is_read = nmsgs > 1 ;
if ( i2c - > speed_hz > ( is_read ? 400000 : 100000 ) ) {
debug ( " %s: Max speed exceeded \n " , __func__ ) ;
return - EINVAL ;
if ( priv - > test_mode ) {
/*
* For testing , don ' t allow writing above 100 KHz for writes and
* 400 KHz for reads .
*/
is_read = nmsgs > 1 ;
if ( i2c - > speed_hz > ( is_read ? 400000 : 100000 ) ) {
debug ( " %s: Max speed exceeded \n " , __func__ ) ;
return - EINVAL ;
}
}
return ops - > xfer ( emul , msg , nmsgs ) ;
}
@ -94,4 +105,5 @@ U_BOOT_DRIVER(i2c_sandbox) = {
. id = UCLASS_I2C ,
. of_match = sandbox_i2c_ids ,
. ops = & sandbox_i2c_ops ,
. priv_auto_alloc_size = sizeof ( struct sandbox_i2c_priv ) ,
} ;