|
11 | 11 | #include <linux/acpi.h>
|
12 | 12 | #include <linux/gpio/machine.h>
|
13 | 13 | #include <linux/input.h>
|
| 14 | +#include <linux/leds.h> |
14 | 15 | #include <linux/platform_device.h>
|
| 16 | +#include <linux/pwm.h> |
15 | 17 |
|
16 | 18 | #include <dt-bindings/leds/common.h>
|
17 | 19 |
|
@@ -662,8 +664,53 @@ static const struct software_node *ktd2026_node_group[] = {
|
662 | 664 | NULL
|
663 | 665 | };
|
664 | 666 |
|
| 667 | +/* |
| 668 | + * For the LEDs which backlight the menu / home / back capacitive buttons on |
| 669 | + * the bottom bezel. These are attached to a TPS61158 LED controller which |
| 670 | + * is controlled by the "pwm_soc_lpss_2" PWM output. |
| 671 | + */ |
| 672 | +#define XIAOMI_MIPAD2_LED_PERIOD_NS 19200 |
| 673 | +#define XIAOMI_MIPAD2_LED_DEFAULT_DUTY 6000 /* From Android kernel */ |
| 674 | + |
| 675 | +static struct pwm_device *xiaomi_mipad2_led_pwm; |
| 676 | + |
| 677 | +static int xiaomi_mipad2_brightness_set(struct led_classdev *led_cdev, |
| 678 | + enum led_brightness val) |
| 679 | +{ |
| 680 | + struct pwm_state state = { |
| 681 | + .period = XIAOMI_MIPAD2_LED_PERIOD_NS, |
| 682 | + .duty_cycle = val, |
| 683 | + /* Always set PWM enabled to avoid the pin floating */ |
| 684 | + .enabled = true, |
| 685 | + }; |
| 686 | + |
| 687 | + return pwm_apply_might_sleep(xiaomi_mipad2_led_pwm, &state); |
| 688 | +} |
| 689 | + |
665 | 690 | static int __init xiaomi_mipad2_init(struct device *dev)
|
666 | 691 | {
|
| 692 | + struct led_classdev *led_cdev; |
| 693 | + int ret; |
| 694 | + |
| 695 | + xiaomi_mipad2_led_pwm = devm_pwm_get(dev, "pwm_soc_lpss_2"); |
| 696 | + if (IS_ERR(xiaomi_mipad2_led_pwm)) |
| 697 | + return dev_err_probe(dev, PTR_ERR(xiaomi_mipad2_led_pwm), "getting pwm\n"); |
| 698 | + |
| 699 | + led_cdev = devm_kzalloc(dev, sizeof(*led_cdev), GFP_KERNEL); |
| 700 | + if (!led_cdev) |
| 701 | + return -ENOMEM; |
| 702 | + |
| 703 | + led_cdev->name = "mipad2:white:touch-buttons-backlight"; |
| 704 | + led_cdev->max_brightness = XIAOMI_MIPAD2_LED_PERIOD_NS; |
| 705 | + /* "input-events" trigger uses blink_brightness */ |
| 706 | + led_cdev->blink_brightness = XIAOMI_MIPAD2_LED_DEFAULT_DUTY; |
| 707 | + led_cdev->default_trigger = "input-events"; |
| 708 | + led_cdev->brightness_set_blocking = xiaomi_mipad2_brightness_set; |
| 709 | + |
| 710 | + ret = devm_led_classdev_register(dev, led_cdev); |
| 711 | + if (ret) |
| 712 | + return dev_err_probe(dev, ret, "registering LED\n"); |
| 713 | + |
667 | 714 | return software_node_register_node_group(ktd2026_node_group);
|
668 | 715 | }
|
669 | 716 |
|
|
0 commit comments