i2c: Convert PowerPC MPC i2c to of_platform_driver from platform_driver
Subsystems (3)
Based on earlier work by Jon Smirl.
Changed common name from powerpc_ to of_ per Olof's suggestion.
Convert MPC i2c driver from a platform_driver to a of_platform_driver. Add the ability to dynamically load i2c drivers based on device tree names. Routine names were changed from fsl_ to mpc_ to make them match the file name. Common code moved to of-common.* Orginal ppc driver left intact for deletion when ppc arch is removed.
Signed-off-by Jochen Friedrich <[email protected]>
Cc Jon Smirl <[email protected]>
--- arch/powerpc/sysdev/fsl_soc.c | 123 --------------------------------- drivers/i2c/busses/i2c-mpc.c | 150 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 144 insertions(+), 129 deletions(-)
arch/powerpc/sysdev/fsl_soc.c +0 -123
@@ -386,129 +386,6 @@ err:arch_initcall (gfar_of_init); -#ifdef CONFIG_I2C_BOARDINFO -#include <linux/i2c.h> -struct i2c_driver_device { -char *of_device; -char *i2c_type; -}; - -static struct i2c_driver_device i2c_devices[]__initdata = { - {"ricoh,rs5c372a" ,"rs5c372a" ,}, - {"ricoh,rs5c372b" ,"rs5c372b" ,}, - {"ricoh,rv5c386" ,"rv5c386" ,}, - {"ricoh,rv5c387a" ,"rv5c387a" ,}, - {"dallas,ds1307" ,"ds1307" ,}, - {"dallas,ds1337" ,"ds1337" ,}, - {"dallas,ds1338" ,"ds1338" ,}, - {"dallas,ds1339" ,"ds1339" ,}, - {"dallas,ds1340" ,"ds1340" ,}, - {"stm,m41t00" ,"m41t00" }, - {"dallas,ds1374" ,"rtc-ds1374" ,}, -}; - -static int __init of_find_i2c_driver (struct device_node *node, -struct i2c_board_info *info) -{ -int i; - -for (i =0 ; i <ARRAY_SIZE (i2c_devices); i++) { -if (!of_device_is_compatible (node, i2c_devices[i].of_device)) -continue ; -if (strlcpy (info->type, i2c_devices[i].i2c_type, -I2C_NAME_SIZE ) >=I2C_NAME_SIZE ) -return -ENOMEM ; -return 0 ; - } -return -ENODEV ; -} - -static void __init 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; -int len; - - addr =of_get_property (node,"reg" , &len); -if (!addr || len <sizeof (int ) || *addr > (1 <<10 ) -1 ) { -printk (KERN_WARNING "fsl_soc.c: invalid i2c device entry\n" ); -continue ; - } - - info.irq =irq_of_parse_and_map (node,0 ); -if (info.irq ==NO_IRQ ) - info.irq =-1 ; - -if (of_find_i2c_driver (node, &info) <0 ) -continue ; - - info.addr = *addr; - -i2c_register_board_info (bus_num, &info,1 ); - } -} - -static int __init fsl_i2c_of_init (void ) -{ -struct device_node *np; -unsigned int i =0 ; -struct platform_device *i2c_dev; -int ret; - -for_each_compatible_node (np,NULL ,"fsl-i2c" ) { -struct resource r[2 ]; -struct fsl_i2c_platform_data i2c_data; -const unsigned char *flags =NULL ; - -memset (&r,0 ,sizeof (r)); -memset (&i2c_data,0 ,sizeof (i2c_data)); - - ret =of_address_to_resource (np,0 , &r[0 ]); -if (ret) - goto err; - -of_irq_to_resource (np,0 , &r[1 ]); - - i2c_dev =platform_device_register_simple ("fsl-i2c" , i, r,2 ); -if (IS_ERR (i2c_dev)) { - ret =PTR_ERR (i2c_dev); - goto err; - } - - i2c_data.device_flags =0 ; - flags =of_get_property (np,"dfsrr" ,NULL ); -if (flags) - i2c_data.device_flags |=FSL_I2C_DEV_SEPARATE_DFSRR ; - - flags =of_get_property (np,"fsl5200-clocking" ,NULL ); -if (flags) - i2c_data.device_flags |=FSL_I2C_DEV_CLOCK_5200 ; - - ret = -platform_device_add_data (i2c_dev, &i2c_data, -sizeof (struct -fsl_i2c_platform_data )); -if (ret) - goto unreg; - -of_register_i2c_devices (np, i++); - } - -return 0 ; - -unreg: -platform_device_unregister (i2c_dev); -err: -return ret; -} - -arch_initcall (fsl_i2c_of_init); -#endif -#ifdef CONFIG_PPC_83xxstatic int __init mpc83xx_wdt_init (void ) {
drivers/i2c/busses/i2c-mpc.c +144 -6
197 lines not on this page · raw message
Signature · 1 line
1.5.4.5