summaryrefslogtreecommitdiff
path: root/drivers/media/sprd_sensor/power/sensor_power_sharkls_z3lte.c
blob: e7d2010cffc3ec04a519ffe1b786d828c199eba3 (plain)
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/*
 * 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 <video/sensor_drv_k.h>
#include "../sensor_drv_sprd.h"

static int sensor_s5k4ecgx_poweron(uint32_t *fd_handle, struct sensor_power *dev0, struct sensor_power *dev1, struct sensor_power *dev2)
{
	int ret = 0;

	/*set default status for main and sub sensor*/
	sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select sub sensor(sensor hi255);
	sensor_k_set_pd_level(fd_handle, 0);//power down valid for hi255
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi255

	sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);//select main sensor(sensor hi544);
	sensor_k_set_pd_level(fd_handle, 0);//power down valid for hi544
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi544
	mdelay(1);

	/*power on sequence*/
	sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_2800MV);//AF monitor
	mdelay(1);//delay
	sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_1800MV);//IO vdd
	udelay(500);//delay >2ms
	sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_2800MV);//anolog vdd
	udelay(1000);//delay > 0us
	sensor_k_set_mclk(fd_handle, 24);
	udelay(500);//delay > 0us
	sensor_k_set_voltage_dvdd(fd_handle, SENSOR_VDD_1200MV);//core vdd
	udelay(1000);//delay >= 10us
	sensor_k_set_pd_level(fd_handle, 1);//power down
	udelay(30);//delay >= 15us
	sensor_k_set_rst_level(fd_handle, 1);//reset
	udelay(100);//delay > 60us
	printk("sensor_s5k4ecgx_poweron OK \n");
	return ret;
}

static int sensor_s5k4ecgx_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(sensor hi544);
	udelay(2);//delay 2us > 16MCLK = 16/24 us
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi544
	udelay(100);//delay >50us
	sensor_k_set_mclk(fd_handle, 0);// disable mclk
	udelay(100);//delay >= 0us
	sensor_k_set_pd_level(fd_handle, 0);//power down valid for hi544
	udelay(100);//delay < 10ms
	sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_CLOSED);
	udelay(10);//delay < 10ms
	sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_CLOSED);//close anolog vdd
	mdelay(5);//delay >= 0us
	sensor_k_set_voltage_dvdd(fd_handle, SENSOR_VDD_CLOSED);//close core vdd
	mdelay(1);//delay
	sensor_k_set_voltage_cammot(fd_handle, SENSOR_VDD_CLOSED);//AF monitor
	udelay(10);//delay

	printk("sensor_s5k4ecgx_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 main sensor(sensor hi544);
	sensor_k_set_pd_level(fd_handle, 0);//power down valid for hi544
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi544
	sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);//select main sensor(sensor hi255);
	sensor_k_set_pd_level(fd_handle, 0);//power down valid for hi255
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi255
	udelay(1);
	sensor_k_set_voltage_iovdd(fd_handle, SENSOR_VDD_1800MV);//IO vdd
	udelay(10);//delay 6ms < 10ms
	sensor_k_set_voltage_avdd(fd_handle, SENSOR_VDD_2800MV);
	udelay(10);
	sensor_k_sensor_sel(fd_handle, SENSOR_DEV_0);
	sensor_k_set_voltage_dvdd(fd_handle, SENSOR_VDD_1200MV);//core vdd
	mdelay(2);
	sensor_k_set_voltage_dvdd(fd_handle, SENSOR_VDD_CLOSED);//close core vdd
	sensor_k_sensor_sel(fd_handle, SENSOR_DEV_1);
	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(31);//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(sensor hi255);
	udelay(2);//delay 2us > 16MCLK = 16/24 us
	sensor_k_set_rst_level(fd_handle, 0);//reset valid for hi255
	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 valid for hi255
	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_s5k4ecgx_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_s5k4ecgx_poweroff(fd_handle, dev0, dev1, dev2);
	} else if (SENSOR_DEV_1 == sensor_id) {
		ret = sensor_hi255_poweroff(fd_handle, dev0, dev1, dev2);
	}

	return ret;
}