Input: tca6416-keypad - add support for tca6408a
authorTony SIM <chinyeow.sim.xt@renesas.com>
Tue, 7 Dec 2010 10:54:00 +0000 (02:54 -0800)
committerDmitry Torokhov <dmitry.torokhov@gmail.com>
Wed, 8 Dec 2010 05:10:28 +0000 (21:10 -0800)
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>
drivers/input/keyboard/Kconfig
drivers/input/keyboard/tca6416-keypad.c

index ee85e5b..a378e95 100644 (file)
@@ -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"
index 00137be..800fbcc 100644 (file)
@@ -29,6 +29,7 @@
 
 static const struct i2c_device_id tca6416_id[] = {
        { "tca6416-keys", 16, },
+       { "tca6408-keys", 8, },
        { }
 };
 MODULE_DEVICE_TABLE(i2c, tca6416_id);
@@ -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];
 };
@@ -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",
@@ -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);
@@ -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;