diff options
-rw-r--r-- | drivers/gpio/Makefile | 1 | ||||
-rw-r--r-- | drivers/gpio/tc35892.c | 76 | ||||
-rw-r--r-- | include/tc35892.h | 55 |
3 files changed, 132 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)); +} diff --git a/include/tc35892.h b/include/tc35892.h new file mode 100644 index 000000000..88bbe8d2b --- /dev/null +++ b/include/tc35892.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2010 ST-Ericsson SA + * + * 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 + */ + +#ifndef __TC35892_H__ +#define __TC35892_H__ + +#define TC35892_PIN_KPX0 0 +#define TC35892_PIN_KPX1 1 +#define TC35892_PIN_KPX2 2 +#define TC35892_PIN_KPX3 3 +#define TC35892_PIN_KPX4 4 +#define TC35892_PIN_KPX5 5 +#define TC35892_PIN_KPX6 6 +#define TC35892_PIN_KPX7 7 +#define TC35892_PIN_KPY0 8 +#define TC35892_PIN_KPY1 9 +#define TC35892_PIN_KPY2 10 +#define TC35892_PIN_KPY3 11 +#define TC35892_PIN_KPY4 12 +#define TC35892_PIN_KPY5 13 +#define TC35892_PIN_KPY6 14 +#define TC35892_PIN_KPY7 15 +#define TC35892_PIN_KPY8 16 +#define TC35892_PIN_KPY9 17 +#define TC35892_PIN_KPY10 18 +#define TC35892_PIN_KPY11 19 +#define TC35892_PIN_PWM0 20 +#define TC35892_PIN_PWM1 21 +#define TC35892_PIN_PWM2 22 +#define TC35892_PIN_EXTIO 23 + +int tc35892_gpio_dir(int addr, int pin, int dir); +int tc35892_gpio_set(int addr, int pin, int val); +int tc35892_gpio_get(int addr, int pin, int val); + +#endif |