2 * leds-s2mu106.c - LED class driver for S2MU106 FLASH LEDs.
4 * Copyright (C) 2018 Samsung Electronics
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
12 #include <linux/kernel.h>
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/err.h>
16 #include <linux/slab.h>
17 #include <linux/workqueue.h>
18 #include <linux/gpio.h>
19 #include <linux/of_gpio.h>
20 #include <linux/mfd/samsung/s2mu106.h>
21 #include <linux/leds-s2mu106.h>
22 #include <linux/platform_device.h>
24 struct s2mu106_fled_data
*g_fled_data
;
26 static char *s2mu106_fled_mode_string
[] = {
32 static char *s2mu106_fled_operating_mode_string
[] = {
39 /* IC current limit */
40 static int s2mu106_fled_torch_curr_max
[] = {
44 /* IC current limit */
45 static int s2mu106_fled_flash_curr_max
[] = {
50 static void s2mu106_fled_test_read(struct s2mu106_fled_data
*fled
)
53 char str
[1016] = {0,};
55 struct i2c_client
*i2c
= fled
->i2c
;
57 for (i
= 0x0B; i
<= 0x0C; i
++) {
58 s2mu106_read_reg(i2c
, i
, &data
);
59 sprintf(str
+strlen(str
), "0x%02x:0x%02x, ", i
, data
);
61 for (i
= 0x14; i
<= 0x15; i
++) {
62 s2mu106_read_reg(i2c
, i
, &data
);
63 sprintf(str
+strlen(str
), "0x%02x:0x%02x, ", i
, data
);
66 for (i
= 0x53; i
<= 0x5A; i
++) {
67 s2mu106_read_reg(i2c
, i
, &data
);
68 sprintf(str
+strlen(str
), "0x%02x:0x%02x, ", i
, data
);
71 s2mu106_read_reg(i2c
, 0x5B, &data
);
72 pr_err("%s: %s0x5B:0x%02x\n", __func__
, str
, data
);
74 memset(str
,0,strlen(str
));
76 for (i
= 0x5C; i
<= 0x62; i
++) {
77 s2mu106_read_reg(i2c
, i
, &data
);
78 sprintf(str
+strlen(str
), "0x%02x:0x%02x, ", i
, data
);
81 s2mu106_read_reg(i2c
, 0x63, &data
);
82 pr_err("%s: %s0x63:0x%02x\n", __func__
, str
, data
);
86 static int s2mu106_fled_get_flash_curr(struct s2mu106_fled_data
*fled
, int chan
)
92 if ((chan
< 1) || (chan
> S2MU106_CH_MAX
)) {
93 pr_info("%s: Wrong channel!!\n", __func__
);
99 dest
= S2MU106_FLED_CH1_CTRL0
;
102 dest
= S2MU106_FLED_CH2_CTRL0
;
105 dest
= S2MU106_FLED_CH3_CTRL0
;
112 s2mu106_read_reg(fled
->i2c
, dest
, &data
);
114 data
= data
& S2MU106_CHX_FLASH_IOUT
;
115 curr
= (data
* 50) + 50;
117 pr_info("%s: CH%02d flash curr. = %dmA\n", __func__
,
123 static int s2mu106_fled_set_flash_curr(struct s2mu106_fled_data
*fled
,
131 if ((chan
< 1) || (chan
> S2MU106_CH_MAX
)) {
132 pr_info("%s: Wrong channel!!\n", __func__
);
138 dest
= S2MU106_FLED_CH1_CTRL0
;
141 dest
= S2MU106_FLED_CH2_CTRL0
;
144 dest
= S2MU106_FLED_CH3_CTRL0
;
153 else if (curr
> s2mu106_fled_flash_curr_max
[chan
])
154 curr
= s2mu106_fled_flash_curr_max
[chan
];
156 data
= (curr
- 50)/50;
158 s2mu106_update_reg(fled
->i2c
, dest
, data
, S2MU106_CHX_FLASH_IOUT
);
160 curr_set
= s2mu106_fled_get_flash_curr(fled
, chan
);
162 pr_info("%s: curr: %d, curr_set: %d\n", __func__
,
168 static int s2mu106_fled_get_torch_curr(struct s2mu106_fled_data
*fled
,
175 if ((chan
< 1) || (chan
> S2MU106_CH_MAX
)) {
176 pr_info("%s: Wrong channel!!\n", __func__
);
182 dest
= S2MU106_FLED_CH1_CTRL1
;
185 dest
= S2MU106_FLED_CH2_CTRL1
;
188 dest
= S2MU106_FLED_CH3_CTRL1
;
195 s2mu106_read_reg(fled
->i2c
, dest
, &data
);
197 data
= data
& S2MU106_CHX_TORCH_IOUT
;
198 curr
= data
* 10 + 10;
200 pr_info("%s: CH%02d torch curr. = %dmA\n", __func__
,
206 static int s2mu106_fled_set_torch_curr(struct s2mu106_fled_data
*fled
,
214 if ((chan
< 1) || (chan
> S2MU106_CH_MAX
)) {
215 pr_info("%s: Wrong channel!!\n", __func__
);
221 dest
= S2MU106_FLED_CH1_CTRL1
;
224 dest
= S2MU106_FLED_CH2_CTRL1
;
227 dest
= S2MU106_FLED_CH3_CTRL1
;
236 else if (curr
> s2mu106_fled_torch_curr_max
[chan
])
237 curr
= s2mu106_fled_torch_curr_max
[chan
];
239 data
= (curr
- 10)/10;
241 s2mu106_update_reg(fled
->i2c
, dest
, data
, S2MU106_CHX_TORCH_IOUT
);
243 curr_set
= s2mu106_fled_get_torch_curr(fled
, chan
);
245 pr_info("%s: curr: %d, curr_set: %d\n", __func__
,
254 static void s2mu106_fled_operating_mode(struct s2mu106_fled_data
*fled
,
259 if (mode
< 0 || mode
> 3) {
260 pr_info ("%s, wrong mode\n", __func__
);
264 pr_info ("%s = %s\n", __func__
,
265 s2mu106_fled_operating_mode_string
[mode
]);
268 s2mu106_update_reg(fled
->i2c
, S2MU106_FLED_CTRL0
, value
, 0xC0);
271 static int s2mu106_fled_get_mode(struct s2mu106_fled_data
*fled
, int chan
)
276 s2mu106_read_reg(fled
->i2c
, S2MU106_FLED_STATUS1
, &status
);
278 pr_info("%s: S2MU106_FLED_STATUS1: 0x%02x\n", __func__
, status
);
280 if ((chan
< 1) || (chan
> S2MU106_CH_MAX
)) {
281 pr_info("%s: Wrong channel!!\n", __func__
);
287 if (status
& S2MU106_CH1_FLASH_ON
)
288 ret
= S2MU106_FLED_MODE_FLASH
;
289 else if (status
& S2MU106_CH1_TORCH_ON
)
290 ret
= S2MU106_FLED_MODE_TORCH
;
292 ret
= S2MU106_FLED_MODE_OFF
;
295 if (status
& S2MU106_CH2_FLASH_ON
)
296 ret
= S2MU106_FLED_MODE_FLASH
;
297 else if (status
& S2MU106_CH2_TORCH_ON
)
298 ret
= S2MU106_FLED_MODE_TORCH
;
300 ret
= S2MU106_FLED_MODE_OFF
;
303 if (status
& S2MU106_CH3_FLASH_ON
)
304 ret
= S2MU106_FLED_MODE_FLASH
;
305 else if (status
& S2MU106_CH3_TORCH_ON
)
306 ret
= S2MU106_FLED_MODE_TORCH
;
308 ret
= S2MU106_FLED_MODE_OFF
;
316 static int s2mu106_fled_set_mode(struct s2mu106_fled_data
*fled
,
319 u8 dest
= 0, bit
= 0, mask
= 0, status
= 0;
321 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
) ||
322 (mode
< 0) || (mode
> S2MU106_FLED_MODE_MAX
)) {
323 pr_err("%s: Wrong channel or mode.\n", __func__
);
327 pr_err("%s: channel: %d, mode: %d\n", __func__
, chan
, mode
);
329 /* 0b000: OFF, 0b101: i2c bit control(on) */
331 case S2MU106_FLED_MODE_OFF
:
332 mask
= S2MU106_CHX_FLASH_FLED_EN
|
333 S2MU106_CHX_TORCH_FLED_EN
;
336 case S2MU106_FLED_MODE_FLASH
:
337 mask
= S2MU106_CHX_FLASH_FLED_EN
;
338 bit
= S2MU106_FLED_EN
<< 3;
340 case S2MU106_FLED_MODE_TORCH
:
341 s2mu106_fled_operating_mode(fled
, SYS_MODE
);
342 mask
= S2MU106_CHX_TORCH_FLED_EN
;
343 bit
= S2MU106_FLED_EN
;
352 dest
= S2MU106_FLED_CTRL1
;
355 dest
= S2MU106_FLED_CTRL2
;
358 dest
= S2MU106_FLED_CTRL3
;
365 /* Need to set EN_FLED_PRE bit before mode change */
366 if (mode
!= S2MU106_FLED_MODE_OFF
)
367 s2mu106_update_reg(fled
->i2c
, S2MU106_FLED_CTRL0
,
368 S2MU106_EN_FLED_PRE
, S2MU106_EN_FLED_PRE
);
370 /* If no LED is on, clear EN_FLED_PRE */
371 s2mu106_read_reg(fled
->i2c
, S2MU106_FLED_STATUS1
, &status
);
372 if (!(status
& S2MU106_FLED_ON_CHECK
))
373 s2mu106_update_reg(fled
->i2c
, S2MU106_FLED_CTRL0
,
374 0, S2MU106_EN_FLED_PRE
);
376 s2mu106_update_reg(fled
->i2c
, dest
, bit
, mask
);
378 if (mode
== S2MU106_FLED_MODE_OFF
)
379 s2mu106_fled_operating_mode(fled
, AUTO_MODE
);
384 int s2mu106_mode_change_cam_to_leds(enum cam_flash_mode cam_mode
)
389 case CAM_FLASH_MODE_OFF
:
390 mode
= S2MU106_FLED_MODE_OFF
;
392 case CAM_FLASH_MODE_SINGLE
:
393 mode
= S2MU106_FLED_MODE_FLASH
;
395 case CAM_FLASH_MODE_TORCH
:
396 mode
= S2MU106_FLED_MODE_TORCH
;
399 mode
= S2MU106_FLED_MODE_OFF
;
406 int s2mu106_fled_set_mode_ctrl(int chan
, enum cam_flash_mode cam_mode
)
408 struct s2mu106_fled_data
*fled
= g_fled_data
;
411 mode
= s2mu106_mode_change_cam_to_leds(cam_mode
);
413 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
) ||
414 (mode
< 0) || (mode
>= S2MU106_FLED_MODE_MAX
)) {
415 pr_err("%s: channel: %d, mode: %d\n", __func__
, chan
, mode
);
416 pr_err("%s: Wrong channel or mode.\n", __func__
);
420 s2mu106_fled_set_mode(fled
, chan
, mode
);
422 s2mu106_fled_test_read(fled
);
428 int s2mu106_fled_set_curr(int chan
, enum cam_flash_mode cam_mode
, int curr
)
430 struct s2mu106_fled_data
*fled
= g_fled_data
;
433 mode
= s2mu106_mode_change_cam_to_leds(cam_mode
);
436 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
)) {
437 pr_err("%s: Wrong channel.\n", __func__
);
442 case S2MU106_FLED_MODE_TORCH
:
444 s2mu106_fled_set_torch_curr(fled
, chan
, curr
);
446 case S2MU106_FLED_MODE_FLASH
:
448 s2mu106_fled_set_flash_curr(fled
, chan
, curr
);
455 s2mu106_fled_test_read(fled
);
461 int s2mu106_fled_get_curr(int chan
, enum cam_flash_mode cam_mode
)
463 struct s2mu106_fled_data
*fled
= g_fled_data
;
467 mode
= s2mu106_mode_change_cam_to_leds(cam_mode
);
470 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
)) {
471 pr_err("%s: Wrong channel.\n", __func__
);
476 case S2MU106_FLED_MODE_TORCH
:
477 curr
= s2mu106_fled_get_torch_curr(fled
, chan
);
479 case S2MU106_FLED_MODE_FLASH
:
480 curr
= s2mu106_fled_get_flash_curr(fled
, chan
);
487 s2mu106_fled_test_read(fled
);
493 static ssize_t
fled_flash_curr_show(struct device
*dev
,
494 struct device_attribute
*attr
, char *buf
)
496 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
497 struct s2mu106_fled_data
*fled
=
498 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
502 char str
[1016] = {0,};
505 for (i
= 1; i
<= S2MU106_CH_MAX
; i
++) {
506 curr
= s2mu106_fled_get_flash_curr(fled
, i
);
507 pr_info("%s: channel: %d, curr: %dmA\n", __func__
, i
, curr
);
509 cnt
+= sprintf(str
+strlen(str
), "CH%02d: %dmA, ", i
, curr
);
512 cnt
+= sprintf(str
+strlen(str
), "\n");
519 static ssize_t
fled_flash_curr_store(struct device
*dev
,
520 struct device_attribute
*attr
, const char *buf
, size_t size
)
522 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
523 struct s2mu106_fled_data
*fled
=
524 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
528 sscanf(buf
, "%d %d", &chan
, &curr
);
531 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
)) {
532 pr_err("%s: Wrong channel.\n", __func__
);
537 s2mu106_fled_set_flash_curr(fled
, chan
, curr
);
541 s2mu106_fled_test_read(fled
);
548 static ssize_t
fled_torch_curr_show(struct device
*dev
,
549 struct device_attribute
*attr
, char *buf
)
551 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
552 struct s2mu106_fled_data
*fled
=
553 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
557 char str
[1016] = {0,};
560 for (i
= 1; i
<= S2MU106_CH_MAX
; i
++) {
561 curr
= s2mu106_fled_get_torch_curr(fled
, i
);
562 pr_info("%s: channel: %d, curr: %dmA\n", __func__
, i
, curr
);
564 cnt
+= sprintf(str
+strlen(str
), "CH%02d: %dmA, ", i
, curr
);
567 cnt
+= sprintf(str
+strlen(str
), "\n");
574 static ssize_t
fled_torch_curr_store(struct device
*dev
,
575 struct device_attribute
*attr
, const char *buf
, size_t size
)
577 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
578 struct s2mu106_fled_data
*fled
=
579 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
583 sscanf(buf
, "%d %d", &chan
, &curr
);
586 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
)) {
587 pr_err("%s: Wrong channel.\n", __func__
);
592 s2mu106_fled_set_torch_curr(fled
, chan
, curr
);
596 s2mu106_fled_test_read(fled
);
602 static ssize_t
fled_mode_show(struct device
*dev
,
603 struct device_attribute
*attr
, char *buf
)
605 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
606 struct s2mu106_fled_data
*fled
=
607 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
611 char str
[1016] = {0,};
614 s2mu106_fled_test_read(fled
);
617 for (i
= 1; i
<= S2MU106_CH_MAX
; i
++) {
618 mode
= s2mu106_fled_get_mode(fled
, i
);
620 cnt
+= sprintf(str
+strlen(str
), "CH%02d: %s, ", i
,
621 s2mu106_fled_mode_string
[mode
]);
624 cnt
+= sprintf(str
+strlen(str
), "\n");
631 static ssize_t
fled_mode_store(struct device
*dev
,
632 struct device_attribute
*attr
, const char *buf
, size_t size
)
634 struct led_classdev
*led_cdev
= dev_get_drvdata(dev
);
635 struct s2mu106_fled_data
*fled
=
636 container_of(led_cdev
, struct s2mu106_fled_data
, cdev
);
640 sscanf(buf
, "%d %d", &chan
, &mode
);
642 if ((chan
<= 0) || (chan
> S2MU106_CH_MAX
) ||
643 (mode
< 0) || (mode
>= S2MU106_FLED_MODE_MAX
)) {
644 pr_err("%s: channel: %d, mode: %d\n", __func__
, chan
, mode
);
645 pr_err("%s: Wrong channel or mode.\n", __func__
);
649 s2mu106_fled_set_mode(fled
, chan
, mode
);
651 s2mu106_fled_test_read(fled
);
657 static DEVICE_ATTR(fled_mode
, 0644, fled_mode_show
, fled_mode_store
);
658 static DEVICE_ATTR(fled_flash_curr
, 0644, fled_flash_curr_show
, fled_flash_curr_store
);
659 static DEVICE_ATTR(fled_torch_curr
, 0644, fled_torch_curr_show
, fled_torch_curr_store
);
661 static struct attribute
*s2mu106_fled_attrs
[] = {
662 &dev_attr_fled_mode
.attr
,
663 &dev_attr_fled_flash_curr
.attr
,
664 &dev_attr_fled_torch_curr
.attr
,
667 ATTRIBUTE_GROUPS(s2mu106_fled
);
669 static void s2mu106_fled_init(struct s2mu106_fled_data
*fled
)
672 struct i2c_client
*i2c
= fled
->i2c
;
675 pr_info("%s: s2mu106_fled init start\n", __func__
);
677 for (i
= 1; i
<= S2MU106_CH_MAX
; i
++) {
678 s2mu106_fled_set_flash_curr(fled
, i
, fled
->pdata
->default_current
);
679 s2mu106_fled_set_torch_curr(fled
, i
, fled
->pdata
->default_current
);
681 s2mu106_write_reg(i2c
, 0xDF, 0x28);
683 s2mu106_read_reg(i2c
, S2MU106_FLED_PMIC_ID
, &data
);
684 fled
->rev_id
= data
& S2MU106_FLED_REV_NO
;
685 pr_info("%s: PMIC_ID = 0x%02x, Rev. No. = %d\n", __func__
,
688 if (fled
->rev_id
>= 1) {
689 /* Set Auto source change for flash mode boosting
690 * VBUS_DET(0x66[5] = 1), T_VBUS_DET_MASK_B(0x67[6] = 1)
692 s2mu106_update_reg(i2c
, 0x66, 1 << 5, 1 << 5);
693 s2mu106_update_reg(i2c
, 0x67, 1 << 6, 1 << 6);
697 s2mu106_fled_test_read(fled
);
701 #if defined(CONFIG_OF)
702 static int s2mu106_led_dt_parse_pdata(struct device
*dev
,
703 struct s2mu106_fled_platform_data
*pdata
)
705 struct device_node
*led_np
, *np
, *c_np
;
710 led_np
= dev
->parent
->of_node
;
713 pr_err("<%s> could not find led sub-node led_np\n", __func__
);
717 np
= of_find_node_by_name(led_np
, "flash_led");
719 pr_err("%s : could not find led sub-node np\n", __func__
);
723 ret
= of_property_read_u32(np
, "default_current",
724 &pdata
->default_current
);
726 pr_err("%s : could not find default_current\n", __func__
);
728 ret
= of_property_read_u32(np
, "max_current",
729 &pdata
->max_current
);
731 pr_err("%s : could not find max_current\n", __func__
);
733 ret
= of_property_read_u32(np
, "default_timer",
734 &pdata
->default_timer
);
736 pr_err("%s : could not find default_timer\n", __func__
);
740 ret
= pdata
->fled
-en1
-pin
= of_get_named_gpio(np
, "fled-en1-gpio", 0);
742 pr_err("%s : can't get fled-en1-pin\n", __func__
);
746 ret
= pdata
->fled
-en2
-pin
= of_get_named_gpio(np
, "fled-en2-gpio", 0);
748 pr_err("%s : can't get fled-en2-pin\n", __func__
);
752 ret
= pdata
->fled
-en3
-pin
= of_get_named_gpio(np
, "fled-en3-gpio", 0);
754 pr_err("%s : can't get fled-en3-pin\n", __func__
);
758 ret
= pdata
->fled
-en4
-pin
= of_get_named_gpio(np
, "fled-en4-gpio", 0);
760 pr_err("%s : can't get fled-en4-pin\n", __func__
);
765 pdata
->chan_num
= of_get_child_count(np
);
767 if (pdata
->chan_num
> S2MU106_CH_MAX
)
768 pdata
->chan_num
= S2MU106_CH_MAX
;
770 pdata
->channel
= devm_kzalloc(dev
,
771 sizeof(struct s2mu106_fled_chan
) * pdata
->chan_num
, GFP_KERNEL
);
773 for_each_child_of_node(np
, c_np
) {
774 ret
= of_property_read_u32(c_np
, "id", &temp
);
779 pr_info("%s: temp = %d, index = %d\n",
780 __func__
, temp
, index
);
782 if (index
< S2MU106_CH_MAX
) {
783 pdata
->channel
[index
].id
= index
;
785 ret
= of_property_read_u32_index(np
, "current", index
,
786 &pdata
->channel
[index
].curr
);
788 pr_err("%s : could not find current for channel%d\n",
789 __func__
, pdata
->channel
[index
].id
);
790 pdata
->channel
[index
].curr
= pdata
->default_current
;
793 ret
= of_property_read_u32_index(np
, "timer", index
,
794 &pdata
->channel
[index
].timer
);
796 pr_err("%s : could not find timer for channel%d\n",
797 __func__
, pdata
->channel
[index
].id
);
798 pdata
->channel
[index
].timer
= pdata
->default_timer
;
804 pr_err("%s: DT parsing finish. ret = %d\n", __func__
, ret
);
807 #endif /* CONFIG_OF */
809 static int s2mu106_led_probe(struct platform_device
*pdev
)
812 struct s2mu106_dev
*s2mu106
= dev_get_drvdata(pdev
->dev
.parent
);
813 struct s2mu106_fled_data
*fled_data
;
816 pr_info("%s: s2mu106_fled start\n", __func__
);
819 dev_err(&pdev
->dev
, "drvdata->dev.parent not supplied\n");
823 fled_data
= devm_kzalloc(&pdev
->dev
,
824 sizeof(struct s2mu106_fled_data
), GFP_KERNEL
);
826 pr_err("%s: failed to allocate driver data\n", __func__
);
830 fled_data
->dev
= &pdev
->dev
;
831 fled_data
->i2c
= s2mu106
->i2c
;
832 fled_data
->pdata
= devm_kzalloc(&pdev
->dev
,
833 sizeof(*(fled_data
->pdata
)), GFP_KERNEL
);
834 if (!fled_data
->pdata
) {
835 pr_err("%s: failed to allocate platform data\n", __func__
);
839 if (s2mu106
->dev
->of_node
) {
840 ret
= s2mu106_led_dt_parse_pdata(&pdev
->dev
, fled_data
->pdata
);
842 pr_err("%s: not found leds dt! ret=%d\n",
848 platform_set_drvdata(pdev
, fled_data
);
850 s2mu106_fled_init(fled_data
);
852 /* Store fled_data for EXPORT_SYMBOL */
853 g_fled_data
= fled_data
;
855 snprintf(name
, sizeof(name
), "fled-s2mu106");
856 fled_data
->cdev
.name
= name
;
857 fled_data
->cdev
.groups
= s2mu106_fled_groups
;
859 ret
= devm_led_classdev_register(&pdev
->dev
, &fled_data
->cdev
);
861 pr_err("%s: unable to register LED class dev\n", __func__
);
865 pr_info("%s: s2mu106_fled loaded\n", __func__
);
869 static int s2mu106_led_remove(struct platform_device
*pdev
)
874 static void s2mu106_led_shutdown(struct platform_device
*pdev
)
876 struct s2mu106_fled_data
*fled_data
=
877 platform_get_drvdata(pdev
);
880 if (!fled_data
->i2c
) {
881 pr_err("%s: no i2c client\n", __func__
);
885 /* Turn off all leds when power off */
886 pr_info("%s: turn off all leds\n", __func__
);
887 for (chan
= 1; chan
<= S2MU106_CH_MAX
; chan
++)
888 s2mu106_fled_set_mode(fled_data
, chan
, S2MU106_FLED_MODE_OFF
);
891 static struct platform_driver s2mu106_led_driver
= {
893 .name
= "leds-s2mu106",
894 .owner
= THIS_MODULE
,
896 .probe
= s2mu106_led_probe
,
897 .remove
= s2mu106_led_remove
,
898 .shutdown
= s2mu106_led_shutdown
,
901 static int __init
s2mu106_led_driver_init(void)
903 return platform_driver_register(&s2mu106_led_driver
);
905 module_init(s2mu106_led_driver_init
);
907 static void __exit
s2mu106_led_driver_exit(void)
909 platform_driver_unregister(&s2mu106_led_driver
);
911 module_exit(s2mu106_led_driver_exit
);
913 MODULE_AUTHOR("Keunho Hwang <keunho.hwang@samsung.com>");
914 MODULE_DESCRIPTION("SAMSUNG s2mu106 flash LED Driver");
915 MODULE_LICENSE("GPL");