xref: /OK3568_Linux_fs/kernel/drivers/input/sensors/sensor-i2c.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* drivers/input/sensors/sensor-i2c.c - sensor i2c handle
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (C) 2012-2015 ROCKCHIP.
4*4882a593Smuzhiyun  * Author: luowei <lw@rock-chips.com>
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * This software is licensed under the terms of the GNU General Public
7*4882a593Smuzhiyun  * License version 2, as published by the Free Software Foundation, and
8*4882a593Smuzhiyun  * may be copied, distributed, and modified under those terms.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
11*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13*4882a593Smuzhiyun  * GNU General Public License for more details.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun #include <linux/interrupt.h>
17*4882a593Smuzhiyun #include <linux/i2c.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun #include <linux/irq.h>
20*4882a593Smuzhiyun #include <linux/miscdevice.h>
21*4882a593Smuzhiyun #include <linux/gpio.h>
22*4882a593Smuzhiyun #include <linux/uaccess.h>
23*4882a593Smuzhiyun #include <asm/atomic.h>
24*4882a593Smuzhiyun #include <linux/delay.h>
25*4882a593Smuzhiyun #include <linux/input.h>
26*4882a593Smuzhiyun #include <linux/workqueue.h>
27*4882a593Smuzhiyun #include <linux/freezer.h>
28*4882a593Smuzhiyun #include <linux/of_gpio.h>
29*4882a593Smuzhiyun #ifdef CONFIG_HAS_EARLYSUSPEND
30*4882a593Smuzhiyun #include <linux/earlysuspend.h>
31*4882a593Smuzhiyun #endif
32*4882a593Smuzhiyun #include <linux/sensor-dev.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #define SENSOR_I2C_RATE 200*1000
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 
sensor_i2c_write(struct i2c_adapter * i2c_adap,unsigned char address,unsigned int len,unsigned char const * data)37*4882a593Smuzhiyun static int sensor_i2c_write(struct i2c_adapter *i2c_adap,
38*4882a593Smuzhiyun 			    unsigned char address,
39*4882a593Smuzhiyun 			    unsigned int len, unsigned char const *data)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	struct i2c_msg msgs[1];
42*4882a593Smuzhiyun 	int res;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	if (!data || !i2c_adap) {
45*4882a593Smuzhiyun 		printk("%s:line=%d,error\n",__func__,__LINE__);
46*4882a593Smuzhiyun 		return -EINVAL;
47*4882a593Smuzhiyun 	}
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	msgs[0].addr = address;
50*4882a593Smuzhiyun 	msgs[0].flags = 0;	/* write */
51*4882a593Smuzhiyun 	msgs[0].buf = (unsigned char *)data;
52*4882a593Smuzhiyun 	msgs[0].len = len;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun 	res = i2c_transfer(i2c_adap, msgs, 1);
55*4882a593Smuzhiyun 	if (res == 1)
56*4882a593Smuzhiyun 		return 0;
57*4882a593Smuzhiyun 	else if(res == 0)
58*4882a593Smuzhiyun 		return -EBUSY;
59*4882a593Smuzhiyun 	else
60*4882a593Smuzhiyun 		return res;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun }
63*4882a593Smuzhiyun 
senosr_i2c_read(struct i2c_adapter * i2c_adap,unsigned char address,unsigned char reg,unsigned int len,unsigned char * data)64*4882a593Smuzhiyun static int senosr_i2c_read(struct i2c_adapter *i2c_adap,
65*4882a593Smuzhiyun 			   unsigned char address, unsigned char reg,
66*4882a593Smuzhiyun 			   unsigned int len, unsigned char *data)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	struct i2c_msg msgs[2];
69*4882a593Smuzhiyun 	int res;
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	if (!data || !i2c_adap) {
72*4882a593Smuzhiyun 		printk("%s:line=%d,error\n",__func__,__LINE__);
73*4882a593Smuzhiyun 		return -EINVAL;
74*4882a593Smuzhiyun 	}
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	msgs[0].addr = address;
77*4882a593Smuzhiyun 	msgs[0].flags = 0;	/* write */
78*4882a593Smuzhiyun 	msgs[0].buf = &reg;
79*4882a593Smuzhiyun 	msgs[0].len = 1;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	msgs[1].addr = address;
82*4882a593Smuzhiyun 	msgs[1].flags = I2C_M_RD;
83*4882a593Smuzhiyun 	msgs[1].buf = data;
84*4882a593Smuzhiyun 	msgs[1].len = len;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	res = i2c_transfer(i2c_adap, msgs, 2);
87*4882a593Smuzhiyun 	if (res == 2)
88*4882a593Smuzhiyun 		return 0;
89*4882a593Smuzhiyun 	else if(res == 0)
90*4882a593Smuzhiyun 		return -EBUSY;
91*4882a593Smuzhiyun 	else
92*4882a593Smuzhiyun 		return res;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 
sensor_rx_data(struct i2c_client * client,char * rxData,int length)97*4882a593Smuzhiyun int sensor_rx_data(struct i2c_client *client, char *rxData, int length)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	//struct sensor_private_data* sensor =
100*4882a593Smuzhiyun 	//	(struct sensor_private_data *)i2c_get_clientdata(client);
101*4882a593Smuzhiyun 	int i = 0;
102*4882a593Smuzhiyun 	int ret = 0;
103*4882a593Smuzhiyun 	char reg = rxData[0];
104*4882a593Smuzhiyun 	ret = senosr_i2c_read(client->adapter, client->addr, reg, length, rxData);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	DBG("addr=0x%x,len=%d,rxdata:",reg,length);
107*4882a593Smuzhiyun 	for(i=0; i<length; i++)
108*4882a593Smuzhiyun 		DBG("0x%x,",rxData[i]);
109*4882a593Smuzhiyun 	DBG("\n");
110*4882a593Smuzhiyun 	return ret;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_rx_data);
113*4882a593Smuzhiyun 
sensor_tx_data(struct i2c_client * client,char * txData,int length)114*4882a593Smuzhiyun int sensor_tx_data(struct i2c_client *client, char *txData, int length)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	//struct sensor_private_data* sensor =
117*4882a593Smuzhiyun 		//(struct sensor_private_data *)i2c_get_clientdata(client);
118*4882a593Smuzhiyun 	int i = 0;
119*4882a593Smuzhiyun 	int ret = 0;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	DBG("addr=0x%x,len=%d,txdata:",txData[0],length);
122*4882a593Smuzhiyun 	for(i=1; i<length; i++)
123*4882a593Smuzhiyun 		DBG("0x%x,",txData[i]);
124*4882a593Smuzhiyun 	DBG("\n");
125*4882a593Smuzhiyun 	ret = sensor_i2c_write(client->adapter, client->addr, length, txData);
126*4882a593Smuzhiyun 	return ret;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_tx_data);
130*4882a593Smuzhiyun 
sensor_write_reg(struct i2c_client * client,int addr,int value)131*4882a593Smuzhiyun int sensor_write_reg(struct i2c_client *client, int addr, int value)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun 	char buffer[2];
134*4882a593Smuzhiyun 	int ret = 0;
135*4882a593Smuzhiyun 	struct sensor_private_data* sensor =
136*4882a593Smuzhiyun 		(struct sensor_private_data *)i2c_get_clientdata(client);
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun 	mutex_lock(&sensor->i2c_mutex);
139*4882a593Smuzhiyun 	buffer[0] = addr;
140*4882a593Smuzhiyun 	buffer[1] = value;
141*4882a593Smuzhiyun 	ret = sensor_tx_data(client, &buffer[0], 2);
142*4882a593Smuzhiyun 	mutex_unlock(&sensor->i2c_mutex);
143*4882a593Smuzhiyun 	return ret;
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_write_reg);
146*4882a593Smuzhiyun 
sensor_read_reg(struct i2c_client * client,int addr)147*4882a593Smuzhiyun int sensor_read_reg(struct i2c_client *client, int addr)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	char tmp[1] = {0};
150*4882a593Smuzhiyun 	int ret = 0;
151*4882a593Smuzhiyun 	struct sensor_private_data* sensor =
152*4882a593Smuzhiyun 		(struct sensor_private_data *)i2c_get_clientdata(client);
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	mutex_lock(&sensor->i2c_mutex);
155*4882a593Smuzhiyun 	tmp[0] = addr;
156*4882a593Smuzhiyun 	ret = sensor_rx_data(client, tmp, 1);
157*4882a593Smuzhiyun 	mutex_unlock(&sensor->i2c_mutex);
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun 	return tmp[0];
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_read_reg);
163*4882a593Smuzhiyun 
i2c_master_normal_recv(const struct i2c_client * client,char * buf,int count,int scl_rate)164*4882a593Smuzhiyun static int i2c_master_normal_recv(const struct i2c_client *client, char *buf, int count, int scl_rate)
165*4882a593Smuzhiyun  {
166*4882a593Smuzhiyun      struct i2c_adapter *adap=client->adapter;
167*4882a593Smuzhiyun      struct i2c_msg msg;
168*4882a593Smuzhiyun     int ret;
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun     msg.addr = client->addr;
171*4882a593Smuzhiyun     msg.flags = client->flags | I2C_M_RD;
172*4882a593Smuzhiyun 	msg.len = count;
173*4882a593Smuzhiyun 	msg.buf = (char *)buf;
174*4882a593Smuzhiyun 	ret = i2c_transfer(adap, &msg, 1);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 		 return (ret == 1) ? count : ret;
177*4882a593Smuzhiyun }
178*4882a593Smuzhiyun 
i2c_master_normal_send(const struct i2c_client * client,const char * buf,int count,int scl_rate)179*4882a593Smuzhiyun static int i2c_master_normal_send(const struct i2c_client *client, const char *buf, int count, int scl_rate)
180*4882a593Smuzhiyun {
181*4882a593Smuzhiyun 	int ret;
182*4882a593Smuzhiyun 	struct i2c_adapter *adap=client->adapter;
183*4882a593Smuzhiyun 	struct i2c_msg msg;
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 	msg.addr = client->addr;
186*4882a593Smuzhiyun 	msg.flags = client->flags;
187*4882a593Smuzhiyun 	msg.len = count;
188*4882a593Smuzhiyun 	msg.buf = (char *)buf;
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	ret = i2c_transfer(adap, &msg, 1);
191*4882a593Smuzhiyun 	return (ret == 1) ? count : ret;
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
sensor_tx_data_normal(struct i2c_client * client,char * buf,int num)194*4882a593Smuzhiyun int sensor_tx_data_normal(struct i2c_client *client, char *buf, int num)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun 	int ret = 0;
197*4882a593Smuzhiyun 	ret = i2c_master_normal_send(client, buf, num, SENSOR_I2C_RATE);
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	return (ret == num) ? 0 : ret;
200*4882a593Smuzhiyun }
201*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_tx_data_normal);
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 
sensor_rx_data_normal(struct i2c_client * client,char * buf,int num)204*4882a593Smuzhiyun int sensor_rx_data_normal(struct i2c_client *client, char *buf, int num)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	int ret = 0;
207*4882a593Smuzhiyun 	ret = i2c_master_normal_recv(client, buf, num, SENSOR_I2C_RATE);
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	return (ret == num) ? 0 : ret;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_rx_data_normal);
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun 
sensor_write_reg_normal(struct i2c_client * client,char value)215*4882a593Smuzhiyun int sensor_write_reg_normal(struct i2c_client *client, char value)
216*4882a593Smuzhiyun {
217*4882a593Smuzhiyun 	char buffer[2];
218*4882a593Smuzhiyun 	int ret = 0;
219*4882a593Smuzhiyun 	struct sensor_private_data* sensor =
220*4882a593Smuzhiyun 		(struct sensor_private_data *)i2c_get_clientdata(client);
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun 	mutex_lock(&sensor->i2c_mutex);
223*4882a593Smuzhiyun 	buffer[0] = value;
224*4882a593Smuzhiyun 	ret = sensor_tx_data_normal(client, &buffer[0], 1);
225*4882a593Smuzhiyun 	mutex_unlock(&sensor->i2c_mutex);
226*4882a593Smuzhiyun 	return ret;
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_write_reg_normal);
229*4882a593Smuzhiyun 
sensor_read_reg_normal(struct i2c_client * client)230*4882a593Smuzhiyun int sensor_read_reg_normal(struct i2c_client *client)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	char tmp[1] = {0};
233*4882a593Smuzhiyun 	int ret = 0;
234*4882a593Smuzhiyun 	struct sensor_private_data* sensor =
235*4882a593Smuzhiyun 		(struct sensor_private_data *)i2c_get_clientdata(client);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	mutex_lock(&sensor->i2c_mutex);
238*4882a593Smuzhiyun 	ret = sensor_rx_data_normal(client, tmp, 1);
239*4882a593Smuzhiyun 	mutex_unlock(&sensor->i2c_mutex);
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun 	return tmp[0];
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun EXPORT_SYMBOL(sensor_read_reg_normal);
245*4882a593Smuzhiyun 
246