1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/*
* Copyright (C) 2012 Spreadtrum Communications Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/bitops.h>
#include <linux/delay.h>
#include <linux/kernel.h>
#include <soc/sprd/hardware.h>
#include <soc/sprd/board.h>
#include "../sensor_drv_sprd.h"
static int sensor_hi544_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select sub sensor
sensor_k_set_pd_level(fd_handle, 0);//power down
sensor_k_set_rst_level(fd_handle, 0);//reset
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor
sensor_k_set_pd_level(fd_handle, 0);//power down
sensor_k_set_rst_level(fd_handle, 0);//reset
udelay(10);
sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_2800MV);
sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_1800MV);
udelay(10);
sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_2800MV);
mdelay(6);//delay 6ms < 10ms
sensor_k_set_pd_level(fd_handle, 1);
mdelay(2);//delay 2ms > 1ms
sensor_k_set_mclk(fd_handle, 24);
mdelay(30);//delay 30ms >= 30ms
sensor_k_set_rst_level(fd_handle, 1);
udelay(2);//delay 2us > 16MCLK = 16/24 us
printk("hi544_poweron OK \n");
return ret;
}
static int sensor_hi544_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor
udelay(2);//delay 2us > 16MCLK = 16/24 us
sensor_k_set_rst_level(fd_handle, 0);//reset
mdelay(10);//delay 2us > 16MCLK = 16/24 us
sensor_k_set_mclk(fd_handle, 0);// disable mclk
udelay(1);//delay 1us > 0ns
sensor_k_set_pd_level(fd_handle, 0);//power down
mdelay(6);//delay 6ms < 10ms
sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_CLOSED);
mdelay(6);//delay 6ms < 10ms
sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_CLOSED);
udelay(1);
sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_CLOSED);
printk("hi544_poweroff OK \n");
return ret;
}
static int sensor_hi255_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select sub sensor
sensor_k_set_pd_level(fd_handle, 0);//power down
sensor_k_set_rst_level(fd_handle, 0);//reset
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select main sensor
sensor_k_set_pd_level(fd_handle, 0);//power down
sensor_k_set_rst_level(fd_handle, 0);//reset
udelay(1);
sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_1800MV);
mdelay(6);//delay 6ms < 10ms
sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_2800MV);
mdelay(6);//delay 6ms < 10ms
sensor_k_set_pd_level(fd_handle, 1);
mdelay(2);//delay 2ms > 1ms
sensor_k_set_mclk(fd_handle, 24);
mdelay(30);//delay 30ms >= 30ms
sensor_k_set_rst_level(fd_handle, 1);
udelay(2);//delay 2us > 16MCLK = 16/24 us
printk("hi255_poweron OK \n");
return ret;
}
static int sensor_hi255_poweroff(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select main sensor
udelay(2);//delay 2us > 16MCLK = 16/24 us
sensor_k_set_rst_level(fd_handle, 0);//reset
udelay(2);//delay 2us > 16MCLK = 16/24 us
sensor_k_set_mclk(fd_handle, 0);// disable mclk
udelay(1);//delay 1us > 0ns
sensor_k_set_pd_level(fd_handle, 0);//power down
mdelay(6);//delay 6ms < 10ms
sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_CLOSED);
//mdelay(6);//delay 6ms < 10ms
sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_CLOSED);
udelay(1);
printk("hi255_poweroff OK \n");
return ret;
}
int sensor_power_on(uint32_t *fd_handle, uint32_t sensor_id, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
if (SENSOR_DEV_0 == sensor_id) {
ret = sensor_hi544_poweron(fd_handle, dev0, dev1, dev2);
} else if (SENSOR_DEV_1 == sensor_id) {
ret = sensor_hi255_poweron(fd_handle, dev0, dev1, dev2);
}
return ret;
}
int sensor_power_off(uint32_t *fd_handle, uint32_t sensor_id, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
int ret = 0;
if (SENSOR_DEV_0 == sensor_id) {
ret = sensor_hi544_poweroff(fd_handle, dev0, dev1, dev2);
} else if (SENSOR_DEV_1 == sensor_id) {
ret = sensor_hi255_poweroff(fd_handle, dev0, dev1, dev2);
}
return ret;
}
|