rk30:auto-dimming function about light-sensor and backlight-curve
[firefly-linux-kernel-4.4.55.git] / drivers / input / sensors / sensor-dev.c
1 /* drivers/input/sensors/sensor-dev.c - handle all gsensor in this file\r
2  *\r
3  * Copyright (C) 2012-2015 ROCKCHIP.\r
4  * Author: luowei <lw@rock-chips.com>\r
5  *\r
6  * This software is licensed under the terms of the GNU General Public\r
7  * License version 2, as published by the Free Software Foundation, and\r
8  * may be copied, distributed, and modified under those terms.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  */\r
16 \r
17 #include <linux/interrupt.h>\r
18 #include <linux/i2c.h>\r
19 #include <linux/slab.h>\r
20 #include <linux/irq.h>\r
21 #include <linux/miscdevice.h>\r
22 #include <linux/gpio.h>\r
23 #include <asm/uaccess.h>\r
24 #include <asm/atomic.h>\r
25 #include <linux/delay.h>\r
26 #include <linux/input.h>\r
27 #include <linux/workqueue.h>\r
28 #include <linux/freezer.h>\r
29 #include <mach/gpio.h>\r
30 #include <mach/board.h> \r
31 #ifdef CONFIG_HAS_EARLYSUSPEND\r
32 #include <linux/earlysuspend.h>\r
33 #endif\r
34 #include <linux/akm8975.h>\r
35 #include <linux/l3g4200d.h>\r
36 #include <linux/sensor-dev.h>\r
37 \r
38 #define SENSOR_ON               1\r
39 #define SENSOR_OFF              0\r
40 \r
41 #if 0\r
42 #define SENSOR_DEBUG_TYPE SENSOR_TYPE_ACCEL\r
43 #define DBG(x...) if(sensor->pdata->type == SENSOR_DEBUG_TYPE) printk(x)\r
44 #else\r
45 #define DBG(x...)\r
46 #endif\r
47 \r
48 struct sensor_private_data *g_sensor[SENSOR_NUM_TYPES];\r
49 static struct sensor_operate *sensor_ops[SENSOR_NUM_ID]; \r
50 \r
51 static int sensor_get_id(struct i2c_client *client, int *value)\r
52 {\r
53         struct sensor_private_data *sensor =\r
54             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
55         int result = 0;\r
56         char temp = sensor->ops->id_reg;\r
57         int i = 0;\r
58 \r
59         if(sensor->ops->id_reg >= 0)\r
60         {\r
61                 for(i=0; i<3; i++)\r
62                 {\r
63                         result = sensor_rx_data(client, &temp, 1);\r
64                         *value = temp;\r
65                         if(!result)\r
66                         break;\r
67                 }\r
68 \r
69                 if(result)\r
70                         return result;\r
71 \r
72                 if(*value != sensor->ops->id_data)\r
73                 {\r
74                         printk("%s:id=0x%x is not 0x%x\n",__func__,*value, sensor->ops->id_data);\r
75                         result = -1;\r
76                 }\r
77                         \r
78                 DBG("%s:devid=0x%x\n",__func__,*value);\r
79         }\r
80         \r
81         return result;\r
82 }\r
83 \r
84 static int sensor_initial(struct i2c_client *client)\r
85 {\r
86         struct sensor_private_data *sensor =\r
87             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
88         int result = 0;\r
89 \r
90         //register setting according to chip datasheet  \r
91         result = sensor->ops->init(client);\r
92         if(result < 0)\r
93         {\r
94                 printk("%s:fail to init sensor\n",__func__);\r
95                 return result;\r
96         }\r
97 \r
98 \r
99         DBG("%s:ctrl_data=0x%x\n",__func__,sensor->ops->ctrl_data);\r
100         \r
101         return result;\r
102 \r
103 }\r
104 \r
105 static int sensor_chip_init(struct i2c_client *client)\r
106 {\r
107         struct sensor_private_data *sensor =\r
108             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
109         struct sensor_operate *ops = sensor_ops[(int)sensor->i2c_id->driver_data];\r
110         int result = 0;\r
111         \r
112         if(ops)\r
113         {\r
114                 sensor->ops = ops;\r
115         }\r
116         else\r
117         {\r
118                 printk("%s:ops is null,sensor name is %s\n",__func__,sensor->i2c_id->name);\r
119                 result = -1;\r
120                 goto error;\r
121         }\r
122 \r
123         if((sensor->type != ops->type) || ((int)sensor->i2c_id->driver_data != ops->id_i2c))\r
124         {\r
125                 printk("%s:type or id is different:type=%d,%d,id=%d,%d\n",__func__,sensor->type, ops->type, (int)sensor->i2c_id->driver_data, ops->id_i2c);\r
126                 result = -1;\r
127                 goto error;\r
128         }\r
129         \r
130         if(!ops->init || !ops->active || !ops->report)\r
131         {\r
132                 printk("%s:error:some function is needed\n",__func__);          \r
133                 result = -1;\r
134                 goto error;\r
135         }\r
136 \r
137         result = sensor_get_id(sensor->client, &sensor->devid);//get id\r
138         if(result < 0)\r
139         {       \r
140                 printk("%s:fail to read %s devid:0x%x\n",__func__, sensor->i2c_id->name, sensor->devid);        \r
141                 goto error;\r
142         }\r
143         \r
144         printk("%s:%s:devid=0x%x,ops=0x%p\n",__func__, sensor->i2c_id->name, sensor->devid,sensor->ops);\r
145 \r
146         result = sensor_initial(sensor->client);        //init sensor\r
147         if(result < 0)\r
148         {       \r
149                 printk("%s:fail to init sensor\n",__func__);            \r
150                 goto error;\r
151         }\r
152 \r
153         return 0;\r
154 \r
155 error:\r
156         \r
157         return result;\r
158 }\r
159 \r
160 static int sensor_reset_rate(struct i2c_client *client, int rate)\r
161 {\r
162         struct sensor_private_data *sensor =\r
163             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
164         int result = 0; \r
165         \r
166         result = sensor->ops->active(client,SENSOR_OFF,rate);\r
167         sensor->ops->init(client);\r
168         result = sensor->ops->active(client,SENSOR_ON,rate);\r
169 \r
170         return result;\r
171 }\r
172 \r
173 static int sensor_get_data(struct i2c_client *client)\r
174 {\r
175         struct sensor_private_data *sensor =\r
176             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
177         int result = 0;\r
178         \r
179         result = sensor->ops->report(client);\r
180         if(result)\r
181                 goto error;\r
182 \r
183         /* set data_ready */\r
184         atomic_set(&sensor->data_ready, 1);\r
185         /*wake up data_ready  work queue*/\r
186         wake_up(&sensor->data_ready_wq);\r
187         \r
188 error:          \r
189         return result;\r
190 }\r
191 \r
192 #if 0\r
193 int sensor_get_cached_data(struct i2c_client* client, char *buffer, int length, struct sensor_axis *axis)\r
194 {\r
195     struct sensor_private_data* sensor = (struct sensor_private_data *)i2c_get_clientdata(client);      \r
196     wait_event_interruptible_timeout(sensor->data_ready_wq, \r
197                                      atomic_read(&(sensor->data_ready) ),\r
198                                      msecs_to_jiffies(1000) );\r
199     if ( 0 == atomic_read(&(sensor->data_ready) ) ) {\r
200         printk("waiting 'data_ready_wq' timed out.");\r
201         goto error;\r
202     }\r
203 \r
204         \r
205         mutex_lock(&sensor->data_mutex);\r
206 \r
207         switch(sensor->type)\r
208         {\r
209                 case SENSOR_TYPE_ACCEL:\r
210                 *axis = sensor->axis;\r
211                 break;\r
212 \r
213                 case SENSOR_TYPE_COMPASS:\r
214                 memcpy(buffer, sensor->sensor_data, length);\r
215                 break;\r
216         }\r
217         \r
218         mutex_unlock(&sensor->data_mutex);\r
219         \r
220     return 0;\r
221         \r
222 error:\r
223         return -1;\r
224 }\r
225 #endif\r
226 \r
227 static void  sensor_delaywork_func(struct work_struct *work)\r
228 {\r
229         struct delayed_work *delaywork = container_of(work, struct delayed_work, work);\r
230         struct sensor_private_data *sensor = container_of(delaywork, struct sensor_private_data, delaywork);\r
231         struct i2c_client *client = sensor->client;\r
232 \r
233         mutex_lock(&sensor->sensor_mutex);      \r
234         if (sensor_get_data(client) < 0) \r
235                 DBG(KERN_ERR "%s: Get data failed\n",__func__);\r
236         \r
237         if(!sensor->pdata->irq_enable)//restart work while polling\r
238         schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
239         //else\r
240         //{\r
241                 //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))\r
242                 //enable_irq(sensor->client->irq);\r
243         //}\r
244         mutex_unlock(&sensor->sensor_mutex);\r
245         \r
246         DBG("%s:%s\n",__func__,sensor->i2c_id->name);\r
247 }\r
248 \r
249 /*\r
250  * This is a threaded IRQ handler so can access I2C/SPI.  Since all\r
251  * interrupts are clear on read the IRQ line will be reasserted and\r
252  * the physical IRQ will be handled again if another interrupt is\r
253  * asserted while we run - in the normal course of events this is a\r
254  * rare occurrence so we save I2C/SPI reads.  We're also assuming that\r
255  * it's rare to get lots of interrupts firing simultaneously so try to\r
256  * minimise I/O.\r
257  */\r
258 static irqreturn_t sensor_interrupt(int irq, void *dev_id)\r
259 {\r
260         struct sensor_private_data *sensor = (struct sensor_private_data *)dev_id;\r
261 \r
262         //use threaded IRQ\r
263         if (sensor_get_data(sensor->client) < 0) \r
264                 DBG(KERN_ERR "%s: Get data failed\n",__func__);\r
265         msleep(sensor->pdata->poll_delay_ms);\r
266 \r
267         \r
268         //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))\r
269         //disable_irq_nosync(irq);\r
270         //schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
271         DBG("%s:irq=%d\n",__func__,irq);\r
272         return IRQ_HANDLED;\r
273 }\r
274 \r
275 \r
276 static int sensor_irq_init(struct i2c_client *client)\r
277 {\r
278         struct sensor_private_data *sensor =\r
279             (struct sensor_private_data *) i2c_get_clientdata(client);  \r
280         int result = 0;\r
281         int irq;\r
282         if((sensor->pdata->irq_enable)&&(sensor->ops->trig != SENSOR_UNKNOW_DATA))\r
283         {\r
284                 //INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
285                 if(sensor->pdata->poll_delay_ms < 0)\r
286                         sensor->pdata->poll_delay_ms = 30;\r
287                 \r
288                 result = gpio_request(client->irq, sensor->i2c_id->name);\r
289                 if (result)\r
290                 {\r
291                         printk("%s:fail to request gpio :%d\n",__func__,client->irq);\r
292                 }\r
293         \r
294                 gpio_pull_updown(client->irq, PullEnable);\r
295                 irq = gpio_to_irq(client->irq);\r
296                 //result = request_irq(irq, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);\r
297                 result = request_threaded_irq(irq, NULL, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);\r
298                 if (result) {\r
299                         printk(KERN_ERR "%s:fail to request irq = %d, ret = 0x%x\n",__func__, irq, result);            \r
300                         goto error;            \r
301                 }\r
302                 client->irq = irq;\r
303                 if((sensor->pdata->type == SENSOR_TYPE_GYROSCOPE))\r
304                 disable_irq_nosync(client->irq);//disable irq\r
305                 printk("%s:use irq=%d\n",__func__,irq);\r
306         }\r
307         else if(!sensor->pdata->irq_enable)\r
308         {               \r
309                 INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
310                 if(sensor->pdata->poll_delay_ms < 0)\r
311                         sensor->pdata->poll_delay_ms = 30;\r
312                 \r
313                 printk("%s:use polling,delay=%d ms\n",__func__,sensor->pdata->poll_delay_ms);\r
314         }\r
315 \r
316 error:  \r
317         return result;\r
318 }\r
319 \r
320 \r
321 static void sensor_suspend(struct early_suspend *h)\r
322 {\r
323         struct sensor_private_data *sensor = \r
324                         container_of(h, struct sensor_private_data, early_suspend);\r
325         \r
326         if(sensor->ops->suspend)\r
327                 sensor->ops->suspend(sensor->client);\r
328 \r
329 }\r
330 \r
331 static void sensor_resume(struct early_suspend *h)\r
332 {\r
333         struct sensor_private_data *sensor = \r
334                         container_of(h, struct sensor_private_data, early_suspend);\r
335 \r
336         if(sensor->ops->resume)\r
337                 sensor->ops->resume(sensor->client);\r
338 }\r
339 \r
340 static int gsensor_dev_open(struct inode *inode, struct file *file)\r
341 {\r
342         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];     \r
343         //struct i2c_client *client = sensor->client;\r
344 \r
345         int result = 0;\r
346 \r
347 \r
348         return result;\r
349 }\r
350 \r
351 \r
352 static int gsensor_dev_release(struct inode *inode, struct file *file)\r
353 {\r
354         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];     \r
355         //struct i2c_client *client = sensor->client;\r
356 \r
357         int result = 0;\r
358 \r
359 \r
360         return result;\r
361 }\r
362 \r
363 /* ioctl - I/O control */\r
364 static long gsensor_dev_ioctl(struct file *file,\r
365                           unsigned int cmd, unsigned long arg)\r
366 {\r
367         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];\r
368         struct i2c_client *client = sensor->client;\r
369         void __user *argp = (void __user *)arg;\r
370         struct sensor_axis axis = {0};\r
371         char rate;\r
372         int result = 0;\r
373 \r
374         switch (cmd) {\r
375         case GSENSOR_IOCTL_APP_SET_RATE:\r
376                 if (copy_from_user(&rate, argp, sizeof(rate)))\r
377                 {\r
378                         result = -EFAULT;\r
379                         goto error;\r
380                 }\r
381                 break;\r
382         default:\r
383                 break;\r
384         }
385
386         switch (cmd) {
387         case GSENSOR_IOCTL_START:       \r
388                 DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);\r
389                 mutex_lock(&sensor->operation_mutex);   \r
390                 if(++sensor->start_count == 1)\r
391                 {\r
392                         if(sensor->status_cur == SENSOR_OFF)\r
393                         {\r
394                                 atomic_set(&(sensor->data_ready), 0);\r
395                                 if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {\r
396                                         mutex_unlock(&sensor->operation_mutex);\r
397                                         printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
398                                         goto error;           \r
399                                 }                       \r
400                                 if(sensor->pdata->irq_enable)\r
401                                 {\r
402                                         //printk("%s:enable irq,irq=%d\n",__func__,client->irq);\r
403                                         //enable_irq(client->irq);      //enable irq\r
404                                 }       \r
405                                 else\r
406                                 {\r
407                                         PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
408                                         schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
409                                 }\r
410                                 sensor->status_cur = SENSOR_ON;\r
411                         }       \r
412                 }\r
413                 mutex_unlock(&sensor->operation_mutex);\r
414                 DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);\r
415                 break;\r
416
417         case GSENSOR_IOCTL_CLOSE:                               \r
418                 DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);\r
419                 mutex_lock(&sensor->operation_mutex);           \r
420                 if(--sensor->start_count == 0)\r
421                 {\r
422                         if(sensor->status_cur == SENSOR_ON)\r
423                         {\r
424                                 atomic_set(&(sensor->data_ready), 0);\r
425                                 if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {\r
426                                         mutex_unlock(&sensor->operation_mutex);              \r
427                                         goto error;\r
428                                 }\r
429                                 \r
430                                 if(sensor->pdata->irq_enable)\r
431                                 {                               \r
432                                         //printk("%s:disable irq,irq=%d\n",__func__,client->irq);\r
433                                         //disable_irq_nosync(client->irq);//disable irq\r
434                                 }\r
435                                 else\r
436                                 cancel_delayed_work_sync(&sensor->delaywork);           \r
437                                 sensor->status_cur = SENSOR_OFF;\r
438                         }\r
439                         \r
440                         DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);\r
441                 }\r
442                 \r
443                 mutex_unlock(&sensor->operation_mutex); \r
444                 break;\r
445
446         case GSENSOR_IOCTL_APP_SET_RATE:                \r
447                 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);         \r
448                 mutex_lock(&sensor->operation_mutex);   \r
449                 result = sensor_reset_rate(client, rate);\r
450                 if (result < 0){\r
451                         mutex_unlock(&sensor->operation_mutex);\r
452                         goto error;\r
453                 }\r
454                 if(sensor->status_cur == SENSOR_OFF)\r
455                 {               \r
456                         if(sensor->pdata->irq_enable)\r
457                         {\r
458                                 //printk("%s:enable irq,irq=%d\n",__func__,client->irq);\r
459                                 //enable_irq(client->irq);      //enable irq\r
460                         }       \r
461                         else\r
462                         {\r
463                                 PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
464                                 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
465                         }\r
466                         sensor->status_cur = SENSOR_ON;\r
467                 }                       \r
468                 mutex_unlock(&sensor->operation_mutex); \r
469                 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);\r
470                 break;\r
471                 \r
472         case GSENSOR_IOCTL_GETDATA:\r
473                 mutex_lock(&sensor->data_mutex);\r
474                 memcpy(&axis, &sensor->axis, sizeof(sensor->axis));     //get data from buffer\r
475                 mutex_unlock(&sensor->data_mutex);              \r
476                 break;\r
477         default:\r
478                 result = -ENOTTY;\r
479         goto error;\r
480         }
481
482         switch (cmd) {
483         case GSENSOR_IOCTL_GETDATA:\r
484                 if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {\r
485                     printk("failed to copy sense data to user space.");\r
486                                 result = -EFAULT;                       \r
487                                 goto error;\r
488                 }               \r
489                 DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);\r
490                 break;
491         default:
492                 break;
493         }\r
494         \r
495 error:\r
496         return result;\r
497 }\r
498 \r
499 \r
500 static int compass_dev_open(struct inode *inode, struct file *file)\r
501 {\r
502         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
503         //struct i2c_client *client = sensor->client;\r
504         int result = 0;\r
505         \r
506         //to do\r
507         return result;\r
508 }\r
509 \r
510 \r
511 static int compass_dev_release(struct inode *inode, struct file *file)\r
512 {\r
513         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
514         //struct i2c_client *client = sensor->client;   \r
515         int result = 0;\r
516 \r
517         //to do\r
518         return result;\r
519 }\r
520 \r
521 \r
522 /* ioctl - I/O control */\r
523 static long compass_dev_ioctl(struct file *file,\r
524                           unsigned int cmd, unsigned long arg)\r
525 {\r
526         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
527         //struct i2c_client *client = sensor->client;\r
528         //void __user *argp = (void __user *)arg;\r
529         int result = 0;\r
530         \r
531         //to do\r
532         return result;\r
533 }\r
534 \r
535 static int gyro_dev_open(struct inode *inode, struct file *file)\r
536 {\r
537         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];\r
538         //struct i2c_client *client = sensor->client;\r
539 \r
540         int result = 0;\r
541 \r
542 \r
543         return result;\r
544 }\r
545 \r
546 \r
547 static int gyro_dev_release(struct inode *inode, struct file *file)\r
548 {\r
549         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];\r
550         //struct i2c_client *client = sensor->client;\r
551 \r
552         int result = 0;\r
553 \r
554 \r
555         return result;\r
556 }\r
557 \r
558 \r
559 /* ioctl - I/O control */\r
560 static long gyro_dev_ioctl(struct file *file,\r
561                           unsigned int cmd, unsigned long arg)\r
562 {\r
563         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];   \r
564         struct i2c_client *client = sensor->client;     \r
565         void __user *argp = (void __user *)arg;\r
566         int result = 0;\r
567         char rate;\r
568         switch (cmd) {\r
569         case L3G4200D_IOCTL_GET_ENABLE: \r
570                 result = !sensor->status_cur;\r
571                 if (copy_to_user(argp, &result, sizeof(result)))\r
572                 {\r
573                         printk("%s:failed to copy status to user space.\n",__FUNCTION__);\r
574                         return -EFAULT;\r
575                 }\r
576                 \r
577                 DBG("%s :L3G4200D_IOCTL_GET_ENABLE,status=%d\n",__FUNCTION__,result);   \r
578                 break;\r
579         case L3G4200D_IOCTL_SET_ENABLE:                 \r
580                 DBG("%s :L3G4200D_IOCTL_SET_ENABLE,flag=%d\n",__FUNCTION__,*(unsigned int *)argp);\r
581                 mutex_lock(&sensor->operation_mutex);   \r
582                 if(*(unsigned int *)argp)\r
583                 {\r
584                         if(sensor->status_cur == SENSOR_OFF)\r
585                         {\r
586                                 if ( (result = sensor->ops->active(client, 1, ODR100_BW12_5) ) < 0 ) {\r
587                                 mutex_unlock(&sensor->operation_mutex);\r
588                                 printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
589                                 goto error;           \r
590                                 }                       \r
591                                 if(sensor->pdata->irq_enable)\r
592                                 {\r
593                                         DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
594                                         enable_irq(client->irq);        //enable irq\r
595                                 }       \r
596                                 else\r
597                                 {\r
598                                         PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
599                                         schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
600                                 }\r
601                                 sensor->status_cur = SENSOR_ON;\r
602                         }       \r
603                 }\r
604                 else\r
605                 {\r
606                         if(sensor->status_cur == SENSOR_ON)\r
607                         {\r
608                                 if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {\r
609                                 mutex_unlock(&sensor->operation_mutex);              \r
610                                 goto error;\r
611                                 }\r
612                                 \r
613                                 if(sensor->pdata->irq_enable)\r
614                                 {                               \r
615                                         DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
616                                         disable_irq_nosync(client->irq);//disable irq\r
617                                 }\r
618                                 else\r
619                                 cancel_delayed_work_sync(&sensor->delaywork);           \r
620                                 sensor->status_cur = SENSOR_OFF;\r
621                         }\r
622                 }\r
623         \r
624                 result = sensor->status_cur;\r
625                 if (copy_to_user(argp, &result, sizeof(result)))\r
626                 {\r
627                         printk("%s:failed to copy sense data to user space.\n",__FUNCTION__);\r
628                         return -EFAULT;\r
629                 }\r
630 \r
631                 mutex_unlock(&sensor->operation_mutex);\r
632                 DBG("%s:L3G4200D_IOCTL_SET_ENABLE OK\n", __func__);\r
633                 break;\r
634         case L3G4200D_IOCTL_SET_DELAY:                                  \r
635                 mutex_lock(&sensor->operation_mutex);\r
636                 if (copy_from_user(&rate, argp, sizeof(rate)))\r
637                 return -EFAULT;\r
638                 if(sensor->status_cur == SENSOR_OFF)\r
639                 {\r
640                         if ( (result = sensor->ops->active(client, 1, rate) ) < 0 ) {\r
641                         mutex_unlock(&sensor->operation_mutex);\r
642                         printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
643                         goto error;           \r
644                         }\r
645                         \r
646                         if(sensor->pdata->irq_enable)\r
647                         {\r
648                                 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
649                                 enable_irq(client->irq);        //enable irq\r
650                         }       \r
651                         else\r
652                         {\r
653                                 PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
654                                 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
655                         }\r
656                         sensor->status_cur = SENSOR_ON;\r
657                 }       \r
658                 \r
659                 mutex_unlock(&sensor->operation_mutex);\r
660                 DBG("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);\r
661                 break;\r
662 \r
663         default:\r
664                 printk("%s:error,cmd=0x%x\n",__func__,cmd);\r
665                 return -ENOTTY;\r
666         }\r
667         \r
668         DBG("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);\r
669 \r
670 error:\r
671         return result;\r
672 }\r
673 \r
674 static int light_dev_open(struct inode *inode, struct file *file)\r
675 {\r
676         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
677         //struct i2c_client *client = sensor->client;   \r
678         int result = 0; \r
679 \r
680 \r
681         return result;\r
682 }\r
683 \r
684 \r
685 \r
686 \r
687 static int light_dev_release(struct inode *inode, struct file *file)\r
688 {\r
689         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
690         //struct i2c_client *client = sensor->client;   \r
691         int result = 0;\r
692 \r
693 \r
694         return result;\r
695 }\r
696 \r
697 \r
698 /* ioctl - I/O control */\r
699 static long light_dev_ioctl(struct file *file,\r
700                           unsigned int cmd, unsigned long arg)\r
701 {\r
702         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
703         struct i2c_client *client = sensor->client;\r
704         unsigned int *argp = (unsigned int *)arg;       \r
705         int result = 0;\r
706 \r
707         switch(cmd)\r
708         {\r
709                 case LIGHTSENSOR_IOCTL_GET_ENABLED:
710                         *argp = sensor->status_cur;\r
711                         break;
712                 case LIGHTSENSOR_IOCTL_ENABLE:          \r
713                         DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);\r
714                         mutex_lock(&sensor->operation_mutex);    \r
715                         if(*(unsigned int *)argp)\r
716                         {\r
717                                 if(sensor->status_cur == SENSOR_OFF)\r
718                                 {\r
719                                         if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
720                                         mutex_unlock(&sensor->operation_mutex);\r
721                                         printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
722                                         goto error;           \r
723                                         }       \r
724                                         \r
725                                         if(!sensor->pdata->irq_enable)\r
726                                         {\r
727                                                 PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
728                                                 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
729                                         }\r
730                                         sensor->status_cur = SENSOR_ON;\r
731                                 }       \r
732                         }\r
733                         else\r
734                         {\r
735                                 if(sensor->status_cur == SENSOR_ON)\r
736                                 {\r
737                                         if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
738                                         mutex_unlock(&sensor->operation_mutex);              \r
739                                         goto error;\r
740                                         }\r
741                                         \r
742                                         if(!sensor->pdata->irq_enable)\r
743                                         cancel_delayed_work_sync(&sensor->delaywork);           \r
744                                         sensor->status_cur = SENSOR_OFF;\r
745                                 }\r
746                         }\r
747                         mutex_unlock(&sensor->operation_mutex);\r
748                         DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);\r
749                         break;\r
750                 \r
751                 default:\r
752                         break;\r
753         }\r
754         \r
755 error:\r
756         return result;\r
757 }\r
758 \r
759 \r
760 static int proximity_dev_open(struct inode *inode, struct file *file)\r
761 {\r
762         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
763         //struct i2c_client *client = sensor->client;   \r
764         int result = 0;\r
765 \r
766 \r
767         return result;\r
768 }\r
769 \r
770 \r
771 static int proximity_dev_release(struct inode *inode, struct file *file)\r
772 {\r
773         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
774         //struct i2c_client *client = sensor->client;   \r
775         int result = 0;\r
776 \r
777 \r
778         return result;\r
779 }\r
780 \r
781 \r
782 /* ioctl - I/O control */\r
783 static long proximity_dev_ioctl(struct file *file,\r
784                           unsigned int cmd, unsigned long arg)\r
785 {\r
786         struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
787         struct i2c_client *client = sensor->client;     \r
788         unsigned int *argp = (unsigned int *)arg;       \r
789         int result = 0;\r
790         switch(cmd)\r
791         {\r
792                 case PSENSOR_IOCTL_GET_ENABLED:\r
793                         *argp = sensor->status_cur;\r
794                         break;
795                 case PSENSOR_IOCTL_ENABLE:              \r
796                         DBG("%s:PSENSOR_IOCTL_ENABLE start\n", __func__);\r
797                         mutex_lock(&sensor->operation_mutex);    \r
798                         if(*(unsigned int *)argp)\r
799                         {\r
800                                 if(sensor->status_cur == SENSOR_OFF)\r
801                                 {\r
802                                         if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
803                                         mutex_unlock(&sensor->operation_mutex);\r
804                                         printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
805                                         goto error;           \r
806                                         }\r
807                                         \r
808                                         if(!sensor->pdata->irq_enable)\r
809                                         {\r
810                                                 PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
811                                                 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
812                                         }\r
813                                         sensor->status_cur = SENSOR_ON;\r
814                                 }       \r
815                         }\r
816                         else\r
817                         {\r
818                                 if(sensor->status_cur == SENSOR_ON)\r
819                                 {\r
820                                         if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
821                                         mutex_unlock(&sensor->operation_mutex);              \r
822                                         goto error;\r
823                                         }\r
824                                         if(!sensor->pdata->irq_enable)\r
825                                         cancel_delayed_work_sync(&sensor->delaywork);           \r
826                                         sensor->status_cur = SENSOR_OFF;\r
827                                 }\r
828                         }\r
829                         mutex_unlock(&sensor->operation_mutex);\r
830                         DBG("%s:PSENSOR_IOCTL_ENABLE OK\n", __func__);\r
831                         break;\r
832                 \r
833                 default:\r
834                         break;\r
835         }\r
836         \r
837 error:\r
838         return result;\r
839 }\r
840 \r
841 static int temperature_dev_open(struct inode *inode, struct file *file)\r
842 {\r
843         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
844         //struct i2c_client *client = sensor->client;\r
845 \r
846         int result = 0;\r
847 \r
848 \r
849         return result;\r
850 }\r
851 \r
852 \r
853 static int temperature_dev_release(struct inode *inode, struct file *file)\r
854 {\r
855         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
856         //struct i2c_client *client = sensor->client;\r
857 \r
858         int result = 0;\r
859 \r
860 \r
861         return result;\r
862 }\r
863 \r
864 \r
865 /* ioctl - I/O control */\r
866 static long temperature_dev_ioctl(struct file *file,\r
867                           unsigned int cmd, unsigned long arg)\r
868 {\r
869         //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
870         //struct i2c_client *client = sensor->client;\r
871         //void __user *argp = (void __user *)arg;\r
872         int result = 0;\r
873         \r
874 \r
875         return result;\r
876 }\r
877 \r
878 \r
879 static int sensor_misc_device_register(struct sensor_private_data *sensor, int type)\r
880 {\r
881         int result = 0;\r
882         \r
883         switch(type)\r
884         {\r
885                 case SENSOR_TYPE_ACCEL:\r
886                         if(!sensor->ops->misc_dev)\r
887                         {\r
888                                 sensor->fops.owner = THIS_MODULE;\r
889                                 sensor->fops.unlocked_ioctl = gsensor_dev_ioctl;\r
890                                 sensor->fops.open = gsensor_dev_open;\r
891                                 sensor->fops.release = gsensor_dev_release;\r
892 \r
893                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
894                                 sensor->miscdev.name = "mma8452_daemon";\r
895                                 sensor->miscdev.fops = &sensor->fops;\r
896                         }\r
897                         else\r
898                         {\r
899                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
900 \r
901                         }\r
902                                 \r
903                         break;\r
904 \r
905                 case SENSOR_TYPE_COMPASS:                       \r
906                         if(!sensor->ops->misc_dev)\r
907                         {\r
908                                 sensor->fops.owner = THIS_MODULE;\r
909                                 sensor->fops.unlocked_ioctl = compass_dev_ioctl;\r
910                                 sensor->fops.open = compass_dev_open;\r
911                                 sensor->fops.release = compass_dev_release;\r
912 \r
913                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
914                                 sensor->miscdev.name = "compass";\r
915                                 sensor->miscdev.fops = &sensor->fops;\r
916                         }\r
917                         else\r
918                         {\r
919                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
920 \r
921                         }\r
922 \r
923                         break;\r
924 \r
925                 case SENSOR_TYPE_GYROSCOPE:                     \r
926                         if(!sensor->ops->misc_dev)\r
927                         {\r
928                                 sensor->fops.owner = THIS_MODULE;\r
929                                 sensor->fops.unlocked_ioctl = gyro_dev_ioctl;\r
930                                 sensor->fops.open = gyro_dev_open;\r
931                                 sensor->fops.release = gyro_dev_release;\r
932 \r
933                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
934                                 sensor->miscdev.name = "gyrosensor";\r
935                                 sensor->miscdev.fops = &sensor->fops;\r
936                         }\r
937                         else\r
938                         {\r
939                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
940 \r
941                         }\r
942                         \r
943                         break;\r
944 \r
945                 case SENSOR_TYPE_LIGHT:\r
946                         if(!sensor->ops->misc_dev)\r
947                         {\r
948                                 sensor->fops.owner = THIS_MODULE;\r
949                                 sensor->fops.unlocked_ioctl = light_dev_ioctl;\r
950                                 sensor->fops.open = light_dev_open;\r
951                                 sensor->fops.release = light_dev_release;\r
952 \r
953                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
954                                 sensor->miscdev.name = "lightsensor";\r
955                                 sensor->miscdev.fops = &sensor->fops;\r
956                         }       \r
957                         else\r
958                         {\r
959                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
960 \r
961                         }\r
962                         break;\r
963                 \r
964                 case SENSOR_TYPE_PROXIMITY:\r
965                         if(!sensor->ops->misc_dev)\r
966                         {\r
967                                 sensor->fops.owner = THIS_MODULE;\r
968                                 sensor->fops.unlocked_ioctl = proximity_dev_ioctl;\r
969                                 sensor->fops.open = proximity_dev_open;\r
970                                 sensor->fops.release = proximity_dev_release;\r
971 \r
972                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
973                                 sensor->miscdev.name = "psensor";\r
974                                 sensor->miscdev.fops = &sensor->fops;\r
975                         }       \r
976                         else\r
977                         {\r
978                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
979 \r
980                         }\r
981                         break;\r
982 \r
983                 case SENSOR_TYPE_TEMPERATURE:\r
984                         if(!sensor->ops->misc_dev)\r
985                         {\r
986                                 sensor->fops.owner = THIS_MODULE;\r
987                                 sensor->fops.unlocked_ioctl = temperature_dev_ioctl;\r
988                                 sensor->fops.open = temperature_dev_open;\r
989                                 sensor->fops.release = temperature_dev_release;\r
990 \r
991                                 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
992                                 sensor->miscdev.name = "temperature";\r
993                                 sensor->miscdev.fops = &sensor->fops;\r
994                         }       \r
995                         else\r
996                         {\r
997                                 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
998 \r
999                         }\r
1000                                 \r
1001                         break;\r
1002 \r
1003                 default:\r
1004                         printk("%s:unknow sensor type=%d\n",__func__,type);\r
1005                         result = -1;\r
1006                         goto error;\r
1007         }\r
1008                         \r
1009         sensor->miscdev.parent = &sensor->client->dev;\r
1010         result = misc_register(&sensor->miscdev);\r
1011         if (result < 0) {\r
1012                 dev_err(&sensor->client->dev,\r
1013                         "fail to register misc device %s\n", sensor->miscdev.name);\r
1014                 goto error;\r
1015         }\r
1016         \r
1017         printk("%s:miscdevice: %s\n",__func__,sensor->miscdev.name);\r
1018 \r
1019 error:  \r
1020         \r
1021         return result;\r
1022 \r
1023 }\r
1024 \r
1025 int sensor_register_slave(int type,struct i2c_client *client,\r
1026                         struct sensor_platform_data *slave_pdata,\r
1027                         struct sensor_operate *(*get_sensor_ops)(void))\r
1028 {\r
1029         int result = 0;\r
1030         struct sensor_operate *ops = get_sensor_ops();\r
1031         if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))\r
1032         {       \r
1033                 printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);\r
1034                 return -1;      \r
1035         }\r
1036         sensor_ops[ops->id_i2c] = ops;\r
1037         printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);\r
1038         return result;\r
1039 }\r
1040 \r
1041 \r
1042 int sensor_unregister_slave(int type,struct i2c_client *client,\r
1043                         struct sensor_platform_data *slave_pdata,\r
1044                         struct sensor_operate *(*get_sensor_ops)(void))\r
1045 {\r
1046         int result = 0;\r
1047         struct sensor_operate *ops = get_sensor_ops();\r
1048         if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))\r
1049         {       \r
1050                 printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);\r
1051                 return -1;      \r
1052         }\r
1053         printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);\r
1054         sensor_ops[ops->id_i2c] = NULL; \r
1055         return result;\r
1056 }\r
1057 \r
1058 \r
1059 int sensor_probe(struct i2c_client *client, const struct i2c_device_id *devid)\r
1060 {\r
1061         struct sensor_private_data *sensor =\r
1062             (struct sensor_private_data *) i2c_get_clientdata(client);\r
1063         struct sensor_platform_data *pdata;\r
1064         int result = 0;\r
1065         int type = 0;\r
1066         dev_info(&client->adapter->dev, "%s: %s,0x%x\n", __func__, devid->name,(unsigned int)client);\r
1067 \r
1068         if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {\r
1069                 result = -ENODEV;\r
1070                 goto out_no_free;\r
1071         }\r
1072 \r
1073         pdata = client->dev.platform_data;\r
1074         if (!pdata) {\r
1075                 dev_err(&client->adapter->dev,\r
1076                         "Missing platform data for slave %s\n", devid->name);\r
1077                 result = -EFAULT;\r
1078                 goto out_no_free;\r
1079         }\r
1080 \r
1081         sensor = kzalloc(sizeof(*sensor), GFP_KERNEL);\r
1082         if (!sensor) {\r
1083                 result = -ENOMEM;\r
1084                 goto out_no_free;\r
1085         }\r
1086 \r
1087         type= pdata->type;      \r
1088         \r
1089         if((type >= SENSOR_NUM_TYPES) || (type <= SENSOR_TYPE_NULL))\r
1090         {       \r
1091                 dev_err(&client->adapter->dev, "sensor type is error %d\n", pdata->type);\r
1092                 result = -EFAULT;\r
1093                 goto out_no_free;       \r
1094         }\r
1095 \r
1096         if(((int)devid->driver_data >= SENSOR_NUM_ID) || ((int)devid->driver_data <= ID_INVALID))\r
1097         {       \r
1098                 dev_err(&client->adapter->dev, "sensor id is error %d\n", (int)devid->driver_data);\r
1099                 result = -EFAULT;\r
1100                 goto out_no_free;       \r
1101         }\r
1102         \r
1103         i2c_set_clientdata(client, sensor);\r
1104         sensor->client = client;        \r
1105         sensor->pdata = pdata;  \r
1106         sensor->type = type;\r
1107         sensor->i2c_id = (struct i2c_device_id *)devid;\r
1108 \r
1109         if (pdata->init_platform_hw) {\r
1110                 result = pdata->init_platform_hw();\r
1111                 if (result < 0)\r
1112                         goto out_free_memory;\r
1113         }\r
1114 \r
1115         memset(&(sensor->axis), 0, sizeof(struct sensor_axis) );\r
1116         atomic_set(&(sensor->data_ready), 0);\r
1117         init_waitqueue_head(&(sensor->data_ready_wq));\r
1118         mutex_init(&sensor->data_mutex);        \r
1119         mutex_init(&sensor->operation_mutex);   \r
1120         mutex_init(&sensor->sensor_mutex);\r
1121         mutex_init(&sensor->i2c_mutex);\r
1122 \r
1123         sensor->status_cur = SENSOR_OFF;\r
1124         sensor->axis.x = 0;\r
1125         sensor->axis.y = 0;\r
1126         sensor->axis.z = 0;\r
1127         \r
1128         result = sensor_chip_init(sensor->client);\r
1129         if(result < 0)\r
1130                 goto out_free_memory;\r
1131         \r
1132         sensor->input_dev = input_allocate_device();\r
1133         if (!sensor->input_dev) {\r
1134                 result = -ENOMEM;\r
1135                 dev_err(&client->dev,\r
1136                         "Failed to allocate input device %s\n", sensor->input_dev->name);\r
1137                 goto out_free_memory;\r
1138         }       \r
1139 \r
1140         switch(type)\r
1141         {\r
1142                 case SENSOR_TYPE_ACCEL: \r
1143                         sensor->input_dev->name = "gsensor";\r
1144                         set_bit(EV_ABS, sensor->input_dev->evbit);\r
1145                         /* x-axis acceleration */\r
1146                         input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
1147                         /* y-axis acceleration */\r
1148                         input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
1149                         /* z-axis acceleration */\r
1150                         input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
1151                         break;          \r
1152                 case SENSOR_TYPE_COMPASS:       \r
1153                         sensor->input_dev->name = "compass";            \r
1154                         /* Setup input device */\r
1155                         set_bit(EV_ABS, sensor->input_dev->evbit);\r
1156                         /* yaw (0, 360) */\r
1157                         input_set_abs_params(sensor->input_dev, ABS_RX, 0, 23040, 0, 0);\r
1158                         /* pitch (-180, 180) */\r
1159                         input_set_abs_params(sensor->input_dev, ABS_RY, -11520, 11520, 0, 0);\r
1160                         /* roll (-90, 90) */\r
1161                         input_set_abs_params(sensor->input_dev, ABS_RZ, -5760, 5760, 0, 0);\r
1162                         /* x-axis acceleration (720 x 8G) */\r
1163                         input_set_abs_params(sensor->input_dev, ABS_X, -5760, 5760, 0, 0);\r
1164                         /* y-axis acceleration (720 x 8G) */\r
1165                         input_set_abs_params(sensor->input_dev, ABS_Y, -5760, 5760, 0, 0);\r
1166                         /* z-axis acceleration (720 x 8G) */\r
1167                         input_set_abs_params(sensor->input_dev, ABS_Z, -5760, 5760, 0, 0);\r
1168                         /* status of magnetic sensor */\r
1169                         input_set_abs_params(sensor->input_dev, ABS_RUDDER, -32768, 3, 0, 0);\r
1170                         /* status of acceleration sensor */\r
1171                         input_set_abs_params(sensor->input_dev, ABS_WHEEL, -32768, 3, 0, 0);\r
1172                         /* x-axis of raw magnetic vector (-4096, 4095) */\r
1173                         input_set_abs_params(sensor->input_dev, ABS_HAT0X, -20480, 20479, 0, 0);\r
1174                         /* y-axis of raw magnetic vector (-4096, 4095) */\r
1175                         input_set_abs_params(sensor->input_dev, ABS_HAT0Y, -20480, 20479, 0, 0);\r
1176                         /* z-axis of raw magnetic vector (-4096, 4095) */\r
1177                         input_set_abs_params(sensor->input_dev, ABS_BRAKE, -20480, 20479, 0, 0);\r
1178                         break;          \r
1179                 case SENSOR_TYPE_GYROSCOPE:\r
1180                         sensor->input_dev->name = "gyro";\r
1181                         /* x-axis acceleration */\r
1182                         input_set_capability(sensor->input_dev, EV_REL, REL_RX);\r
1183                         input_set_abs_params(sensor->input_dev, ABS_RX, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
1184                         /* y-axis acceleration */       \r
1185                         input_set_capability(sensor->input_dev, EV_REL, REL_RY);\r
1186                         input_set_abs_params(sensor->input_dev, ABS_RY, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
1187                         /* z-axis acceleration */\r
1188                         input_set_capability(sensor->input_dev, EV_REL, REL_RZ);\r
1189                         input_set_abs_params(sensor->input_dev, ABS_RZ, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
1190                         break;\r
1191                 case SENSOR_TYPE_LIGHT:\r
1192                         sensor->input_dev->name = "lightsensor-level";\r
1193                         set_bit(EV_ABS, sensor->input_dev->evbit);\r
1194                         input_set_abs_params(sensor->input_dev, ABS_MISC, sensor->ops->range[0], sensor->ops->range[1], 0, 0);                  \r
1195                         input_set_abs_params(sensor->input_dev, ABS_TOOL_WIDTH ,  sensor->ops->brightness[0],sensor->ops->brightness[1], 0, 0);\r
1196                         break;\r
1197                 case SENSOR_TYPE_PROXIMITY:\r
1198                         sensor->input_dev->name = "proximity";  \r
1199                         set_bit(EV_ABS, sensor->input_dev->evbit);\r
1200                         input_set_abs_params(sensor->input_dev, ABS_DISTANCE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);\r
1201                         break;\r
1202                 case SENSOR_TYPE_TEMPERATURE:                           \r
1203                         sensor->input_dev->name = "temperature";\r
1204                         set_bit(EV_ABS, sensor->input_dev->evbit);              \r
1205                         input_set_abs_params(sensor->input_dev, ABS_THROTTLE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);\r
1206                         break;\r
1207                 default:\r
1208                         printk("%s:unknow sensor type=%d\n",__func__,type);\r
1209                         break;\r
1210 \r
1211         }\r
1212         sensor->input_dev->dev.parent = &client->dev;\r
1213
1214         result = input_register_device(sensor->input_dev);\r
1215         if (result) {\r
1216                 dev_err(&client->dev,\r
1217                         "Unable to register input device %s\n", sensor->input_dev->name);\r
1218                 goto out_input_register_device_failed;\r
1219         }\r
1220 \r
1221         result = sensor_irq_init(sensor->client);\r
1222         if (result) {\r
1223                 dev_err(&client->dev,\r
1224                         "fail to init sensor irq,ret=%d\n",result);\r
1225                 goto out_input_register_device_failed;\r
1226         }\r
1227 \r
1228         \r
1229         sensor->miscdev.parent = &client->dev;\r
1230         result = sensor_misc_device_register(sensor, type);\r
1231         if (result) {\r
1232                 dev_err(&client->dev,\r
1233                         "fail to register misc device %s\n", sensor->miscdev.name);\r
1234                 goto out_misc_device_register_device_failed;\r
1235         }\r
1236         \r
1237         g_sensor[type] = sensor;\r
1238 \r
1239 #ifdef CONFIG_HAS_EARLYSUSPEND\r
1240         if((sensor->ops->suspend) && (sensor->ops->resume))\r
1241         {\r
1242                 sensor->early_suspend.suspend = sensor_suspend;\r
1243                 sensor->early_suspend.resume = sensor_resume;\r
1244                 sensor->early_suspend.level = 0x02;\r
1245                 register_early_suspend(&sensor->early_suspend);\r
1246         }\r
1247 #endif\r
1248 \r
1249         printk("%s:initialized ok,sensor name:%s,type:%d,id=%d\n\n",__func__,sensor->ops->name,type,(int)sensor->i2c_id->driver_data);\r
1250 \r
1251         return result;\r
1252         \r
1253 out_misc_device_register_device_failed:\r
1254         input_unregister_device(sensor->input_dev);     \r
1255 out_input_register_device_failed:\r
1256         input_free_device(sensor->input_dev);   \r
1257 out_free_memory:\r
1258         kfree(sensor);\r
1259 out_no_free:\r
1260         dev_err(&client->adapter->dev, "%s failed %d\n", __func__, result);\r
1261         return result;\r
1262 \r
1263 }\r
1264 \r
1265 static void sensor_shut_down(struct i2c_client *client)\r
1266 {\r
1267         struct sensor_private_data *sensor =\r
1268             (struct sensor_private_data *) i2c_get_clientdata(client);\r
1269         if((sensor->ops->suspend) && (sensor->ops->resume))             \r
1270                 unregister_early_suspend(&sensor->early_suspend);\r
1271         DBG("%s:%s\n",__func__,sensor->i2c_id->name);\r
1272 }\r
1273 \r
1274 static int sensor_remove(struct i2c_client *client)\r
1275 {\r
1276         struct sensor_private_data *sensor =\r
1277             (struct sensor_private_data *) i2c_get_clientdata(client);\r
1278         int result = 0;\r
1279         \r
1280         cancel_delayed_work_sync(&sensor->delaywork);\r
1281         misc_deregister(&sensor->miscdev);\r
1282         input_unregister_device(sensor->input_dev);     \r
1283         input_free_device(sensor->input_dev);   \r
1284         kfree(sensor);\r
1285 #ifdef CONFIG_HAS_EARLYSUSPEND\r
1286         if((sensor->ops->suspend) && (sensor->ops->resume))\r
1287         unregister_early_suspend(&sensor->early_suspend);\r
1288 #endif  \r
1289         return result;\r
1290 }\r
1291 \r
1292 static const struct i2c_device_id sensor_id[] = {\r
1293         /*gsensor*/\r
1294         {"gsensor", ACCEL_ID_ALL},\r
1295         {"gs_mma8452", ACCEL_ID_MMA845X},       \r
1296         {"gs_kxtik", ACCEL_ID_KXTIK},\r
1297         {"gs_lis3dh", ACCEL_ID_LIS3DH},\r
1298         /*compass*/\r
1299         {"compass", COMPASS_ID_ALL},\r
1300         {"ak8975", COMPASS_ID_AK8975},\r
1301         {"mmc314x", COMPASS_ID_MMC314X},\r
1302         /*gyroscope*/\r
1303         {"gyro", GYRO_ID_ALL},  \r
1304         {"l3g4200d_gryo", GYRO_ID_L3G4200D},\r
1305         {"k3g", GYRO_ID_K3G},\r
1306         /*light sensor*/\r
1307         {"lightsensor", LIGHT_ID_ALL},  \r
1308         {"light_cm3217", LIGHT_ID_CM3217},\r
1309         {"light_al3006", LIGHT_ID_AL3006},\r
1310         {"ls_stk3171", LIGHT_ID_STK3171},\r
1311         /*proximity sensor*/\r
1312         {"psensor", PROXIMITY_ID_ALL},\r
1313         {"proximity_al3006", PROXIMITY_ID_AL3006},      \r
1314         {"ps_stk3171", PROXIMITY_ID_STK3171},\r
1315         /*temperature*/\r
1316         {"temperature", TEMPERATURE_ID_ALL},\r
1317         {},\r
1318 };\r
1319 \r
1320 \r
1321 static struct i2c_driver sensor_driver = {\r
1322         .probe = sensor_probe,\r
1323         .remove = sensor_remove,\r
1324         .shutdown = sensor_shut_down,\r
1325         .id_table = sensor_id,\r
1326         .driver = {\r
1327                    .owner = THIS_MODULE,\r
1328                    .name = "sensors",\r
1329                    },\r
1330 };\r
1331 \r
1332 static int __init sensor_init(void)\r
1333 {\r
1334         int res = i2c_add_driver(&sensor_driver);\r
1335         pr_info("%s: Probe name %s\n", __func__, sensor_driver.driver.name);\r
1336         if (res)\r
1337                 pr_err("%s failed\n", __func__);\r
1338         return res;\r
1339 }\r
1340 \r
1341 static void __exit sensor_exit(void)\r
1342 {\r
1343         pr_info("%s\n", __func__);\r
1344         i2c_del_driver(&sensor_driver);\r
1345 }\r
1346 \r
1347 late_initcall(sensor_init);\r
1348 module_exit(sensor_exit);\r
1349 \r
1350 MODULE_AUTHOR("ROCKCHIP Corporation:lw@rock-chips.com");\r
1351 MODULE_DESCRIPTION("User space character device interface for sensors");\r
1352 MODULE_LICENSE("GPL");\r
1353 \r