Input: tca6416-keypad - add support for tca6408a

Support 8-bit tca6408a I/O expander as a keypad.

Signed-off-by: Tony SIM <chinyeow.sim.xt@renesas.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
This commit is contained in:
Tony SIM 2010-12-07 02:54:00 -08:00 committed by Dmitry Torokhov
parent da0c490115
commit b8a3d6bcbc
2 changed files with 16 additions and 7 deletions

View File

@ -180,20 +180,22 @@ config KEYBOARD_GPIO
module will be called gpio_keys. module will be called gpio_keys.
config KEYBOARD_TCA6416 config KEYBOARD_TCA6416
tristate "TCA6416 Keypad Support" tristate "TCA6416/TCA6408A Keypad Support"
depends on I2C depends on I2C
help help
This driver implements basic keypad functionality This driver implements basic keypad functionality
for keys connected through TCA6416 IO expander for keys connected through TCA6416/TCA6408A IO expanders.
Say Y here if your device has keys connected to Say Y here if your device has keys connected to
TCA6416 IO expander. Your board-specific setup logic TCA6416/TCA6408A IO expander. Your board-specific setup logic
must also provide pin-mask details(of which TCA6416 pins must also provide pin-mask details(of which TCA6416 pins
are used for keypad). are used for keypad).
If enabled the complete TCA6416 device will be managed through If enabled the entire TCA6416 device will be managed through
this driver. this driver.
To compile this driver as a module, choose M here: the
module will be called tca6416_keypad.
config KEYBOARD_MATRIX config KEYBOARD_MATRIX
tristate "GPIO driven matrix keypad support" tristate "GPIO driven matrix keypad support"

View File

@ -29,6 +29,7 @@
static const struct i2c_device_id tca6416_id[] = { static const struct i2c_device_id tca6416_id[] = {
{ "tca6416-keys", 16, }, { "tca6416-keys", 16, },
{ "tca6408-keys", 8, },
{ } { }
}; };
MODULE_DEVICE_TABLE(i2c, tca6416_id); MODULE_DEVICE_TABLE(i2c, tca6416_id);
@ -46,8 +47,9 @@ struct tca6416_keypad_chip {
struct i2c_client *client; struct i2c_client *client;
struct input_dev *input; struct input_dev *input;
struct delayed_work dwork; struct delayed_work dwork;
u16 pinmask; int io_size;
int irqnum; int irqnum;
u16 pinmask;
bool use_polling; bool use_polling;
struct tca6416_button buttons[0]; struct tca6416_button buttons[0];
}; };
@ -56,7 +58,9 @@ static int tca6416_write_reg(struct tca6416_keypad_chip *chip, int reg, u16 val)
{ {
int error; int error;
error = i2c_smbus_write_word_data(chip->client, reg << 1, val); error = chip->io_size > 8 ?
i2c_smbus_write_word_data(chip->client, reg << 1, val) :
i2c_smbus_write_byte_data(chip->client, reg, val);
if (error < 0) { if (error < 0) {
dev_err(&chip->client->dev, dev_err(&chip->client->dev,
"%s failed, reg: %d, val: %d, error: %d\n", "%s failed, reg: %d, val: %d, error: %d\n",
@ -71,7 +75,9 @@ static int tca6416_read_reg(struct tca6416_keypad_chip *chip, int reg, u16 *val)
{ {
int retval; int retval;
retval = i2c_smbus_read_word_data(chip->client, reg << 1); retval = chip->io_size > 8 ?
i2c_smbus_read_word_data(chip->client, reg << 1) :
i2c_smbus_read_byte_data(chip->client, reg);
if (retval < 0) { if (retval < 0) {
dev_err(&chip->client->dev, "%s failed, reg: %d, error: %d\n", dev_err(&chip->client->dev, "%s failed, reg: %d, error: %d\n",
__func__, reg, retval); __func__, reg, retval);
@ -224,6 +230,7 @@ static int __devinit tca6416_keypad_probe(struct i2c_client *client,
chip->client = client; chip->client = client;
chip->input = input; chip->input = input;
chip->io_size = id->driver_data;
chip->pinmask = pdata->pinmask; chip->pinmask = pdata->pinmask;
chip->use_polling = pdata->use_polling; chip->use_polling = pdata->use_polling;