camsys_drv: v0.0x1f.0
[firefly-linux-kernel-4.4.55.git] / drivers / media / video / rk_camsys / ext_flashled_drv / rk_ext_fshled_ctl.c
1 #include "rk_ext_fshled_ctl.h"
2 #include "../camsys_gpio.h"
3 #include "flashlight.h"
4 #include "leds-rt8547.h"
5
6 typedef struct ext_fsh_info_s{
7     struct      platform_device pdev;
8     char*       dev_model;    
9     struct      list_head         list;
10 }ext_fsh_info_t;
11
12 struct ext_fsh_dev_list_s{
13     struct list_head         dev_list;
14 };
15
16 static struct ext_fsh_dev_list_s g_ext_fsh_devs;
17
18 int camsys_init_ext_fsh_module()
19 {
20     camsys_trace(1,"init external flash module");
21     INIT_LIST_HEAD(&g_ext_fsh_devs.dev_list);
22     return 0;
23 }
24
25 int camsys_deinit_ext_fsh_module()
26 {
27     ext_fsh_info_t* cur_fsh_info = NULL;
28     camsys_trace(1,"deinit external flash module");
29     if (!list_empty(&g_ext_fsh_devs.dev_list)) {
30         list_for_each_entry(cur_fsh_info, &g_ext_fsh_devs.dev_list, list) {
31             if (cur_fsh_info) {
32                 platform_device_unregister(&cur_fsh_info->pdev);
33                 list_del_init(&cur_fsh_info->list);
34                 /* free after unregister device ?*/
35                 kfree(cur_fsh_info->pdev.dev.platform_data);
36                 kfree(cur_fsh_info);
37                 cur_fsh_info = NULL;
38             }
39         }
40     }
41     
42     INIT_LIST_HEAD(&g_ext_fsh_devs.dev_list);
43     return 0;
44 }
45 void* camsys_register_ext_fsh_dev(camsys_flash_info_t *fsh_info)
46 {
47     ext_fsh_info_t* new_dev = NULL;
48     if(strcmp(fsh_info->fl_drv_name,"rt8547") == 0){
49         struct rt8547_platform_data* new_rt_dev = NULL;
50         new_dev = kzalloc(sizeof(ext_fsh_info_t),GFP_KERNEL);
51         if(!new_dev){
52             camsys_err("register new ext flash dev erro !");
53             goto fail0;
54         }
55         
56         new_rt_dev = kzalloc(sizeof(ext_fsh_info_t),GFP_KERNEL);
57         if(!new_rt_dev){
58             camsys_err("register new ext flash dev erro !");
59             goto fail1;
60         }
61
62         new_dev->pdev.id = -1;
63         new_dev->pdev.name = fsh_info->fl_drv_name;
64         new_dev->pdev.dev.platform_data = (void*)new_rt_dev;
65         new_dev->dev_model = "rt-flash-led";
66
67         new_rt_dev->flen_gpio = camsys_gpio_get(fsh_info->fl_en.name);
68         new_rt_dev->flen_active = fsh_info->fl_en.active;
69         camsys_trace(1,"flen name :%s,gpio %d,active %d \n",fsh_info->fl_en.name,new_rt_dev->flen_gpio,new_rt_dev->flen_active);
70         new_rt_dev->flset_gpio = camsys_gpio_get(fsh_info->fl.name );
71         new_rt_dev->flset_active = fsh_info->fl.active;
72         camsys_trace(1,"flset name :%s, gpio %d, active %d \n",fsh_info->fl.name,new_rt_dev->flset_gpio,new_rt_dev->flset_active);
73         new_rt_dev->ctl_gpio   = -1;
74         new_rt_dev->def_lvp = RT8547_LVP_3V;
75             new_rt_dev->def_tol = RT8547_TOL_100mA;
76
77     //    new_rt_dev->def_lvp = RT8547_LVP_MAX;
78         //    new_rt_dev->def_tol = RT8547_TOL_MAX;
79
80         if(platform_device_register(&new_dev->pdev) < 0){
81                 camsys_err("register rtfled fail\n");
82                 kfree(new_rt_dev);
83                 goto fail1;
84         }
85
86         list_add_tail(&new_dev->list, &g_ext_fsh_devs.dev_list);
87         camsys_trace(1,"register new rt led dev success !");
88     }
89     
90     return (void*)new_dev;
91 fail1:
92     if(new_dev)
93         kfree(new_dev);
94 fail0:
95     return NULL;
96 }
97
98 int camsys_deregister_ext_fsh_dev(void* dev)
99 {
100     ext_fsh_info_t* cur_fsh_info = NULL;
101     if (!list_empty(&g_ext_fsh_devs.dev_list)) {
102         list_for_each_entry(cur_fsh_info, &g_ext_fsh_devs.dev_list, list) {
103             if (dev == cur_fsh_info) {
104                 camsys_trace(1,"unregister  ext flsh dev !");
105                 platform_device_unregister(&cur_fsh_info->pdev);
106                 list_del_init(&cur_fsh_info->list);
107                 /* free after unregister device ?*/
108                 kfree(cur_fsh_info->pdev.dev.platform_data);
109                 kfree(cur_fsh_info);
110             }
111         }
112     }
113     return 0;
114 }
115
116 /*******************************
117 mode:
118     0:  CAM_ENGINE_FLASH_OFF = 0x00,
119     1:  CAM_ENGINE_FLASH_AUTO = 0x01,
120     2:  CAM_ENGINE_FLASH_ON = 0x02,
121     3:  CAM_ENGINE_FLASH_RED_EYE = 0x03,
122     5:  CAM_ENGINE_FLASH_TORCH = 0x05
123 ********************************/
124 int camsys_ext_fsh_ctrl(void* dev,int mode,unsigned int on)
125 {
126     ext_fsh_info_t* cur_fsh_info = NULL;
127     struct flashlight_device *fled_dev = NULL;
128     if (!list_empty(&g_ext_fsh_devs.dev_list)) {
129         list_for_each_entry(cur_fsh_info, &g_ext_fsh_devs.dev_list, list) {
130             if (dev == cur_fsh_info) {
131             break;
132             }
133         }
134     }
135     if(cur_fsh_info == NULL){
136                 camsys_err("this flash dev have not been registered !");
137         return -1;
138     }
139
140     fled_dev = find_flashlight_by_name(cur_fsh_info->dev_model);
141         if(fled_dev == NULL){
142                 camsys_err("--find_flashlight_by_name return NULL!--");
143                 return -1;
144         }
145     switch(mode){
146         case 0: /* off */
147            /* set flashlight mode to Off */
148             flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_OFF);
149             break;
150         case 2: /* flash on */
151            /* set strobe timeout to 256ms */
152            //flashlight_set_strobe_timeout(fled_dev, 256, 256);
153            flashlight_set_strobe_timeout(fled_dev, 512, 512);
154            /* set strobe brightness to to index 18 (1A), refer to the datasheet for the others */
155            flashlight_set_strobe_brightness(fled_dev, 18);
156            /* set flashlight mode to Strobe */
157            flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_FLASH);
158            flashlight_strobe(fled_dev);
159             break;
160         case 5: /* torch */
161             /* set the torch brightness index 2 (75mA), refer to the datasheet for index current value. */
162             flashlight_set_torch_brightness(fled_dev, 2);
163             /* set flashlight mode to Torch */
164             flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_TORCH);
165             break;
166         default:
167                 camsys_err("not support this mode %d !",mode);
168     }
169
170     return 0;
171 }
172