1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2009,2018 Daniel Mack <daniel@zonque.org>
4 #include <linux/kernel.h>
5 #include <linux/platform_device.h>
6 #include <linux/leds.h>
7 #include <linux/delay.h>
8 #include <linux/gpio.h>
9 #include <linux/gpio/consumer.h>
10 #include <linux/slab.h>
11 #include <linux/module.h>
14 #define LED_LT3593_NAME "lt3593"
16 struct lt3593_led_data
{
17 struct led_classdev cdev
;
18 struct gpio_desc
*gpiod
;
21 static int lt3593_led_set(struct led_classdev
*led_cdev
,
22 enum led_brightness value
)
24 struct lt3593_led_data
*led_dat
=
25 container_of(led_cdev
, struct lt3593_led_data
, cdev
);
29 * The LT3593 resets its internal current level register to the maximum
30 * level on the first falling edge on the control pin. Each following
31 * falling edge decreases the current level by 625uA. Up to 32 pulses
32 * can be sent, so the maximum power reduction is 20mA.
33 * After a timeout of 128us, the value is taken from the register and
34 * applied is to the output driver.
38 gpiod_set_value_cansleep(led_dat
->gpiod
, 0);
42 pulses
= 32 - (value
* 32) / 255;
45 gpiod_set_value_cansleep(led_dat
->gpiod
, 0);
47 gpiod_set_value_cansleep(led_dat
->gpiod
, 1);
51 gpiod_set_value_cansleep(led_dat
->gpiod
, 1);
54 gpiod_set_value_cansleep(led_dat
->gpiod
, 0);
56 gpiod_set_value_cansleep(led_dat
->gpiod
, 1);
63 static int lt3593_led_probe(struct platform_device
*pdev
)
65 struct device
*dev
= &pdev
->dev
;
66 struct lt3593_led_data
*led_data
;
67 struct fwnode_handle
*child
;
68 int ret
, state
= LEDS_GPIO_DEFSTATE_OFF
;
69 struct led_init_data init_data
= {};
75 led_data
= devm_kzalloc(dev
, sizeof(*led_data
), GFP_KERNEL
);
79 if (device_get_child_node_count(dev
) != 1) {
80 dev_err(dev
, "Device must have exactly one LED sub-node.");
84 led_data
->gpiod
= devm_gpiod_get(dev
, "lltc,ctrl", 0);
85 if (IS_ERR(led_data
->gpiod
))
86 return PTR_ERR(led_data
->gpiod
);
88 child
= device_get_next_child_node(dev
, NULL
);
90 fwnode_property_read_string(child
, "linux,default-trigger",
91 &led_data
->cdev
.default_trigger
);
93 if (!fwnode_property_read_string(child
, "default-state", &tmp
)) {
94 if (!strcmp(tmp
, "on"))
95 state
= LEDS_GPIO_DEFSTATE_ON
;
98 led_data
->cdev
.brightness_set_blocking
= lt3593_led_set
;
99 led_data
->cdev
.brightness
= state
? LED_FULL
: LED_OFF
;
101 init_data
.fwnode
= child
;
102 init_data
.devicename
= LED_LT3593_NAME
;
103 init_data
.default_label
= ":";
105 ret
= devm_led_classdev_register_ext(dev
, &led_data
->cdev
, &init_data
);
107 fwnode_handle_put(child
);
111 led_data
->cdev
.dev
->of_node
= dev
->of_node
;
112 platform_set_drvdata(pdev
, led_data
);
117 static const struct of_device_id of_lt3593_leds_match
[] = {
118 { .compatible
= "lltc,lt3593", },
121 MODULE_DEVICE_TABLE(of
, of_lt3593_leds_match
);
123 static struct platform_driver lt3593_led_driver
= {
124 .probe
= lt3593_led_probe
,
126 .name
= "leds-lt3593",
127 .of_match_table
= of_match_ptr(of_lt3593_leds_match
),
131 module_platform_driver(lt3593_led_driver
);
133 MODULE_AUTHOR("Daniel Mack <daniel@zonque.org>");
134 MODULE_DESCRIPTION("LED driver for LT3593 controllers");
135 MODULE_LICENSE("GPL v2");
136 MODULE_ALIAS("platform:leds-lt3593");