[v2,3/3] Input: adp5589-keys - add basic devicetree support
diff mbox series

Message ID 20201124082255.13427-3-alexandru.ardelean@analog.com
State New, archived
Headers show
Series
  • [v2,1/3] Input: adp5589-keys - add default platform data
Related show

Commit Message

Alexandru Ardelean Nov. 24, 2020, 8:22 a.m. UTC
From: Lars-Peter Clausen <lars@metafoo.de>

Add very basic devicetree suppport to the adp5589 allowing the device to be
registered from devicetree and ACPI via PRP0001.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
---
 drivers/input/keyboard/adp5589-keys.c | 30 ++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

Comments

Lars-Peter Clausen Nov. 24, 2020, 8:43 a.m. UTC | #1
On 11/24/20 9:22 AM, Alexandru Ardelean wrote:
>   	error = devm_add_action_or_reset(&client->dev, adp5589_clear_config,
> @@ -1078,6 +1098,13 @@ static int __maybe_unused 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 = &adp5589_chip_info_tbl[ADP5585_01] },
> +	{ .compatible = "adi,adp5585-02", .data = &adp5589_chip_info_tbl[ADP5585_02] },
> +	{ .compatible = "adi,adp5589", .data = &adp5589_chip_info_tbl[ADP5589] },

I think we need to add these to 
Documentation/devicetree/bindings/trivial-devices.yaml
Alexandru Ardelean Nov. 25, 2020, 5:29 a.m. UTC | #2
> -----Original Message-----
> From: Lars-Peter Clausen <lars@metafoo.de>
> Sent: Tuesday, November 24, 2020 10:43 AM
> To: Ardelean, Alexandru <alexandru.Ardelean@analog.com>; linux-
> input@vger.kernel.org; linux-kernel@vger.kernel.org
> Cc: dmitry.torokhov@gmail.com
> Subject: Re: [PATCH v2 3/3] Input: adp5589-keys - add basic devicetree support
> 
> [External]
> 
> On 11/24/20 9:22 AM, Alexandru Ardelean wrote:
> >   	error = devm_add_action_or_reset(&client->dev,
> > adp5589_clear_config, @@ -1078,6 +1098,13 @@ static int __maybe_unused
> > 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 =
> &adp5589_chip_info_tbl[ADP5585_01] },
> > +	{ .compatible = "adi,adp5585-02", .data =
> &adp5589_chip_info_tbl[ADP5585_02] },
> > +	{ .compatible = "adi,adp5589", .data =
> > +&adp5589_chip_info_tbl[ADP5589] },
> 
> I think we need to add these to
> Documentation/devicetree/bindings/trivial-devices.yaml
> 

Ack
Will send a V3 in the next few days.

Patch
diff mbox series

diff --git a/drivers/input/keyboard/adp5589-keys.c b/drivers/input/keyboard/adp5589-keys.c
index 6cb93ee3b97c..8ff18ff18b75 100644
--- a/drivers/input/keyboard/adp5589-keys.c
+++ b/drivers/input/keyboard/adp5589-keys.c
@@ -986,9 +986,25 @@  static void adp5589_clear_config(void *data)
 	adp5589_write(client, kpad->var->reg(ADP5589_GENERAL_CFG), 0);
 }
 
+static const struct adp5589_chip_info *adp5589_get_chip_info(struct device *dev,
+							     const struct i2c_device_id *id)
+{
+	const struct adp5589_chip_info *info;
+
+	info = device_get_match_data(dev);
+	if (info)
+		return info;
+
+	if (id)
+		return &adp5589_chip_info_tbl[id->driver_data];
+
+	return NULL;
+}
+
 static int adp5589_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
 {
+	const struct adp5589_chip_info *info;
 	struct adp5589_kpad *kpad;
 	const struct adp5589_kpad_platform_data *pdata =
 		adp5589_kpad_pdata_get(&client->dev);
@@ -1001,13 +1017,17 @@  static int adp5589_probe(struct i2c_client *client,
 		return -EIO;
 	}
 
+	info = adp5589_get_chip_info(&client->dev, id);
+	if (!info)
+		return -ENODEV;
+
 	kpad = devm_kzalloc(&client->dev, sizeof(*kpad), GFP_KERNEL);
 	if (!kpad)
 		return -ENOMEM;
 
 	kpad->client = client;
 
-	kpad->info = &adp5589_chip_info_tbl[id->driver_data];
+	kpad->info = info;
 	kpad->var = kpad->info->constants;
 
 	error = devm_add_action_or_reset(&client->dev, adp5589_clear_config,
@@ -1078,6 +1098,13 @@  static int __maybe_unused 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 = &adp5589_chip_info_tbl[ADP5585_01] },
+	{ .compatible = "adi,adp5585-02", .data = &adp5589_chip_info_tbl[ADP5585_02] },
+	{ .compatible = "adi,adp5589", .data = &adp5589_chip_info_tbl[ADP5589] },
+	{}
+};
+
 static const struct i2c_device_id adp5589_id[] = {
 	{"adp5589-keys", ADP5589},
 	{"adp5585-keys", ADP5585_01},
@@ -1091,6 +1118,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,
 	.id_table = adp5589_id,