aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch')
-rw-r--r--target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch64
1 files changed, 64 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch b/target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch
new file mode 100644
index 0000000000..77ac4e7dc9
--- /dev/null
+++ b/target/linux/generic/backport-5.10/844-v5.15-leds-pca955x-switch-to-i2c-probe-new.patch
@@ -0,0 +1,64 @@
+From 239f32b4f161c1584cd4b386d6ab8766432a6ede Mon Sep 17 00:00:00 2001
+From: Eddie James <eajames@linux.ibm.com>
+Date: Fri, 16 Jul 2021 17:03:31 -0500
+Subject: [PATCH] leds: pca955x: Switch to i2c probe_new
+
+The deprecated i2c probe functionality doesn't work with OF
+compatible strings, as it only checks for the i2c device id. Switch
+to the new way of probing and grab the match data to select the
+chip type.
+
+Signed-off-by: Eddie James <eajames@linux.ibm.com>
+Signed-off-by: Pavel Machek <pavel@ucw.cz>
+---
+ drivers/leds/leds-pca955x.c | 23 +++++++++++++++++++----
+ 1 file changed, 19 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c
+index a6aa4b9abde8c4..a6b5699aeae4fe 100644
+--- a/drivers/leds/leds-pca955x.c
++++ b/drivers/leds/leds-pca955x.c
+@@ -479,8 +479,7 @@ static const struct of_device_id of_pca955x_match[] = {
+ };
+ MODULE_DEVICE_TABLE(of, of_pca955x_match);
+
+-static int pca955x_probe(struct i2c_client *client,
+- const struct i2c_device_id *id)
++static int pca955x_probe(struct i2c_client *client)
+ {
+ struct pca955x *pca955x;
+ struct pca955x_led *pca955x_led;
+@@ -494,8 +493,24 @@ static int pca955x_probe(struct i2c_client *client,
+ bool set_default_label = false;
+ bool keep_pwm = false;
+ char default_label[8];
++ enum pca955x_type chip_type;
++ const void *md = device_get_match_data(&client->dev);
+
+- chip = &pca955x_chipdefs[id->driver_data];
++ if (md) {
++ chip_type = (enum pca955x_type)md;
++ } else {
++ const struct i2c_device_id *id = i2c_match_id(pca955x_id,
++ client);
++
++ if (id) {
++ chip_type = (enum pca955x_type)id->driver_data;
++ } else {
++ dev_err(&client->dev, "unknown chip\n");
++ return -ENODEV;
++ }
++ }
++
++ chip = &pca955x_chipdefs[chip_type];
+ adapter = client->adapter;
+ pdata = dev_get_platdata(&client->dev);
+ if (!pdata) {
+@@ -670,7 +685,7 @@ static struct i2c_driver pca955x_driver = {
+ .name = "leds-pca955x",
+ .of_match_table = of_pca955x_match,
+ },
+- .probe = pca955x_probe,
++ .probe_new = pca955x_probe,
+ .id_table = pca955x_id,
+ };