1 // SPDX-License-Identifier: GPL-2.0-only
3 * LP5521/LP5523/LP55231/LP5562 Common Driver
5 * Copyright 2012 Texas Instruments
9 * Derived from leds-lp5521.c, leds-lp5523.c
12 #include <linux/clk.h>
13 #include <linux/delay.h>
14 #include <linux/firmware.h>
15 #include <linux/i2c.h>
16 #include <linux/leds.h>
17 #include <linux/module.h>
18 #include <linux/platform_data/leds-lp55xx.h>
19 #include <linux/slab.h>
20 #include <linux/gpio/consumer.h>
22 #include "leds-lp55xx-common.h"
24 /* External clock rate */
25 #define LP55XX_CLK_32K 32768
27 static struct lp55xx_led *cdev_to_lp55xx_led(struct led_classdev *cdev)
29 return container_of(cdev, struct lp55xx_led, cdev);
32 static struct lp55xx_led *dev_to_lp55xx_led(struct device *dev)
34 return cdev_to_lp55xx_led(dev_get_drvdata(dev));
37 static struct lp55xx_led *mcled_cdev_to_led(struct led_classdev_mc *mc_cdev)
39 return container_of(mc_cdev, struct lp55xx_led, mc_cdev);
42 static void lp55xx_reset_device(struct lp55xx_chip *chip)
44 struct lp55xx_device_config *cfg = chip->cfg;
45 u8 addr = cfg->reset.addr;
46 u8 val = cfg->reset.val;
48 /* no error checking here because no ACK from the device after reset */
49 lp55xx_write(chip, addr, val);
52 static int lp55xx_detect_device(struct lp55xx_chip *chip)
54 struct lp55xx_device_config *cfg = chip->cfg;
55 u8 addr = cfg->enable.addr;
56 u8 val = cfg->enable.val;
59 ret = lp55xx_write(chip, addr, val);
63 usleep_range(1000, 2000);
65 ret = lp55xx_read(chip, addr, &val);
69 if (val != cfg->enable.val)
75 static int lp55xx_post_init_device(struct lp55xx_chip *chip)
77 struct lp55xx_device_config *cfg = chip->cfg;
79 if (!cfg->post_init_device)
82 return cfg->post_init_device(chip);
85 static ssize_t led_current_show(struct device *dev,
86 struct device_attribute *attr,
89 struct lp55xx_led *led = dev_to_lp55xx_led(dev);
91 return sysfs_emit(buf, "%d\n", led->led_current);
94 static ssize_t led_current_store(struct device *dev,
95 struct device_attribute *attr,
96 const char *buf, size_t len)
98 struct lp55xx_led *led = dev_to_lp55xx_led(dev);
99 struct lp55xx_chip *chip = led->chip;
102 if (kstrtoul(buf, 0, &curr))
105 if (curr > led->max_current)
108 if (!chip->cfg->set_led_current)
111 mutex_lock(&chip->lock);
112 chip->cfg->set_led_current(led, (u8)curr);
113 mutex_unlock(&chip->lock);
118 static ssize_t max_current_show(struct device *dev,
119 struct device_attribute *attr,
122 struct lp55xx_led *led = dev_to_lp55xx_led(dev);
124 return sysfs_emit(buf, "%d\n", led->max_current);
127 static DEVICE_ATTR_RW(led_current);
128 static DEVICE_ATTR_RO(max_current);
130 static struct attribute *lp55xx_led_attrs[] = {
131 &dev_attr_led_current.attr,
132 &dev_attr_max_current.attr,
135 ATTRIBUTE_GROUPS(lp55xx_led);
137 static int lp55xx_set_mc_brightness(struct led_classdev *cdev,
138 enum led_brightness brightness)
140 struct led_classdev_mc *mc_dev = lcdev_to_mccdev(cdev);
141 struct lp55xx_led *led = mcled_cdev_to_led(mc_dev);
142 struct lp55xx_device_config *cfg = led->chip->cfg;
144 led_mc_calc_color_components(&led->mc_cdev, brightness);
145 return cfg->multicolor_brightness_fn(led);
149 static int lp55xx_set_brightness(struct led_classdev *cdev,
150 enum led_brightness brightness)
152 struct lp55xx_led *led = cdev_to_lp55xx_led(cdev);
153 struct lp55xx_device_config *cfg = led->chip->cfg;
155 led->brightness = (u8)brightness;
156 return cfg->brightness_fn(led);
159 static int lp55xx_init_led(struct lp55xx_led *led,
160 struct lp55xx_chip *chip, int chan)
162 struct lp55xx_platform_data *pdata = chip->pdata;
163 struct lp55xx_device_config *cfg = chip->cfg;
164 struct device *dev = &chip->cl->dev;
165 int max_channel = cfg->max_channel;
166 struct mc_subled *mc_led_info;
167 struct led_classdev *led_cdev;
172 if (chan >= max_channel) {
173 dev_err(dev, "invalid channel: %d / %d\n", chan, max_channel);
177 if (pdata->led_config[chan].led_current == 0)
180 if (pdata->led_config[chan].name) {
181 led->cdev.name = pdata->led_config[chan].name;
183 snprintf(name, sizeof(name), "%s:channel%d",
184 pdata->label ? : chip->cl->name, chan);
185 led->cdev.name = name;
188 if (pdata->led_config[chan].num_colors > 1) {
189 mc_led_info = devm_kcalloc(dev,
190 pdata->led_config[chan].num_colors,
191 sizeof(*mc_led_info), GFP_KERNEL);
195 led_cdev = &led->mc_cdev.led_cdev;
196 led_cdev->name = led->cdev.name;
197 led_cdev->brightness_set_blocking = lp55xx_set_mc_brightness;
198 led->mc_cdev.num_colors = pdata->led_config[chan].num_colors;
199 for (i = 0; i < led->mc_cdev.num_colors; i++) {
200 mc_led_info[i].color_index =
201 pdata->led_config[chan].color_id[i];
202 mc_led_info[i].channel =
203 pdata->led_config[chan].output_num[i];
206 led->mc_cdev.subled_info = mc_led_info;
208 led->cdev.brightness_set_blocking = lp55xx_set_brightness;
211 led->cdev.groups = lp55xx_led_groups;
212 led->cdev.default_trigger = pdata->led_config[chan].default_trigger;
213 led->led_current = pdata->led_config[chan].led_current;
214 led->max_current = pdata->led_config[chan].max_current;
215 led->chan_nr = pdata->led_config[chan].chan_nr;
217 if (led->chan_nr >= max_channel) {
218 dev_err(dev, "Use channel numbers between 0 and %d\n",
223 if (pdata->led_config[chan].num_colors > 1)
224 ret = devm_led_classdev_multicolor_register(dev, &led->mc_cdev);
226 ret = devm_led_classdev_register(dev, &led->cdev);
229 dev_err(dev, "led register err: %d\n", ret);
236 static void lp55xx_firmware_loaded(const struct firmware *fw, void *context)
238 struct lp55xx_chip *chip = context;
239 struct device *dev = &chip->cl->dev;
240 enum lp55xx_engine_index idx = chip->engine_idx;
243 dev_err(dev, "firmware request failed\n");
247 /* handling firmware data is chip dependent */
248 mutex_lock(&chip->lock);
250 chip->engines[idx - 1].mode = LP55XX_ENGINE_LOAD;
252 if (chip->cfg->firmware_cb)
253 chip->cfg->firmware_cb(chip);
255 mutex_unlock(&chip->lock);
257 /* firmware should be released for other channel use */
258 release_firmware(chip->fw);
262 static int lp55xx_request_firmware(struct lp55xx_chip *chip)
264 const char *name = chip->cl->name;
265 struct device *dev = &chip->cl->dev;
267 return request_firmware_nowait(THIS_MODULE, false, name, dev,
268 GFP_KERNEL, chip, lp55xx_firmware_loaded);
271 static ssize_t select_engine_show(struct device *dev,
272 struct device_attribute *attr,
275 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
276 struct lp55xx_chip *chip = led->chip;
278 return sprintf(buf, "%d\n", chip->engine_idx);
281 static ssize_t select_engine_store(struct device *dev,
282 struct device_attribute *attr,
283 const char *buf, size_t len)
285 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
286 struct lp55xx_chip *chip = led->chip;
290 if (kstrtoul(buf, 0, &val))
293 /* select the engine to be run */
296 case LP55XX_ENGINE_1:
297 case LP55XX_ENGINE_2:
298 case LP55XX_ENGINE_3:
299 mutex_lock(&chip->lock);
300 chip->engine_idx = val;
301 ret = lp55xx_request_firmware(chip);
302 mutex_unlock(&chip->lock);
305 dev_err(dev, "%lu: invalid engine index. (1, 2, 3)\n", val);
310 dev_err(dev, "request firmware err: %d\n", ret);
317 static inline void lp55xx_run_engine(struct lp55xx_chip *chip, bool start)
319 if (chip->cfg->run_engine)
320 chip->cfg->run_engine(chip, start);
323 static ssize_t run_engine_store(struct device *dev,
324 struct device_attribute *attr,
325 const char *buf, size_t len)
327 struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
328 struct lp55xx_chip *chip = led->chip;
331 if (kstrtoul(buf, 0, &val))
334 /* run or stop the selected engine */
337 lp55xx_run_engine(chip, false);
341 mutex_lock(&chip->lock);
342 lp55xx_run_engine(chip, true);
343 mutex_unlock(&chip->lock);
348 static DEVICE_ATTR_RW(select_engine);
349 static DEVICE_ATTR_WO(run_engine);
351 static struct attribute *lp55xx_engine_attributes[] = {
352 &dev_attr_select_engine.attr,
353 &dev_attr_run_engine.attr,
357 static const struct attribute_group lp55xx_engine_attr_group = {
358 .attrs = lp55xx_engine_attributes,
361 int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val)
363 return i2c_smbus_write_byte_data(chip->cl, reg, val);
365 EXPORT_SYMBOL_GPL(lp55xx_write);
367 int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val)
371 ret = i2c_smbus_read_byte_data(chip->cl, reg);
378 EXPORT_SYMBOL_GPL(lp55xx_read);
380 int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg, u8 mask, u8 val)
385 ret = lp55xx_read(chip, reg, &tmp);
392 return lp55xx_write(chip, reg, tmp);
394 EXPORT_SYMBOL_GPL(lp55xx_update_bits);
396 bool lp55xx_is_extclk_used(struct lp55xx_chip *chip)
401 clk = devm_clk_get(&chip->cl->dev, "32k_clk");
403 goto use_internal_clk;
405 err = clk_prepare_enable(clk);
407 goto use_internal_clk;
409 if (clk_get_rate(clk) != LP55XX_CLK_32K) {
410 clk_disable_unprepare(clk);
411 goto use_internal_clk;
414 dev_info(&chip->cl->dev, "%dHz external clock used\n", LP55XX_CLK_32K);
420 dev_info(&chip->cl->dev, "internal clock used\n");
423 EXPORT_SYMBOL_GPL(lp55xx_is_extclk_used);
425 int lp55xx_init_device(struct lp55xx_chip *chip)
427 struct lp55xx_platform_data *pdata;
428 struct lp55xx_device_config *cfg;
429 struct device *dev = &chip->cl->dev;
440 if (pdata->enable_gpiod) {
441 gpiod_direction_output(pdata->enable_gpiod, 0);
443 gpiod_set_consumer_name(pdata->enable_gpiod, "LP55xx enable");
444 gpiod_set_value(pdata->enable_gpiod, 0);
445 usleep_range(1000, 2000); /* Keep enable down at least 1ms */
446 gpiod_set_value(pdata->enable_gpiod, 1);
447 usleep_range(1000, 2000); /* 500us abs min. */
450 lp55xx_reset_device(chip);
453 * Exact value is not available. 10 - 20ms
454 * appears to be enough for reset.
456 usleep_range(10000, 20000);
458 ret = lp55xx_detect_device(chip);
460 dev_err(dev, "device detection err: %d\n", ret);
464 /* chip specific initialization */
465 ret = lp55xx_post_init_device(chip);
467 dev_err(dev, "post init device err: %d\n", ret);
474 lp55xx_deinit_device(chip);
478 EXPORT_SYMBOL_GPL(lp55xx_init_device);
480 void lp55xx_deinit_device(struct lp55xx_chip *chip)
482 struct lp55xx_platform_data *pdata = chip->pdata;
485 clk_disable_unprepare(chip->clk);
487 if (pdata->enable_gpiod)
488 gpiod_set_value(pdata->enable_gpiod, 0);
490 EXPORT_SYMBOL_GPL(lp55xx_deinit_device);
492 int lp55xx_register_leds(struct lp55xx_led *led, struct lp55xx_chip *chip)
494 struct lp55xx_platform_data *pdata = chip->pdata;
495 struct lp55xx_device_config *cfg = chip->cfg;
496 int num_channels = pdata->num_channels;
497 struct lp55xx_led *each;
502 if (!cfg->brightness_fn) {
503 dev_err(&chip->cl->dev, "empty brightness configuration\n");
507 for (i = 0; i < num_channels; i++) {
509 /* do not initialize channels that are not connected */
510 if (pdata->led_config[i].led_current == 0)
513 led_current = pdata->led_config[i].led_current;
515 ret = lp55xx_init_led(each, chip, i);
522 /* setting led current at each channel */
523 if (cfg->set_led_current)
524 cfg->set_led_current(each, led_current);
532 EXPORT_SYMBOL_GPL(lp55xx_register_leds);
534 int lp55xx_register_sysfs(struct lp55xx_chip *chip)
536 struct device *dev = &chip->cl->dev;
537 struct lp55xx_device_config *cfg = chip->cfg;
540 if (!cfg->run_engine || !cfg->firmware_cb)
541 goto dev_specific_attrs;
543 ret = sysfs_create_group(&dev->kobj, &lp55xx_engine_attr_group);
548 return cfg->dev_attr_group ?
549 sysfs_create_group(&dev->kobj, cfg->dev_attr_group) : 0;
551 EXPORT_SYMBOL_GPL(lp55xx_register_sysfs);
553 void lp55xx_unregister_sysfs(struct lp55xx_chip *chip)
555 struct device *dev = &chip->cl->dev;
556 struct lp55xx_device_config *cfg = chip->cfg;
558 if (cfg->dev_attr_group)
559 sysfs_remove_group(&dev->kobj, cfg->dev_attr_group);
561 sysfs_remove_group(&dev->kobj, &lp55xx_engine_attr_group);
563 EXPORT_SYMBOL_GPL(lp55xx_unregister_sysfs);
565 static int lp55xx_parse_common_child(struct device_node *np,
566 struct lp55xx_led_config *cfg,
567 int led_number, int *chan_nr)
571 of_property_read_string(np, "chan-name",
572 &cfg[led_number].name);
573 of_property_read_u8(np, "led-cur",
574 &cfg[led_number].led_current);
575 of_property_read_u8(np, "max-cur",
576 &cfg[led_number].max_current);
578 ret = of_property_read_u32(np, "reg", chan_nr);
582 if (*chan_nr < 0 || *chan_nr > cfg->max_channel)
588 static int lp55xx_parse_multi_led_child(struct device_node *child,
589 struct lp55xx_led_config *cfg,
590 int child_number, int color_number)
592 int chan_nr, color_id, ret;
594 ret = lp55xx_parse_common_child(child, cfg, child_number, &chan_nr);
598 ret = of_property_read_u32(child, "color", &color_id);
602 cfg[child_number].color_id[color_number] = color_id;
603 cfg[child_number].output_num[color_number] = chan_nr;
608 static int lp55xx_parse_multi_led(struct device_node *np,
609 struct lp55xx_led_config *cfg,
612 struct device_node *child;
613 int num_colors = 0, ret;
615 for_each_available_child_of_node(np, child) {
616 ret = lp55xx_parse_multi_led_child(child, cfg, child_number,
625 cfg[child_number].num_colors = num_colors;
630 static int lp55xx_parse_logical_led(struct device_node *np,
631 struct lp55xx_led_config *cfg,
637 cfg[child_number].default_trigger =
638 of_get_property(np, "linux,default-trigger", NULL);
640 ret = of_property_read_u32(np, "color", &led_color);
644 if (led_color == LED_COLOR_ID_RGB)
645 return lp55xx_parse_multi_led(np, cfg, child_number);
647 ret = lp55xx_parse_common_child(np, cfg, child_number, &chan_nr);
651 cfg[child_number].chan_nr = chan_nr;
656 struct lp55xx_platform_data *lp55xx_of_populate_pdata(struct device *dev,
657 struct device_node *np,
658 struct lp55xx_chip *chip)
660 struct device_node *child;
661 struct lp55xx_platform_data *pdata;
662 struct lp55xx_led_config *cfg;
667 pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
669 return ERR_PTR(-ENOMEM);
671 num_channels = of_get_available_child_count(np);
672 if (num_channels == 0) {
673 dev_err(dev, "no LED channels\n");
674 return ERR_PTR(-EINVAL);
677 cfg = devm_kcalloc(dev, num_channels, sizeof(*cfg), GFP_KERNEL);
679 return ERR_PTR(-ENOMEM);
681 pdata->led_config = &cfg[0];
682 pdata->num_channels = num_channels;
683 cfg->max_channel = chip->cfg->max_channel;
685 for_each_available_child_of_node(np, child) {
686 ret = lp55xx_parse_logical_led(child, cfg, i);
689 return ERR_PTR(-EINVAL);
694 of_property_read_string(np, "label", &pdata->label);
695 of_property_read_u8(np, "clock-mode", &pdata->clock_mode);
697 pdata->enable_gpiod = devm_gpiod_get_optional(dev, "enable",
699 if (IS_ERR(pdata->enable_gpiod))
700 return ERR_CAST(pdata->enable_gpiod);
702 /* LP8501 specific */
703 of_property_read_u8(np, "pwr-sel", (u8 *)&pdata->pwr_sel);
707 EXPORT_SYMBOL_GPL(lp55xx_of_populate_pdata);
710 MODULE_DESCRIPTION("LP55xx Common Driver");
711 MODULE_LICENSE("GPL");