Skip to content

Commit

Permalink
TPS65910: GPIO: Add GPIO driver
Browse files Browse the repository at this point in the history
TPS65910 has one configurable GPIO that can be used for several
purposes. Subsequent versions of the TPS chip support more than
one GPIO.

Signed-off-by: Graeme Gregory <gg@slimlogic.co.uk>
Signed-off-by: Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>
Acked-by: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
  • Loading branch information
Graeme Gregory authored and Liam Girdwood committed May 27, 2011
1 parent 27c6750 commit 2537df7
Show file tree
Hide file tree
Showing 4 changed files with 101 additions and 1 deletion.
2 changes: 1 addition & 1 deletion drivers/mfd/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -93,4 +93,4 @@ obj-$(CONFIG_MFD_CS5535) += cs5535-mfd.o
obj-$(CONFIG_MFD_OMAP_USB_HOST) += omap-usb-host.o
obj-$(CONFIG_MFD_PM8921_CORE) += pm8921-core.o
obj-$(CONFIG_MFD_PM8XXX_IRQ) += pm8xxx-irq.o
obj-$(CONFIG_MFD_TPS65910) += tps65910.o
obj-$(CONFIG_MFD_TPS65910) += tps65910.o tps65910-gpio.o
91 changes: 91 additions & 0 deletions drivers/mfd/tps65910-gpio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
/*
* tps65910-gpio.c -- TI TPS6591x
*
* Copyright 2010 Texas Instruments Inc.
*
* Author: Graeme Gregory <gg@slimlogic.co.uk>
* Author: Jorge Eduardo Candelaria jedu@slimlogic.co.uk>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
*/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/mfd/tps65910.h>

static int tps65910_gpio_get(struct gpio_chip *gc, unsigned offset)
{
struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
uint8_t val;

tps65910->read(tps65910, TPS65910_GPIO0, 1, &val);

if (val & GPIO0_GPIO_STS_MASK)
return 1;

return 0;
}

static void tps65910_gpio_set(struct gpio_chip *gc, unsigned offset,
int value)
{
struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);

if (value)
tps65910_set_bits(tps65910, TPS65910_GPIO0,
GPIO0_GPIO_SET_MASK);
else
tps65910_clear_bits(tps65910, TPS65910_GPIO0,
GPIO0_GPIO_SET_MASK);
}

static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset,
int value)
{
struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);

/* Set the initial value */
tps65910_gpio_set(gc, 0, value);

return tps65910_set_bits(tps65910, TPS65910_GPIO0, GPIO0_GPIO_CFG_MASK);
}

static int tps65910_gpio_input(struct gpio_chip *gc, unsigned offset)
{
struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);

return tps65910_clear_bits(tps65910, TPS65910_GPIO0,
GPIO0_GPIO_CFG_MASK);
}

void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base)
{
int ret;

if (!gpio_base)
return;

tps65910->gpio.owner = THIS_MODULE;
tps65910->gpio.label = tps65910->i2c_client->name;
tps65910->gpio.dev = tps65910->dev;
tps65910->gpio.base = gpio_base;
tps65910->gpio.ngpio = 1;
tps65910->gpio.can_sleep = 1;

tps65910->gpio.direction_input = tps65910_gpio_input;
tps65910->gpio.direction_output = tps65910_gpio_output;
tps65910->gpio.set = tps65910_gpio_set;
tps65910->gpio.get = tps65910_gpio_get;

ret = gpiochip_add(&tps65910->gpio);

if (ret)
dev_warn(tps65910->dev, "GPIO registration failed: %d\n", ret);
}
7 changes: 7 additions & 0 deletions drivers/mfd/tps65910.c
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,13 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct tps65910 *tps65910;
struct tps65910_board *pmic_plat_data;
int ret = 0;

pmic_plat_data = dev_get_platdata(&i2c->dev);
if (!pmic_plat_data)
return -EINVAL;

tps65910 = kzalloc(sizeof(struct tps65910), GFP_KERNEL);
if (tps65910 == NULL)
return -ENOMEM;
Expand All @@ -154,6 +159,8 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
if (ret < 0)
goto err;

tps65910_gpio_init(tps65910, pmic_plat_data->gpio_base);

return ret;

err:
Expand Down
2 changes: 2 additions & 0 deletions include/linux/mfd/tps65910.h
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,7 @@
*/

struct tps65910_board {
int gpio_base;
struct regulator_init_data *tps65910_pmic_init_data;
};

Expand Down Expand Up @@ -749,5 +750,6 @@ struct tps65910_platform_data {

int tps65910_set_bits(struct tps65910 *tps65910, u8 reg, u8 mask);
int tps65910_clear_bits(struct tps65910 *tps65910, u8 reg, u8 mask);
void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base);

#endif /* __LINUX_MFD_TPS65910_H */

0 comments on commit 2537df7

Please sign in to comment.