diff options
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.patch | 64 |
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, + }; |