ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[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
46 static void camsys_ext_fsh_release(struct device *dev)
47 {
48 }
49
50 void* camsys_register_ext_fsh_dev(camsys_flash_info_t *fsh_info)
51 {
52     ext_fsh_info_t* new_dev = NULL;
53     if(strcmp(fsh_info->fl_drv_name,"rt8547") == 0){
54         struct rt8547_platform_data* new_rt_dev = NULL;
55         new_dev = kzalloc(sizeof(ext_fsh_info_t),GFP_KERNEL);
56         if(!new_dev){
57             camsys_err("register new ext flash dev erro !");
58             goto fail0;
59         }
60         
61                 new_rt_dev = kzalloc(sizeof(*new_rt_dev), GFP_KERNEL);
62         if(!new_rt_dev){
63             camsys_err("register new ext flash dev erro !");
64             goto fail1;
65         }
66
67         new_dev->pdev.id = -1;
68         new_dev->pdev.name = fsh_info->fl_drv_name;
69                 new_dev->pdev.dev.release = camsys_ext_fsh_release;
70         new_dev->pdev.dev.platform_data = (void*)new_rt_dev;
71         new_dev->dev_model = "rt-flash-led";
72
73         new_rt_dev->flen_gpio = camsys_gpio_get(fsh_info->fl_en.name);
74         new_rt_dev->flen_active = fsh_info->fl_en.active;
75         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);
76         new_rt_dev->flset_gpio = camsys_gpio_get(fsh_info->fl.name );
77         new_rt_dev->flset_active = fsh_info->fl.active;
78         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);
79         new_rt_dev->ctl_gpio   = -1;
80         new_rt_dev->def_lvp = RT8547_LVP_3V;
81             new_rt_dev->def_tol = RT8547_TOL_100mA;
82
83     //    new_rt_dev->def_lvp = RT8547_LVP_MAX;
84         //    new_rt_dev->def_tol = RT8547_TOL_MAX;
85
86         if(platform_device_register(&new_dev->pdev) < 0){
87                 camsys_err("register rtfled fail\n");
88                 kfree(new_rt_dev);
89                 goto fail1;
90         }
91
92         list_add_tail(&new_dev->list, &g_ext_fsh_devs.dev_list);
93         camsys_trace(1,"register new rt led dev success !");
94     }
95     
96     return (void*)new_dev;
97 fail1:
98     if(new_dev)
99         kfree(new_dev);
100 fail0:
101     return NULL;
102 }
103
104 int camsys_deregister_ext_fsh_dev(void* dev)
105 {
106     ext_fsh_info_t* cur_fsh_info = NULL;
107     if (!list_empty(&g_ext_fsh_devs.dev_list)) {
108         list_for_each_entry(cur_fsh_info, &g_ext_fsh_devs.dev_list, list) {
109             if (dev == cur_fsh_info) {
110                 camsys_trace(1,"unregister  ext flsh dev !");
111                 platform_device_unregister(&cur_fsh_info->pdev);
112                 list_del_init(&cur_fsh_info->list);
113                 /* free after unregister device ?*/
114                 kfree(cur_fsh_info->pdev.dev.platform_data);
115                 kfree(cur_fsh_info);
116                                 return 0;
117             }
118         }
119     }
120     return 0;
121 }
122
123 /*******************************
124 mode:
125     0:  CAM_ENGINE_FLASH_OFF = 0x00,
126     1:  CAM_ENGINE_FLASH_AUTO = 0x01,
127     2:  CAM_ENGINE_FLASH_ON = 0x02,
128     3:  CAM_ENGINE_FLASH_RED_EYE = 0x03,
129     5:  CAM_ENGINE_FLASH_TORCH = 0x05
130 ********************************/
131 int camsys_ext_fsh_ctrl(void* dev,int mode,unsigned int on)
132 {
133     ext_fsh_info_t* cur_fsh_info = NULL;
134     struct flashlight_device *fled_dev = NULL;
135     if (!list_empty(&g_ext_fsh_devs.dev_list)) {
136         list_for_each_entry(cur_fsh_info, &g_ext_fsh_devs.dev_list, list) {
137             if (dev == cur_fsh_info) {
138             break;
139             }
140         }
141     }
142     if(cur_fsh_info == NULL){
143                 camsys_err("this flash dev have not been registered !");
144         return -1;
145     }
146
147     fled_dev = find_flashlight_by_name(cur_fsh_info->dev_model);
148         if(fled_dev == NULL){
149                 camsys_err("--find_flashlight_by_name return NULL!--");
150                 return -1;
151         }
152     switch(mode){
153         case 0: /* off */
154            /* set flashlight mode to Off */
155             flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_OFF);
156             break;
157         case 2: /* flash on */
158            /* set strobe timeout to 256ms */
159            //flashlight_set_strobe_timeout(fled_dev, 256, 256);
160            flashlight_set_strobe_timeout(fled_dev, 512, 512);
161            /* set strobe brightness to to index 18 (1A), refer to the datasheet for the others */
162            flashlight_set_strobe_brightness(fled_dev, 18);
163            /* set flashlight mode to Strobe */
164            flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_FLASH);
165            flashlight_strobe(fled_dev);
166             break;
167         case 5: /* torch */
168             /* set the torch brightness index 2 (75mA), refer to the datasheet for index current value. */
169             flashlight_set_torch_brightness(fled_dev, 2);
170             /* set flashlight mode to Torch */
171             flashlight_set_mode(fled_dev, FLASHLIGHT_MODE_TORCH);
172             break;
173         default:
174                 camsys_err("not support this mode %d !",mode);
175     }
176
177     return 0;
178 }
179