Skip to content

Commit

Permalink
Input: tca8418 - switch to using generic device properties
Browse files Browse the repository at this point in the history
Let's drop legacy platform data support (there are no users in mainline)
and switch to using generic device properties, which will make the driver
simpler (non-OF boards can use property sets to describe hardware).

Reviewed-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
  • Loading branch information
Dmitry Torokhov committed Jan 31, 2017
1 parent aef01aa commit 8b1a315
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 108 deletions.
90 changes: 26 additions & 64 deletions drivers/input/keyboard/tca8418_keypad.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,17 @@
* alternative licensing inquiries.
*/

#include <linux/types.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/input.h>
#include <linux/input/tca8418_keypad.h>
#include <linux/input/matrix_keypad.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/property.h>
#include <linux/slab.h>
#include <linux/types.h>

/* TCA8418 hardware limits */
#define TCA8418_MAX_ROWS 8
Expand Down Expand Up @@ -264,43 +263,25 @@ static int tca8418_configure(struct tca8418_keypad *keypad_data,
}

static int tca8418_keypad_probe(struct i2c_client *client,
const struct i2c_device_id *id)
const struct i2c_device_id *id)
{
struct device *dev = &client->dev;
const struct tca8418_keypad_platform_data *pdata =
dev_get_platdata(dev);
struct tca8418_keypad *keypad_data;
struct input_dev *input;
const struct matrix_keymap_data *keymap_data = NULL;
u32 rows = 0, cols = 0;
bool rep = false;
bool irq_is_gpio = false;
int irq;
int error, row_shift, max_keys;
unsigned long trigger = 0;

/* Copy the platform data */
if (pdata) {
if (!pdata->keymap_data) {
dev_err(dev, "no keymap data defined\n");
return -EINVAL;
}
keymap_data = pdata->keymap_data;
rows = pdata->rows;
cols = pdata->cols;
rep = pdata->rep;
irq_is_gpio = pdata->irq_is_gpio;
trigger = IRQF_TRIGGER_FALLING;
} else {
struct device_node *np = dev->of_node;
int err;

err = matrix_keypad_parse_properties(dev, &rows, &cols);
if (err)
return err;
rep = of_property_read_bool(np, "keypad,autorepeat");
/* Check i2c driver capabilities */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) {
dev_err(dev, "%s adapter not supported\n",
dev_driver_string(&client->adapter->dev));
return -ENODEV;
}

error = matrix_keypad_parse_properties(dev, &rows, &cols);
if (error)
return error;

if (!rows || rows > TCA8418_MAX_ROWS) {
dev_err(dev, "invalid rows\n");
return -EINVAL;
Expand All @@ -311,13 +292,6 @@ static int tca8418_keypad_probe(struct i2c_client *client,
return -EINVAL;
}

/* Check i2c driver capabilities */
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE)) {
dev_err(dev, "%s adapter not supported\n",
dev_driver_string(&client->adapter->dev));
return -ENODEV;
}

row_shift = get_count_order(cols);
max_keys = rows << row_shift;

Expand Down Expand Up @@ -347,23 +321,20 @@ static int tca8418_keypad_probe(struct i2c_client *client,
input->id.product = 0x001;
input->id.version = 0x0001;

error = matrix_keypad_build_keymap(keymap_data, NULL, rows, cols,
NULL, input);
error = matrix_keypad_build_keymap(NULL, NULL, rows, cols, NULL, input);
if (error) {
dev_err(dev, "Failed to build keymap\n");
return error;
}

if (rep)
if (device_property_read_bool(dev, "keypad,autorepeat"))
__set_bit(EV_REP, input->evbit);
input_set_capability(input, EV_MSC, MSC_SCAN);

irq = client->irq;
if (irq_is_gpio)
irq = gpio_to_irq(irq);
input_set_capability(input, EV_MSC, MSC_SCAN);

error = devm_request_threaded_irq(dev, irq, NULL, tca8418_irq_handler,
trigger | IRQF_SHARED | IRQF_ONESHOT,
error = devm_request_threaded_irq(dev, client->irq,
NULL, tca8418_irq_handler,
IRQF_SHARED | IRQF_ONESHOT,
client->name, keypad_data);
if (error) {
dev_err(dev, "Unable to claim irq %d; error %d\n",
Expand All @@ -382,30 +353,21 @@ static int tca8418_keypad_probe(struct i2c_client *client,
}

static const struct i2c_device_id tca8418_id[] = {
{ TCA8418_NAME, 8418, },
{ "tca8418", 8418, },
{ }
};
MODULE_DEVICE_TABLE(i2c, tca8418_id);

#ifdef CONFIG_OF
static const struct of_device_id tca8418_dt_ids[] = {
{ .compatible = "ti,tca8418", },
{ }
};
MODULE_DEVICE_TABLE(of, tca8418_dt_ids);

/*
* The device tree based i2c loader looks for
* "i2c:" + second_component_of(property("compatible"))
* and therefore we need an alias to be found.
*/
MODULE_ALIAS("i2c:tca8418");
#endif

static struct i2c_driver tca8418_keypad_driver = {
.driver = {
.name = TCA8418_NAME,
.of_match_table = of_match_ptr(tca8418_dt_ids),
.name = "tca8418_keypad",
.of_match_table = tca8418_dt_ids,
},
.probe = tca8418_keypad_probe,
.id_table = tca8418_id,
Expand Down
44 changes: 0 additions & 44 deletions include/linux/input/tca8418_keypad.h

This file was deleted.

0 comments on commit 8b1a315

Please sign in to comment.