summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2011-05-26 15:32:57 +0530
committerNiket Sirsi <nsirsi@nvidia.com>2011-05-27 15:43:00 -0700
commit098ea391265043dc10ca5023b5881fd0d3a2c34d (patch)
tree39deb6b491f182a2fd26f95f9b56c6215ab16a73
parenta07de2f2e0037c15a321dbb93ae4d139d7ad72c8 (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.c37
-rw-r--r--[-rwxr-xr-x]include/linux/mfd/tps6591x.h17
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;
};
/*