diff options
author | Chris Blake <chrisrblake93@gmail.com> | 2022-02-14 18:54:02 -0600 |
---|---|---|
committer | Christian Lamparter <chunkeey@gmail.com> | 2022-06-19 12:31:02 +0200 |
commit | 78ecaebdff78378b0c9b081ac9beae29a69dbf69 (patch) | |
tree | 3af13f908f149f76e5fa36aa3e97e2145631bb52 /target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch | |
parent | 2e0afef246ef7128b982e02688d357269d9c7a6e (diff) | |
download | upstream-78ecaebdff78378b0c9b081ac9beae29a69dbf69.tar.gz upstream-78ecaebdff78378b0c9b081ac9beae29a69dbf69.tar.bz2 upstream-78ecaebdff78378b0c9b081ac9beae29a69dbf69.zip |
kernel: add upstream patches for pca955x led driver
These patches are to support the pca955x led with OpenWRT correctly via
device tree on linux 5.10. Without these, the new LED function/color/reg
features can not be used.
Signed-off-by: Chris Blake <chrisrblake93@gmail.com>
Diffstat (limited to 'target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch')
-rw-r--r-- | target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch b/target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch new file mode 100644 index 0000000000..7a091d9716 --- /dev/null +++ b/target/linux/generic/backport-5.10/843-v5.15-leds-pca955x-let-the-core-process-the-fwnode.patch @@ -0,0 +1,138 @@ +From 7c4815929276b2e223eb6f2e49afe5071d4294a5 Mon Sep 17 00:00:00 2001 +From: Eddie James <eajames@linux.ibm.com> +Date: Fri, 16 Jul 2021 17:03:30 -0500 +Subject: [PATCH] leds: pca955x: Let the core process the fwnode + +Much of the fwnode processing in the PCA955x driver is now in the +LEDs core driver, so pass the fwnode in the init data when +registering the LED device. In order to preserve the existing naming +scheme, check for an empty name and set it to the LED number. + +Signed-off-by: Eddie James <eajames@linux.ibm.com> +Signed-off-by: Pavel Machek <pavel@ucw.cz> +--- + drivers/leds/leds-pca955x.c | 58 +++++++++++++++++++------------------ + 1 file changed, 30 insertions(+), 28 deletions(-) + +diff --git a/drivers/leds/leds-pca955x.c b/drivers/leds/leds-pca955x.c +index fa1d77d86ef67b..a6aa4b9abde8c4 100644 +--- a/drivers/leds/leds-pca955x.c ++++ b/drivers/leds/leds-pca955x.c +@@ -127,10 +127,9 @@ struct pca955x_led { + struct pca955x *pca955x; + struct led_classdev led_cdev; + int led_num; /* 0 .. 15 potentially */ +- char name[32]; + u32 type; + int default_state; +- const char *default_trigger; ++ struct fwnode_handle *fwnode; + }; + + struct pca955x_platform_data { +@@ -439,7 +438,6 @@ pca955x_get_pdata(struct i2c_client *client, struct pca955x_chipdef *chip) + return ERR_PTR(-ENOMEM); + + device_for_each_child_node(&client->dev, child) { +- const char *name; + const char *state; + u32 reg; + int res; +@@ -448,17 +446,10 @@ pca955x_get_pdata(struct i2c_client *client, struct pca955x_chipdef *chip) + if ((res != 0) || (reg >= chip->bits)) + continue; + +- res = fwnode_property_read_string(child, "label", &name); +- if ((res != 0) && is_of_node(child)) +- name = to_of_node(child)->name; +- + led = &pdata->leds[reg]; +- snprintf(led->name, sizeof(led->name), "%s", name); +- + led->type = PCA955X_TYPE_LED; ++ led->fwnode = child; + fwnode_property_read_u32(child, "type", &led->type); +- fwnode_property_read_string(child, "linux,default-trigger", +- &led->default_trigger); + + if (!fwnode_property_read_string(child, "default-state", + &state)) { +@@ -495,11 +486,14 @@ static int pca955x_probe(struct i2c_client *client, + struct pca955x_led *pca955x_led; + struct pca955x_chipdef *chip; + struct led_classdev *led; ++ struct led_init_data init_data; + struct i2c_adapter *adapter; + int i, err; + struct pca955x_platform_data *pdata; + int ngpios = 0; ++ bool set_default_label = false; + bool keep_pwm = false; ++ char default_label[8]; + + chip = &pca955x_chipdefs[id->driver_data]; + adapter = client->adapter; +@@ -547,6 +541,9 @@ static int pca955x_probe(struct i2c_client *client, + pca955x->client = client; + pca955x->chipdef = chip; + ++ init_data.devname_mandatory = false; ++ init_data.devicename = "pca955x"; ++ + for (i = 0; i < chip->bits; i++) { + pca955x_led = &pca955x->leds[i]; + pca955x_led->led_num = i; +@@ -560,23 +557,7 @@ static int pca955x_probe(struct i2c_client *client, + ngpios++; + break; + case PCA955X_TYPE_LED: +- /* +- * Platform data can specify LED names and +- * default triggers +- */ +- if (pdata->leds[i].name[0] == '\0') +- snprintf(pdata->leds[i].name, +- sizeof(pdata->leds[i].name), "%d", i); +- +- snprintf(pca955x_led->name, sizeof(pca955x_led->name), +- "pca955x:%s", pdata->leds[i].name); +- + led = &pca955x_led->led_cdev; +- if (pdata->leds[i].default_trigger) +- led->default_trigger = +- pdata->leds[i].default_trigger; +- +- led->name = pca955x_led->name; + led->brightness_set_blocking = pca955x_led_set; + led->brightness_get = pca955x_led_get; + +@@ -592,7 +573,28 @@ static int pca955x_probe(struct i2c_client *client, + return err; + } + +- err = devm_led_classdev_register(&client->dev, led); ++ init_data.fwnode = pdata->leds[i].fwnode; ++ ++ if (is_of_node(init_data.fwnode)) { ++ if (to_of_node(init_data.fwnode)->name[0] == ++ '\0') ++ set_default_label = true; ++ else ++ set_default_label = false; ++ } else { ++ set_default_label = true; ++ } ++ ++ if (set_default_label) { ++ snprintf(default_label, sizeof(default_label), ++ "%d", i); ++ init_data.default_label = default_label; ++ } else { ++ init_data.default_label = NULL; ++ } ++ ++ err = devm_led_classdev_register_ext(&client->dev, led, ++ &init_data); + if (err) + return err; + |