forked from Minki/linux
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:
parent
da0c490115
commit
b8a3d6bcbc
@ -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"
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user