diff options
author | Rabin Vincent <rabin.vincent@stericsson.com> | 2010-03-19 18:21:33 +0530 |
---|---|---|
committer | Jonas ABERG <jonas.aberg@stericsson.com> | 2010-06-10 16:58:30 +0200 |
commit | d46a7e3528b5f86610ee388a18a9698a3d26e6fb (patch) | |
tree | e3dd643181ec57f866801db53ac70fb39a4d071b /drivers/gpio | |
parent | 98feb85a113cdd4649ac3c34906e1cf0abadbc35 (diff) |
Add TC35892 I2C GPIO expander driver
Add a simple driver for the I2C-controlled TC35892 GPIO
expander.
Change-Id: I49389d808353ca6b43cc38e1c7518de38f14ef51
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/1047
Reviewed-by: Par-Olof HAKANSSON <par-olof.hakansson@stericsson.com>
Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Tested-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'drivers/gpio')
-rw-r--r-- | drivers/gpio/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpio/tc35892.c | 76 |
2 files changed, 77 insertions, 0 deletions
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index acba56c1c..fc3ee5ea9 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -28,6 +28,7 @@ LIB := $(obj)libgpio.a COBJS-$(CONFIG_KIRKWOOD_GPIO) += kw_gpio.o COBJS-$(CONFIG_MX31_GPIO) += mx31_gpio.o COBJS-$(CONFIG_PCA953X) += pca953x.o +COBJS-$(CONFIG_TC35892_GPIO) += tc35892.o COBJS := $(COBJS-y) SRCS := $(COBJS:.o=.c) diff --git a/drivers/gpio/tc35892.c b/drivers/gpio/tc35892.c new file mode 100644 index 000000000..7fa55263d --- /dev/null +++ b/drivers/gpio/tc35892.c @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2010 ST-Ericsson SA + * + * Author: Rabin Vincent <rabin.vincent@stericsson.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <i2c.h> +#include <tc35892.h> + +#define GPIODATA0 0xC0 +#define GPIODATA1 0xC2 +#define GPIODATA2 0xC4 +#define GPIODIR0 0xC6 +#define GPIODIR1 0xC7 +#define GPIODIR2 0xC8 + +int tc35892_gpio_dir(int addr, int pin, int dir) +{ + uchar reg = GPIODIR0 + pin / 8; + uchar pos = pin % 8; + uchar data; + int ret; + + ret = i2c_read(addr, reg, sizeof(reg), &data, sizeof(data)); + if (ret) + return ret; + + if (dir) + data |= (1 << pos); + else + data &= ~(1 << pos); + + return i2c_write(addr, reg, sizeof(reg), &data, sizeof(data)); +} + +int tc35892_gpio_get(int addr, int pin, int val) +{ + uchar reg = GPIODATA0 + (pin / 8) * 2; + uchar pos = pin % 8; + uchar data; + int ret; + + ret = i2c_read(addr, reg, sizeof(reg), &data, sizeof(data)); + if (ret < 0) + return ret; + + return !!(data & (1 << pos)); +} + +int tc35892_gpio_set(int addr, int pin, int val) +{ + uchar reg = GPIODATA0 + (pin / 8) * 2; + uchar pos = pin % 8; + uchar data[] = {val << pos, 1 << pos}; + + return i2c_write(addr, reg, sizeof(reg), data, sizeof(data)); +} |