]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
mfd/tc3589x: add block identifier for multiple child devices
authorSundar Iyer <sundar.iyer@stericsson.com>
Mon, 13 Dec 2010 04:03:15 +0000 (09:33 +0530)
committerLinus Walleij <linus.walleij@stericsson.com>
Sun, 19 Dec 2010 18:27:49 +0000 (19:27 +0100)
Add block identifier to be able to add multiple mfd clients
to the mfd core

Acked-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Sundar Iyer <sundar.iyer@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
arch/arm/mach-ux500/board-mop500.c
drivers/mfd/tc3589x.c
include/linux/mfd/tc3589x.h

index 5c950261968e7a4a0199ef84c4321dd4136a7735..060b23aab8e4475f4f3e57685600c351b3dec361 100644 (file)
@@ -122,6 +122,7 @@ static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
 };
 
 static struct tc3589x_platform_data mop500_tc35892_data = {
+       .block          = TC3589x_BLOCK_GPIO,
        .gpio           = &mop500_tc35892_gpio_data,
        .irq_base       = MOP500_EGPIO_IRQ_BASE,
 };
index 7deff53181d168d3d68fd8ad20b92691473ebcbf..0ed9669d95fa18d8c6199ca1c06a52f2140932ae 100644 (file)
@@ -129,7 +129,7 @@ static struct resource gpio_resources[] = {
        },
 };
 
-static struct mfd_cell tc3589x_devs[] = {
+static struct mfd_cell tc3589x_dev_gpio[] = {
        {
                .name           = "tc3589x-gpio",
                .num_resources  = ARRAY_SIZE(gpio_resources),
@@ -240,6 +240,26 @@ static int tc3589x_chip_init(struct tc3589x *tc3589x)
        return tc3589x_reg_write(tc3589x, TC3589x_RSTINTCLR, 0x1);
 }
 
+static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
+{
+       int ret = 0;
+       unsigned int blocks = tc3589x->pdata->block;
+
+       if (blocks & TC3589x_BLOCK_GPIO) {
+               ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
+                               ARRAY_SIZE(tc3589x_dev_gpio), NULL,
+                               tc3589x->irq_base);
+               if (ret) {
+                       dev_err(tc3589x->dev, "failed to add gpio child\n");
+                       return ret;
+               }
+               dev_info(tc3589x->dev, "added gpio block\n");
+       }
+
+       return ret;
+
+}
+
 static int __devinit tc3589x_probe(struct i2c_client *i2c,
                                   const struct i2c_device_id *id)
 {
@@ -281,11 +301,9 @@ static int __devinit tc3589x_probe(struct i2c_client *i2c,
                goto out_removeirq;
        }
 
-       ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_devs,
-                             ARRAY_SIZE(tc3589x_devs), NULL,
-                             tc3589x->irq_base);
+       ret = tc3589x_device_init(tc3589x);
        if (ret) {
-               dev_err(tc3589x->dev, "failed to add children\n");
+               dev_err(tc3589x->dev, "failed to add child devices\n");
                goto out_freeirq;
        }
 
index ea1918896f5b340e462806ea1aebf3e7983fcdc3..da00958b12d9de212476c774a26942aab5d0703c 100644 (file)
@@ -9,6 +9,11 @@
 
 #include <linux/device.h>
 
+enum tx3589x_block {
+       TC3589x_BLOCK_GPIO        = 1 << 0,
+       TC3589x_BLOCK_KEYPAD      = 1 << 1,
+};
+
 #define TC3589x_RSTCTRL_IRQRST (1 << 4)
 #define TC3589x_RSTCTRL_TIMRST (1 << 3)
 #define TC3589x_RSTCTRL_ROTRST (1 << 2)
@@ -122,10 +127,12 @@ struct tc3589x_gpio_platform_data {
 
 /**
  * struct tc3589x_platform_data - TC3589x platform data
+ * @block: bitmask of blocks to enable (use TC3589x_BLOCK_*)
  * @irq_base: base IRQ number.  %TC3589x_NR_IRQS irqs will be used.
  * @gpio: GPIO-specific platform data
  */
 struct tc3589x_platform_data {
+       unsigned int block;
        int irq_base;
        struct tc3589x_gpio_platform_data *gpio;
 };