@@ -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,