diff options
author | Laxman Dewangan <ldewangan@nvidia.com> | 2011-05-26 15:32:57 +0530 |
---|---|---|
committer | Niket Sirsi <nsirsi@nvidia.com> | 2011-05-27 15:43:00 -0700 |
commit | 098ea391265043dc10ca5023b5881fd0d3a2c34d (patch) | |
tree | 39deb6b491f182a2fd26f95f9b56c6215ab16a73 | |
parent | a07de2f2e0037c15a321dbb93ae4d139d7ad72c8 (diff) |
mfd: tps6591x: Adding init time configuration for gpios
Adding the init configuration parameter for initializing the gpio of
tps6591x pmic device.
The configuration parameter is passed through platform data.
bug 821295
Change-Id: If83e0b7edfec4d15a879fcf9085506573efbc1ac
Reviewed-on: http://git-master/r/32613
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Tested-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: Scott Williams <scwilliams@nvidia.com>
-rw-r--r-- | drivers/mfd/tps6591x.c | 37 | ||||
-rw-r--r--[-rwxr-xr-x] | include/linux/mfd/tps6591x.h | 17 |
2 files changed, 48 insertions, 6 deletions
diff --git a/drivers/mfd/tps6591x.c b/drivers/mfd/tps6591x.c index f317732ade1d..20716f532a27 100644 --- a/drivers/mfd/tps6591x.c +++ b/drivers/mfd/tps6591x.c @@ -63,6 +63,10 @@ /* silicon version number */ #define TPS6591X_VERNUM 0x80 +#define TPS6591X_GPIO_SLEEP 7 +#define TPS6591X_GPIO_PDEN 3 +#define TPS6591X_GPIO_DIR 2 + struct tps6591x_irq_data { u8 mask_reg; u8 mask_mask; @@ -346,13 +350,36 @@ static int tps6591x_gpio_output(struct gpio_chip *gc, unsigned offset, offset, reg_val); } -static void tps6591x_gpio_init(struct tps6591x *tps6591x, int gpio_base) +static void tps6591x_gpio_init(struct tps6591x *tps6591x, + struct tps6591x_platform_data *pdata) { int ret; + int gpio_base = pdata->gpio_base; + int i; + u8 gpio_reg; + struct tps6591x_gpio_init_data *ginit; - if (!gpio_base) + if (gpio_base <= 0) return; + for (i = 0; i < pdata->num_gpioinit_data; ++i) { + ginit = &pdata->gpio_init_data[i]; + if (!ginit->init_apply) + continue; + gpio_reg = (ginit->sleep_en << TPS6591X_GPIO_SLEEP) | + (ginit->pulldn_en << TPS6591X_GPIO_PDEN) | + (ginit->output_mode_en << TPS6591X_GPIO_DIR); + + if (ginit->output_mode_en) + gpio_reg |= ginit->output_val; + + ret = __tps6591x_write(tps6591x->client, + TPS6591X_GPIO_BASE_ADDR + i, gpio_reg); + if (ret < 0) + dev_err(&tps6591x->client->dev, "Gpio %d init " + "configuration failed: %d\n", i, ret); + } + tps6591x->gpio.owner = THIS_MODULE; tps6591x->gpio.label = tps6591x->client->name; tps6591x->gpio.dev = tps6591x->dev; @@ -733,7 +760,7 @@ static int __devinit tps6591x_i2c_probe(struct i2c_client *client, goto err_add_devs; } - tps6591x_gpio_init(tps6591x, pdata->gpio_base); + tps6591x_gpio_init(tps6591x, pdata); tps6591x_debuginit(tps6591x); @@ -758,6 +785,10 @@ static int __devexit tps6591x_i2c_remove(struct i2c_client *client) if (client->irq) free_irq(client->irq, tps6591x); + if (gpiochip_remove(&tps6591x->gpio) < 0) + dev_err(&client->dev, "Error in removing the gpio driver\n"); + + kfree(tps6591x); return 0; } #ifdef CONFIG_PM diff --git a/include/linux/mfd/tps6591x.h b/include/linux/mfd/tps6591x.h index ac6527491610..9135779a0828 100755..100644 --- a/include/linux/mfd/tps6591x.h +++ b/include/linux/mfd/tps6591x.h @@ -88,15 +88,26 @@ struct tps6591x_sleep_keepon_data { unsigned i2chs_keepon:1; /* high speed internal clock */ }; -struct tps6591x_platform_data { - int num_subdevs; - struct tps6591x_subdev_info *subdevs; +struct tps6591x_gpio_init_data { + unsigned sleep_en:1; /* Enable sleep mode */ + unsigned pulldn_en:1; /* Enable pull down */ + unsigned output_mode_en:1; /* Enable output mode during init */ + unsigned output_val:1; /* Output value if it is in output mode */ + unsigned init_apply:1; /* Apply init data on configuring gpios*/ +}; +struct tps6591x_platform_data { int gpio_base; int irq_base; + int num_subdevs; + struct tps6591x_subdev_info *subdevs; + bool dev_slp_en; struct tps6591x_sleep_keepon_data *slp_keepon; + + struct tps6591x_gpio_init_data *gpio_init_data; + int num_gpioinit_data; }; /* |