[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20200305131405.6598-2-alexandru.ardelean@analog.com>
Date: Thu, 5 Mar 2020 15:14:03 +0200
From: Alexandru Ardelean <alexandru.ardelean@...log.com>
To: <linux-input@...r.kernel.org>, <linux-kernel@...r.kernel.org>
CC: <dmitry.torokhov@...il.com>, <lars@...afoo.de>,
Alexandru Ardelean <alexandru.ardelean@...log.com>
Subject: [PATCH v4 2/4] Input: adp5589: Add basic devicetree support
From: Lars-Peter Clausen <lars@...afoo.de>
Add very basic devicetree suppport to the adp5589 allowing the device to be
registered from devicetree.
Signed-off-by: Lars-Peter Clausen <lars@...afoo.de>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@...log.com>
---
drivers/input/keyboard/adp5589-keys.c | 33 ++++++++++++++++++++++++++-
1 file changed, 32 insertions(+), 1 deletion(-)
diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c
index c6a801bcdf90..56f4ff7fa9c3 100644
--- a/drivers/input/keyboard/adp5589-keys.c
+++ b/drivers/input/keyboard/adp5589-keys.c
@@ -1008,6 +1008,25 @@ static void adp5589_keypad_remove(struct adp5589_kpad *kpad)
}
}
+static int adp5589_i2c_get_driver_data(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+{
+ const struct of_device_id *match;
+
+ if (id)
+ return id->driver_data;
+
+ if (!IS_ENABLED(CONFIG_OF) || !i2c->dev.of_node)
+ return -ENODEV;
+
+ match = of_match_node(i2c->dev.driver->of_match_table,
+ i2c->dev.of_node);
+ if (match)
+ return (uintptr_t)match->data;
+
+ return -ENODEV;
+}
+
static int adp5589_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -1029,7 +1048,11 @@ static int adp5589_probe(struct i2c_client *client,
kpad->client = client;
- switch (id->driver_data) {
+ ret = adp5589_i2c_get_driver_data(client, id);
+ if (ret < 0)
+ return ret;
+
+ switch (ret) {
case ADP5585_02:
kpad->support_row5 = true;
/* fall through */
@@ -1129,6 +1152,13 @@ static int adp5589_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(adp5589_dev_pm_ops, adp5589_suspend, adp5589_resume);
+static const struct of_device_id adp5589_of_match[] = {
+ { .compatible = "adi,adp5585", .data = (void *)ADP5585_01 },
+ { .compatible = "adi,adp5585-02", .data = (void *)ADP5585_02 },
+ { .compatible = "adi,adp5589", .data = (void *)ADP5589 },
+ {}
+};
+
static const struct i2c_device_id adp5589_id[] = {
{"adp5589-keys", ADP5589},
{"adp5585-keys", ADP5585_01},
@@ -1142,6 +1172,7 @@ static struct i2c_driver adp5589_driver = {
.driver = {
.name = KBUILD_MODNAME,
.pm = &adp5589_dev_pm_ops,
+ .of_match_table = adp5589_of_match,
},
.probe = adp5589_probe,
.remove = adp5589_remove,
--
2.20.1
Powered by blists - more mailing lists