Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'leds-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/leds

PULL LED updates from Lee Jones:

- Remove unused local header files from various drivers

- Revert platform driver removal to the original method for consistency

- Introduce ordered workqueues for LED events, replacing the less
efficient system_wq

- Switch to a safer iteration macro in several drivers to prevent
potential memory leaks

- Fix a refcounting bug in the mt6360 flash LED driver

- Fix an uninitialized variable in the mt6370_mc_pattern_clear()
function

- Resolve Smatch warnings in the leds-bcm6328 driver

- Address a potential NULL pointer dereference in the brightness_show()
function

- Fix an incorrect format specifier in the ss4200 driver

- Prevent a resource leak in the max5970 driver's probe function

- Add support for specifying the number of serial shift bits in the
device tree for the BCM63138 family

- Implement multicolor brightness control in the lp5562 driver

- Add a device tree property to override the default LED pin polarity

- Add a property to specify the default brightness value when the LED
is initially on

- Set missing timing properties for the ktd2692 driver

- Document the "rc-feedback" trigger for controlling LEDs based on
remote control activity

- Convert text bindings to YAML for the pca955x driver to enable device
tree validation

- Remove redundant checks for invalid channel numbers in the lp55xx
driver

- Update the MAINTAINERS file with current contact information

* tag 'leds-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/leds: (46 commits)
leds: ss4200: Fix the wrong format specifier for 'blinking'
leds: pwm: Add optional DT property default-brightness
dt-bindings: leds: pwm: Add default-brightness property
leds: class: Protect brightness_show() with led_cdev->led_access mutex
leds: ktd2692: Set missing timing properties
leds: max5970: Fix unreleased fwnode_handle in probe function
leds: Introduce ordered workqueue for LEDs events instead of system_wq
MAINTAINERS: Replace Siemens IPC related bouncing maintainers
leds: bcm6328: Replace divide condition with comparison for shift value
leds: lp55xx: Remove redundant test for invalid channel number
dt-bindings: leds: pca955x: Convert text bindings to YAML
leds: rgb: leds-mt6370-rgb: Fix uninitialized variable 'ret' in mt6370_mc_pattern_clear
leds: lp5562: Add multicolor brightness control
dt-bindings: leds: Add 'active-high' property
leds: Switch back to struct platform_driver::remove()
leds: bcm63138: Add some register defines
leds: bcm63138: Handle shift register config
leds: bcm63138: Use scopes and guards
dt-bindings: leds: bcm63138: Add shift register bits
leds: leds-gpio-register: Reorganize kerneldoc parameter names
...

