@ -50,7 +50,7 @@ static int i2c_setup_offset(struct dm_i2c_chip *chip, uint offset,
static int i2c_read_bytewise ( struct udevice * dev , uint offset ,
uint8_t * buffer , int len )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
struct udevice * bus = dev_get_parent ( dev ) ;
struct dm_i2c_ops * ops = i2c_get_ops ( bus ) ;
struct i2c_msg msg [ 2 ] , * ptr ;
@ -79,7 +79,7 @@ static int i2c_read_bytewise(struct udevice *dev, uint offset,
static int i2c_write_bytewise ( struct udevice * dev , uint offset ,
const uint8_t * buffer , int len )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
struct udevice * bus = dev_get_parent ( dev ) ;
struct dm_i2c_ops * ops = i2c_get_ops ( bus ) ;
struct i2c_msg msg [ 1 ] ;
@ -102,7 +102,7 @@ static int i2c_write_bytewise(struct udevice *dev, uint offset,
int dm_i2c_read ( struct udevice * dev , uint offset , uint8_t * buffer , int len )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
struct udevice * bus = dev_get_parent ( dev ) ;
struct dm_i2c_ops * ops = i2c_get_ops ( bus ) ;
struct i2c_msg msg [ 2 ] , * ptr ;
@ -133,7 +133,7 @@ int dm_i2c_read(struct udevice *dev, uint offset, uint8_t *buffer, int len)
int dm_i2c_write ( struct udevice * dev , uint offset , const uint8_t * buffer ,
int len )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
struct udevice * bus = dev_get_parent ( dev ) ;
struct dm_i2c_ops * ops = i2c_get_ops ( bus ) ;
struct i2c_msg msg [ 1 ] ;
@ -223,7 +223,7 @@ static int i2c_probe_chip(struct udevice *bus, uint chip_addr,
static int i2c_bind_driver ( struct udevice * bus , uint chip_addr , uint offset_len ,
struct udevice * * devp )
{
struct dm_i2c_chip chip ;
struct dm_i2c_chip * chip ;
char name [ 30 ] , * str ;
struct udevice * dev ;
int ret ;
@ -236,11 +236,11 @@ static int i2c_bind_driver(struct udevice *bus, uint chip_addr, uint offset_len,
goto err_bind ;
/* Tell the device what we know about it */
memset ( & chip , ' \0 ' , sizeof ( chip ) ) ;
chip . chip_addr = chip_addr ;
chip . offset_len = offset_len ;
ret = device_probe_child ( dev , & chip ) ;
debug ( " %s: device_probe_child : ret=%d \n " , __func__ , ret ) ;
chip = dev_get_parent_platdata ( dev ) ;
chip - > chip_addr = chip_addr ;
chip - > offset_len = offset_len ;
ret = device_probe ( dev ) ;
debug ( " %s: device_probe: ret=%d \n " , __func__ , ret ) ;
if ( ret )
goto err_probe ;
@ -248,6 +248,10 @@ static int i2c_bind_driver(struct udevice *bus, uint chip_addr, uint offset_len,
return 0 ;
err_probe :
/*
* If the device failed to probe , unbind it . There is nothing there
* on the bus so we don ' t want to leave it lying around
*/
device_unbind ( dev ) ;
err_bind :
free ( str ) ;
@ -263,15 +267,9 @@ int i2c_get_chip(struct udevice *bus, uint chip_addr, uint offset_len,
bus - > name , chip_addr ) ;
for ( device_find_first_child ( bus , & dev ) ; dev ;
device_find_next_child ( & dev ) ) {
struct dm_i2c_chip store ;
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_platdata ( dev ) ;
int ret ;
if ( ! chip ) {
chip = & store ;
i2c_chip_ofdata_to_platdata ( gd - > fdt_blob ,
dev - > of_offset , chip ) ;
}
if ( chip - > chip_addr = = chip_addr ) {
ret = device_probe ( dev ) ;
debug ( " found, ret=%d \n " , ret ) ;
@ -367,7 +365,7 @@ int i2c_get_bus_speed(struct udevice *bus)
int i2c_set_chip_flags ( struct udevice * dev , uint flags )
{
struct udevice * bus = dev - > parent ;
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
struct dm_i2c_ops * ops = i2c_get_ops ( bus ) ;
int ret ;
@ -383,7 +381,7 @@ int i2c_set_chip_flags(struct udevice *dev, uint flags)
int i2c_get_chip_flags ( struct udevice * dev , uint * flagsp )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
* flagsp = chip - > flags ;
@ -392,7 +390,7 @@ int i2c_get_chip_flags(struct udevice *dev, uint *flagsp)
int i2c_set_chip_offset_len ( struct udevice * dev , uint offset_len )
{
struct dm_i2c_chip * chip = dev_get_parentdata ( dev ) ;
struct dm_i2c_chip * chip = dev_get_parent_plat data ( dev ) ;
if ( offset_len > I2C_MAX_OFFSET_LEN )
return - EINVAL ;
@ -444,19 +442,31 @@ static int i2c_post_probe(struct udevice *dev)
return i2c_set_bus_speed ( dev , i2c - > speed_hz ) ;
}
int i2c_post_bind ( struct udevice * dev )
static int i2c_post_bind ( struct udevice * dev )
{
/* Scan the bus for devices */
return dm_scan_fdt_node ( dev , gd - > fdt_blob , dev - > of_offset , false ) ;
}
static int i2c_child_post_bind ( struct udevice * dev )
{
struct dm_i2c_chip * plat = dev_get_parent_platdata ( dev ) ;
if ( dev - > of_offset = = - 1 )
return 0 ;
return i2c_chip_ofdata_to_platdata ( gd - > fdt_blob , dev - > of_offset , plat ) ;
}
UCLASS_DRIVER ( i2c ) = {
. id = UCLASS_I2C ,
. name = " i2c " ,
. flags = DM_UC_FLAG_SEQ_ALIAS ,
. per_device_auto_alloc_size = sizeof ( struct dm_i2c_bus ) ,
. post_bind = i2c_post_bind ,
. post_probe = i2c_post_probe ,
. per_device_auto_alloc_size = sizeof ( struct dm_i2c_bus ) ,
. per_child_platdata_auto_alloc_size = sizeof ( struct dm_i2c_chip ) ,
. child_post_bind = i2c_child_post_bind ,
} ;
UCLASS_DRIVER ( i2c_generic ) = {