automatically add it as parent if the device does not have a parent already Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@xxxxxxxxxxxx> --- drivers/i2c/i2c.c | 26 +++++++++++++++++++------- include/i2c/i2c.h | 5 +++-- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c index 27fd256..dd7dfd7 100644 --- a/drivers/i2c/i2c.c +++ b/drivers/i2c/i2c.c @@ -252,12 +252,20 @@ struct i2c_client *i2c_new_device(struct i2c_adapter *adapter, strcpy(client->dev.name, chip->type); client->dev.type_data = client; client->dev.platform_data = chip->platform_data; - client->dev.bus = &i2c_bus; + client->dev.bus = &i2c_bus_type; client->adapter = adapter; client->addr = chip->addr; status = register_device(&client->dev); + if (status) + goto fail; + + if (!client->dev.parent) { + client->dev.parent = &i2c_bus; + dev_add_child(client->dev.parent, &client->dev); + } + #if 0 /* drivers may modify this initial i/o setup */ status = master->setup(client); @@ -270,11 +278,9 @@ struct i2c_client *i2c_new_device(struct i2c_adapter *adapter, return client; -#if 0 - fail: - free(proxy); +fail: + free(client); return NULL; -#endif } EXPORT_SYMBOL(i2c_new_device); @@ -390,7 +396,12 @@ static void i2c_remove(struct device_d *dev) dev->driver->remove(dev); } -struct bus_type i2c_bus = { +struct device_d i2c_bus = { + .name = "i2c", + .id = DEVICE_ID_SINGLE, +}; + +struct bus_type i2c_bus_type = { .name = "i2c", .match = i2c_match, .probe = i2c_probe, @@ -399,6 +410,7 @@ struct bus_type i2c_bus = { static int i2c_bus_init(void) { - return bus_register(&i2c_bus); + register_device(&i2c_bus); + return bus_register(&i2c_bus_type); } pure_initcall(i2c_bus_init); diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h index de2a7ea..20d7f65 100644 --- a/include/i2c/i2c.h +++ b/include/i2c/i2c.h @@ -139,11 +139,12 @@ extern int i2c_write_reg(struct i2c_client *client, u32 addr, const u8 *buf, u16 #endif /* DOXYGEN_SHOULD_SKIP_THIS */ -extern struct bus_type i2c_bus; +extern struct device_d i2c_bus; +extern struct bus_type i2c_bus_type; static inline int i2c_register_driver(struct driver_d *drv) { - drv->bus = &i2c_bus; + drv->bus = &i2c_bus_type; return register_driver(drv); } -- 1.7.10.4 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox