2 * Copyright (C) 2012 Spreadtrum Communications Inc.
\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
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
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
23 static int sensor_s5k4ecgx_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
\r
27 printk("sensor_s5k4ecgx_poweron start \n");
\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
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
39 /*power on sequence*/
\r
40 sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_2800MV);//AF monitor
\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
58 static int sensor_s5k4ecgx_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
\r
62 printk("sensor_s5k4ecgx_poweroff start \n");
\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
78 sensor_k_set_voltage_cammot(fd_handle,SENSOR_VDD_CLOSED);//AF monitor
\r
81 printk("sensor_s5k4ecgx_poweroff OK \n");
\r
87 static int sensor_hi255_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
\r
91 printk("sensor_sr200pc20_poweron start \n");
\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
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
117 printk("sr200pc20_poweron OK \n");
\r
122 static int sensor_hi255_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
\r
126 printk("sensor_sr200pc20_poweroff start \n");
\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
140 printk("sr200pc20_poweroff OK \n");
\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
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
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
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