xref: /OK3568_Linux_fs/kernel/drivers/input/sensors/gyro/ewtsa.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* drivers/input/sensors/gyro/Ewtsa.c
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright (C) 2012-2015 ROCKCHIP.
4*4882a593Smuzhiyun  * Author: zhangaihui <zah@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 /** This define controls compilation of the master device interface */
35*4882a593Smuzhiyun /*#define EWTSA_MASTER_DEVICE*/
36*4882a593Smuzhiyun /* configurable */
37*4882a593Smuzhiyun #define GYRO_MOUNT_SWAP_XY      0   /* swap X, Y */
38*4882a593Smuzhiyun #define GYRO_MOUNT_REVERSE_X    0   /* reverse X */
39*4882a593Smuzhiyun #define GYRO_MOUNT_REVERSE_Y    0   /* reverse Y */
40*4882a593Smuzhiyun #define GYRO_MOUNT_REVERSE_Z    0   /* reverse Z */
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun /* macro defines */
43*4882a593Smuzhiyun /*#define CHIP_ID                 0x68*/
44*4882a593Smuzhiyun #define DEVICE_NAME             "ewtsa"
45*4882a593Smuzhiyun #define EWTSA_ON                1
46*4882a593Smuzhiyun #define EWTSA_OFF               0
47*4882a593Smuzhiyun #define SLEEP_PIN               14
48*4882a593Smuzhiyun #define DRDY_PIN                12
49*4882a593Smuzhiyun #define DIAG_PIN                11
50*4882a593Smuzhiyun #define MAX_VALUE               32768
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun /* ewtsa_delay parameter */
53*4882a593Smuzhiyun #define DELAY_THRES_MIN         1
54*4882a593Smuzhiyun #define DELAY_THRES_1           4
55*4882a593Smuzhiyun #define DELAY_THRES_2           9   /* msec x 90% */
56*4882a593Smuzhiyun #define DELAY_THRES_3           18
57*4882a593Smuzhiyun #define DELAY_THRES_4           45
58*4882a593Smuzhiyun #define DELAY_THRES_5           90
59*4882a593Smuzhiyun #define DELAY_THRES_6           128
60*4882a593Smuzhiyun #define DELAY_THRES_MAX         255
61*4882a593Smuzhiyun #define DELAY_DLPF_2            2
62*4882a593Smuzhiyun #define DELAY_DLPF_3            3
63*4882a593Smuzhiyun #define DELAY_DLPF_4            4
64*4882a593Smuzhiyun #define DELAY_DLPF_5            5
65*4882a593Smuzhiyun #define DELAY_DLPF_6            6
66*4882a593Smuzhiyun #define DELAY_INTMIN_THRES      9
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define DATA_RATE_1             0x01
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /* ewtsa_sleep parameter */
71*4882a593Smuzhiyun #define SLEEP_OFF               0
72*4882a593Smuzhiyun #define SLEEP_ON                1
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* event mode */
75*4882a593Smuzhiyun #define EWTSA_POLLING_MODE    0
76*4882a593Smuzhiyun #define EWTSA_INTERUPT_MODE   1
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /* ewtsa register address */
79*4882a593Smuzhiyun #define REG_SMPL                0x15
80*4882a593Smuzhiyun #define REG_FS_DLPF             0x16
81*4882a593Smuzhiyun #define REG_INT_CFG             0x17
82*4882a593Smuzhiyun #define REG_INT_STATUS          0x1A
83*4882a593Smuzhiyun #define REG_SELF_O_C            0x29
84*4882a593Smuzhiyun #define REG_PWR_MGM             0x3E
85*4882a593Smuzhiyun #define REG_MBURST_ALL          0xFF
86*4882a593Smuzhiyun #define GYRO_DATA_REG            0x1D
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun /* ewtsa register param */
89*4882a593Smuzhiyun #define SELF_O_C_ENABLE         0x00
90*4882a593Smuzhiyun #define SELF_O_C_DISABLE        0x01
91*4882a593Smuzhiyun #define SLEEP_CTRL_ACTIVATE     0x40
92*4882a593Smuzhiyun #define SLEEP_CTRL_SLEEP        0x00
93*4882a593Smuzhiyun #define INT_CFG_INT_ENABLE      0x01
94*4882a593Smuzhiyun #define INT_CFG_INT_DISABLE     0x00
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /* ewtsa interrupt control */
97*4882a593Smuzhiyun #define EWSTA_INT_CLEAR         0x00
98*4882a593Smuzhiyun #define EWSTA_INT_SKIP          0x01
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* wait time(ms)*/
101*4882a593Smuzhiyun #define EWTSA_BOOST_TIME_0      500
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun /* sleep setting range */
104*4882a593Smuzhiyun #define EWTSA_SLP_MIN 0
105*4882a593Smuzhiyun #define EWTSA_SLP_MAX 1
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun /* delay setting range */
108*4882a593Smuzhiyun #define EWTSA_DLY_MIN 1
109*4882a593Smuzhiyun #define EWTSA_DLY_MAX 255
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun /* range setting range */
112*4882a593Smuzhiyun #define EWTSA_RNG_MIN 0
113*4882a593Smuzhiyun #define EWTSA_RNG_MAX 3
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* soc setting range */
116*4882a593Smuzhiyun #define EWTSA_SOC_MIN 0
117*4882a593Smuzhiyun #define EWTSA_SOC_MAX 1
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun /* event setting range */
120*4882a593Smuzhiyun #define EWTSA_EVE_MIN 0
121*4882a593Smuzhiyun #define EWTSA_EVE_MAX 1
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /* init param */
124*4882a593Smuzhiyun #define SLEEP_INIT_VAL       (SLEEP_ON)
125*4882a593Smuzhiyun #define DELAY_INIT_VAL       10
126*4882a593Smuzhiyun #define RANGE_INIT_VAL       2 /*range 1000*/
127*4882a593Smuzhiyun #define DLPF_INIT_VAL        (DELAY_DLPF_2)
128*4882a593Smuzhiyun #define CALIB_FUNC_INIT_VAL  (EWTSA_ON)
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /*config store counter num*/
131*4882a593Smuzhiyun #define CONFIG_COUNTER_MIN (6+9)
132*4882a593Smuzhiyun #define CONFIG_COUNTER_MAX (32+9)
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /*command name */
135*4882a593Smuzhiyun #define COMMAND_NAME_SOC 0
136*4882a593Smuzhiyun #define COMMAND_NAME_DLY 1
137*4882a593Smuzhiyun #define COMMAND_NAME_RNG 2
138*4882a593Smuzhiyun #define COMMAND_NAME_EVE 3
139*4882a593Smuzhiyun #define COMMAND_NAME_SLP 4
140*4882a593Smuzhiyun #define COMMAND_NAME_NUM 5
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define EWTSA_delay  DELAY_INIT_VAL
143*4882a593Smuzhiyun #define EWTSA_range    RANGE_INIT_VAL
144*4882a593Smuzhiyun #define EWTSA_calib    EWTSA_ON
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun /****************operate according to sensor chip:start************/
i2c_read_byte(struct i2c_client * thisClient,unsigned char regAddr,char * pReadData)147*4882a593Smuzhiyun static int i2c_read_byte(struct i2c_client *thisClient, unsigned char regAddr, char *pReadData)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun     int    ret = 0;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun     ret = i2c_master_send( thisClient, (char*)&regAddr, 1);
152*4882a593Smuzhiyun     if(ret < 0)
153*4882a593Smuzhiyun     {
154*4882a593Smuzhiyun         printk("EWTSA send cAddress=0x%x error!\n", regAddr);
155*4882a593Smuzhiyun         return ret;
156*4882a593Smuzhiyun     }
157*4882a593Smuzhiyun     ret = i2c_master_recv( thisClient, (char*)pReadData, 1);
158*4882a593Smuzhiyun     if(ret < 0)
159*4882a593Smuzhiyun     {
160*4882a593Smuzhiyun         printk("EWTSAread *pReadData=0x%x error!\n", *pReadData);
161*4882a593Smuzhiyun         return ret;
162*4882a593Smuzhiyun     }
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     return 1;
165*4882a593Smuzhiyun }
i2c_write_byte(struct i2c_client * thisClient,unsigned char regAddr,unsigned char writeData)166*4882a593Smuzhiyun static int i2c_write_byte(struct i2c_client *thisClient, unsigned char regAddr, unsigned char writeData)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun     char    write_data[2] = {0};
169*4882a593Smuzhiyun     int    ret=0;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     write_data[0] = regAddr;
172*4882a593Smuzhiyun     write_data[1] = writeData;
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun     ret = i2c_master_send(thisClient, write_data, 2);
175*4882a593Smuzhiyun     if (ret < 0)
176*4882a593Smuzhiyun     {
177*4882a593Smuzhiyun         ret = i2c_master_send(thisClient, write_data, 2);
178*4882a593Smuzhiyun         if (ret < 0)
179*4882a593Smuzhiyun 	 {
180*4882a593Smuzhiyun 	     printk("EWTSA send regAddr=0x%x error!\n", regAddr);
181*4882a593Smuzhiyun 	     return ret;
182*4882a593Smuzhiyun         }
183*4882a593Smuzhiyun         return 1;
184*4882a593Smuzhiyun     }
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     return 1;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
ewtsa_system_restart(struct i2c_client * client)189*4882a593Smuzhiyun static int ewtsa_system_restart(struct i2c_client *client)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun     int             err;
192*4882a593Smuzhiyun      char   reg;
193*4882a593Smuzhiyun      char   smpl , dlpf;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun     err = i2c_write_byte(client, ( unsigned char)REG_SELF_O_C, ( unsigned char)SELF_O_C_DISABLE);
196*4882a593Smuzhiyun     if (err < 0) {
197*4882a593Smuzhiyun         return err;
198*4882a593Smuzhiyun     }
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun     ///Set SMPL register
201*4882a593Smuzhiyun         if (EWTSA_delay <= ( unsigned char)DELAY_THRES_2) {
202*4882a593Smuzhiyun             smpl = ( unsigned char)DELAY_INTMIN_THRES;
203*4882a593Smuzhiyun         }else{
204*4882a593Smuzhiyun             smpl = ( unsigned char)(EWTSA_delay - ( unsigned char)1);
205*4882a593Smuzhiyun         }
206*4882a593Smuzhiyun     err = i2c_write_byte(client, ( unsigned char)REG_SMPL, ( unsigned char)smpl);
207*4882a593Smuzhiyun     if (err < 0) {
208*4882a593Smuzhiyun         return err;
209*4882a593Smuzhiyun     }
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun     ///Set DLPF register
212*4882a593Smuzhiyun     if (EWTSA_delay >= ( unsigned char)DELAY_THRES_6){
213*4882a593Smuzhiyun         dlpf = ( unsigned char)DELAY_DLPF_6;
214*4882a593Smuzhiyun     }else if (EWTSA_delay >= ( unsigned char)DELAY_THRES_5) {
215*4882a593Smuzhiyun         dlpf = ( unsigned char)DELAY_DLPF_5;
216*4882a593Smuzhiyun     }else if (EWTSA_delay >= ( unsigned char)DELAY_THRES_4){
217*4882a593Smuzhiyun         dlpf = ( unsigned char)DELAY_DLPF_4;
218*4882a593Smuzhiyun     }else if (EWTSA_delay >= ( unsigned char)DELAY_THRES_3) {
219*4882a593Smuzhiyun         dlpf = ( unsigned char)DELAY_DLPF_3;
220*4882a593Smuzhiyun     }else{
221*4882a593Smuzhiyun         dlpf = ( unsigned char)DELAY_DLPF_2;
222*4882a593Smuzhiyun     }
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun     reg = ( unsigned char)(( unsigned char)(EWTSA_range << 3) | dlpf | ( unsigned char)0x80 ) ;
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun     err = i2c_write_byte(client, REG_FS_DLPF, reg);
227*4882a593Smuzhiyun     if (err < 0) {
228*4882a593Smuzhiyun         return err;
229*4882a593Smuzhiyun     }
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun     if (EWTSA_calib==  EWTSA_ON) {
232*4882a593Smuzhiyun 	printk("EWTSA_set_calibration() start \n");
233*4882a593Smuzhiyun 	err =  i2c_write_byte(client,( unsigned char)REG_SELF_O_C, ( unsigned char)SELF_O_C_ENABLE);
234*4882a593Smuzhiyun 	if (err < 0) {
235*4882a593Smuzhiyun 		return err;
236*4882a593Smuzhiyun 	}
237*4882a593Smuzhiyun 	mdelay(500);
238*4882a593Smuzhiyun 	printk("EWTSA_set_calibration() end \n");
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun     }
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun     return 0;
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun 
ewtsa_disable(struct i2c_client * client)245*4882a593Smuzhiyun static int ewtsa_disable(struct i2c_client *client)
246*4882a593Smuzhiyun {
247*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
248*4882a593Smuzhiyun 	    (struct sensor_private_data *) i2c_get_clientdata(client);
249*4882a593Smuzhiyun 
250*4882a593Smuzhiyun 	gpio_direction_output(sensor->pdata->standby_pin, GPIO_HIGH);
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun 	DBG("%s: end \n",__func__);
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun 	return 0;
255*4882a593Smuzhiyun }
256*4882a593Smuzhiyun 
ewtsa_enable(struct i2c_client * client)257*4882a593Smuzhiyun static int ewtsa_enable(struct i2c_client *client)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun 	int err;
260*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
261*4882a593Smuzhiyun 	    (struct sensor_private_data *) i2c_get_clientdata(client);
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun 	gpio_direction_output(sensor->pdata->standby_pin, GPIO_LOW);
264*4882a593Smuzhiyun 	err = i2c_write_byte(client, ( unsigned char)REG_PWR_MGM, ( unsigned char)SLEEP_CTRL_ACTIVATE);////0x44
265*4882a593Smuzhiyun 	if (err < 0){
266*4882a593Smuzhiyun 		//return err;
267*4882a593Smuzhiyun 		err = ewtsa_system_restart(client);///restart; only when i2c error
268*4882a593Smuzhiyun 		if (err < 0){
269*4882a593Smuzhiyun 			return err;
270*4882a593Smuzhiyun 		}
271*4882a593Smuzhiyun 	}
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	err = i2c_write_byte(client,  ( unsigned char) REG_INT_CFG, ( unsigned char)INT_CFG_INT_ENABLE);
274*4882a593Smuzhiyun 	if (err < 0) {
275*4882a593Smuzhiyun 		return err;
276*4882a593Smuzhiyun 	}
277*4882a593Smuzhiyun 	DBG("%s: end \n",__func__);
278*4882a593Smuzhiyun 	return 0;
279*4882a593Smuzhiyun }
280*4882a593Smuzhiyun 
gyro_dev_reset(struct i2c_client * client)281*4882a593Smuzhiyun void gyro_dev_reset(struct i2c_client *client)
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
284*4882a593Smuzhiyun 	    (struct sensor_private_data *) i2c_get_clientdata(client);
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun     DBG("%s\n",__func__);
288*4882a593Smuzhiyun 	gpio_direction_output(sensor->pdata->standby_pin, GPIO_HIGH);
289*4882a593Smuzhiyun 	msleep(100);
290*4882a593Smuzhiyun 	gpio_direction_output(sensor->pdata->standby_pin, GPIO_LOW);
291*4882a593Smuzhiyun 	msleep(100);
292*4882a593Smuzhiyun }
293*4882a593Smuzhiyun 
sensor_active(struct i2c_client * client,int enable,int rate)294*4882a593Smuzhiyun static int sensor_active(struct i2c_client *client, int enable, int rate)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	/*
297*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
298*4882a593Smuzhiyun 	    (struct sensor_private_data *) i2c_get_clientdata(client);
299*4882a593Smuzhiyun 	int status = 0;
300*4882a593Smuzhiyun 	*/
301*4882a593Smuzhiyun 	int result = 0;
302*4882a593Smuzhiyun 	if(enable)
303*4882a593Smuzhiyun 	{
304*4882a593Smuzhiyun 		result=ewtsa_enable(client);
305*4882a593Smuzhiyun 	}
306*4882a593Smuzhiyun 	else
307*4882a593Smuzhiyun 	{
308*4882a593Smuzhiyun 		result=ewtsa_disable(client);
309*4882a593Smuzhiyun 	}
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	if(result)
312*4882a593Smuzhiyun 		printk("%s:fail to active sensor\n",__func__);
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	return result;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun 
sensor_init(struct i2c_client * client)318*4882a593Smuzhiyun static int sensor_init(struct i2c_client *client)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
321*4882a593Smuzhiyun 	    (struct sensor_private_data *) i2c_get_clientdata(client);
322*4882a593Smuzhiyun 	int result = 0;
323*4882a593Smuzhiyun 	/*
324*4882a593Smuzhiyun 	unsigned char buf[5];
325*4882a593Smuzhiyun 	unsigned char data = 0;
326*4882a593Smuzhiyun 	int i = 0;
327*4882a593Smuzhiyun 	char pReadData=0;
328*4882a593Smuzhiyun 	*/
329*4882a593Smuzhiyun 	sensor->status_cur = SENSOR_OFF;
330*4882a593Smuzhiyun 	gyro_dev_reset(client);
331*4882a593Smuzhiyun 	ewtsa_system_restart(client);
332*4882a593Smuzhiyun 	return result;
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 
gyro_report_value(struct i2c_client * client,struct sensor_axis * axis)336*4882a593Smuzhiyun static int gyro_report_value(struct i2c_client *client, struct sensor_axis *axis)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
339*4882a593Smuzhiyun 	    	(struct sensor_private_data *) i2c_get_clientdata(client);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 	if (sensor->status_cur == SENSOR_ON) {
342*4882a593Smuzhiyun 		/* Report GYRO  information */
343*4882a593Smuzhiyun 		input_report_rel(sensor->input_dev, ABS_RX, axis->x);
344*4882a593Smuzhiyun 		input_report_rel(sensor->input_dev, ABS_RY, axis->y);
345*4882a593Smuzhiyun 		input_report_rel(sensor->input_dev, ABS_RZ, axis->z);
346*4882a593Smuzhiyun 		input_sync(sensor->input_dev);
347*4882a593Smuzhiyun 	}
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	return 0;
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
sensor_report_value(struct i2c_client * client)352*4882a593Smuzhiyun static int sensor_report_value(struct i2c_client *client)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun 	struct sensor_private_data *sensor =
355*4882a593Smuzhiyun 	    	(struct sensor_private_data *) i2c_get_clientdata(client);
356*4882a593Smuzhiyun 	struct sensor_platform_data *pdata = sensor->pdata;
357*4882a593Smuzhiyun 	int ret = 0;
358*4882a593Smuzhiyun 	int x = 0, y = 0, z = 0;
359*4882a593Smuzhiyun 	struct sensor_axis axis;
360*4882a593Smuzhiyun 	char buffer[6] = {0};
361*4882a593Smuzhiyun 	int i = 0;
362*4882a593Smuzhiyun 	/* int value = 0; */
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	memset(buffer, 0, 6);
365*4882a593Smuzhiyun #if 0
366*4882a593Smuzhiyun 	/* Data bytes from hardware xL, xH, yL, yH, zL, zH */
367*4882a593Smuzhiyun 	do {
368*4882a593Smuzhiyun 		buffer[0] = sensor->ops->read_reg;
369*4882a593Smuzhiyun 		ret = sensor_rx_data(client, buffer, sensor->ops->read_len);
370*4882a593Smuzhiyun 		if (ret < 0)
371*4882a593Smuzhiyun 		return ret;
372*4882a593Smuzhiyun 	} while (0);
373*4882a593Smuzhiyun #else
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun 	for(i=0; i<6; i++)
376*4882a593Smuzhiyun 	{
377*4882a593Smuzhiyun 		i2c_read_byte(client, sensor->ops->read_reg + i,&buffer[i]);
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun #endif
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	x = (short) (((buffer[0]) << 8) | buffer[1]);
382*4882a593Smuzhiyun 	y = (short) (((buffer[2]) << 8) | buffer[3]);
383*4882a593Smuzhiyun 	z = (short) (((buffer[4]) << 8) | buffer[5]);
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	//printk("%s: x=%d  y=%d z=%d \n",__func__, x,y,z);
386*4882a593Smuzhiyun 	if (pdata)
387*4882a593Smuzhiyun 	{
388*4882a593Smuzhiyun 		axis.x = (pdata->orientation[0])*x + (pdata->orientation[1])*y + (pdata->orientation[2])*z;
389*4882a593Smuzhiyun 		axis.y = (pdata->orientation[3])*x + (pdata->orientation[4])*y + (pdata->orientation[5])*z;
390*4882a593Smuzhiyun 		axis.z = (pdata->orientation[6])*x + (pdata->orientation[7])*y + (pdata->orientation[8])*z;
391*4882a593Smuzhiyun 	}
392*4882a593Smuzhiyun 	else
393*4882a593Smuzhiyun 	{
394*4882a593Smuzhiyun 		axis.x = x;
395*4882a593Smuzhiyun 		axis.y = y;
396*4882a593Smuzhiyun 		axis.z = z;
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	gyro_report_value(client, &axis);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	mutex_lock(&sensor->data_mutex);
402*4882a593Smuzhiyun 	sensor->axis = axis;
403*4882a593Smuzhiyun 	mutex_unlock(&sensor->data_mutex);
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	return ret;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun static struct sensor_operate gyro_ewtsa_ops = {
410*4882a593Smuzhiyun 	.name			= "ewtsa",
411*4882a593Smuzhiyun 	.type			= SENSOR_TYPE_GYROSCOPE,
412*4882a593Smuzhiyun 	.id_i2c			= GYRO_ID_EWTSA,
413*4882a593Smuzhiyun 	.read_reg			= GYRO_DATA_REG,
414*4882a593Smuzhiyun 	.read_len			= 6,
415*4882a593Smuzhiyun 	.id_reg			= -1,
416*4882a593Smuzhiyun 	.id_data			= -1,
417*4882a593Smuzhiyun 	.precision			= 16,
418*4882a593Smuzhiyun 	.ctrl_reg			= REG_PWR_MGM,
419*4882a593Smuzhiyun 	.int_status_reg	= REG_INT_STATUS,
420*4882a593Smuzhiyun 	.range			= {-32768, 32768},
421*4882a593Smuzhiyun 	.trig				= IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
422*4882a593Smuzhiyun 	.active			= sensor_active,
423*4882a593Smuzhiyun 	.init				= sensor_init,
424*4882a593Smuzhiyun 	.report			= sensor_report_value,
425*4882a593Smuzhiyun };
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun /****************operate according to sensor chip:end************/
gyro_ewtsa_probe(struct i2c_client * client,const struct i2c_device_id * devid)428*4882a593Smuzhiyun static int gyro_ewtsa_probe(struct i2c_client *client,
429*4882a593Smuzhiyun 			    const struct i2c_device_id *devid)
430*4882a593Smuzhiyun {
431*4882a593Smuzhiyun 	return sensor_register_device(client, NULL, devid, &gyro_ewtsa_ops);
432*4882a593Smuzhiyun }
433*4882a593Smuzhiyun 
gyro_ewtsa_remove(struct i2c_client * client)434*4882a593Smuzhiyun static int gyro_ewtsa_remove(struct i2c_client *client)
435*4882a593Smuzhiyun {
436*4882a593Smuzhiyun 	return sensor_unregister_device(client, NULL, &gyro_ewtsa_ops);
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun static const struct i2c_device_id gyro_ewtsa_id[] = {
440*4882a593Smuzhiyun 	{"ewtsa_gyro", GYRO_ID_EWTSA},
441*4882a593Smuzhiyun 	{}
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun static struct i2c_driver gyro_ewtsa_driver = {
445*4882a593Smuzhiyun 	.probe = gyro_ewtsa_probe,
446*4882a593Smuzhiyun 	.remove = gyro_ewtsa_remove,
447*4882a593Smuzhiyun 	.shutdown = sensor_shutdown,
448*4882a593Smuzhiyun 	.id_table = gyro_ewtsa_id,
449*4882a593Smuzhiyun 	.driver = {
450*4882a593Smuzhiyun 		.name = "gyro_ewtsa",
451*4882a593Smuzhiyun 	#ifdef CONFIG_PM
452*4882a593Smuzhiyun 		.pm = &sensor_pm_ops,
453*4882a593Smuzhiyun 	#endif
454*4882a593Smuzhiyun 	},
455*4882a593Smuzhiyun };
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun module_i2c_driver(gyro_ewtsa_driver);
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun MODULE_AUTHOR("zhangaihui <zah@rock-chips.com>");
460*4882a593Smuzhiyun MODULE_DESCRIPTION("ewtsa 3-Axis Gyroscope driver");
461*4882a593Smuzhiyun MODULE_LICENSE("GPL");
462