[PATCH v2] powerpc: Add of_register_i2c_devices().
From: Scott Wood <hidden>
Date: 2007-05-17 15:07:06
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Linus Torvalds
Add of_register_i2c_devices(), which scans the children of the specified I2C adapter node, and registers them with the I2C code. Signed-off-by: Scott Wood <redacted> --- Now without the i2c-mpc bit. Sorry about that. arch/powerpc/kernel/prom_parse.c | 42 ++++++++++++++++++++++++++++++++++++++ include/asm-powerpc/prom.h | 1 + 2 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/arch/powerpc/kernel/prom_parse.c b/arch/powerpc/kernel/prom_parse.c
index 3786dcc..5e80062 100644
--- a/arch/powerpc/kernel/prom_parse.c
+++ b/arch/powerpc/kernel/prom_parse.c@@ -1067,3 +1067,45 @@ void __iomem *of_iomap(struct device_node *np, int index) return ioremap(res.start, 1 + res.end - res.start); } EXPORT_SYMBOL(of_iomap); + +#ifdef CONFIG_I2C +#include <linux/i2c.h> + +void of_register_i2c_devices(struct device_node *adap_node, int bus_num) +{ + struct device_node *node = NULL; + + while ((node = of_get_next_child(adap_node, node))) { + struct i2c_board_info info; + const u32 *addr; + const char *name; + int len; + + addr = get_property(node, "reg", &len); + if (!addr || len < sizeof(int) || *addr > 0xffff) + continue; + + info.irq = irq_of_parse_and_map(node, 0); + if (info.irq == NO_IRQ) + info.irq = -1; + + name = get_property(node, "compatible", NULL); + if (!name) + name = node->name; + if (!name) + continue; + + /* FIXME: the i2c code should allow drivers to specify + * multiple match names; board code shouldn't need to + * know what driver will handle a given type. + */ + + snprintf(info.driver_name, KOBJ_NAME_LEN, name); + snprintf(info.type, KOBJ_NAME_LEN, name); + info.platform_data = NULL; + info.addr = *addr; + + i2c_register_board_info(bus_num, &info, 1); + } +} +#endif /* CONFIG_I2C */
diff --git a/include/asm-powerpc/prom.h b/include/asm-powerpc/prom.h
index 6845af9..ed085e1 100644
--- a/include/asm-powerpc/prom.h
+++ b/include/asm-powerpc/prom.h@@ -305,6 +305,7 @@ extern int of_irq_map_raw(struct device_node *parent, const u32 *intspec, u32 ointsize, const u32 *addr, struct of_irq *out_irq); +void of_register_i2c_devices(struct device_node *adap_node, int bus_num); /** * of_irq_map_one - Resolve an interrupt for a device
--
1.5.0.3