From: Mark Brown <broonie@opensource.wolfsonmicro.com>
To: Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>
Cc: linux-kernel@vger.kernel.org, lrg@ti.com, sameo@linux.intel.com,
Graeme Gregory <gg@slimlogic.co.uk>,
grant@secretlab.ca
Subject: Re: [PATCHv4 2/4] TPS65910: GPIO: Add GPIO driver
Date: Thu, 21 Apr 2011 16:11:30 +0100 [thread overview]
Message-ID: <20110421151130.GB25526@opensource.wolfsonmicro.com> (raw)
In-Reply-To: <8BC87CF8-EAB5-40A9-AAFB-D4F7521B3E04@slimlogic.co.uk>
On Thu, Apr 21, 2011 at 09:35:47AM -0500, Jorge Eduardo Candelaria wrote:
> From: Graeme Gregory <gg@slimlogic.co.uk>
>
> 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: Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>
CCing in Grant who's taken over the GPIO subsystem.
> ---
> drivers/mfd/Makefile | 2 +-
> drivers/mfd/tps65910-gpio.c | 109 ++++++++++++++++++++++++++++++++++++++++++
> drivers/mfd/tps65910.c | 7 +++
> include/linux/mfd/tps65910.h | 3 +
> 4 files changed, 120 insertions(+), 1 deletions(-)
> create mode 100644 drivers/mfd/tps65910-gpio.c
>
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
> index 3afb7ac..012ed17 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -88,4 +88,4 @@ obj-$(CONFIG_MFD_VX855) += vx855.o
> obj-$(CONFIG_MFD_WL1273_CORE) += wl1273-core.o
> obj-$(CONFIG_MFD_CS5535) += cs5535-mfd.o
> obj-$(CONFIG_MFD_OMAP_USB_HOST) += omap-usb-host.o
> -obj-$(CONFIG_MFD_TPS65910) += tps65910.o
> +obj-$(CONFIG_MFD_TPS65910) += tps65910.o tps65910-gpio.o
> diff --git a/drivers/mfd/tps65910-gpio.c b/drivers/mfd/tps65910-gpio.c
> new file mode 100644
> index 0000000..7bb8fe6
> --- /dev/null
> +++ b/drivers/mfd/tps65910-gpio.c
> @@ -0,0 +1,109 @@
> +/*
> + * 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);
> + uint8_t val;
> +
> + tps65910->read(tps65910, TPS65910_GPIO0, 1, &val);
> +
> + if (value)
> + val |= GPIO0_GPIO_SET_MASK;
> + else
> + val &= ~GPIO0_GPIO_SET_MASK;
> +
> + tps65910->write(tps65910, TPS65910_GPIO0, 1, &val);
> +}
> +
> +static int tps65910_gpio_output(struct gpio_chip *gc, unsigned offset,
> + int value)
> +{
> + struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
> + uint8_t val;
> + int ret;
> +
> + ret = tps65910->read(tps65910, TPS65910_GPIO0, 1, &val);
> + if (ret < 0)
> + return ret;
> +
> + val |= GPIO0_GPIO_CFG_MASK;
> +
> + /* Set the initial value */
> + tps65910_gpio_set(gc, 0, value);
> +
> + return tps65910->write(tps65910, TPS65910_GPIO0, 1, &val);
> +}
> +
> +static int tps65910_gpio_input(struct gpio_chip *gc, unsigned offset)
> +{
> + struct tps65910 *tps65910 = container_of(gc, struct tps65910, gpio);
> + uint8_t val;
> + int ret;
> +
> + ret = tps65910->read(tps65910, TPS65910_GPIO0, 1, &val);
> + if (ret < 0)
> + return ret;
> +
> + val &= ~GPIO0_GPIO_CFG_MASK;
> +
> + return tps65910->write(tps65910, TPS65910_GPIO0, 1, &val);
> +}
> +
> +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);
> +}
> diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
> index f13e448..99c43b6 100644
> --- a/drivers/mfd/tps65910.c
> +++ b/drivers/mfd/tps65910.c
> @@ -89,8 +89,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;
> @@ -107,6 +112,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:
> diff --git a/include/linux/mfd/tps65910.h b/include/linux/mfd/tps65910.h
> index 43c8631..bf3597e 100644
> --- a/include/linux/mfd/tps65910.h
> +++ b/include/linux/mfd/tps65910.h
> @@ -714,6 +714,7 @@
> */
>
> struct tps65910_board {
> + int gpio_base;
> struct regulator_init_data *tps65910_pmic_init_data;
> };
>
> @@ -746,4 +747,6 @@ struct tps65910_platform_data {
> int irq_base;
> };
>
> +void tps65910_gpio_init(struct tps65910 *tps65910, int gpio_base);
> +
> #endif /* __LINUX_MFD_TPS65910_H */
> --
> 1.7.1
next prev parent reply other threads:[~2011-04-21 15:11 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-21 14:35 [PATCHv4 2/4] TPS65910: GPIO: Add GPIO driver Jorge Eduardo Candelaria
2011-04-21 15:11 ` Mark Brown [this message]
2011-04-26 14:04 ` Samuel Ortiz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110421151130.GB25526@opensource.wolfsonmicro.com \
--to=broonie@opensource.wolfsonmicro.com \
--cc=gg@slimlogic.co.uk \
--cc=grant@secretlab.ca \
--cc=jedu@slimlogic.co.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=lrg@ti.com \
--cc=sameo@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.