2 * drivers/leds/leds-rt8547.c
3 * Driver for Richtek RT8547 LED Flash IC
5 * Copyright (C) 2014 Richtek Technology Corp.
6 * cy_huang <cy_huang@richtek.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/spinlock.h>
18 #include <linux/platform_device.h>
19 #include <linux/delay.h>
20 #include <linux/of_gpio.h>
23 #endif /* #ifdef CONFIG_OF */
24 #ifdef CONFIG_DEBUG_FS
25 #include <linux/debugfs.h>
26 #include <linux/uaccess.h>
27 #endif /* #ifdef CONFIG_DEBUG_FS */
30 #include "leds-rt8547.h"
35 struct rt8547_platform_data *pdata;
37 unsigned char suspend:1;
39 #ifdef CONFIG_DEBUG_FS
40 struct flashlight_device *fled_dev;
41 unsigned char reg_addr;
42 unsigned char reg_data;
43 #endif /* #ifdef CONFIG_DEBUG_FS */
46 #ifdef CONFIG_DEBUG_FS
60 static struct dentry *debugfs_rt_dent;
61 static struct dentry *debugfs_file[RT8547_DBG_MAX];
62 static struct rt_debug_st rtdbg_data[RT8547_DBG_MAX];
63 #endif /* #ifdef CONFIG_DEBUG_FS */
65 static unsigned char rt8547_reg_initval[] = {
72 static inline int rt8547_send_bit(struct rt8547_platform_data *pdata,
76 gpio_set_value(pdata->flset_gpio, (~(pdata->flset_active) & 0x1));
77 udelay(RT8547_SHORT_DELAY);
78 gpio_set_value(pdata->flset_gpio, ((pdata->flset_active) & 0x1));
79 udelay(RT8547_LONG_DELAY);
81 gpio_set_value(pdata->flset_gpio, (~(pdata->flset_active) & 0x1));
82 udelay(RT8547_LONG_DELAY);
83 gpio_set_value(pdata->flset_gpio, ((pdata->flset_active) & 0x1));
84 udelay(RT8547_SHORT_DELAY);
89 static inline int rt8547_send_byte(struct rt8547_platform_data *pdata,
94 /*Send order is high bit to low bit */
95 for (i = 7; i >= 0; i--)
96 rt8547_send_bit(pdata, byte & (0x1 << i));
100 static inline int rt8547_send_special_byte(struct rt8547_platform_data *pdata,
105 /*Only send three bit for register address */
106 for (i = 2; i >= 0; i--)
107 rt8547_send_bit(pdata, byte & (0x1 << i));
111 static inline int rt8547_start_xfer(struct rt8547_platform_data *pdata)
113 gpio_set_value(pdata->flset_gpio, ((pdata->flset_active) & 0x1));
114 udelay(RT8547_START_DELAY);
118 static inline int rt8547_stop_xfer(struct rt8547_platform_data *pdata)
120 /*Redundant one bit as the stop condition */
121 rt8547_send_bit(pdata, 1);
125 static int rt8547_send_data(struct rt8547_chip *chip, unsigned char reg,
128 struct rt8547_platform_data *pdata = chip->pdata;
130 unsigned char xfer_data[3]; /*0: adddr, 1: reg, 2: reg data*/
132 xfer_data[0] = RT8547_ONEWIRE_ADDR;
135 RT_DBG("rt8547-> 0: 0x%02x, 1: 0x%02x, 2: 0x%02x\n", xfer_data[0],
136 xfer_data[1], xfer_data[2]);
137 spin_lock_irqsave(&chip->io_lock, flags);
138 rt8547_start_xfer(pdata);
139 rt8547_send_byte(pdata, xfer_data[0]);
140 rt8547_send_special_byte(pdata, xfer_data[1]);
141 rt8547_send_byte(pdata, xfer_data[2]);
142 rt8547_stop_xfer(pdata);
143 spin_unlock_irqrestore(&chip->io_lock, flags);
144 /*write back to reg array*/
145 rt8547_reg_initval[reg - 1] = data;
149 #ifdef CONFIG_DEBUG_FS
150 static int reg_debug_open(struct inode *inode, struct file *file)
152 file->private_data = inode->i_private;
156 static int get_parameters(char *buf, long int *param1, int num_of_par)
161 token = strsep(&buf, " ");
163 for (cnt = 0; cnt < num_of_par; cnt++) {
165 if ((token[1] == 'x') || (token[1] == 'X'))
170 if (kstrtoul(token, base, ¶m1[cnt]) != 0)
173 token = strsep(&buf, " ");
180 static ssize_t reg_debug_read(struct file *filp, char __user *ubuf,
181 size_t count, loff_t *ppos)
183 struct rt_debug_st *st = filp->private_data;
184 struct rt8547_chip *di = st->info;
191 snprintf(lbuf, sizeof(lbuf), "0x%x\n", di->reg_addr);
193 case RT8547_DBG_DATA:
194 di->reg_data = rt8547_reg_initval[di->reg_addr - 1];
195 snprintf(lbuf, sizeof(lbuf), "0x%x\n", di->reg_data);
197 case RT8547_DBG_REGS:
198 for (i = RT8547_FLED_REG0; i < RT8547_FLED_REGMAX; i++)
199 j += snprintf(lbuf + j, 20, "0x%02x:%02x\n", i,
200 rt8547_reg_initval[i - 1]);
202 case RT8547_DBG_FLED:
203 snprintf(lbuf, sizeof(lbuf), "%d\n", di->in_use_mode);
209 return simple_read_from_buffer(ubuf, count, ppos, lbuf, strlen(lbuf));
212 static ssize_t reg_debug_write(struct file *filp,
213 const char __user *ubuf, size_t cnt,
216 struct rt_debug_st *st = filp->private_data;
217 struct rt8547_chip *di = st->info;
222 if (cnt > sizeof(lbuf) - 1)
225 rc = copy_from_user(lbuf, ubuf, cnt);
233 rc = get_parameters(lbuf, param, 1);
234 if ((param[0] < RT8547_FLED_REGMAX) && (rc == 0)) {
235 if ((param[0] >= RT8547_FLED_REG0
236 && param[0] <= RT8547_FLED_REG3))
237 di->reg_addr = (unsigned char)param[0];
243 case RT8547_DBG_DATA:
244 rc = get_parameters(lbuf, param, 1);
245 if ((param[0] <= 0xff) && (rc == 0)) {
246 rt8547_send_data(di, di->reg_addr,
247 (unsigned char)param[0]);
251 case RT8547_DBG_FLED:
253 di->fled_dev = find_flashlight_by_name("rt-flash-led");
254 rc = get_parameters(lbuf, param, 1);
255 if ((param[0] <= FLASHLIGHT_MODE_FLASH) && (rc == 0)
258 case FLASHLIGHT_MODE_TORCH:
259 flashlight_set_torch_brightness(di->fled_dev,
261 flashlight_set_mode(di->fled_dev,
262 FLASHLIGHT_MODE_TORCH);
264 case FLASHLIGHT_MODE_FLASH:
265 flashlight_set_strobe_timeout(di->fled_dev,
267 flashlight_set_strobe_brightness(di->fled_dev,
269 flashlight_set_mode(di->fled_dev,
270 FLASHLIGHT_MODE_FLASH);
271 flashlight_strobe(di->fled_dev);
273 case FLASHLIGHT_MODE_OFF:
274 flashlight_set_mode(di->fled_dev,
275 FLASHLIGHT_MODE_OFF);
289 static const struct file_operations reg_debug_ops = {
290 .open = reg_debug_open,
291 .write = reg_debug_write,
292 .read = reg_debug_read
295 static void rt8547_create_debugfs(struct rt8547_chip *chip)
297 RT_DBG("add debugfs for RT8547\n");
298 debugfs_rt_dent = debugfs_create_dir("rt8547_dbg", 0);
299 if (!IS_ERR(debugfs_rt_dent)) {
300 rtdbg_data[0].info = chip;
301 rtdbg_data[0].id = RT8547_DBG_REG;
302 debugfs_file[0] = debugfs_create_file("reg",
305 (void *)&rtdbg_data[0],
308 rtdbg_data[1].info = chip;
309 rtdbg_data[1].id = RT8547_DBG_DATA;
310 debugfs_file[1] = debugfs_create_file("data",
313 (void *)&rtdbg_data[1],
316 rtdbg_data[2].info = chip;
317 rtdbg_data[2].id = RT8547_DBG_REGS;
318 debugfs_file[2] = debugfs_create_file("regs",
321 (void *)&rtdbg_data[2],
324 rtdbg_data[3].info = chip;
325 rtdbg_data[3].id = RT8547_DBG_FLED;
326 debugfs_file[3] = debugfs_create_file("fled",
329 (void *)&rtdbg_data[3],
332 dev_err(chip->dev, "create debugfs failed\n");
336 static void rt8547_remove_debugfs(void)
338 if (!IS_ERR(debugfs_rt_dent))
339 debugfs_remove_recursive(debugfs_rt_dent);
341 #endif /* #ifdef CONFIG_DEBUG_FS */
343 static inline void rt8547_fled_power_on(struct rt8547_platform_data *pdata)
345 if (gpio_is_valid(pdata->flset_gpio))
346 gpio_set_value(pdata->flset_gpio, ((pdata->flset_active) & 0x1));
349 static inline void rt8547_fled_power_off(struct rt8547_platform_data *pdata)
351 if (gpio_is_valid(pdata->flset_gpio))
352 gpio_set_value(pdata->flset_gpio, (~(pdata->flset_active) & 0x1));
353 udelay(RT8547_STOP_DELAY);
356 static inline void rt8547_fled_ctrl_en(struct rt8547_platform_data *pdata,
359 if (gpio_is_valid(pdata->ctl_gpio)){
361 gpio_set_value(pdata->ctl_gpio, ((pdata->ctl_active) & 0x1));
363 gpio_set_value(pdata->ctl_gpio, (~(pdata->ctl_active) & 0x1));
365 RT_DBG("en %d\n", en);
368 static inline void rt8547_fled_flash_en(struct rt8547_platform_data *pdata,
371 if (gpio_is_valid(pdata->flen_gpio)){
373 gpio_set_value(pdata->flen_gpio, ((pdata->flen_active) & 0x1));
375 gpio_set_value(pdata->flen_gpio, (~(pdata->flen_active) & 0x1));
377 RT_DBG("en %d\n", en);
380 static int rt8547_fled_init(struct rt_fled_info *info)
386 static int rt8547_fled_resume(struct rt_fled_info *info)
388 struct rt8547_chip *fi = (struct rt8547_chip *)info;
395 static int rt8547_fled_suspend(struct rt_fled_info *info, pm_message_t state)
397 struct rt8547_chip *fi = (struct rt8547_chip *)info;
404 static int rt8547_fled_set_mode(struct rt_fled_info *info,
405 flashlight_mode_t mode)
407 struct rt8547_chip *fi = (struct rt8547_chip *)info;
408 unsigned char tmp = 0;
411 RT_DBG("mode=%d\n", mode);
413 case FLASHLIGHT_MODE_TORCH:
414 if (fi->in_use_mode == FLASHLIGHT_MODE_OFF)
415 rt8547_fled_power_on(fi->pdata);
416 tmp = rt8547_reg_initval[RT8547_FLED_REG2 - 1];
417 tmp |= RT8547_MODESEL_MASK;
418 rt8547_send_data(fi, RT8547_FLED_REG2, tmp);
419 rt8547_fled_ctrl_en(fi->pdata, 1);
420 rt8547_fled_flash_en(fi->pdata, 1);
421 fi->in_use_mode = mode;
423 case FLASHLIGHT_MODE_FLASH:
424 if (fi->in_use_mode == FLASHLIGHT_MODE_OFF)
425 rt8547_fled_power_on(fi->pdata);
426 tmp = rt8547_reg_initval[RT8547_FLED_REG2 - 1];
427 tmp &= ~RT8547_MODESEL_MASK;
428 rt8547_send_data(fi, RT8547_FLED_REG2, tmp);
429 fi->in_use_mode = mode;
431 case FLASHLIGHT_MODE_OFF:
432 rt8547_fled_flash_en(fi->pdata, 0);
433 rt8547_fled_ctrl_en(fi->pdata, 0);
434 if (fi->in_use_mode != FLASHLIGHT_MODE_OFF)
435 rt8547_fled_power_off(fi->pdata);
436 fi->in_use_mode = mode;
438 case FLASHLIGHT_MODE_MIXED:
445 static int rt8547_fled_get_mode(struct rt_fled_info *info)
447 struct rt8547_chip *fi = (struct rt8547_chip *)info;
450 return fi->in_use_mode;
453 static int rt8547_fled_strobe(struct rt_fled_info *info)
455 struct rt8547_chip *fi = (struct rt8547_chip *)info;
458 rt8547_fled_flash_en(fi->pdata, 0);
459 rt8547_fled_ctrl_en(fi->pdata, 0);
460 rt8547_fled_ctrl_en(fi->pdata, 1);
461 rt8547_fled_flash_en(fi->pdata, 1);
465 static int rt8547_fled_torch_current_list(struct rt_fled_info *info,
468 RT_DBG("selector=%d\n", selector);
469 return 25000 + selector * 25000; /* unit: uA */
472 static int rt8547_fled_strobe_current_list(struct rt_fled_info *info,
475 RT_DBG("selector=%d\n", selector);
476 return 100000 + selector * 50000; /* unit: uA */
479 static int rt8547_fled_timeout_level_list(struct rt_fled_info *info,
482 RT_DBG("selector=%d\n", selector);
483 return 100000 + selector * 50000; /* unit: uA */
486 static int rt8547_fled_lv_protection_list(struct rt_fled_info *info,
489 RT_DBG("selector=%d\n", selector);
490 return 3000 + selector * 100; /* unit: mV */
493 static int rt8547_fled_strobe_timeout_list(struct rt_fled_info *info,
496 RT_DBG("selector=%d\n", selector);
497 return 64 + selector * 32; /* unit: mS */
500 static int rt8547_fled_set_torch_current_sel(struct rt_fled_info *info,
504 struct rt8547_chip *fi = (struct rt8547_chip *)info;
505 unsigned char tmp = 0;
507 RT_DBG("selector=%d\n", selector);
508 tmp = rt8547_reg_initval[RT8547_FLED_REG2 - 1];
509 tmp &= ~RT8547_TCLEVEL_MASK;
511 rt8547_send_data(fi, RT8547_FLED_REG2, tmp);
515 static int rt8547_fled_set_strobe_current_sel(struct rt_fled_info *info,
518 struct rt8547_chip *fi = (struct rt8547_chip *)info;
519 unsigned char tmp = 0;
521 RT_DBG("selector=%d\n", selector);
522 tmp = rt8547_reg_initval[RT8547_FLED_REG1 - 1];
523 tmp &= ~RT8547_SCLEVEL_MASK;
525 rt8547_send_data(fi, RT8547_FLED_REG1, tmp);
529 static int rt8547_fled_set_timeout_level_sel(struct rt_fled_info *info,
532 struct rt8547_chip *fi = (struct rt8547_chip *)info;
533 unsigned char tmp = 0;
535 RT_DBG("selector=%d\n", selector);
536 if (selector > RT8547_TOL_MAX)
538 tmp = rt8547_reg_initval[RT8547_FLED_REG1 - 1];
539 tmp &= ~RT8547_TOCLEVEL_MASK;
540 tmp |= (selector << RT8547_TOCLEVEL_SHFT);
541 rt8547_send_data(fi, RT8547_FLED_REG1, tmp);
545 static int rt8547_fled_set_lv_protection_sel(struct rt_fled_info *info,
548 struct rt8547_chip *fi = (struct rt8547_chip *)info;
549 unsigned char tmp = 0;
551 RT_DBG("selector=%d\n", selector);
552 if (selector > RT8547_LVP_MAX)
554 tmp = rt8547_reg_initval[RT8547_FLED_REG0 - 1];
555 tmp &= ~RT8547_LVP_MASK;
557 rt8547_send_data(fi, RT8547_FLED_REG0, tmp);
561 static int rt8547_fled_set_strobe_timeout_sel(struct rt_fled_info *info,
564 struct rt8547_chip *fi = (struct rt8547_chip *)info;
565 unsigned char tmp = 0;
567 RT_DBG("selector=%d\n", selector);
568 if (selector > RT8547_STO_MAX)
570 tmp = rt8547_reg_initval[RT8547_FLED_REG3 - 1];
571 tmp &= ~RT8547_STO_MASK;
573 rt8547_send_data(fi, RT8547_FLED_REG3, tmp);
577 static int rt8547_fled_get_torch_current_sel(struct rt_fled_info *info)
580 rt8547_reg_initval[RT8547_FLED_REG2 - 1] & RT8547_TCLEVEL_MASK;
585 static int rt8547_fled_get_strobe_current_sel(struct rt_fled_info *info)
588 rt8547_reg_initval[RT8547_FLED_REG1 - 1] & RT8547_SCLEVEL_MASK;
593 static int rt8547_fled_get_timeout_level_sel(struct rt_fled_info *info)
596 rt8547_reg_initval[RT8547_FLED_REG1 - 1] & RT8547_TOCLEVEL_MASK;
598 selector >>= RT8547_TOCLEVEL_SHFT;
602 static int rt8547_fled_get_lv_protection_sel(struct rt_fled_info *info)
605 rt8547_reg_initval[RT8547_FLED_REG0 - 1] & RT8547_LVP_MASK;
610 static int rt8547_fled_get_strobe_timeout_sel(struct rt_fled_info *info)
613 rt8547_reg_initval[RT8547_FLED_REG3 - 1] & RT8547_STO_MASK;
618 static struct rt_fled_hal rt8547_fled_hal = {
619 .fled_init = rt8547_fled_init,
620 .fled_suspend = rt8547_fled_suspend,
621 .fled_resume = rt8547_fled_resume,
622 .fled_set_mode = rt8547_fled_set_mode,
623 .fled_get_mode = rt8547_fled_get_mode,
624 .fled_strobe = rt8547_fled_strobe,
625 .fled_torch_current_list = rt8547_fled_torch_current_list,
626 .fled_strobe_current_list = rt8547_fled_strobe_current_list,
627 .fled_timeout_level_list = rt8547_fled_timeout_level_list,
628 .fled_lv_protection_list = rt8547_fled_lv_protection_list,
629 .fled_strobe_timeout_list = rt8547_fled_strobe_timeout_list,
631 .fled_set_torch_current_sel = rt8547_fled_set_torch_current_sel,
632 .fled_set_strobe_current_sel = rt8547_fled_set_strobe_current_sel,
633 .fled_set_timeout_level_sel = rt8547_fled_set_timeout_level_sel,
634 .fled_set_lv_protection_sel = rt8547_fled_set_lv_protection_sel,
635 .fled_set_strobe_timeout_sel = rt8547_fled_set_strobe_timeout_sel,
637 .fled_get_torch_current_sel = rt8547_fled_get_torch_current_sel,
638 .fled_get_strobe_current_sel = rt8547_fled_get_strobe_current_sel,
639 .fled_get_timeout_level_sel = rt8547_fled_get_timeout_level_sel,
640 .fled_get_lv_protection_sel = rt8547_fled_get_lv_protection_sel,
641 .fled_get_strobe_timeout_sel = rt8547_fled_get_strobe_timeout_sel,
644 static struct flashlight_properties rt8547_fled_props = {
645 .type = FLASHLIGHT_TYPE_LED,
646 .torch_brightness = 2,
647 .torch_max_brightness = 15,
648 .strobe_brightness = 18,
649 .strobe_max_brightness = 30,
651 .strobe_timeout = 544,
652 .alias_name = "rt8547-fled",
655 static void rt8547_parse_dt(struct rt8547_platform_data *pdata,
659 struct device_node *np = dev->of_node;
662 if (of_property_read_u32(np, "rt,def_lvp", &tmp) < 0) {
663 dev_warn(dev, "use 3V as the default lvp\n");
665 if (tmp > RT8547_LVP_MAX)
666 tmp = RT8547_LVP_MAX;
667 rt8547_reg_initval[RT8547_FLED_REG0 - 1] &= ~RT8547_LVP_MASK;
668 rt8547_reg_initval[RT8547_FLED_REG0 - 1] |= tmp;
671 if (of_property_read_u32(np, "rt,def_tol", &tmp) < 0) {
672 dev_warn(dev, "use 100mA as the default timeout level\n");
674 if (tmp > RT8547_TOL_MAX)
675 tmp = RT8547_TOL_MAX;
676 tmp <<= RT8547_TOCLEVEL_SHFT;
677 rt8547_reg_initval[RT8547_FLED_REG1 - 1] &=
678 ~RT8547_TOCLEVEL_MASK;
679 rt8547_reg_initval[RT8547_FLED_REG1 - 1] |= tmp;
681 pdata->flen_gpio = of_get_named_gpio(np, "rt,flen_gpio", 0);
682 pdata->ctl_gpio = of_get_named_gpio(np, "rt,ctl_gpio", 0);
683 pdata->flset_gpio = of_get_named_gpio(np, "rt,flset_gpio", 0);
684 #endif /* #ifdef CONFIG_OF */
687 static void rt8547_parse_pdata(struct rt8547_platform_data *pdata,
692 tmp = pdata->def_lvp;
693 rt8547_reg_initval[RT8547_FLED_REG0 - 1] &= ~RT8547_LVP_MASK;
694 rt8547_reg_initval[RT8547_FLED_REG0 - 1] |= tmp;
696 tmp = pdata->def_tol;
697 tmp <<= RT8547_TOCLEVEL_SHFT;
698 rt8547_reg_initval[RT8547_FLED_REG1 - 1] &= ~RT8547_TOCLEVEL_MASK;
699 rt8547_reg_initval[RT8547_FLED_REG1 - 1] |= tmp;
702 static int rt8547_io_init(struct rt8547_platform_data *pdata,
707 if (gpio_is_valid(pdata->flen_gpio)) {
708 rc = gpio_request_one(pdata->flen_gpio, ((~(pdata->flen_active) & 0x1) ? GPIOF_OUT_INIT_HIGH:GPIOF_OUT_INIT_LOW),
711 dev_err(dev, "request rt8547 flash en pin fail\n");
717 if(gpio_is_valid(pdata->ctl_gpio)){
718 rc = gpio_request_one(pdata->ctl_gpio, ((~(pdata->ctl_active) & 0x1) ? GPIOF_OUT_INIT_HIGH:GPIOF_OUT_INIT_LOW),
721 dev_err(dev, "request rt8547 ctl pin fail\n");
726 if(gpio_is_valid(pdata->flset_gpio)){
727 rc = gpio_request_one(pdata->flset_gpio, ((~(pdata->flset_active) & 0x1) ? GPIOF_OUT_INIT_HIGH:GPIOF_OUT_INIT_LOW),
730 dev_err(dev, "request rt8547 flash set pin fail\n");
736 if(gpio_is_valid(pdata->ctl_gpio))
737 gpio_free(pdata->ctl_gpio);
739 if (gpio_is_valid(pdata->flen_gpio))
740 gpio_free(pdata->flen_gpio);
746 static int rt8547_io_deinit(struct rt8547_platform_data *pdata)
748 if (gpio_is_valid(pdata->flen_gpio)){
749 gpio_direction_input(pdata->flen_gpio);
750 gpio_free(pdata->flen_gpio);
752 if(gpio_is_valid(pdata->ctl_gpio)){
753 gpio_direction_input(pdata->ctl_gpio);
754 gpio_free(pdata->ctl_gpio);
756 if(gpio_is_valid(pdata->flset_gpio)){
757 gpio_direction_input(pdata->flset_gpio);
758 gpio_free(pdata->flset_gpio);
763 static void rt8547_reg_init(struct rt8547_chip *chip)
766 rt8547_send_data(chip, RT8547_FLED_REG0,
767 rt8547_reg_initval[RT8547_FLED_REG0 - 1]);
768 rt8547_send_data(chip, RT8547_FLED_REG1,
769 rt8547_reg_initval[RT8547_FLED_REG1 - 1]);
770 rt8547_send_data(chip, RT8547_FLED_REG2,
771 rt8547_reg_initval[RT8547_FLED_REG2 - 1]);
772 rt8547_send_data(chip, RT8547_FLED_REG3,
773 rt8547_reg_initval[RT8547_FLED_REG3 - 1]);
776 static struct platform_device rt_fled_pdev = {
777 .name = "rt-flash-led",
781 static int rt8547_led_probe(struct platform_device *pdev)
783 struct rt8547_platform_data *pdata = pdev->dev.platform_data;
784 struct rt8547_chip *chip;
785 bool use_dt = pdev->dev.of_node;
788 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
792 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
795 rt8547_parse_dt(pdata, &pdev->dev);
799 rt8547_parse_pdata(pdata, &pdev->dev);
802 ret = rt8547_io_init(pdata, &pdev->dev);
806 chip->dev = &pdev->dev;
808 spin_lock_init(&chip->io_lock);
809 chip->in_use_mode = FLASHLIGHT_MODE_OFF;
810 platform_set_drvdata(pdev, chip);
812 rt8547_fled_power_on(pdata);
813 rt8547_reg_init(chip);
814 rt8547_fled_power_off(pdata);
816 chip->base.hal = &rt8547_fled_hal;
817 chip->base.init_props = &rt8547_fled_props;
818 rt_fled_pdev.dev.parent = &pdev->dev;
819 ret = platform_device_register(&rt_fled_pdev);
821 dev_err(&pdev->dev, "register rtfled fail\n");
824 #ifdef CONFIG_DEBUG_FS
825 rt8547_create_debugfs(chip);
826 #endif /* #ifdef CONFIG_DEBUG_FS */
827 dev_info(&pdev->dev, "driver successfully registered\n");
831 devm_kfree(&pdev->dev, pdata);
833 devm_kfree(&pdev->dev, chip);
837 static int rt8547_led_remove(struct platform_device *pdev)
839 struct rt8547_chip *chip = platform_get_drvdata(pdev);
841 #ifdef CONFIG_DEBUG_FS
842 rt8547_remove_debugfs();
843 #endif /* #ifdef CONFIG_DEBUG_FS */
844 platform_device_unregister(&rt_fled_pdev);
845 rt8547_io_deinit(chip->pdata);
849 static const struct of_device_id rt_match_table[] = {
850 {.compatible = "rt,rt8547",},
854 static struct platform_driver rt8547_led_driver = {
857 .owner = THIS_MODULE,
858 .of_match_table = rt_match_table,
860 .probe = rt8547_led_probe,
861 .remove = rt8547_led_remove,
864 static int rt8547_led_init(void)
866 return platform_driver_register(&rt8547_led_driver);
869 module_init(rt8547_led_init);
871 static void rt8547_led_exit(void)
873 platform_driver_unregister(&rt8547_led_driver);
876 module_exit(rt8547_led_exit);
878 MODULE_LICENSE("GPL");
879 MODULE_AUTHOR("CY Huang <cy_huang@richtek.com>");
880 MODULE_DESCRIPTION("LED Flash Driver for RT8547");
881 MODULE_VERSION(RT8547_DRV_VER);