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

leds: nic78bx: Use devm API to cleanup module's resources

In this driver LEDs are registered using devm_led_classdev_register()
so they are automatically unregistered after module's remove() is done.
led_classdev_unregister() calls module's led_set_brightness() to turn off
the LEDs and that callback uses resources which were destroyed already
in module's remove() so use devm API instead of remove().

Signed-off-by: George Stark <gnstark@salutedevices.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20240411161032.609544-7-gnstark@salutedevices.com
Signed-off-by: Lee Jones <lee@kernel.org>

authored by

George Stark and committed by
Lee Jones
310d2652 c230c03b

+13 -10
+13 -10
drivers/leds/leds-nic78bx.c
··· 118 118 } 119 119 }; 120 120 121 + static void lock_led_reg_action(void *data) 122 + { 123 + struct nic78bx_led_data *led_data = data; 124 + 125 + /* Lock LED register */ 126 + outb(NIC78BX_LOCK_VALUE, 127 + led_data->io_base + NIC78BX_LOCK_REG_OFFSET); 128 + } 129 + 121 130 static int nic78bx_probe(struct platform_device *pdev) 122 131 { 123 132 struct device *dev = &pdev->dev; ··· 161 152 led_data->io_base = io_rc->start; 162 153 spin_lock_init(&led_data->lock); 163 154 155 + ret = devm_add_action(dev, lock_led_reg_action, led_data); 156 + if (ret) 157 + return ret; 158 + 164 159 for (i = 0; i < ARRAY_SIZE(nic78bx_leds); i++) { 165 160 nic78bx_leds[i].data = led_data; 166 161 ··· 180 167 return ret; 181 168 } 182 169 183 - static void nic78bx_remove(struct platform_device *pdev) 184 - { 185 - struct nic78bx_led_data *led_data = platform_get_drvdata(pdev); 186 - 187 - /* Lock LED register */ 188 - outb(NIC78BX_LOCK_VALUE, 189 - led_data->io_base + NIC78BX_LOCK_REG_OFFSET); 190 - } 191 - 192 170 static const struct acpi_device_id led_device_ids[] = { 193 171 {"NIC78B3", 0}, 194 172 {"", 0}, ··· 188 184 189 185 static struct platform_driver led_driver = { 190 186 .probe = nic78bx_probe, 191 - .remove_new = nic78bx_remove, 192 187 .driver = { 193 188 .name = KBUILD_MODNAME, 194 189 .acpi_match_table = ACPI_PTR(led_device_ids),