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

Merge branches 'ib-leds-mfd-6.11', 'ib-leds-platform-power-6.11' and 'ib-mfd-leds-platform-6.11' into ibs-for-leds-merged

+203 -42
+1
drivers/leds/led-class-multicolor.c
··· 134 134 return -EINVAL; 135 135 136 136 led_cdev = &mcled_cdev->led_cdev; 137 + led_cdev->flags |= LED_MULTI_COLOR; 137 138 mcled_cdev->led_cdev.groups = led_multicolor_groups; 138 139 139 140 return led_classdev_register_ext(parent, led_cdev, init_data);
+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);
+31
drivers/leds/led-core.c
··· 8 8 */ 9 9 10 10 #include <linux/kernel.h> 11 + #include <linux/led-class-multicolor.h> 11 12 #include <linux/leds.h> 12 13 #include <linux/list.h> 13 14 #include <linux/module.h> ··· 361 360 return __led_set_brightness_blocking(led_cdev, led_cdev->brightness); 362 361 } 363 362 EXPORT_SYMBOL_GPL(led_set_brightness_sync); 363 + 364 + /* 365 + * This is a led-core function because just like led_set_brightness() 366 + * it is used in the kernel by e.g. triggers. 367 + */ 368 + void led_mc_set_brightness(struct led_classdev *led_cdev, 369 + unsigned int *intensity_value, unsigned int num_colors, 370 + unsigned int brightness) 371 + { 372 + struct led_classdev_mc *mcled_cdev; 373 + unsigned int i; 374 + 375 + if (!(led_cdev->flags & LED_MULTI_COLOR)) { 376 + dev_err_once(led_cdev->dev, "error not a multi-color LED\n"); 377 + return; 378 + } 379 + 380 + mcled_cdev = lcdev_to_mccdev(led_cdev); 381 + if (num_colors != mcled_cdev->num_colors) { 382 + dev_err_once(led_cdev->dev, "error num_colors mismatch %u != %u\n", 383 + num_colors, mcled_cdev->num_colors); 384 + return; 385 + } 386 + 387 + for (i = 0; i < mcled_cdev->num_colors; i++) 388 + mcled_cdev->subled_info[i].intensity = intensity_value[i]; 389 + 390 + led_set_brightness(led_cdev, brightness); 391 + } 392 + EXPORT_SYMBOL_GPL(led_mc_set_brightness); 364 393 365 394 int led_update_brightness(struct led_classdev *led_cdev) 366 395 {
+20
drivers/leds/led-triggers.c
··· 396 396 } 397 397 EXPORT_SYMBOL_GPL(led_trigger_event); 398 398 399 + void led_mc_trigger_event(struct led_trigger *trig, 400 + unsigned int *intensity_value, unsigned int num_colors, 401 + enum led_brightness brightness) 402 + { 403 + struct led_classdev *led_cdev; 404 + 405 + if (!trig) 406 + return; 407 + 408 + rcu_read_lock(); 409 + list_for_each_entry_rcu(led_cdev, &trig->led_cdevs, trig_list) { 410 + if (!(led_cdev->flags & LED_MULTI_COLOR)) 411 + continue; 412 + 413 + led_mc_set_brightness(led_cdev, intensity_value, num_colors, brightness); 414 + } 415 + rcu_read_unlock(); 416 + } 417 + EXPORT_SYMBOL_GPL(led_mc_trigger_event); 418 + 399 419 static void led_trigger_blink_setup(struct led_trigger *trig, 400 420 unsigned long delay_on, 401 421 unsigned long delay_off,
-1
drivers/leds/rgb/Kconfig
··· 17 17 config LEDS_KTD202X 18 18 tristate "LED support for KTD202x Chips" 19 19 depends on I2C 20 - depends on OF 21 20 select REGMAP_I2C 22 21 help 23 22 This option enables support for the Kinetic KTD2026/KTD2027
+46 -34
drivers/leds/rgb/leds-ktd202x.c
··· 99 99 struct device *dev; 100 100 struct regmap *regmap; 101 101 bool enabled; 102 - int num_leds; 102 + unsigned long num_leds; 103 103 struct ktd202x_led leds[] __counted_by(num_leds); 104 104 }; 105 105 ··· 381 381 mc->num_colors); 382 382 } 383 383 384 - static int ktd202x_setup_led_rgb(struct ktd202x *chip, struct device_node *np, 384 + static int ktd202x_setup_led_rgb(struct ktd202x *chip, struct fwnode_handle *fwnode, 385 385 struct ktd202x_led *led, struct led_init_data *init_data) 386 386 { 387 + struct fwnode_handle *child; 387 388 struct led_classdev *cdev; 388 - struct device_node *child; 389 389 struct mc_subled *info; 390 390 int num_channels; 391 391 int i = 0; 392 392 393 - num_channels = of_get_available_child_count(np); 393 + num_channels = 0; 394 + fwnode_for_each_available_child_node(fwnode, child) 395 + num_channels++; 396 + 394 397 if (!num_channels || num_channels > chip->num_leds) 395 398 return -EINVAL; 396 399 ··· 401 398 if (!info) 402 399 return -ENOMEM; 403 400 404 - for_each_available_child_of_node(np, child) { 401 + fwnode_for_each_available_child_node(fwnode, child) { 405 402 u32 mono_color; 406 403 u32 reg; 407 404 int ret; 408 405 409 - ret = of_property_read_u32(child, "reg", &reg); 406 + ret = fwnode_property_read_u32(child, "reg", &reg); 410 407 if (ret != 0 || reg >= chip->num_leds) { 411 - dev_err(chip->dev, "invalid 'reg' of %pOFn\n", child); 412 - of_node_put(child); 413 - return -EINVAL; 408 + dev_err(chip->dev, "invalid 'reg' of %pfw\n", child); 409 + fwnode_handle_put(child); 410 + return ret; 414 411 } 415 412 416 - ret = of_property_read_u32(child, "color", &mono_color); 413 + ret = fwnode_property_read_u32(child, "color", &mono_color); 417 414 if (ret < 0 && ret != -EINVAL) { 418 - dev_err(chip->dev, "failed to parse 'color' of %pOF\n", child); 419 - of_node_put(child); 415 + dev_err(chip->dev, "failed to parse 'color' of %pfw\n", child); 416 + fwnode_handle_put(child); 420 417 return ret; 421 418 } 422 419 ··· 436 433 return devm_led_classdev_multicolor_register_ext(chip->dev, &led->mcdev, init_data); 437 434 } 438 435 439 - static int ktd202x_setup_led_single(struct ktd202x *chip, struct device_node *np, 436 + static int ktd202x_setup_led_single(struct ktd202x *chip, struct fwnode_handle *fwnode, 440 437 struct ktd202x_led *led, struct led_init_data *init_data) 441 438 { 442 439 struct led_classdev *cdev; 443 440 u32 reg; 444 441 int ret; 445 442 446 - ret = of_property_read_u32(np, "reg", &reg); 443 + ret = fwnode_property_read_u32(fwnode, "reg", &reg); 447 444 if (ret != 0 || reg >= chip->num_leds) { 448 - dev_err(chip->dev, "invalid 'reg' of %pOFn\n", np); 445 + dev_err(chip->dev, "invalid 'reg' of %pfw\n", fwnode); 449 446 return -EINVAL; 450 447 } 451 448 led->index = reg; ··· 457 454 return devm_led_classdev_register_ext(chip->dev, &led->cdev, init_data); 458 455 } 459 456 460 - static int ktd202x_add_led(struct ktd202x *chip, struct device_node *np, unsigned int index) 457 + static int ktd202x_add_led(struct ktd202x *chip, struct fwnode_handle *fwnode, unsigned int index) 461 458 { 462 459 struct ktd202x_led *led = &chip->leds[index]; 463 460 struct led_init_data init_data = {}; ··· 466 463 int ret; 467 464 468 465 /* Color property is optional in single color case */ 469 - ret = of_property_read_u32(np, "color", &color); 466 + ret = fwnode_property_read_u32(fwnode, "color", &color); 470 467 if (ret < 0 && ret != -EINVAL) { 471 - dev_err(chip->dev, "failed to parse 'color' of %pOF\n", np); 468 + dev_err(chip->dev, "failed to parse 'color' of %pfw\n", fwnode); 472 469 return ret; 473 470 } 474 471 475 472 led->chip = chip; 476 - init_data.fwnode = of_fwnode_handle(np); 473 + init_data.fwnode = fwnode; 477 474 478 475 if (color == LED_COLOR_ID_RGB) { 479 476 cdev = &led->mcdev.led_cdev; 480 - ret = ktd202x_setup_led_rgb(chip, np, led, &init_data); 477 + ret = ktd202x_setup_led_rgb(chip, fwnode, led, &init_data); 481 478 } else { 482 479 cdev = &led->cdev; 483 - ret = ktd202x_setup_led_single(chip, np, led, &init_data); 480 + ret = ktd202x_setup_led_single(chip, fwnode, led, &init_data); 484 481 } 485 482 486 483 if (ret) { ··· 493 490 return 0; 494 491 } 495 492 496 - static int ktd202x_probe_dt(struct ktd202x *chip) 493 + static int ktd202x_probe_fw(struct ktd202x *chip) 497 494 { 498 - struct device_node *np = dev_of_node(chip->dev), *child; 495 + struct fwnode_handle *child; 496 + struct device *dev = chip->dev; 499 497 int count; 500 498 int i = 0; 501 499 502 - chip->num_leds = (int)(unsigned long)of_device_get_match_data(chip->dev); 503 - 504 - count = of_get_available_child_count(np); 500 + count = device_get_child_node_count(dev); 505 501 if (!count || count > chip->num_leds) 506 502 return -EINVAL; 507 503 ··· 509 507 /* Allow the device to execute the complete reset */ 510 508 usleep_range(200, 300); 511 509 512 - for_each_available_child_of_node(np, child) { 510 + device_for_each_child_node(dev, child) { 513 511 int ret = ktd202x_add_led(chip, child, i); 514 512 515 513 if (ret) { 516 - of_node_put(child); 514 + fwnode_handle_put(child); 517 515 return ret; 518 516 } 519 517 i++; ··· 556 554 return ret; 557 555 } 558 556 557 + ret = devm_mutex_init(dev, &chip->mutex); 558 + if (ret) 559 + return ret; 560 + 561 + chip->num_leds = (unsigned long)i2c_get_match_data(client); 562 + 559 563 chip->regulators[0].supply = "vin"; 560 564 chip->regulators[1].supply = "vio"; 561 565 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(chip->regulators), chip->regulators); ··· 576 568 return ret; 577 569 } 578 570 579 - ret = ktd202x_probe_dt(chip); 571 + ret = ktd202x_probe_fw(chip); 580 572 if (ret < 0) { 581 573 regulator_bulk_disable(ARRAY_SIZE(chip->regulators), chip->regulators); 582 574 return ret; ··· 588 580 return ret; 589 581 } 590 582 591 - mutex_init(&chip->mutex); 592 - 593 583 return 0; 594 584 } 595 585 ··· 596 590 struct ktd202x *chip = i2c_get_clientdata(client); 597 591 598 592 ktd202x_chip_disable(chip); 599 - 600 - mutex_destroy(&chip->mutex); 601 593 } 602 594 603 595 static void ktd202x_shutdown(struct i2c_client *client) ··· 606 602 regmap_write(chip->regmap, KTD202X_REG_RESET_CONTROL, KTD202X_RSTR_RESET); 607 603 } 608 604 605 + static const struct i2c_device_id ktd202x_id[] = { 606 + {"ktd2026", KTD2026_NUM_LEDS}, 607 + {"ktd2027", KTD2027_NUM_LEDS}, 608 + {} 609 + }; 610 + MODULE_DEVICE_TABLE(i2c, ktd202x_id); 611 + 609 612 static const struct of_device_id ktd202x_match_table[] = { 610 613 { .compatible = "kinetic,ktd2026", .data = (void *)KTD2026_NUM_LEDS }, 611 614 { .compatible = "kinetic,ktd2027", .data = (void *)KTD2027_NUM_LEDS }, 612 - {}, 615 + {} 613 616 }; 614 617 MODULE_DEVICE_TABLE(of, ktd202x_match_table); 615 618 ··· 628 617 .probe = ktd202x_probe, 629 618 .remove = ktd202x_remove, 630 619 .shutdown = ktd202x_shutdown, 620 + .id_table = ktd202x_id, 631 621 }; 632 622 module_i2c_driver(ktd202x_driver); 633 623
+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
+23
drivers/power/supply/power_supply_leds.c
··· 22 22 static void power_supply_update_bat_leds(struct power_supply *psy) 23 23 { 24 24 union power_supply_propval status; 25 + unsigned int intensity_green[3] = { 0, 255, 0 }; 26 + unsigned int intensity_orange[3] = { 255, 128, 0 }; 25 27 26 28 if (power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &status)) 27 29 return; ··· 38 36 /* Going from blink to LED on requires a LED_OFF event to stop blink */ 39 37 led_trigger_event(psy->charging_blink_full_solid_trig, LED_OFF); 40 38 led_trigger_event(psy->charging_blink_full_solid_trig, LED_FULL); 39 + led_mc_trigger_event(psy->charging_orange_full_green_trig, 40 + intensity_green, 41 + ARRAY_SIZE(intensity_green), 42 + LED_FULL); 41 43 break; 42 44 case POWER_SUPPLY_STATUS_CHARGING: 43 45 led_trigger_event(psy->charging_full_trig, LED_FULL); 44 46 led_trigger_event(psy->charging_trig, LED_FULL); 45 47 led_trigger_event(psy->full_trig, LED_OFF); 46 48 led_trigger_blink(psy->charging_blink_full_solid_trig, 0, 0); 49 + led_mc_trigger_event(psy->charging_orange_full_green_trig, 50 + intensity_orange, 51 + ARRAY_SIZE(intensity_orange), 52 + LED_FULL); 47 53 break; 48 54 default: 49 55 led_trigger_event(psy->charging_full_trig, LED_OFF); 50 56 led_trigger_event(psy->charging_trig, LED_OFF); 51 57 led_trigger_event(psy->full_trig, LED_OFF); 52 58 led_trigger_event(psy->charging_blink_full_solid_trig, 59 + LED_OFF); 60 + led_trigger_event(psy->charging_orange_full_green_trig, 53 61 LED_OFF); 54 62 break; 55 63 } ··· 86 74 if (!psy->charging_blink_full_solid_trig_name) 87 75 goto charging_blink_full_solid_failed; 88 76 77 + psy->charging_orange_full_green_trig_name = kasprintf(GFP_KERNEL, 78 + "%s-charging-orange-full-green", psy->desc->name); 79 + if (!psy->charging_orange_full_green_trig_name) 80 + goto charging_red_full_green_failed; 81 + 89 82 led_trigger_register_simple(psy->charging_full_trig_name, 90 83 &psy->charging_full_trig); 91 84 led_trigger_register_simple(psy->charging_trig_name, ··· 99 82 &psy->full_trig); 100 83 led_trigger_register_simple(psy->charging_blink_full_solid_trig_name, 101 84 &psy->charging_blink_full_solid_trig); 85 + led_trigger_register_simple(psy->charging_orange_full_green_trig_name, 86 + &psy->charging_orange_full_green_trig); 102 87 103 88 return 0; 104 89 90 + charging_red_full_green_failed: 91 + kfree(psy->charging_blink_full_solid_trig_name); 105 92 charging_blink_full_solid_failed: 106 93 kfree(psy->full_trig_name); 107 94 full_failed: ··· 122 101 led_trigger_unregister_simple(psy->charging_trig); 123 102 led_trigger_unregister_simple(psy->full_trig); 124 103 led_trigger_unregister_simple(psy->charging_blink_full_solid_trig); 104 + led_trigger_unregister_simple(psy->charging_orange_full_green_trig); 125 105 kfree(psy->charging_blink_full_solid_trig_name); 126 106 kfree(psy->full_trig_name); 127 107 kfree(psy->charging_trig_name); 128 108 kfree(psy->charging_full_trig_name); 109 + kfree(psy->charging_orange_full_green_trig_name); 129 110 } 130 111 131 112 /* Generated power specific LEDs triggers. */
+27
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) 111 + #define LED_MULTI_COLOR BIT(25) 110 112 111 113 /* set_brightness_work / blink_timer flags, atomic, private. */ 112 114 unsigned long work_flags; ··· 376 374 int led_set_brightness_sync(struct led_classdev *led_cdev, unsigned int value); 377 375 378 376 /** 377 + * led_mc_set_brightness - set mc LED color intensity values and brightness 378 + * @led_cdev: the LED to set 379 + * @intensity_value: array of per color intensity values to set 380 + * @num_colors: amount of entries in intensity_value array 381 + * @brightness: the brightness to set the LED to 382 + * 383 + * Set a multi-color LED's per color intensity values and brightness. 384 + * If necessary, this cancels the software blink timer. This function is 385 + * guaranteed not to sleep. 386 + * 387 + * Calling this function on a non multi-color led_classdev or with the wrong 388 + * num_colors value is an error. In this case an error will be logged once 389 + * and the call will do nothing. 390 + */ 391 + void led_mc_set_brightness(struct led_classdev *led_cdev, 392 + unsigned int *intensity_value, unsigned int num_colors, 393 + unsigned int brightness); 394 + 395 + /** 379 396 * led_update_brightness - update LED brightness 380 397 * @led_cdev: the LED to query 381 398 * ··· 521 500 struct led_trigger **trigger); 522 501 void led_trigger_unregister_simple(struct led_trigger *trigger); 523 502 void led_trigger_event(struct led_trigger *trigger, enum led_brightness event); 503 + void led_mc_trigger_event(struct led_trigger *trig, 504 + unsigned int *intensity_value, unsigned int num_colors, 505 + enum led_brightness brightness); 524 506 void led_trigger_blink(struct led_trigger *trigger, unsigned long delay_on, 525 507 unsigned long delay_off); 526 508 void led_trigger_blink_oneshot(struct led_trigger *trigger, ··· 566 542 static inline void led_trigger_unregister_simple(struct led_trigger *trigger) {} 567 543 static inline void led_trigger_event(struct led_trigger *trigger, 568 544 enum led_brightness event) {} 545 + static inline void led_mc_trigger_event(struct led_trigger *trig, 546 + unsigned int *intensity_value, unsigned int num_colors, 547 + enum led_brightness brightness) {} 569 548 static inline void led_trigger_blink(struct led_trigger *trigger, 570 549 unsigned long delay_on, 571 550 unsigned long delay_off) {}
+2
include/linux/power_supply.h
··· 319 319 char *online_trig_name; 320 320 struct led_trigger *charging_blink_full_solid_trig; 321 321 char *charging_blink_full_solid_trig_name; 322 + struct led_trigger *charging_orange_full_green_trig; 323 + char *charging_orange_full_green_trig_name; 322 324 #endif 323 325 }; 324 326