[PATCH 19 4/5] Convert PowerPC MPC i2c to of_platform_driver from platform_driver

2008-01-11 Thread Jon Smirl
Convert MPC i2c driver from being a platform_driver to an open firmware 
version. Error returns were improved. Routine names were changed from fsl_ to 
mpc_ to make them match the file name.

Signed-off-by: Jon Smirl [EMAIL PROTECTED]
---

 arch/powerpc/sysdev/fsl_soc.c |   96 --
 drivers/i2c/busses/i2c-mpc.c  |  183 -
 2 files changed, 180 insertions(+), 99 deletions(-)


diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
index 94e5c73..d6ef264 100644
--- a/arch/powerpc/sysdev/fsl_soc.c
+++ b/arch/powerpc/sysdev/fsl_soc.c
@@ -318,102 +318,6 @@ err:
 
 arch_initcall(gfar_of_init);
 
-#ifdef CONFIG_I2C_BOARDINFO
-#include linux/i2c.h
-
-static void __init of_register_i2c_devices(struct device_node *adap_node,
-  int bus_num)
-{
-   struct device_node *node = NULL;
-   const char *compatible;
-
-   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;
-
-   compatible = of_get_property(node, compatible, len);
-   if (!compatible) {
-   printk(KERN_WARNING i2c-mpc.c: invalid entry, missing 
compatible attribute\n);
-   continue;
-   }
-   strncpy(info.type, compatible, sizeof(info.type));
-
-   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;
-   struct platform_device *i2c_dev;
-   int ret;
-
-   for (np = NULL, i = 0;
-(np = of_find_compatible_node(np, i2c, fsl-i2c)) != NULL;
-i++) {
-   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_83xx
 static int __init mpc83xx_wdt_init(void)
 {
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c
index 7c35a8f..91fa73c 100644
--- a/drivers/i2c/busses/i2c-mpc.c
+++ b/drivers/i2c/busses/i2c-mpc.c
@@ -17,7 +17,7 @@
 #include linux/module.h
 #include linux/sched.h
 #include linux/init.h
-#include linux/platform_device.h
+#include linux/of_platform.h
 
 #include asm/io.h
 #include linux/fsl_devices.h
@@ -25,13 +25,13 @@
 #include linux/interrupt.h
 #include linux/delay.h
 
-#define MPC_I2C_ADDR  0x00
+#define DRV_NAME mpc-i2c
+
 #define MPC_I2C_FDR0x04
 #define MPC_I2C_CR 0x08
 #define MPC_I2C_SR 0x0c
 #define MPC_I2C_DR 0x10
 #define MPC_I2C_DFSRR 0x14
-#define MPC_I2C_REGION 0x20
 
 #define CCR_MEN  0x80
 #define CCR_MIEN 0x40
@@ -316,6 +316,181 @@ static struct i2c_adapter mpc_ops = {
.retries = 1
 };
 
+struct i2c_driver_device {
+   char*of_device;
+   char*i2c_driver;
+   char*i2c_type;
+};
+
+#ifdef CONFIG_PPC_MERGE
+
+static void of_register_i2c_devices(struct i2c_adapter *adap, struct 
device_node *adap_node)
+{
+   struct device_node *node = NULL;
+
+   while ((node = of_get_next_child(adap_node, node))) {
+   struct 

Re: [PATCH 19 4/5] Convert PowerPC MPC i2c to of_platform_driver from platform_driver

2008-01-11 Thread Stephen Rothwell
Hi Jon,

On Fri, 11 Jan 2008 21:47:46 -0500 Jon Smirl [EMAIL PROTECTED] wrote:

 +++ b/drivers/i2c/busses/i2c-mpc.c

 +static void of_register_i2c_devices(struct i2c_adapter *adap, struct 
 device_node *adap_node)
 +{
 + struct device_node *node = NULL;
 +
 + while ((node = of_get_next_child(adap_node, node))) {

We have for_each_child_of_node(adap_node, node) now for this (and it
means you don't need to initialize the node above).

 + struct i2c_board_info info;
 + const u32 *addr;
 + const char *compatible;
 + int len;
 +
 + addr = of_get_property(node, reg, len);
 + if (!addr || len  sizeof(int) || *addr  (1  10) - 1) {
 + printk(KERN_ERR i2c-mpc.c: invalid entry, missing reg 
 attribute\n);
 + continue;
 + }
 +
 + info.irq = irq_of_parse_and_map(node, 0);
 + if (info.irq == NO_IRQ)
 + info.irq = -1;
 +
 + compatible = of_get_property(node, compatible, len);
 + if (!compatible) {
 + printk(KERN_ERR i2c-mpc.c: invalid entry, missing 
 compatible attribute\n);
 + continue;

You may need to clean up from the irq_of_pase_and_map().

 + }
 + 
 + /* need full alias i2c:NOF,vendor,device */
 + strcpy(info.type, I2C_OF_MODULE_PREFIX);
 + strncat(info.type, compatible, sizeof(info.type));
 + request_module(info.type);
 + 
 + /* need module alias OF,vendor,device */
 + strcpy(info.type, OF_I2C_PREFIX);
 + strncat(info.type, compatible, sizeof(info.type));
 + 
 + info.driver_name[0] = '\0';
 + info.platform_data = NULL;
 + info.addr = *addr;
 +
 + if (!i2c_new_device(adap, info)) {
 + printk(KERN_ERR i2c-mpc.c: Failed to load driver for 
 %s\n, info.type);
 + continue;

And again.

 + }
 + }
 +}
 +
 +static int mpc_i2c_probe(struct of_device *op, const struct of_device_id 
 *match)
 +{

 + dev_set_drvdata(op-dev, i2c);
 +
 + i2c-adap = mpc_ops;
 + i2c_set_adapdata(i2c-adap, i2c);
 + i2c-adap.dev.parent = op-dev;
 +
 + result = i2c_add_adapter(i2c-adap);
 + if (result  0) {
 + printk(KERN_ERR i2c-mpc - failed to add adapter\n);
 + goto fail_add;
 + }
 +
 + of_register_i2c_devices(i2c-adap, op-node);
 +
 + return result;
 +
 +fail_add:

dev_set_dvdata(op-dev, NULL);

 + free_irq(i2c-irq, i2c);
 +fail_request:
 + irq_dispose_mapping(i2c-irq);
 +fail_irq:
 + iounmap(i2c-base);
 +fail_map:
 + kfree(i2c);
 + return result;
 +};

 +static struct of_device_id mpc_i2c_of_match[] = {

const, please.

-- 
Cheers,
Stephen Rothwell[EMAIL PROTECTED]
http://www.canb.auug.org.au/~sfr/


pgp8GVFyhJlad.pgp
Description: PGP signature
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev