Skip to content

Commit

Permalink
mfd/tc3589x: add block identifier for multiple child devices
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sundar Iyer authored and Linus Walleij committed Dec 19, 2010
1 parent 20406eb commit 611b759
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 5 deletions.
1 change: 1 addition & 0 deletions arch/arm/mach-ux500/board-mop500.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down
28 changes: 23 additions & 5 deletions drivers/mfd/tc3589x.c
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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;
}

Expand Down
7 changes: 7 additions & 0 deletions include/linux/mfd/tc3589x.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
};
Expand Down

0 comments on commit 611b759

Please sign in to comment.