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

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'ib-mfd-leds-platform-6.11' into ibs-for-mfd-merged

+54 -7
+5 -4
drivers/leds/led-class.c
··· 503 503 ret = led_classdev_next_name(proposed_name, final_name, sizeof(final_name)); 504 504 if (ret < 0) 505 505 return ret; 506 + else if (ret && led_cdev->flags & LED_REJECT_NAME_CONFLICT) 507 + return -EEXIST; 508 + else if (ret) 509 + dev_warn(parent, "Led %s renamed to %s due to name collision\n", 510 + proposed_name, final_name); 506 511 507 512 if (led_cdev->color >= LED_COLOR_ID_MAX) 508 513 dev_warn(parent, "LED %s color identifier out of range\n", final_name); ··· 522 517 } 523 518 if (init_data && init_data->fwnode) 524 519 device_set_node(led_cdev->dev, init_data->fwnode); 525 - 526 - if (ret) 527 - dev_warn(parent, "Led %s renamed to %s due to name collision", 528 - proposed_name, dev_name(led_cdev->dev)); 529 520 530 521 if (led_cdev->flags & LED_BRIGHT_HW_CHANGED) { 531 522 ret = led_add_brightness_hw_changed(led_cdev);
+9
drivers/mfd/cros_ec_dev.c
··· 103 103 { .name = "cros-ec-led", }, 104 104 }; 105 105 106 + static const struct mfd_cell cros_ec_keyboard_leds_cells[] = { 107 + { .name = "cros-keyboard-leds", }, 108 + }; 109 + 106 110 static const struct cros_feature_to_cells cros_subdevices[] = { 107 111 { 108 112 .id = EC_FEATURE_CEC, ··· 137 133 .id = EC_FEATURE_LED, 138 134 .mfd_cells = cros_ec_led_cells, 139 135 .num_cells = ARRAY_SIZE(cros_ec_led_cells), 136 + }, 137 + { 138 + .id = EC_FEATURE_PWM_KEYB, 139 + .mfd_cells = cros_ec_keyboard_leds_cells, 140 + .num_cells = ARRAY_SIZE(cros_ec_keyboard_leds_cells), 140 141 }, 141 142 }; 142 143
+1 -1
drivers/platform/chrome/Kconfig
··· 150 150 151 151 config CROS_KBD_LED_BACKLIGHT 152 152 tristate "Backlight LED support for Chrome OS keyboards" 153 - depends on LEDS_CLASS && (ACPI || CROS_EC) 153 + depends on LEDS_CLASS && (ACPI || CROS_EC || MFD_CROS_EC_DEV) 154 154 help 155 155 This option enables support for the keyboard backlight LEDs on 156 156 select Chrome OS systems.
+38 -2
drivers/platform/chrome/cros_kbd_led_backlight.c
··· 9 9 #include <linux/init.h> 10 10 #include <linux/kernel.h> 11 11 #include <linux/leds.h> 12 + #include <linux/mfd/core.h> 12 13 #include <linux/mod_devicetable.h> 13 14 #include <linux/module.h> 14 15 #include <linux/of.h> ··· 195 194 196 195 #endif /* IS_ENABLED(CONFIG_CROS_EC) */ 197 196 197 + #if IS_ENABLED(CONFIG_MFD_CROS_EC_DEV) 198 + static int keyboard_led_init_ec_pwm_mfd(struct platform_device *pdev) 199 + { 200 + struct cros_ec_dev *ec_dev = dev_get_drvdata(pdev->dev.parent); 201 + struct cros_ec_device *cros_ec = ec_dev->ec_dev; 202 + struct keyboard_led *keyboard_led = platform_get_drvdata(pdev); 203 + 204 + keyboard_led->ec = cros_ec; 205 + 206 + return 0; 207 + } 208 + 209 + static const struct keyboard_led_drvdata keyboard_led_drvdata_ec_pwm_mfd = { 210 + .init = keyboard_led_init_ec_pwm_mfd, 211 + .brightness_set_blocking = keyboard_led_set_brightness_ec_pwm, 212 + .brightness_get = keyboard_led_get_brightness_ec_pwm, 213 + .max_brightness = KEYBOARD_BACKLIGHT_MAX, 214 + }; 215 + 216 + #else /* IS_ENABLED(CONFIG_MFD_CROS_EC_DEV) */ 217 + 218 + static const struct keyboard_led_drvdata keyboard_led_drvdata_ec_pwm_mfd = {}; 219 + 220 + #endif /* IS_ENABLED(CONFIG_MFD_CROS_EC_DEV) */ 221 + 222 + static int keyboard_led_is_mfd_device(struct platform_device *pdev) 223 + { 224 + return IS_ENABLED(CONFIG_MFD_CROS_EC_DEV) && mfd_get_cell(pdev); 225 + } 226 + 198 227 static int keyboard_led_probe(struct platform_device *pdev) 199 228 { 200 229 const struct keyboard_led_drvdata *drvdata; 201 230 struct keyboard_led *keyboard_led; 202 231 int error; 203 232 204 - drvdata = device_get_match_data(&pdev->dev); 233 + if (keyboard_led_is_mfd_device(pdev)) 234 + drvdata = &keyboard_led_drvdata_ec_pwm_mfd; 235 + else 236 + drvdata = device_get_match_data(&pdev->dev); 205 237 if (!drvdata) 206 238 return -EINVAL; 207 239 ··· 250 216 } 251 217 252 218 keyboard_led->cdev.name = "chromeos::kbd_backlight"; 253 - keyboard_led->cdev.flags |= LED_CORE_SUSPENDRESUME; 219 + keyboard_led->cdev.flags |= LED_CORE_SUSPENDRESUME | LED_REJECT_NAME_CONFLICT; 254 220 keyboard_led->cdev.max_brightness = drvdata->max_brightness; 255 221 keyboard_led->cdev.brightness_set = drvdata->brightness_set; 256 222 keyboard_led->cdev.brightness_set_blocking = drvdata->brightness_set_blocking; 257 223 keyboard_led->cdev.brightness_get = drvdata->brightness_get; 258 224 259 225 error = devm_led_classdev_register(&pdev->dev, &keyboard_led->cdev); 226 + if (error == -EEXIST) /* Already bound via other mechanism */ 227 + return -ENODEV; 260 228 if (error) 261 229 return error; 262 230
+1
include/linux/leds.h
··· 107 107 #define LED_BRIGHT_HW_CHANGED BIT(21) 108 108 #define LED_RETAIN_AT_SHUTDOWN BIT(22) 109 109 #define LED_INIT_DEFAULT_TRIGGER BIT(23) 110 + #define LED_REJECT_NAME_CONFLICT BIT(24) 110 111 111 112 /* set_brightness_work / blink_timer flags, atomic, private. */ 112 113 unsigned long work_flags;