Commit 09c730a4 authored by Sundar Iyer's avatar Sundar Iyer Committed by Linus Walleij

input/tc3589x: add tc3589x keypad support

Add support for the keypad controller module found on the
TC3589X devices. This driver default adds the support for
TC35893 device.
Signed-off-by: default avatarSundar Iyer <sundar.iyer@stericsson.com>
Acked-by: default avatarDmitry Torokhov <dtor@mail.ru>
[Some minor fixups for compilation]
Signed-off-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
parent 11c8ea81
...@@ -443,6 +443,16 @@ config KEYBOARD_OMAP4 ...@@ -443,6 +443,16 @@ config KEYBOARD_OMAP4
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called omap4-keypad. module will be called omap4-keypad.
config KEYBOARD_TC3589X
tristate "TC3589X Keypad support"
depends on MFD_TC3589X
help
Say Y here if you want to use the keypad controller on
TC35892/3 I/O expander.
To compile this driver as a module, choose M here: the
module will be called tc3589x-keypad.
config KEYBOARD_TNETV107X config KEYBOARD_TNETV107X
tristate "TI TNETV107X keypad support" tristate "TI TNETV107X keypad support"
depends on ARCH_DAVINCI_TNETV107X depends on ARCH_DAVINCI_TNETV107X
......
...@@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o ...@@ -40,6 +40,7 @@ obj-$(CONFIG_KEYBOARD_SH_KEYSC) += sh_keysc.o
obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o obj-$(CONFIG_KEYBOARD_STMPE) += stmpe-keypad.o
obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o obj-$(CONFIG_KEYBOARD_STOWAWAY) += stowaway.o
obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o
obj-$(CONFIG_KEYBOARD_TC3589X) += tc3589x-keypad.o
obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o obj-$(CONFIG_KEYBOARD_TNETV107X) += tnetv107x-keypad.o
obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o
obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
......
This diff is collapsed.
...@@ -132,6 +132,14 @@ static struct resource gpio_resources[] = { ...@@ -132,6 +132,14 @@ static struct resource gpio_resources[] = {
}, },
}; };
static struct resource keypad_resources[] = {
{
.start = TC3589x_INT_KBDIRQ,
.end = TC3589x_INT_KBDIRQ,
.flags = IORESOURCE_IRQ,
},
};
static struct mfd_cell tc3589x_dev_gpio[] = { static struct mfd_cell tc3589x_dev_gpio[] = {
{ {
.name = "tc3589x-gpio", .name = "tc3589x-gpio",
...@@ -140,6 +148,14 @@ static struct mfd_cell tc3589x_dev_gpio[] = { ...@@ -140,6 +148,14 @@ static struct mfd_cell tc3589x_dev_gpio[] = {
}, },
}; };
static struct mfd_cell tc3589x_dev_keypad[] = {
{
.name = "tc3589x-keypad",
.num_resources = ARRAY_SIZE(keypad_resources),
.resources = &keypad_resources[0],
},
};
static irqreturn_t tc3589x_irq(int irq, void *data) static irqreturn_t tc3589x_irq(int irq, void *data)
{ {
struct tc3589x *tc3589x = data; struct tc3589x *tc3589x = data;
...@@ -255,8 +271,18 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x) ...@@ -255,8 +271,18 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
dev_info(tc3589x->dev, "added gpio block\n"); dev_info(tc3589x->dev, "added gpio block\n");
} }
if (blocks & TC3589x_BLOCK_KEYPAD) {
ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
ARRAY_SIZE(tc3589x_dev_keypad), NULL,
tc3589x->irq_base);
if (ret) {
dev_err(tc3589x->dev, "failed to keypad child\n");
return ret; return ret;
}
dev_info(tc3589x->dev, "added keypad block\n");
}
return ret;
} }
static int __devinit tc3589x_probe(struct i2c_client *i2c, static int __devinit tc3589x_probe(struct i2c_client *i2c,
......
...@@ -20,6 +20,17 @@ enum tx3589x_block { ...@@ -20,6 +20,17 @@ enum tx3589x_block {
#define TC3589x_RSTCTRL_KBDRST (1 << 1) #define TC3589x_RSTCTRL_KBDRST (1 << 1)
#define TC3589x_RSTCTRL_GPIRST (1 << 0) #define TC3589x_RSTCTRL_GPIRST (1 << 0)
/* Keyboard Configuration Registers */
#define TC3589x_KBDSETTLE_REG 0x01
#define TC3589x_KBDBOUNCE 0x02
#define TC3589x_KBDSIZE 0x03
#define TC3589x_KBCFG_LSB 0x04
#define TC3589x_KBCFG_MSB 0x05
#define TC3589x_KBDIC 0x08
#define TC3589x_KBDMSK 0x09
#define TC3589x_EVTCODE_FIFO 0x10
#define TC3589x_KBDMFS 0x8F
#define TC3589x_IRQST 0x91 #define TC3589x_IRQST 0x91
#define TC3589x_MANFCODE_MAGIC 0x03 #define TC3589x_MANFCODE_MAGIC 0x03
...@@ -35,6 +46,14 @@ enum tx3589x_block { ...@@ -35,6 +46,14 @@ enum tx3589x_block {
#define TC3589x_EXTRSTN 0x83 #define TC3589x_EXTRSTN 0x83
#define TC3589x_RSTINTCLR 0x84 #define TC3589x_RSTINTCLR 0x84
/* Pull up/down configuration registers */
#define TC3589x_IOCFG 0xA7
#define TC3589x_IOPULLCFG0_LSB 0xAA
#define TC3589x_IOPULLCFG0_MSB 0xAB
#define TC3589x_IOPULLCFG1_LSB 0xAC
#define TC3589x_IOPULLCFG1_MSB 0xAD
#define TC3589x_IOPULLCFG2_LSB 0xAE
#define TC3589x_GPIOIS0 0xC9 #define TC3589x_GPIOIS0 0xC9
#define TC3589x_GPIOIS1 0xCA #define TC3589x_GPIOIS1 0xCA
#define TC3589x_GPIOIS2 0xCB #define TC3589x_GPIOIS2 0xCB
...@@ -112,6 +131,37 @@ extern int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length, ...@@ -112,6 +131,37 @@ extern int tc3589x_block_write(struct tc3589x *tc3589x, u8 reg, u8 length,
const u8 *values); const u8 *values);
extern int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val); extern int tc3589x_set_bits(struct tc3589x *tc3589x, u8 reg, u8 mask, u8 val);
/*
* Keypad related platform specific constants
* These values may be modified for fine tuning
*/
#define TC_KPD_ROWS 0x8
#define TC_KPD_COLUMNS 0x8
#define TC_KPD_DEBOUNCE_PERIOD 0xA3
#define TC_KPD_SETTLE_TIME 0xA3
/**
* struct tc35893_platform_data - data structure for platform specific data
* @keymap_data: matrix scan code table for keycodes
* @krow: mask for available rows, value is 0xFF
* @kcol: mask for available columns, value is 0xFF
* @debounce_period: platform specific debounce time
* @settle_time: platform specific settle down time
* @irqtype: type of interrupt, falling or rising edge
* @enable_wakeup: specifies if keypad event can wake up system from sleep
* @no_autorepeat: flag for auto repetition
*/
struct tc3589x_keypad_platform_data {
const struct matrix_keymap_data *keymap_data;
u8 krow;
u8 kcol;
u8 debounce_period;
u8 settle_time;
unsigned long irqtype;
bool enable_wakeup;
bool no_autorepeat;
};
/** /**
* struct tc3589x_gpio_platform_data - TC3589x GPIO platform data * struct tc3589x_gpio_platform_data - TC3589x GPIO platform data
* @gpio_base: first gpio number assigned to TC3589x. A maximum of * @gpio_base: first gpio number assigned to TC3589x. A maximum of
...@@ -130,11 +180,13 @@ struct tc3589x_gpio_platform_data { ...@@ -130,11 +180,13 @@ struct tc3589x_gpio_platform_data {
* @block: bitmask of blocks to enable (use TC3589x_BLOCK_*) * @block: bitmask of blocks to enable (use TC3589x_BLOCK_*)
* @irq_base: base IRQ number. %TC3589x_NR_IRQS irqs will be used. * @irq_base: base IRQ number. %TC3589x_NR_IRQS irqs will be used.
* @gpio: GPIO-specific platform data * @gpio: GPIO-specific platform data
* @keypad: keypad-specific platform data
*/ */
struct tc3589x_platform_data { struct tc3589x_platform_data {
unsigned int block; unsigned int block;
int irq_base; int irq_base;
struct tc3589x_gpio_platform_data *gpio; struct tc3589x_gpio_platform_data *gpio;
const struct tc3589x_keypad_platform_data *keypad;
}; };
#define TC3589x_NR_GPIOS 24 #define TC3589x_NR_GPIOS 24
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment