Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8a3d6bc authored by Tony SIM's avatar Tony SIM Committed by Dmitry Torokhov
Browse files

Input: tca6416-keypad - add support for tca6408a



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

Signed-off-by: default avatarTony SIM <chinyeow.sim.xt@renesas.com>
Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
parent da0c4901
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -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"
+10 −3
Original line number Diff line number Diff line
@@ -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;