tizen 2.4 release
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / drivers / media / sprd_sensor / power / sensor_power_coreprime3g_ve.c
1 /*\r
2  * Copyright (C) 2012 Spreadtrum Communications Inc.\r
3  *\r
4  * This software is licensed under the terms of the GNU General Public\r
5  * License version 2, as published by the Free Software Foundation, and\r
6  * may be copied, distributed, and modified under those terms.\r
7  *\r
8  * This program is distributed in the hope that it will be useful,\r
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
11  * GNU General Public License for more details.\r
12  */\r
13 #include <linux/module.h>\r
14 #include <linux/kernel.h>\r
15 #include <linux/init.h>\r
16 #include <linux/bitops.h>\r
17 #include <linux/delay.h>\r
18 #include <linux/kernel.h>
19 #include <soc/sprd/hardware.h>\r
20 #include <soc/sprd/board.h>\r
21 #include "../sensor_drv_sprd.h"\r
22
23 static int sensor_s5k4ecgx_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
24 {\r
25         int ret = 0;\r
26 \r
27         printk("sensor_s5k4ecgx_poweron start \n");\r
28 \r
29         /*set default status for main and sub sensor*/\r
30         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select sub sensor(sensor hi255);\r
31         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi255 gpio187\r
32         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi255 gpio238\r
33 \r
34         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor(sensor hi544);\r
35         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi544 gpio188\r
36         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi544 gpio186\r
37         mdelay(1);\r
38 \r
39         /*power on sequence*/\r
40         sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_2800MV);//AF monitor\r
41         mdelay(1);//delay\r
42         sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_1800MV);//IO vdd\r
43         udelay(500);//delay <2ms\r
44         sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_2800MV);//anolog vdd\r
45         udelay(500);//delay >0us\r
46         sensor_k_set_mclk(fd_handle,24);\r
47         mdelay(1);//delay >= 0us\r
48         sensor_k_set_voltage_dvdd(fd_handle,SENSOR_VDD_1200MV);//core vdd       gpio193\r
49         udelay(1000);//delay >= 10us\r
50         sensor_k_set_pd_level(fd_handle,1);//power down gpio188\r
51         udelay(100);//delay > 15us\r
52         sensor_k_set_rst_level(fd_handle,1);//reset gpio 186\r
53         udelay(100);//delay > 60us\r
54         printk("sensor_s5k4ecgx_poweron OK \n");\r
55         return ret;\r
56 }\r
57 \r
58 static int sensor_s5k4ecgx_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
59 {\r
60         int ret = 0;\r
61 \r
62         printk("sensor_s5k4ecgx_poweroff start \n");\r
63 \r
64         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor(sensor hi544);\r
65         udelay(2);//delay 2us > 16MCLK = 16/24 us\r
66         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi544     \r
67         udelay(500);//delay >50us\r
68         sensor_k_set_mclk(fd_handle,0);// disable mclk\r
69         udelay(100);//delay > 0us\r
70         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi544\r
71         udelay(100);//delay > 0us\r
72         sensor_k_set_voltage_avdd(fd_handle,SENSOR_VDD_CLOSED);//close anolog vdd       \r
73         mdelay(5);//delay <10ms\r
74         sensor_k_set_voltage_iovdd(fd_handle,SENSOR_VDD_CLOSED);\r
75         mdelay(2);//delay > 0us\r
76         sensor_k_set_voltage_dvdd(fd_handle,SENSOR_VDD_CLOSED);//close core vdd\r
77         mdelay(1);//delay\r
78         sensor_k_set_voltage_cammot(fd_handle,SENSOR_VDD_CLOSED);//AF monitor\r
79         udelay(10);//delay      \r
80 \r
81         printk("sensor_s5k4ecgx_poweroff OK \n");\r
82         return ret;\r
83 \r
84 }\r
85 \r
86 \r
87 static int sensor_hi255_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
88 {\r
89         int ret = 0;\r
90 \r
91         printk("sensor_sr200pc20_poweron start \n");\r
92 \r
93         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor(sensor hi544);\r
94         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi544\r
95         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi544\r
96         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select main sensor(sensor hi255);\r
97         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi255\r
98         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi255\r
99         udelay(1);\r
100         sensor_k_set_voltage_iovdd(fd_handle,SENSOR_VDD_1800MV);//IO vdd\r
101         udelay(500);//delay < 10ms\r
102         sensor_k_set_voltage_avdd(fd_handle,SENSOR_VDD_2800MV);\r
103         udelay(500);//delay < 10ms\r
104         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);\r
105         sensor_k_set_voltage_dvdd(fd_handle,SENSOR_VDD_1200MV);//core vdd\r
106         mdelay(2);//delay >1ms\r
107         sensor_k_set_voltage_dvdd(fd_handle,SENSOR_VDD_CLOSED);//close core vdd\r
108         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);\r
109         mdelay(5);//delay >1ms\r
110         sensor_k_set_pd_level(fd_handle,1);\r
111         mdelay(2);//delay  > 1ms\r
112         sensor_k_set_mclk(fd_handle,24);\r
113         mdelay(35);//delay 30ms >= 30ms\r
114         sensor_k_set_rst_level(fd_handle,1);\r
115         udelay(2);//delay 2us > 16MCLK = 16/24 us\r
116         \r
117         printk("sr200pc20_poweron OK \n");\r
118 \r
119         return ret;\r
120 }\r
121 \r
122 static int sensor_hi255_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
123 {\r
124         int ret = 0;\r
125 \r
126         printk("sensor_sr200pc20_poweroff start \n");   \r
127 \r
128         sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select main sensor(sensor hi255);\r
129         udelay(50);//delay 2us > 16MCLK = 16/24 us\r
130         sensor_k_set_rst_level(fd_handle,0);//reset valid for hi255     \r
131         udelay(50);//delay 2us > 16MCLK = 16/24 us\r
132         sensor_k_set_mclk(fd_handle,0);// disable mclk\r
133         udelay(10);//delay > 0us\r
134         sensor_k_set_pd_level(fd_handle,0);//power down valid for hi255\r
135         udelay(500);//delay > 0us\r
136         sensor_k_set_voltage_avdd(fd_handle,SENSOR_VDD_CLOSED);\r
137         mdelay(5);//delay <10ms\r
138         sensor_k_set_voltage_iovdd(fd_handle,SENSOR_VDD_CLOSED);\r
139         udelay(1);\r
140         printk("sr200pc20_poweroff OK \n");\r
141 \r
142         return ret;\r
143 }\r
144 \r
145 int sensor_power_on(uint32_t *fd_handle, uint32_t sensor_id, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
146 {\r
147         int ret = 0;\r
148 \r
149         if (SENSOR_DEV_0 == sensor_id) {\r
150                 ret = sensor_s5k4ecgx_poweron(fd_handle, dev0, dev1, dev2);\r
151         } else if (SENSOR_DEV_1 == sensor_id) {\r
152                 ret = sensor_hi255_poweron(fd_handle, dev0, dev1, dev2);\r
153         }\r
154         return ret;\r
155 }\r
156 \r
157 int sensor_power_off(uint32_t *fd_handle, uint32_t sensor_id, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)\r
158 {\r
159         int ret = 0;\r
160 \r
161         if (SENSOR_DEV_0 == sensor_id) {\r
162                 ret = sensor_s5k4ecgx_poweroff(fd_handle, dev0, dev1, dev2);\r
163         } else if (SENSOR_DEV_1 == sensor_id) {\r
164                 ret = sensor_hi255_poweroff(fd_handle, dev0, dev1, dev2);\r
165         }\r
166 \r
167         return ret;\r
168 }\r