+397 -330
+16
Documentation/devicetree/bindings/leds/common.yaml
··· 118 118 # No trigger assigned to the LED. This is the default mode 119 119 # if trigger is absent 120 120 - none 121 + # LED indicates remote control feedback 122 + - rc-feedback 121 123 # LED indicates camera torch state 122 124 - torch 123 125 # LED indicates USB gadget activity ··· 204 202 #trigger-source-cells property in the source node. 205 203 $ref: /schemas/types.yaml#/definitions/phandle-array 206 204 205 + active-high: 206 + type: boolean 207 + description: 208 + Makes LED active high. To turn the LED ON, line needs to be 209 + set to high voltage instead of low. 210 + 207 211 active-low: 208 212 type: boolean 209 213 description: ··· 232 224 description: 233 225 Maximum timeout in microseconds after which the flash LED is turned off. 234 226 Required for flash LED nodes with configurable timeout. 227 + 228 + allOf: 229 + - if: 230 + required: 231 + - active-low 232 + then: 233 + properties: 234 + active-high: false 235 235 236 236 additionalProperties: true 237 237
+11
Documentation/devicetree/bindings/leds/leds-bcm63138.yaml
··· 41 41 "#size-cells": 42 42 const: 0 43 43 44 + brcm,serial-shift-bits: 45 + minimum: 1 46 + maximum: 32 47 + description: 48 + This describes the number of 8-bit serial shifters connected to the LED 49 + controller block. The hardware is typically using 8-bit shift registers 50 + with 8 LEDs per shift register, so 4 shifters results in 32 LEDs or 2 51 + shifters give 16 LEDs etc, but the hardware supports any odd number of 52 + registers. If left unspecified, the hardware boot-time default is used. 53 + 44 54 patternProperties: 45 55 "^led@[a-f0-9]+$": 46 56 type: object ··· 81 71 leds@ff800800 { 82 72 compatible = "brcm,bcm4908-leds", "brcm,bcm63138-leds"; 83 73 reg = <0xff800800 0xdc>; 74 + brcm,serial-shift-bits = <16>; 84 75 85 76 #address-cells = <1>; 86 77 #size-cells = <0>;
-89
Documentation/devicetree/bindings/leds/leds-pca955x.txt
··· 1 - * NXP - pca955x LED driver 2 - 3 - The PCA955x family of chips are I2C LED blinkers whose pins not used 4 - to control LEDs can be used as general purpose I/Os. The GPIO pins can 5 - be input or output, and output pins can also be pulse-width controlled. 6 - 7 - Required properties: 8 - - compatible : should be one of : 9 - "nxp,pca9550" 10 - "nxp,pca9551" 11 - "nxp,pca9552" 12 - "ibm,pca9552" 13 - "nxp,pca9553" 14 - - #address-cells: must be 1 15 - - #size-cells: must be 0 16 - - reg: I2C slave address. depends on the model. 17 - 18 - Optional properties: 19 - - gpio-controller: allows pins to be used as GPIOs. 20 - - #gpio-cells: must be 2. 21 - - gpio-line-names: define the names of the GPIO lines 22 - 23 - LED sub-node properties: 24 - - reg : number of LED line. 25 - from 0 to 1 for the pca9550 26 - from 0 to 7 for the pca9551 27 - from 0 to 15 for the pca9552 28 - from 0 to 3 for the pca9553 29 - - type: (optional) either 30 - PCA955X_TYPE_NONE 31 - PCA955X_TYPE_LED 32 - PCA955X_TYPE_GPIO 33 - see dt-bindings/leds/leds-pca955x.h (default to LED) 34 - - label : (optional) 35 - see Documentation/devicetree/bindings/leds/common.txt 36 - - linux,default-trigger : (optional) 37 - see Documentation/devicetree/bindings/leds/common.txt 38 - 39 - Examples: 40 - 41 - pca9552: pca9552@60 { 42 - compatible = "nxp,pca9552"; 43 - #address-cells = <1>; 44 - #size-cells = <0>; 45 - reg = <0x60>; 46 - 47 - gpio-controller; 48 - #gpio-cells = <2>; 49 - gpio-line-names = "GPIO12", "GPIO13", "GPIO14", "GPIO15"; 50 - 51 - gpio@12 { 52 - reg = <12>; 53 - type = <PCA955X_TYPE_GPIO>; 54 - }; 55 - gpio@13 { 56 - reg = <13>; 57 - type = <PCA955X_TYPE_GPIO>; 58 - }; 59 - gpio@14 { 60 - reg = <14>; 61 - type = <PCA955X_TYPE_GPIO>; 62 - }; 63 - gpio@15 { 64 - reg = <15>; 65 - type = <PCA955X_TYPE_GPIO>; 66 - }; 67 - 68 - led@0 { 69 - label = "red:power"; 70 - linux,default-trigger = "default-on"; 71 - reg = <0>; 72 - type = <PCA955X_TYPE_LED>; 73 - }; 74 - led@1 { 75 - label = "green:power"; 76 - reg = <1>; 77 - type = <PCA955X_TYPE_LED>; 78 - }; 79 - led@2 { 80 - label = "pca9552:yellow"; 81 - reg = <2>; 82 - type = <PCA955X_TYPE_LED>; 83 - }; 84 - led@3 { 85 - label = "pca9552:white"; 86 - reg = <3>; 87 - type = <PCA955X_TYPE_LED>; 88 - }; 89 - };
+6
Documentation/devicetree/bindings/leds/leds-pwm.yaml
··· 34 34 Maximum brightness possible for the LED 35 35 $ref: /schemas/types.yaml#/definitions/uint32 36 36 37 + default-brightness: 38 + description: 39 + Brightness to be set if LED's default state is on. Used only during 40 + initialization. If the option is not set then max brightness is used. 41 + $ref: /schemas/types.yaml#/definitions/uint32 42 + 37 43 required: 38 44 - pwms 39 45 - max-brightness
+158
Documentation/devicetree/bindings/leds/nxp,pca955x.yaml
··· 1 + # SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/leds/nxp,pca955x.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: NXP PCA955X LED controllers 8 + 9 + maintainers: 10 + - Nate Case <ncase@xes-inc.com> 11 + 12 + description: | 13 + The PCA955x family of chips are I2C LED blinkers whose pins not used 14 + to control LEDs can be used as general purpose I/Os. The GPIO pins can 15 + be input or output, and output pins can also be pulse-width controlled. 16 + 17 + For more product information please see the link below: 18 + - https://www.nxp.com/docs/en/data-sheet/PCA9552.pdf 19 + 20 + properties: 21 + compatible: 22 + enum: 23 + - nxp,pca9550 24 + - nxp,pca9551 25 + - nxp,pca9552 26 + - ibm,pca9552 27 + - nxp,pca9553 28 + 29 + reg: 30 + maxItems: 1 31 + 32 + "#address-cells": 33 + const: 1 34 + 35 + "#size-cells": 36 + const: 0 37 + 38 + gpio-controller: true 39 + 40 + gpio-line-names: 41 + minItems: 1 42 + maxItems: 16 43 + 44 + "#gpio-cells": 45 + const: 2 46 + 47 + patternProperties: 48 + "^led@[0-9a-f]$": 49 + type: object 50 + $ref: common.yaml# 51 + unevaluatedProperties: false 52 + 53 + properties: 54 + reg: 55 + maxItems: 1 56 + type: 57 + description: | 58 + Output configuration, see include/dt-bindings/leds/leds-pca955x.h 59 + $ref: /schemas/types.yaml#/definitions/uint32 60 + default: 0 61 + minimum: 0 62 + maximum: 2 63 + 64 + required: 65 + - reg 66 + 67 + allOf: 68 + - if: 69 + properties: 70 + compatible: 71 + contains: 72 + enum: 73 + - nxp,pca9550 74 + then: 75 + patternProperties: 76 + "^led@[0-9a-f]$": 77 + properties: 78 + reg: 79 + maximum: 1 80 + - if: 81 + properties: 82 + compatible: 83 + contains: 84 + enum: 85 + - nxp,pca9551 86 + then: 87 + patternProperties: 88 + "^led@[0-9a-f]$": 89 + properties: 90 + reg: 91 + maximum: 7 92 + - if: 93 + properties: 94 + compatible: 95 + contains: 96 + enum: 97 + - nxp,pca9552 98 + - ibm,pca9552 99 + then: 100 + patternProperties: 101 + "^led@[0-9a-f]$": 102 + properties: 103 + reg: 104 + maximum: 15 105 + - if: 106 + properties: 107 + compatible: 108 + contains: 109 + enum: 110 + - nxp,pca9553 111 + then: 112 + patternProperties: 113 + "^led@[0-9a-f]$": 114 + properties: 115 + reg: 116 + maximum: 3 117 + 118 + additionalProperties: false 119 + 120 + examples: 121 + - | 122 + #include <dt-bindings/leds/leds-pca955x.h> 123 + 124 + i2c { 125 + #address-cells = <1>; 126 + #size-cells = <0>; 127 + 128 + led-controller@60 { 129 + compatible = "nxp,pca9552"; 130 + reg = <0x60>; 131 + #address-cells = <1>; 132 + #size-cells = <0>; 133 + 134 + led@0 { 135 + reg = <0>; 136 + label = "red:power"; 137 + linux,default-trigger = "default-on"; 138 + type = <PCA955X_TYPE_LED>; 139 + }; 140 + led@1 { 141 + reg = <1>; 142 + label = "green:power"; 143 + type = <PCA955X_TYPE_LED>; 144 + }; 145 + led@2 { 146 + reg = <2>; 147 + label = "pca9552:yellow"; 148 + type = <PCA955X_TYPE_LED>; 149 + }; 150 + led@3 { 151 + reg = <3>; 152 + label = "pca9552:white"; 153 + type = <PCA955X_TYPE_LED>; 154 + }; 155 + }; 156 + }; 157 + 158 + ...
+6 -6
MAINTAINERS
··· 21231 21231 F: drivers/media/usb/siano/ 21232 21232 21233 21233 SIEMENS IPC LED DRIVERS 21234 - M: Gerd Haeussler <gerd.haeussler.ext@siemens.com> 21235 - M: Xing Tong Wu <xingtong.wu@siemens.com> 21234 + M: Bao Cheng Su <baocheng.su@siemens.com> 21235 + M: Benedikt Niedermayr <benedikt.niedermayr@siemens.com> 21236 21236 M: Tobias Schaffner <tobias.schaffner@siemens.com> 21237 21237 L: linux-leds@vger.kernel.org 21238 21238 S: Maintained 21239 21239 F: drivers/leds/simple/ 21240 21240 21241 21241 SIEMENS IPC PLATFORM DRIVERS 21242 - M: Gerd Haeussler <gerd.haeussler.ext@siemens.com> 21243 - M: Xing Tong Wu <xingtong.wu@siemens.com> 21242 + M: Bao Cheng Su <baocheng.su@siemens.com> 21243 + M: Benedikt Niedermayr <benedikt.niedermayr@siemens.com> 21244 21244 M: Tobias Schaffner <tobias.schaffner@siemens.com> 21245 21245 L: platform-driver-x86@vger.kernel.org 21246 21246 S: Maintained ··· 21249 21249 F: include/linux/platform_data/x86/simatic-ipc.h 21250 21250 21251 21251 SIEMENS IPC WATCHDOG DRIVERS 21252 - M: Gerd Haeussler <gerd.haeussler.ext@siemens.com> 21253 - M: Xing Tong Wu <xingtong.wu@siemens.com> 21252 + M: Bao Cheng Su <baocheng.su@siemens.com> 21253 + M: Benedikt Niedermayr <benedikt.niedermayr@siemens.com> 21254 21254 M: Tobias Schaffner <tobias.schaffner@siemens.com> 21255 21255 L: linux-watchdog@vger.kernel.org 21256 21256 S: Maintained
+17 -12
drivers/leds/blink/leds-bcm63138.c
··· 2 2 /* 3 3 * Copyright (C) 2021 Rafał Miłecki <rafal@milecki.pl> 4 4 */ 5 + #include <linux/bits.h> 6 + #include <linux/cleanup.h> 5 7 #include <linux/delay.h> 6 8 #include <linux/io.h> 7 9 #include <linux/leds.h> ··· 21 19 #define BCM63138_LEDS_PER_REG (32 / BCM63138_LED_BITS) /* 8 */ 22 20 23 21 #define BCM63138_GLB_CTRL 0x00 24 - #define BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL 0x00000002 25 - #define BCM63138_GLB_CTRL_SERIAL_LED_EN_POL 0x00000008 22 + #define BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL BIT(1) 23 + #define BCM63138_GLB_CTRL_SERIAL_LED_CLK_POL BIT(2) 24 + #define BCM63138_GLB_CTRL_SERIAL_LED_EN_POL BIT(3) 25 + #define BCM63138_GLB_CTRL_SERIAL_LED_MSB_FIRST BIT(4) 26 26 #define BCM63138_MASK 0x04 27 27 #define BCM63138_HW_LED_EN 0x08 28 28 #define BCM63138_SERIAL_LED_SHIFT_SEL 0x0c ··· 37 33 #define BCM63138_BRIGHT_CTRL3 0x28 38 34 #define BCM63138_BRIGHT_CTRL4 0x2c 39 35 #define BCM63138_POWER_LED_CFG 0x30 36 + #define BCM63138_POWER_LUT_BASE0 0x34 /* -> b0 */ 40 37 #define BCM63138_HW_POLARITY 0xb4 41 38 #define BCM63138_SW_DATA 0xb8 42 39 #define BCM63138_SW_POLARITY 0xbc ··· 130 125 { 131 126 struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); 132 127 struct bcm63138_leds *leds = led->leds; 133 - unsigned long flags; 134 128 135 - spin_lock_irqsave(&leds->lock, flags); 129 + guard(spinlock_irqsave)(&leds->lock); 136 130 137 131 bcm63138_leds_enable_led(leds, led, value); 138 132 if (!value) 139 133 bcm63138_leds_set_flash_rate(leds, led, 0); 140 134 else 141 135 bcm63138_leds_set_bright(leds, led, value); 142 - 143 - spin_unlock_irqrestore(&leds->lock, flags); 144 136 } 145 137 146 138 static int bcm63138_leds_blink_set(struct led_classdev *led_cdev, ··· 146 144 { 147 145 struct bcm63138_led *led = container_of(led_cdev, struct bcm63138_led, cdev); 148 146 struct bcm63138_leds *leds = led->leds; 149 - unsigned long flags; 150 147 u8 value; 151 148 152 149 if (!*delay_on && !*delay_off) { ··· 180 179 return -EINVAL; 181 180 } 182 181 183 - spin_lock_irqsave(&leds->lock, flags); 182 + guard(spinlock_irqsave)(&leds->lock); 184 183 185 184 bcm63138_leds_enable_led(leds, led, BCM63138_MAX_BRIGHTNESS); 186 185 bcm63138_leds_set_flash_rate(leds, led, value); 187 - 188 - spin_unlock_irqrestore(&leds->lock, flags); 189 186 190 187 return 0; 191 188 } ··· 258 259 struct device_node *np = dev_of_node(&pdev->dev); 259 260 struct device *dev = &pdev->dev; 260 261 struct bcm63138_leds *leds; 261 - struct device_node *child; 262 + u32 shift_bits; 262 263 263 264 leds = devm_kzalloc(dev, sizeof(*leds), GFP_KERNEL); 264 265 if (!leds) ··· 272 273 273 274 spin_lock_init(&leds->lock); 274 275 276 + /* If this property is not present, we use boot defaults */ 277 + if (!of_property_read_u32(np, "brcm,serial-shift-bits", &shift_bits)) { 278 + bcm63138_leds_write(leds, BCM63138_SERIAL_LED_SHIFT_SEL, 279 + GENMASK(shift_bits - 1, 0)); 280 + } 281 + 275 282 bcm63138_leds_write(leds, BCM63138_GLB_CTRL, 276 283 BCM63138_GLB_CTRL_SERIAL_LED_DATA_PPOL | 277 284 BCM63138_GLB_CTRL_SERIAL_LED_EN_POL); ··· 285 280 bcm63138_leds_write(leds, BCM63138_SERIAL_LED_POLARITY, 0); 286 281 bcm63138_leds_write(leds, BCM63138_PARALLEL_LED_POLARITY, 0); 287 282 288 - for_each_available_child_of_node(np, child) { 283 + for_each_available_child_of_node_scoped(np, child) { 289 284 bcm63138_leds_create_led(leds, child); 290 285 } 291 286
+1 -1
drivers/leds/blink/leds-lgm-sso.c
··· 861 861 862 862 static struct platform_driver intel_sso_led_driver = { 863 863 .probe = intel_sso_led_probe, 864 - .remove_new = intel_sso_led_remove, 864 + .remove = intel_sso_led_remove, 865 865 .driver = { 866 866 .name = "lgm-ssoled", 867 867 .of_match_table = of_sso_led_match,
+1 -1
drivers/leds/flash/leds-aat1290.c
··· 536 536 537 537 static struct platform_driver aat1290_led_driver = { 538 538 .probe = aat1290_led_probe, 539 - .remove_new = aat1290_led_remove, 539 + .remove = aat1290_led_remove, 540 540 .driver = { 541 541 .name = "aat1290", 542 542 .of_match_table = aat1290_led_dt_match,
+2 -1
drivers/leds/flash/leds-ktd2692.c
··· 292 292 293 293 fled_cdev = &led->fled_cdev; 294 294 led_cdev = &fled_cdev->led_cdev; 295 + led->props.timing = ktd2692_timing; 295 296 296 297 ret = ktd2692_parse_dt(led, &pdev->dev, &led_cfg); 297 298 if (ret) ··· 344 343 .of_match_table = ktd2692_match, 345 344 }, 346 345 .probe = ktd2692_probe, 347 - .remove_new = ktd2692_remove, 346 + .remove = ktd2692_remove, 348 347 }; 349 348 350 349 module_platform_driver(ktd2692_driver);
+1 -1
drivers/leds/flash/leds-max77693.c
··· 1042 1042 1043 1043 static struct platform_driver max77693_led_driver = { 1044 1044 .probe = max77693_led_probe, 1045 - .remove_new = max77693_led_remove, 1045 + .remove = max77693_led_remove, 1046 1046 .driver = { 1047 1047 .name = "max77693-led", 1048 1048 .of_match_table = max77693_led_dt_match,
+2 -3
drivers/leds/flash/leds-mt6360.c
··· 784 784 static int mt6360_led_probe(struct platform_device *pdev) 785 785 { 786 786 struct mt6360_priv *priv; 787 - struct fwnode_handle *child; 788 787 size_t count; 789 788 int i = 0, ret; 790 789 ··· 810 811 return -ENODEV; 811 812 } 812 813 813 - device_for_each_child_node(&pdev->dev, child) { 814 + device_for_each_child_node_scoped(&pdev->dev, child) { 814 815 struct mt6360_led *led = priv->leds + i; 815 816 struct led_init_data init_data = { .fwnode = child, }; 816 817 u32 reg, led_color; ··· 886 887 .of_match_table = mt6360_led_of_id, 887 888 }, 888 889 .probe = mt6360_led_probe, 889 - .remove_new = mt6360_led_remove, 890 + .remove = mt6360_led_remove, 890 891 }; 891 892 module_platform_driver(mt6360_led_driver); 892 893
+3 -8
drivers/leds/flash/leds-mt6370-flash.c
··· 509 509 { 510 510 struct device *dev = &pdev->dev; 511 511 struct mt6370_priv *priv; 512 - struct fwnode_handle *child; 513 512 size_t count; 514 513 int i = 0, ret; 515 514 ··· 528 529 if (!priv->regmap) 529 530 return dev_err_probe(dev, -ENODEV, "Failed to get parent regmap\n"); 530 531 531 - device_for_each_child_node(dev, child) { 532 + device_for_each_child_node_scoped(dev, child) { 532 533 struct mt6370_led *led = priv->leds + i; 533 534 534 535 led->priv = priv; 535 536 536 537 ret = mt6370_init_flash_properties(dev, led, child); 537 - if (ret) { 538 - fwnode_handle_put(child); 538 + if (ret) 539 539 return ret; 540 - } 541 540 542 541 ret = mt6370_led_register(dev, led, child); 543 - if (ret) { 544 - fwnode_handle_put(child); 542 + if (ret) 545 543 return ret; 546 - } 547 544 548 545 i++; 549 546 }
+2 -4
drivers/leds/flash/leds-qcom-flash.c
··· 812 812 { 813 813 struct qcom_flash_data *flash_data; 814 814 struct qcom_flash_led *led; 815 - struct fwnode_handle *child; 816 815 struct device *dev = &pdev->dev; 817 816 struct regmap *regmap; 818 817 struct reg_field *regs; ··· 895 896 if (!flash_data->v4l2_flash) 896 897 return -ENOMEM; 897 898 898 - device_for_each_child_node(dev, child) { 899 + device_for_each_child_node_scoped(dev, child) { 899 900 led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL); 900 901 if (!led) { 901 902 rc = -ENOMEM; ··· 913 914 return 0; 914 915 915 916 release: 916 - fwnode_handle_put(child); 917 917 while (flash_data->v4l2_flash[flash_data->leds_count] && flash_data->leds_count) 918 918 v4l2_flash_release(flash_data->v4l2_flash[flash_data->leds_count--]); 919 919 return rc; ··· 940 942 .of_match_table = qcom_flash_led_match_table, 941 943 }, 942 944 .probe = qcom_flash_led_probe, 943 - .remove_new = qcom_flash_led_remove, 945 + .remove = qcom_flash_led_remove, 944 946 }; 945 947 946 948 module_platform_driver(qcom_flash_led_driver);
+1 -1
drivers/leds/flash/leds-rt8515.c
··· 388 388 .of_match_table = rt8515_match, 389 389 }, 390 390 .probe = rt8515_probe, 391 - .remove_new = rt8515_remove, 391 + .remove = rt8515_remove, 392 392 }; 393 393 module_platform_driver(rt8515_driver); 394 394
+1 -1
drivers/leds/flash/leds-sgm3140.c
··· 300 300 301 301 static struct platform_driver sgm3140_driver = { 302 302 .probe = sgm3140_probe, 303 - .remove_new = sgm3140_remove, 303 + .remove = sgm3140_remove, 304 304 .driver = { 305 305 .name = "sgm3140", 306 306 .of_match_table = sgm3140_dt_match,
-1
drivers/leds/led-class-flash.c
··· 12 12 #include <linux/leds.h> 13 13 #include <linux/module.h> 14 14 #include <linux/slab.h> 15 - #include "leds.h" 16 15 17 16 #define has_flash_op(fled_cdev, op) \ 18 17 (fled_cdev && fled_cdev->ops->op)
-2
drivers/leds/led-class-multicolor.c
··· 11 11 #include <linux/slab.h> 12 12 #include <linux/uaccess.h> 13 13 14 - #include "leds.h" 15 - 16 14 int led_mc_calc_color_components(struct led_classdev_mc *mcled_cdev, 17 15 enum led_brightness brightness) 18 16 {
+22 -4
drivers/leds/led-class.c
··· 25 25 static DEFINE_MUTEX(leds_lookup_lock); 26 26 static LIST_HEAD(leds_lookup_list); 27 27 28 + static struct workqueue_struct *leds_wq; 29 + 28 30 static ssize_t brightness_show(struct device *dev, 29 31 struct device_attribute *attr, char *buf) 30 32 { 31 33 struct led_classdev *led_cdev = dev_get_drvdata(dev); 34 + unsigned int brightness; 32 35 33 - /* no lock needed for this */ 36 + mutex_lock(&led_cdev->led_access); 34 37 led_update_brightness(led_cdev); 38 + brightness = led_cdev->brightness; 39 + mutex_unlock(&led_cdev->led_access); 35 40 36 - return sprintf(buf, "%u\n", led_cdev->brightness); 41 + return sprintf(buf, "%u\n", brightness); 37 42 } 38 43 39 44 static ssize_t brightness_store(struct device *dev, ··· 62 57 if (state == LED_OFF) 63 58 led_trigger_remove(led_cdev); 64 59 led_set_brightness(led_cdev, state); 65 - flush_work(&led_cdev->set_brightness_work); 66 60 67 61 ret = size; 68 62 unlock: ··· 74 70 struct device_attribute *attr, char *buf) 75 71 { 76 72 struct led_classdev *led_cdev = dev_get_drvdata(dev); 73 + unsigned int max_brightness; 77 74 78 - return sprintf(buf, "%u\n", led_cdev->max_brightness); 75 + mutex_lock(&led_cdev->led_access); 76 + max_brightness = led_cdev->max_brightness; 77 + mutex_unlock(&led_cdev->led_access); 78 + 79 + return sprintf(buf, "%u\n", max_brightness); 79 80 } 80 81 static DEVICE_ATTR_RO(max_brightness); 81 82 ··· 558 549 559 550 led_update_brightness(led_cdev); 560 551 552 + led_cdev->wq = leds_wq; 553 + 561 554 led_init_core(led_cdev); 562 555 563 556 #ifdef CONFIG_LEDS_TRIGGERS ··· 678 667 679 668 static int __init leds_init(void) 680 669 { 670 + leds_wq = alloc_ordered_workqueue("leds", 0); 671 + if (!leds_wq) { 672 + pr_err("Failed to create LEDs ordered workqueue\n"); 673 + return -ENOMEM; 674 + } 675 + 681 676 return class_register(&leds_class); 682 677 } 683 678 684 679 static void __exit leds_exit(void) 685 680 { 686 681 class_unregister(&leds_class); 682 + destroy_workqueue(leds_wq); 687 683 } 688 684 689 685 subsys_initcall(leds_init);
+3 -3
drivers/leds/led-core.c
··· 273 273 led_cdev->delayed_delay_on = delay_on; 274 274 led_cdev->delayed_delay_off = delay_off; 275 275 set_bit(LED_SET_BLINK, &led_cdev->work_flags); 276 - schedule_work(&led_cdev->set_brightness_work); 276 + queue_work(led_cdev->wq, &led_cdev->set_brightness_work); 277 277 return; 278 278 } 279 279 ··· 304 304 */ 305 305 if (!brightness) { 306 306 set_bit(LED_BLINK_DISABLE, &led_cdev->work_flags); 307 - schedule_work(&led_cdev->set_brightness_work); 307 + queue_work(led_cdev->wq, &led_cdev->set_brightness_work); 308 308 } else { 309 309 set_bit(LED_BLINK_BRIGHTNESS_CHANGE, 310 310 &led_cdev->work_flags); ··· 340 340 set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags); 341 341 } 342 342 343 - schedule_work(&led_cdev->set_brightness_work); 343 + queue_work(led_cdev->wq, &led_cdev->set_brightness_work); 344 344 } 345 345 EXPORT_SYMBOL_GPL(led_set_brightness_nopm); 346 346
+1 -1
drivers/leds/leds-88pm860x.c
··· 226 226 .name = "88pm860x-led", 227 227 }, 228 228 .probe = pm860x_led_probe, 229 - .remove_new = pm860x_led_remove, 229 + .remove = pm860x_led_remove, 230 230 }; 231 231 232 232 module_platform_driver(pm860x_led_driver);
+1 -1
drivers/leds/leds-adp5520.c
··· 184 184 .name = "adp5520-led", 185 185 }, 186 186 .probe = adp5520_led_probe, 187 - .remove_new = adp5520_led_remove, 187 + .remove = adp5520_led_remove, 188 188 }; 189 189 190 190 module_platform_driver(adp5520_led_driver);
+2 -5
drivers/leds/leds-aw200xx.c
··· 409 409 410 410 static int aw200xx_probe_fw(struct device *dev, struct aw200xx *chip) 411 411 { 412 - struct fwnode_handle *child; 413 412 u32 current_min, current_max, min_uA; 414 413 int ret; 415 414 int i; ··· 423 424 min_uA = UINT_MAX; 424 425 i = 0; 425 426 426 - device_for_each_child_node(dev, child) { 427 + device_for_each_child_node_scoped(dev, child) { 427 428 struct led_init_data init_data = {}; 428 429 struct aw200xx_led *led; 429 430 u32 source, imax; ··· 467 468 468 469 ret = devm_led_classdev_register_ext(dev, &led->cdev, 469 470 &init_data); 470 - if (ret) { 471 - fwnode_handle_put(child); 471 + if (ret) 472 472 break; 473 - } 474 473 475 474 i++; 476 475 }
+2 -2
drivers/leds/leds-bcm6328.c
··· 113 113 unsigned long val, shift; 114 114 115 115 shift = bcm6328_pin2shift(led->pin); 116 - if (shift / 16) 116 + if (shift >= 16) 117 117 mode = led->mem + BCM6328_REG_MODE_HI; 118 118 else 119 119 mode = led->mem + BCM6328_REG_MODE_LO; ··· 357 357 break; 358 358 case LEDS_DEFSTATE_KEEP: 359 359 shift = bcm6328_pin2shift(led->pin); 360 - if (shift / 16) 360 + if (shift >= 16) 361 361 mode = mem + BCM6328_REG_MODE_HI; 362 362 else 363 363 mode = mem + BCM6328_REG_MODE_LO;
+1 -1
drivers/leds/leds-cht-wcove.c
··· 461 461 462 462 static struct platform_driver cht_wc_leds_driver = { 463 463 .probe = cht_wc_leds_probe, 464 - .remove_new = cht_wc_leds_remove, 464 + .remove = cht_wc_leds_remove, 465 465 .shutdown = cht_wc_leds_disable, 466 466 .driver = { 467 467 .name = "cht_wcove_leds",
+1 -1
drivers/leds/leds-clevo-mail.c
··· 165 165 } 166 166 167 167 static struct platform_driver clevo_mail_led_driver = { 168 - .remove_new = clevo_mail_led_remove, 168 + .remove = clevo_mail_led_remove, 169 169 .driver = { 170 170 .name = KBUILD_MODNAME, 171 171 },
+1 -3
drivers/leds/leds-cr0014114.c
··· 181 181 { 182 182 size_t i = 0; 183 183 struct cr0014114_led *led; 184 - struct fwnode_handle *child; 185 184 struct led_init_data init_data = {}; 186 185 int ret; 187 186 188 - device_for_each_child_node(priv->dev, child) { 187 + device_for_each_child_node_scoped(priv->dev, child) { 189 188 led = &priv->leds[i]; 190 189 191 190 led->priv = priv; ··· 200 201 if (ret) { 201 202 dev_err(priv->dev, 202 203 "failed to register LED device, err %d", ret); 203 - fwnode_handle_put(child); 204 204 return ret; 205 205 } 206 206
+1 -1
drivers/leds/leds-da903x.c
··· 133 133 .name = "da903x-led", 134 134 }, 135 135 .probe = da903x_led_probe, 136 - .remove_new = da903x_led_remove, 136 + .remove = da903x_led_remove, 137 137 }; 138 138 139 139 module_platform_driver(da903x_led_driver);
+1 -1
drivers/leds/leds-da9052.c
··· 179 179 .name = "da9052-leds", 180 180 }, 181 181 .probe = da9052_led_probe, 182 - .remove_new = da9052_led_remove, 182 + .remove = da9052_led_remove, 183 183 }; 184 184 185 185 module_platform_driver(da9052_led_driver);
+4 -10
drivers/leds/leds-el15203000.c
··· 237 237 static int el15203000_probe_dt(struct el15203000 *priv) 238 238 { 239 239 struct el15203000_led *led = priv->leds; 240 - struct fwnode_handle *child; 241 240 int ret; 242 241 243 - device_for_each_child_node(priv->dev, child) { 242 + device_for_each_child_node_scoped(priv->dev, child) { 244 243 struct led_init_data init_data = {}; 245 244 246 245 ret = fwnode_property_read_u32(child, "reg", &led->reg); 247 246 if (ret) { 248 247 dev_err(priv->dev, "LED without ID number"); 249 - goto err_child_out; 248 + return ret; 250 249 } 251 250 252 251 if (led->reg > U8_MAX) { 253 252 dev_err(priv->dev, "LED value %d is invalid", led->reg); 254 - ret = -EINVAL; 255 - goto err_child_out; 253 + return -EINVAL; 256 254 } 257 255 258 256 led->priv = priv; ··· 272 274 dev_err(priv->dev, 273 275 "failed to register LED device %s, err %d", 274 276 led->ldev.name, ret); 275 - goto err_child_out; 277 + return ret; 276 278 } 277 279 278 280 led++; 279 281 } 280 282 281 283 return 0; 282 - 283 - err_child_out: 284 - fwnode_handle_put(child); 285 - return ret; 286 284 } 287 285 288 286 static int el15203000_probe(struct spi_device *spi)
+1 -1
drivers/leds/leds-gpio-register.c
··· 10 10 11 11 /** 12 12 * gpio_led_register_device - register a gpio-led device 13 - * @pdata: the platform data used for the new device 14 13 * @id: platform ID 14 + * @pdata: the platform data used for the new device 15 15 * 16 16 * Makes a copy of pdata and pdata->leds and registers a new leds-gpio device 17 17 * with the result. This allows to have pdata and pdata-leds in .init.rodata
+3 -8
drivers/leds/leds-gpio.c
··· 21 21 #include <linux/slab.h> 22 22 #include <linux/types.h> 23 23 24 - #include "leds.h" 25 - 26 24 struct gpio_led_data { 27 25 struct led_classdev cdev; 28 26 struct gpio_desc *gpiod; ··· 146 148 147 149 static struct gpio_leds_priv *gpio_leds_create(struct device *dev) 148 150 { 149 - struct fwnode_handle *child; 150 151 struct gpio_leds_priv *priv; 151 152 int count, used, ret; 152 153 ··· 159 162 priv->num_leds = count; 160 163 used = 0; 161 164 162 - device_for_each_child_node(dev, child) { 165 + device_for_each_child_node_scoped(dev, child) { 163 166 struct gpio_led_data *led_dat = &priv->leds[used]; 164 167 struct gpio_led led = {}; 165 168 ··· 173 176 if (IS_ERR(led.gpiod)) { 174 177 dev_err_probe(dev, PTR_ERR(led.gpiod), "Failed to get GPIO '%pfw'\n", 175 178 child); 176 - fwnode_handle_put(child); 177 179 return ERR_CAST(led.gpiod); 178 180 } 179 181 ··· 188 192 led.panic_indicator = 1; 189 193 190 194 ret = create_gpio_led(&led, led_dat, dev, child, NULL); 191 - if (ret < 0) { 192 - fwnode_handle_put(child); 195 + if (ret < 0) 193 196 return ERR_PTR(ret); 194 - } 197 + 195 198 /* Set gpiod label to match the corresponding LED name. */ 196 199 gpiod_set_consumer_name(led_dat->gpiod, 197 200 led_dat->cdev.dev->kobj.name);
+7 -11
drivers/leds/leds-lm3532.c
··· 551 551 552 552 static int lm3532_parse_node(struct lm3532_data *priv) 553 553 { 554 - struct fwnode_handle *child = NULL; 555 554 struct lm3532_led *led; 556 555 int control_bank; 557 556 u32 ramp_time; ··· 586 587 else 587 588 priv->runtime_ramp_down = lm3532_get_ramp_index(ramp_time); 588 589 589 - device_for_each_child_node(priv->dev, child) { 590 + device_for_each_child_node_scoped(priv->dev, child) { 590 591 struct led_init_data idata = { 591 592 .fwnode = child, 592 593 .default_label = ":", ··· 598 599 ret = fwnode_property_read_u32(child, "reg", &control_bank); 599 600 if (ret) { 600 601 dev_err(&priv->client->dev, "reg property missing\n"); 601 - goto child_out; 602 + return ret; 602 603 } 603 604 604 605 if (control_bank > LM3532_CONTROL_C) { ··· 612 613 &led->mode); 613 614 if (ret) { 614 615 dev_err(&priv->client->dev, "ti,led-mode property missing\n"); 615 - goto child_out; 616 + return ret; 616 617 } 617 618 618 619 if (fwnode_property_present(child, "led-max-microamp") && ··· 646 647 led->num_leds); 647 648 if (ret) { 648 649 dev_err(&priv->client->dev, "led-sources property missing\n"); 649 - goto child_out; 650 + return ret; 650 651 } 651 652 652 653 led->priv = priv; ··· 656 657 if (ret) { 657 658 dev_err(&priv->client->dev, "led register err: %d\n", 658 659 ret); 659 - goto child_out; 660 + return ret; 660 661 } 661 662 662 663 ret = lm3532_init_registers(led); 663 664 if (ret) { 664 665 dev_err(&priv->client->dev, "register init err: %d\n", 665 666 ret); 666 - goto child_out; 667 + return ret; 667 668 } 668 669 669 670 i++; 670 671 } 671 - return 0; 672 672 673 - child_out: 674 - fwnode_handle_put(child); 675 - return ret; 673 + return 0; 676 674 } 677 675 678 676 static int lm3532_probe(struct i2c_client *client)
+1 -1
drivers/leds/leds-lm3533.c
··· 744 744 .name = "lm3533-leds", 745 745 }, 746 746 .probe = lm3533_led_probe, 747 - .remove_new = lm3533_led_remove, 747 + .remove = lm3533_led_remove, 748 748 .shutdown = lm3533_led_shutdown, 749 749 }; 750 750 module_platform_driver(lm3533_led_driver);
+6 -12
drivers/leds/leds-lm3697.c
··· 202 202 203 203 static int lm3697_probe_dt(struct lm3697 *priv) 204 204 { 205 - struct fwnode_handle *child = NULL; 206 205 struct device *dev = priv->dev; 207 206 struct lm3697_led *led; 208 207 int ret = -EINVAL; ··· 219 220 if (IS_ERR(priv->regulator)) 220 221 priv->regulator = NULL; 221 222 222 - device_for_each_child_node(dev, child) { 223 + device_for_each_child_node_scoped(dev, child) { 223 224 struct led_init_data init_data = {}; 224 225 225 226 ret = fwnode_property_read_u32(child, "reg", &control_bank); 226 227 if (ret) { 227 228 dev_err(dev, "reg property missing\n"); 228 - goto child_out; 229 + return ret; 229 230 } 230 231 231 232 if (control_bank > LM3697_CONTROL_B) { 232 233 dev_err(dev, "reg property is invalid\n"); 233 - ret = -EINVAL; 234 - goto child_out; 234 + return -EINVAL; 235 235 } 236 236 237 237 led = &priv->leds[i]; ··· 260 262 led->num_leds); 261 263 if (ret) { 262 264 dev_err(dev, "led-sources property missing\n"); 263 - goto child_out; 265 + return ret; 264 266 } 265 267 266 268 for (j = 0; j < led->num_leds; j++) ··· 284 286 &init_data); 285 287 if (ret) { 286 288 dev_err(dev, "led register err: %d\n", ret); 287 - goto child_out; 289 + return ret; 288 290 } 289 291 290 292 i++; 291 293 } 292 294 293 - return ret; 294 - 295 - child_out: 296 - fwnode_handle_put(child); 297 - return ret; 295 + return 0; 298 296 } 299 297 300 298 static int lm3697_probe(struct i2c_client *client)
+7 -16
drivers/leds/leds-lp50xx.c
··· 16 16 17 17 #include <linux/led-class-multicolor.h> 18 18 19 - #include "leds.h" 20 - 21 19 #define LP50XX_DEV_CFG0 0x00 22 20 #define LP50XX_DEV_CFG1 0x01 23 21 #define LP50XX_LED_CFG0 0x02 ··· 432 434 433 435 static int lp50xx_probe_dt(struct lp50xx *priv) 434 436 { 435 - struct fwnode_handle *child = NULL; 436 437 struct fwnode_handle *led_node = NULL; 437 438 struct led_init_data init_data = {}; 438 439 struct led_classdev *led_cdev; ··· 451 454 if (IS_ERR(priv->regulator)) 452 455 priv->regulator = NULL; 453 456 454 - device_for_each_child_node(priv->dev, child) { 457 + device_for_each_child_node_scoped(priv->dev, child) { 455 458 led = &priv->leds[i]; 456 459 ret = fwnode_property_count_u32(child, "reg"); 457 460 if (ret < 0) { 458 461 dev_err(priv->dev, "reg property is invalid\n"); 459 - goto child_out; 462 + return ret; 460 463 } 461 464 462 465 ret = lp50xx_probe_leds(child, priv, led, ret); 463 466 if (ret) 464 - goto child_out; 467 + return ret; 465 468 466 469 init_data.fwnode = child; 467 470 num_colors = 0; ··· 472 475 */ 473 476 mc_led_info = devm_kcalloc(priv->dev, LP50XX_LEDS_PER_MODULE, 474 477 sizeof(*mc_led_info), GFP_KERNEL); 475 - if (!mc_led_info) { 476 - ret = -ENOMEM; 477 - goto child_out; 478 - } 478 + if (!mc_led_info) 479 + return -ENOMEM; 479 480 480 481 fwnode_for_each_child_node(child, led_node) { 481 482 ret = fwnode_property_read_u32(led_node, "color", ··· 481 486 if (ret) { 482 487 fwnode_handle_put(led_node); 483 488 dev_err(priv->dev, "Cannot read color\n"); 484 - goto child_out; 489 + return ret; 485 490 } 486 491 487 492 mc_led_info[num_colors].color_index = color_id; ··· 499 504 &init_data); 500 505 if (ret) { 501 506 dev_err(priv->dev, "led register err: %d\n", ret); 502 - goto child_out; 507 + return ret; 503 508 } 504 509 i++; 505 510 } 506 511 507 512 return 0; 508 - 509 - child_out: 510 - fwnode_handle_put(child); 511 - return ret; 512 513 } 513 514 514 515 static int lp50xx_probe(struct i2c_client *client)
+25
drivers/leds/leds-lp5562.c
··· 161 161 return 0; 162 162 } 163 163 164 + static int lp5562_multicolor_brightness(struct lp55xx_led *led) 165 + { 166 + struct lp55xx_chip *chip = led->chip; 167 + static const u8 addr[] = { 168 + LP5562_REG_R_PWM, 169 + LP5562_REG_G_PWM, 170 + LP5562_REG_B_PWM, 171 + LP5562_REG_W_PWM, 172 + }; 173 + int ret; 174 + int i; 175 + 176 + guard(mutex)(&chip->lock); 177 + for (i = 0; i < led->mc_cdev.num_colors; i++) { 178 + ret = lp55xx_write(chip, 179 + addr[led->mc_cdev.subled_info[i].channel], 180 + led->mc_cdev.subled_info[i].brightness); 181 + if (ret) 182 + break; 183 + } 184 + 185 + return ret; 186 + } 187 + 164 188 static int lp5562_led_brightness(struct lp55xx_led *led) 165 189 { 166 190 struct lp55xx_chip *chip = led->chip; ··· 388 364 .post_init_device = lp5562_post_init_device, 389 365 .set_led_current = lp5562_set_led_current, 390 366 .brightness_fn = lp5562_led_brightness, 367 + .multicolor_brightness_fn = lp5562_multicolor_brightness, 391 368 .run_engine = lp5562_run_engine, 392 369 .firmware_cb = lp55xx_firmware_loaded_cb, 393 370 .dev_attr_group = &lp5562_group,
-3
drivers/leds/leds-lp55xx-common.c
··· 1132 1132 if (ret) 1133 1133 return ret; 1134 1134 1135 - if (*chan_nr < 0 || *chan_nr > cfg->max_channel) 1136 - return -EINVAL; 1137 - 1138 1135 return 0; 1139 1136 } 1140 1137
+3 -2
drivers/leds/leds-max5970.c
··· 45 45 46 46 static int max5970_led_probe(struct platform_device *pdev) 47 47 { 48 - struct fwnode_handle *led_node, *child; 48 + struct fwnode_handle *child; 49 49 struct device *dev = &pdev->dev; 50 50 struct regmap *regmap; 51 51 struct max5970_led *ddata; ··· 55 55 if (!regmap) 56 56 return -ENODEV; 57 57 58 - led_node = device_get_named_child_node(dev->parent, "leds"); 58 + struct fwnode_handle *led_node __free(fwnode_handle) = 59 + device_get_named_child_node(dev->parent, "leds"); 59 60 if (!led_node) 60 61 return -ENODEV; 61 62
+6 -12
drivers/leds/leds-max77650.c
··· 62 62 63 63 static int max77650_led_probe(struct platform_device *pdev) 64 64 { 65 - struct fwnode_handle *child; 66 65 struct max77650_led *leds, *led; 67 66 struct device *dev; 68 67 struct regmap *map; ··· 83 84 if (!num_leds || num_leds > MAX77650_LED_NUM_LEDS) 84 85 return -ENODEV; 85 86 86 - device_for_each_child_node(dev, child) { 87 + device_for_each_child_node_scoped(dev, child) { 87 88 struct led_init_data init_data = {}; 88 89 89 90 rv = fwnode_property_read_u32(child, "reg", &reg); 90 - if (rv || reg >= MAX77650_LED_NUM_LEDS) { 91 - rv = -EINVAL; 92 - goto err_node_put; 93 - } 91 + if (rv || reg >= MAX77650_LED_NUM_LEDS) 92 + return -EINVAL; 94 93 95 94 led = &leds[reg]; 96 95 led->map = map; ··· 105 108 rv = devm_led_classdev_register_ext(dev, &led->cdev, 106 109 &init_data); 107 110 if (rv) 108 - goto err_node_put; 111 + return rv; 109 112 110 113 rv = regmap_write(map, led->regA, MAX77650_LED_A_DEFAULT); 111 114 if (rv) 112 - goto err_node_put; 115 + return rv; 113 116 114 117 rv = regmap_write(map, led->regB, MAX77650_LED_B_DEFAULT); 115 118 if (rv) 116 - goto err_node_put; 119 + return rv; 117 120 } 118 121 119 122 return regmap_write(map, 120 123 MAX77650_REG_CNFG_LED_TOP, 121 124 MAX77650_LED_TOP_DEFAULT); 122 - err_node_put: 123 - fwnode_handle_put(child); 124 - return rv; 125 125 } 126 126 127 127 static const struct of_device_id max77650_led_of_match[] = {
+1 -1
drivers/leds/leds-mc13783.c
··· 301 301 .driver = { 302 302 .name = "mc13xxx-led", 303 303 }, 304 - .remove_new = mc13xxx_led_remove, 304 + .remove = mc13xxx_led_remove, 305 305 .id_table = mc13xxx_led_id_table, 306 306 }; 307 307 module_platform_driver_probe(mc13xxx_led_driver, mc13xxx_led_probe);
+1 -1
drivers/leds/leds-mt6323.c
··· 713 713 714 714 static struct platform_driver mt6323_led_driver = { 715 715 .probe = mt6323_led_probe, 716 - .remove_new = mt6323_led_remove, 716 + .remove = mt6323_led_remove, 717 717 .driver = { 718 718 .name = "mt6323-led", 719 719 .of_match_table = mt6323_led_dt_match,
+2 -5
drivers/leds/leds-ns2.c
··· 238 238 static int ns2_led_probe(struct platform_device *pdev) 239 239 { 240 240 struct device *dev = &pdev->dev; 241 - struct fwnode_handle *child; 242 241 struct ns2_led *leds; 243 242 int count; 244 243 int ret; ··· 250 251 if (!leds) 251 252 return -ENOMEM; 252 253 253 - device_for_each_child_node(dev, child) { 254 + device_for_each_child_node_scoped(dev, child) { 254 255 ret = ns2_led_register(dev, child, leds++); 255 - if (ret) { 256 - fwnode_handle_put(child); 256 + if (ret) 257 257 return ret; 258 - } 259 258 } 260 259 261 260 return 0;
+3 -8
drivers/leds/leds-pca963x.c
··· 306 306 struct pca963x_chipdef *chipdef = chip->chipdef; 307 307 struct pca963x_led *led = chip->leds; 308 308 struct device *dev = &client->dev; 309 - struct fwnode_handle *child; 310 309 bool hw_blink; 311 310 s32 mode2; 312 311 u32 reg; ··· 337 338 if (ret < 0) 338 339 return ret; 339 340 340 - device_for_each_child_node(dev, child) { 341 + device_for_each_child_node_scoped(dev, child) { 341 342 struct led_init_data init_data = {}; 342 343 char default_label[32]; 343 344 ··· 345 346 if (ret || reg >= chipdef->n_leds) { 346 347 dev_err(dev, "Invalid 'reg' property for node %pfw\n", 347 348 child); 348 - ret = -EINVAL; 349 - goto err; 349 + return -EINVAL; 350 350 } 351 351 352 352 led->led_num = reg; ··· 367 369 if (ret) { 368 370 dev_err(dev, "Failed to register LED for node %pfw\n", 369 371 child); 370 - goto err; 372 + return ret; 371 373 } 372 374 373 375 ++led; 374 376 } 375 377 376 378 return 0; 377 - err: 378 - fwnode_handle_put(child); 379 - return ret; 380 379 } 381 380 382 381 static int pca963x_suspend(struct device *dev)
+2 -2
drivers/leds/leds-powernv.c
··· 323 323 MODULE_DEVICE_TABLE(of, powernv_led_match); 324 324 325 325 static struct platform_driver powernv_led_driver = { 326 - .probe = powernv_led_probe, 327 - .remove_new = powernv_led_remove, 326 + .probe = powernv_led_probe, 327 + .remove = powernv_led_remove, 328 328 .driver = { 329 329 .name = "powernv-led-driver", 330 330 .of_match_table = powernv_led_match,
+20 -13
drivers/leds/leds-pwm.c
··· 17 17 #include <linux/err.h> 18 18 #include <linux/pwm.h> 19 19 #include <linux/slab.h> 20 - #include "leds.h" 21 20 22 21 struct led_pwm { 23 22 const char *name; ··· 62 63 return pwm_apply_might_sleep(led_dat->pwm, &led_dat->pwmstate); 63 64 } 64 65 66 + static int led_pwm_default_brightness_get(struct fwnode_handle *fwnode, 67 + int max_brightness) 68 + { 69 + unsigned int default_brightness; 70 + int ret; 71 + 72 + ret = fwnode_property_read_u32(fwnode, "default-brightness", 73 + &default_brightness); 74 + if (ret < 0 || default_brightness > max_brightness) 75 + default_brightness = max_brightness; 76 + 77 + return default_brightness; 78 + } 79 + 65 80 __attribute__((nonnull)) 66 81 static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv, 67 82 struct led_pwm *led, struct fwnode_handle *fwnode) ··· 117 104 /* set brightness */ 118 105 switch (led->default_state) { 119 106 case LEDS_DEFSTATE_ON: 120 - led_data->cdev.brightness = led->max_brightness; 107 + led_data->cdev.brightness = 108 + led_pwm_default_brightness_get(fwnode, led->max_brightness); 121 109 break; 122 110 case LEDS_DEFSTATE_KEEP: 123 111 { ··· 154 140 155 141 static int led_pwm_create_fwnode(struct device *dev, struct led_pwm_priv *priv) 156 142 { 157 - struct fwnode_handle *fwnode; 158 143 struct led_pwm led; 159 144 int ret; 160 145 161 - device_for_each_child_node(dev, fwnode) { 146 + device_for_each_child_node_scoped(dev, fwnode) { 162 147 memset(&led, 0, sizeof(led)); 163 148 164 149 ret = fwnode_property_read_string(fwnode, "label", &led.name); 165 150 if (ret && is_of_node(fwnode)) 166 151 led.name = to_of_node(fwnode)->name; 167 152 168 - if (!led.name) { 169 - ret = -EINVAL; 170 - goto err_child_out; 171 - } 153 + if (!led.name) 154 + return -EINVAL; 172 155 173 156 led.active_low = fwnode_property_read_bool(fwnode, 174 157 "active-low"); ··· 176 165 177 166 ret = led_pwm_add(dev, priv, &led, fwnode); 178 167 if (ret) 179 - goto err_child_out; 168 + return ret; 180 169 } 181 170 182 171 return 0; 183 - 184 - err_child_out: 185 - fwnode_handle_put(fwnode); 186 - return ret; 187 172 } 188 173 189 174 static int led_pwm_probe(struct platform_device *pdev)
+1 -1
drivers/leds/leds-rb532.c
··· 49 49 50 50 static struct platform_driver rb532_led_driver = { 51 51 .probe = rb532_led_probe, 52 - .remove_new = rb532_led_remove, 52 + .remove = rb532_led_remove, 53 53 .driver = { 54 54 .name = "rb532-led", 55 55 },
+1 -1
drivers/leds/leds-regulator.c
··· 193 193 .of_match_table = regulator_led_of_match, 194 194 }, 195 195 .probe = regulator_led_probe, 196 - .remove_new = regulator_led_remove, 196 + .remove = regulator_led_remove, 197 197 }; 198 198 199 199 module_platform_driver(regulator_led_driver);
+1 -1
drivers/leds/leds-sc27xx-bltc.c
··· 344 344 .of_match_table = sc27xx_led_of_match, 345 345 }, 346 346 .probe = sc27xx_led_probe, 347 - .remove_new = sc27xx_led_remove, 347 + .remove = sc27xx_led_remove, 348 348 }; 349 349 350 350 module_platform_driver(sc27xx_led_driver);
+1 -1
drivers/leds/leds-ss4200.c
··· 451 451 int blinking = 0; 452 452 if (nasgpio_led_get_attr(led, GPO_BLINK)) 453 453 blinking = 1; 454 - return sprintf(buf, "%u\n", blinking); 454 + return sprintf(buf, "%d\n", blinking); 455 455 } 456 456 457 457 static ssize_t blink_store(struct device *dev,
+10 -19
drivers/leds/leds-sun50i-a100.c
··· 392 392 struct sun50i_a100_ledc_led *led; 393 393 struct device *dev = &pdev->dev; 394 394 struct sun50i_a100_ledc *priv; 395 - struct fwnode_handle *child; 396 395 struct resource *mem; 397 396 u32 max_addr = 0; 398 397 u32 num_leds = 0; ··· 401 402 * The maximum LED address must be known in sun50i_a100_ledc_resume() before 402 403 * class device registration, so parse and validate the subnodes up front. 403 404 */ 404 - device_for_each_child_node(dev, child) { 405 + device_for_each_child_node_scoped(dev, child) { 405 406 u32 addr, color; 406 407 407 408 ret = fwnode_property_read_u32(child, "reg", &addr); 408 - if (ret || addr >= LEDC_MAX_LEDS) { 409 - fwnode_handle_put(child); 409 + if (ret || addr >= LEDC_MAX_LEDS) 410 410 return dev_err_probe(dev, -EINVAL, "'reg' must be between 0 and %d\n", 411 411 LEDC_MAX_LEDS - 1); 412 - } 413 412 414 413 ret = fwnode_property_read_u32(child, "color", &color); 415 - if (ret || color != LED_COLOR_ID_RGB) { 416 - fwnode_handle_put(child); 414 + if (ret || color != LED_COLOR_ID_RGB) 417 415 return dev_err_probe(dev, -EINVAL, "'color' must be LED_COLOR_ID_RGB\n"); 418 - } 419 416 420 417 max_addr = max(max_addr, addr); 421 418 num_leds++; ··· 497 502 return ret; 498 503 499 504 led = priv->leds; 500 - device_for_each_child_node(dev, child) { 505 + device_for_each_child_node_scoped(dev, child) { 501 506 struct led_classdev *cdev; 502 507 503 508 /* The node was already validated above. */ ··· 522 527 ret = led_classdev_multicolor_register_ext(dev, &led->mc_cdev, &init_data); 523 528 if (ret) { 524 529 dev_err_probe(dev, ret, "Failed to register multicolor LED %u", led->addr); 525 - goto err_put_child; 530 + while (led-- > priv->leds) 531 + led_classdev_multicolor_unregister(&led->mc_cdev); 532 + sun50i_a100_ledc_suspend(&pdev->dev); 533 + 534 + return ret; 526 535 } 527 536 528 537 led++; ··· 535 536 dev_info(dev, "Registered %u LEDs\n", num_leds); 536 537 537 538 return 0; 538 - 539 - err_put_child: 540 - fwnode_handle_put(child); 541 - while (led-- > priv->leds) 542 - led_classdev_multicolor_unregister(&led->mc_cdev); 543 - sun50i_a100_ledc_suspend(&pdev->dev); 544 - 545 - return ret; 546 539 } 547 540 548 541 static void sun50i_a100_ledc_remove(struct platform_device *pdev) ··· 558 567 559 568 static struct platform_driver sun50i_a100_ledc_driver = { 560 569 .probe = sun50i_a100_ledc_probe, 561 - .remove_new = sun50i_a100_ledc_remove, 570 + .remove = sun50i_a100_ledc_remove, 562 571 .shutdown = sun50i_a100_ledc_remove, 563 572 .driver = { 564 573 .name = "sun50i-a100-ledc",
+2 -2
drivers/leds/leds-sunfire.c
··· 219 219 220 220 static struct platform_driver sunfire_clockboard_led_driver = { 221 221 .probe = sunfire_clockboard_led_probe, 222 - .remove_new = sunfire_led_generic_remove, 222 + .remove = sunfire_led_generic_remove, 223 223 .driver = { 224 224 .name = "sunfire-clockboard-leds", 225 225 }, ··· 227 227 228 228 static struct platform_driver sunfire_fhc_led_driver = { 229 229 .probe = sunfire_fhc_led_probe, 230 - .remove_new = sunfire_led_generic_remove, 230 + .remove = sunfire_led_generic_remove, 231 231 .driver = { 232 232 .name = "sunfire-fhc-leds", 233 233 },
+2 -5
drivers/leds/leds-tca6507.c
··· 658 658 tca6507_led_dt_init(struct device *dev) 659 659 { 660 660 struct tca6507_platform_data *pdata; 661 - struct fwnode_handle *child; 662 661 struct led_info *tca_leds; 663 662 int count; 664 663 ··· 670 671 if (!tca_leds) 671 672 return ERR_PTR(-ENOMEM); 672 673 673 - device_for_each_child_node(dev, child) { 674 + device_for_each_child_node_scoped(dev, child) { 674 675 struct led_info led; 675 676 u32 reg; 676 677 int ret; ··· 687 688 led.flags |= TCA6507_MAKE_GPIO; 688 689 689 690 ret = fwnode_property_read_u32(child, "reg", &reg); 690 - if (ret || reg >= NUM_LEDS) { 691 - fwnode_handle_put(child); 691 + if (ret || reg >= NUM_LEDS) 692 692 return ERR_PTR(ret ? : -EINVAL); 693 - } 694 693 695 694 tca_leds[reg] = led; 696 695 }
-1
drivers/leds/leds-turris-omnia.c
··· 10 10 #include <linux/module.h> 11 11 #include <linux/mutex.h> 12 12 #include <linux/of.h> 13 - #include "leds.h" 14 13 15 14 #define OMNIA_BOARD_LEDS 12 16 15 #define OMNIA_LED_NUM_CHANNELS 3
+1 -1
drivers/leds/leds-wm831x-status.c
··· 292 292 .name = "wm831x-status", 293 293 }, 294 294 .probe = wm831x_status_probe, 295 - .remove_new = wm831x_status_remove, 295 + .remove = wm831x_status_remove, 296 296 }; 297 297 298 298 module_platform_driver(wm831x_status_driver);
+1 -1
drivers/leds/leds-wm8350.c
··· 255 255 .name = "wm8350-led", 256 256 }, 257 257 .probe = wm8350_led_probe, 258 - .remove_new = wm8350_led_remove, 258 + .remove = wm8350_led_remove, 259 259 .shutdown = wm8350_led_shutdown, 260 260 }; 261 261
+1 -1
drivers/leds/rgb/leds-group-multicolor.c
··· 55 55 { 56 56 struct led_classdev *led_cdev = data; 57 57 58 - /* Restore the write acccess to the LED */ 58 + /* Restore the write access to the LED */ 59 59 mutex_lock(&led_cdev->led_access); 60 60 led_sysfs_enable(led_cdev); 61 61 mutex_unlock(&led_cdev->led_access);
+3 -5
drivers/leds/rgb/leds-ktd202x.c
··· 495 495 496 496 static int ktd202x_probe_fw(struct ktd202x *chip) 497 497 { 498 - struct fwnode_handle *child; 499 498 struct device *dev = chip->dev; 500 499 int count; 501 500 int i = 0; ··· 508 509 /* Allow the device to execute the complete reset */ 509 510 usleep_range(200, 300); 510 511 511 - device_for_each_child_node(dev, child) { 512 + device_for_each_child_node_scoped(dev, child) { 512 513 int ret = ktd202x_add_led(chip, child, i); 513 514 514 - if (ret) { 515 - fwnode_handle_put(child); 515 + if (ret) 516 516 return ret; 517 - } 517 + 518 518 i++; 519 519 } 520 520
+12 -27
drivers/leds/rgb/leds-mt6370-rgb.c
··· 587 587 struct mt6370_led *led = container_of(mccdev, struct mt6370_led, mc); 588 588 struct mt6370_priv *priv = led->priv; 589 589 struct mc_subled *subled; 590 - int i, ret; 590 + int i, ret = 0; 591 591 592 592 mutex_lock(&led->priv->lock); 593 593 ··· 905 905 { 906 906 struct device *dev = &pdev->dev; 907 907 struct mt6370_priv *priv; 908 - struct fwnode_handle *child; 909 908 size_t count; 910 909 unsigned int i = 0; 911 910 int ret; ··· 935 936 if (ret) 936 937 return dev_err_probe(dev, ret, "Failed to allocate regmap field\n"); 937 938 938 - device_for_each_child_node(dev, child) { 939 + device_for_each_child_node_scoped(dev, child) { 939 940 struct mt6370_led *led = priv->leds + i++; 940 941 struct led_init_data init_data = { .fwnode = child }; 941 942 u32 reg, color; 942 943 943 944 ret = fwnode_property_read_u32(child, "reg", &reg); 944 - if (ret) { 945 - dev_err(dev, "Failed to parse reg property\n"); 946 - goto fwnode_release; 947 - } 945 + if (ret) 946 + dev_err_probe(dev, ret, "Failed to parse reg property\n"); 948 947 949 - if (reg >= MT6370_MAX_LEDS) { 950 - ret = -EINVAL; 951 - dev_err(dev, "Error reg property number\n"); 952 - goto fwnode_release; 953 - } 948 + if (reg >= MT6370_MAX_LEDS) 949 + return dev_err_probe(dev, -EINVAL, "Error reg property number\n"); 954 950 955 951 ret = fwnode_property_read_u32(child, "color", &color); 956 - if (ret) { 957 - dev_err(dev, "Failed to parse color property\n"); 958 - goto fwnode_release; 959 - } 952 + if (ret) 953 + return dev_err_probe(dev, ret, "Failed to parse color property\n"); 960 954 961 955 if (color == LED_COLOR_ID_RGB || color == LED_COLOR_ID_MULTI) 962 956 reg = MT6370_VIRTUAL_MULTICOLOR; 963 957 964 - if (priv->leds_active & BIT(reg)) { 965 - ret = -EINVAL; 966 - dev_err(dev, "Duplicate reg property\n"); 967 - goto fwnode_release; 968 - } 958 + if (priv->leds_active & BIT(reg)) 959 + return dev_err_probe(dev, -EINVAL, "Duplicate reg property\n"); 969 960 970 961 priv->leds_active |= BIT(reg); 971 962 ··· 964 975 965 976 ret = mt6370_init_led_properties(dev, led, &init_data); 966 977 if (ret) 967 - goto fwnode_release; 978 + return ret; 968 979 969 980 ret = mt6370_led_register(dev, led, &init_data); 970 981 if (ret) 971 - goto fwnode_release; 982 + return ret; 972 983 } 973 984 974 985 return 0; 975 - 976 - fwnode_release: 977 - fwnode_handle_put(child); 978 - return ret; 979 986 } 980 987 981 988 static const struct of_device_id mt6370_rgbled_device_table[] = {
+1 -1
drivers/leds/simple/simatic-ipc-leds-gpio-apollolake.c
··· 53 53 54 54 static struct platform_driver simatic_ipc_led_gpio_apollolake_driver = { 55 55 .probe = simatic_ipc_leds_gpio_apollolake_probe, 56 - .remove_new = simatic_ipc_leds_gpio_apollolake_remove, 56 + .remove = simatic_ipc_leds_gpio_apollolake_remove, 57 57 .driver = { 58 58 .name = KBUILD_MODNAME, 59 59 },
+1 -1
drivers/leds/simple/simatic-ipc-leds-gpio-elkhartlake.c
··· 43 43 44 44 static struct platform_driver simatic_ipc_led_gpio_elkhartlake_driver = { 45 45 .probe = simatic_ipc_leds_gpio_elkhartlake_probe, 46 - .remove_new = simatic_ipc_leds_gpio_elkhartlake_remove, 46 + .remove = simatic_ipc_leds_gpio_elkhartlake_remove, 47 47 .driver = { 48 48 .name = KBUILD_MODNAME, 49 49 },
+1 -1
drivers/leds/simple/simatic-ipc-leds-gpio-f7188x.c
··· 93 93 94 94 static struct platform_driver simatic_ipc_led_gpio_driver = { 95 95 .probe = simatic_ipc_leds_gpio_f7188x_probe, 96 - .remove_new = simatic_ipc_leds_gpio_f7188x_remove, 96 + .remove = simatic_ipc_leds_gpio_f7188x_remove, 97 97 .driver = { 98 98 .name = KBUILD_MODNAME, 99 99 },
+2 -1
include/linux/leds.h
··· 171 171 int new_blink_brightness; 172 172 void (*flash_resume)(struct led_classdev *led_cdev); 173 173 174 + struct workqueue_struct *wq; /* LED workqueue */ 174 175 struct work_struct set_brightness_work; 175 176 int delayed_set_value; 176 177 unsigned long delayed_delay_on; ··· 239 238 struct kernfs_node *brightness_hw_changed_kn; 240 239 #endif 241 240 242 - /* Ensures consistent access to the LED Flash Class device */ 241 + /* Ensures consistent access to the LED class device */ 243 242 struct mutex led_access; 244 243 }; 245 244