Skip to content

Commit

Permalink
Input: tca6416-keypad - add support for tca6408a
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tony SIM authored and Dmitry Torokhov committed Dec 8, 2010
1 parent da0c490 commit b8a3d6b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
10 changes: 6 additions & 4 deletions drivers/input/keyboard/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -180,20 +180,22 @@ config KEYBOARD_GPIO
module will be called gpio_keys.

config KEYBOARD_TCA6416
tristate "TCA6416 Keypad Support"
tristate "TCA6416/TCA6408A Keypad Support"
depends on I2C
help
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
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
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.

To compile this driver as a module, choose M here: the
module will be called tca6416_keypad.

config KEYBOARD_MATRIX
tristate "GPIO driven matrix keypad support"
Expand Down
13 changes: 10 additions & 3 deletions drivers/input/keyboard/tca6416-keypad.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

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

chip->client = client;
chip->input = input;
chip->io_size = id->driver_data;
chip->pinmask = pdata->pinmask;
chip->use_polling = pdata->use_polling;

Expand Down

0 comments on commit b8a3d6b

Please sign in to comment.