1 /* drivers/input/sensors/sensor-dev.c - handle all gsensor in this file
\r
3 * Copyright (C) 2012-2015 ROCKCHIP.
\r
4 * Author: luowei <lw@rock-chips.com>
\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
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
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 <linux/proc_fs.h>
\r
30 #include <linux/gpio.h>
\r
31 #include <linux/of_gpio.h>
\r
32 #include <linux/of.h>
\r
33 #ifdef CONFIG_HAS_EARLYSUSPEND
\r
34 #include <linux/earlysuspend.h>
\r
36 #include <linux/l3g4200d.h>
\r
37 #include <linux/sensor-dev.h>
\r
38 #include <linux/module.h>
\r
40 #include <linux/compat.h>
45 sensor-dev.c v1.1 add pressure and temperature support 2013-2-27
\r
46 sensor-dev.c v1.2 add akm8963 support 2013-3-10
\r
47 sensor-dev.c v1.3 add sensor debug support 2013-3-15
\r
48 sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01
\r
51 #define SENSOR_VERSION_AND_TIME "sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01"
\r
54 struct sensor_private_data *g_sensor[SENSOR_NUM_TYPES];
\r
55 static struct sensor_operate *sensor_ops[SENSOR_NUM_ID];
\r
56 static struct class *g_sensor_class[SENSOR_NUM_TYPES];
\r
58 static ssize_t sensor_proc_write(struct file *file, const char __user *buffer,
\r
59 size_t count, loff_t *data)
\r
65 rc = get_user(c, buffer);
\r
68 for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)
\r
69 atomic_set(&g_sensor[i]->flags.debug_flag, SENSOR_TYPE_NULL);
\r
76 printk("%s command list:close:%d,angle:%d accel:%d, compass:%d, gyro:%d, light:%d, psensor:%d, temp:%d, pressure:%d,total:%d,num=%d\n",__func__,
\r
78 SENSOR_TYPE_NULL, SENSOR_TYPE_ANGLE, SENSOR_TYPE_ACCEL,SENSOR_TYPE_COMPASS,SENSOR_TYPE_GYROSCOPE,SENSOR_TYPE_LIGHT,SENSOR_TYPE_PROXIMITY,
\r
80 SENSOR_TYPE_TEMPERATURE,SENSOR_TYPE_PRESSURE,SENSOR_NUM_TYPES,num);
\r
82 if((num > SENSOR_NUM_TYPES) || (num < SENSOR_TYPE_NULL))
\r
84 printk("%s:error! only support %d to %d\n",__func__, SENSOR_TYPE_NULL,SENSOR_NUM_TYPES);
\r
88 for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)
\r
91 atomic_set(&g_sensor[i]->flags.debug_flag, num);
\r
97 static const struct file_operations sensor_proc_fops = {
\r
98 .owner = THIS_MODULE,
\r
99 .write = sensor_proc_write,
\r
104 static int sensor_get_id(struct i2c_client *client, int *value)
\r
106 struct sensor_private_data *sensor =
\r
107 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
109 char temp = sensor->ops->id_reg;
\r
112 if(sensor->ops->id_reg >= 0)
\r
116 result = sensor_rx_data(client, &temp, 1);
\r
125 if(*value != sensor->ops->id_data)
\r
127 printk("%s:id=0x%x is not 0x%x\n",__func__,*value, sensor->ops->id_data);
\r
131 DBG("%s:devid=0x%x\n",__func__,*value);
\r
137 static int sensor_initial(struct i2c_client *client)
\r
139 struct sensor_private_data *sensor =
\r
140 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
143 //register setting according to chip datasheet
\r
144 result = sensor->ops->init(client);
\r
147 printk("%s:fail to init sensor\n",__func__);
\r
152 DBG("%s:ctrl_data=0x%x\n",__func__,sensor->ops->ctrl_data);
\r
158 static int sensor_chip_init(struct i2c_client *client)
\r
160 struct sensor_private_data *sensor =
\r
161 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
162 struct sensor_operate *ops = sensor_ops[(int)sensor->i2c_id->driver_data];
\r
171 printk("%s:ops is null,sensor name is %s\n",__func__,sensor->i2c_id->name);
\r
176 if((sensor->type != ops->type) || ((int)sensor->i2c_id->driver_data != ops->id_i2c))
\r
178 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
183 if(!ops->init || !ops->active || !ops->report)
\r
185 printk("%s:error:some function is needed\n",__func__);
\r
190 result = sensor_get_id(sensor->client, &sensor->devid);//get id
\r
193 printk("%s:fail to read %s devid:0x%x\n",__func__, sensor->i2c_id->name, sensor->devid);
\r
197 printk("%s:%s:devid=0x%x,ops=0x%p\n",__func__, sensor->i2c_id->name, sensor->devid,sensor->ops);
\r
199 result = sensor_initial(sensor->client); //init sensor
\r
202 printk("%s:fail to init sensor\n",__func__);
\r
213 static int sensor_reset_rate(struct i2c_client *client, int rate)
\r
215 struct sensor_private_data *sensor =
\r
216 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
219 result = sensor->ops->active(client,SENSOR_OFF,rate);
\r
220 sensor->ops->init(client);
\r
221 result = sensor->ops->active(client,SENSOR_ON,rate);
\r
226 static int sensor_get_data(struct i2c_client *client)
\r
228 struct sensor_private_data *sensor =
\r
229 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
232 result = sensor->ops->report(client);
\r
236 /* set data_ready */
\r
237 atomic_set(&sensor->data_ready, 1);
\r
238 /*wake up data_ready work queue*/
\r
239 wake_up(&sensor->data_ready_wq);
\r
246 int sensor_get_cached_data(struct i2c_client* client, char *buffer, int length, struct sensor_axis *axis)
\r
248 struct sensor_private_data* sensor = (struct sensor_private_data *)i2c_get_clientdata(client);
\r
249 wait_event_interruptible_timeout(sensor->data_ready_wq,
\r
250 atomic_read(&(sensor->data_ready) ),
\r
251 msecs_to_jiffies(1000) );
\r
252 if ( 0 == atomic_read(&(sensor->data_ready) ) ) {
\r
253 printk("waiting 'data_ready_wq' timed out.");
\r
258 mutex_lock(&sensor->data_mutex);
\r
260 switch(sensor->type)
\r
262 case SENSOR_TYPE_ACCEL:
\r
263 *axis = sensor->axis;
\r
266 case SENSOR_TYPE_COMPASS:
\r
267 memcpy(buffer, sensor->sensor_data, length);
\r
271 mutex_unlock(&sensor->data_mutex);
\r
280 static void sensor_delaywork_func(struct work_struct *work)
\r
282 struct delayed_work *delaywork = container_of(work, struct delayed_work, work);
\r
283 struct sensor_private_data *sensor = container_of(delaywork, struct sensor_private_data, delaywork);
\r
284 struct i2c_client *client = sensor->client;
\r
286 mutex_lock(&sensor->sensor_mutex);
\r
287 if (sensor_get_data(client) < 0)
\r
288 DBG(KERN_ERR "%s: Get data failed\n",__func__);
\r
290 if(!sensor->pdata->irq_enable)//restart work while polling
\r
291 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
294 //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))
\r
295 //enable_irq(sensor->client->irq);
\r
297 mutex_unlock(&sensor->sensor_mutex);
\r
299 DBG("%s:%s\n",__func__,sensor->i2c_id->name);
\r
303 * This is a threaded IRQ handler so can access I2C/SPI. Since all
\r
304 * interrupts are clear on read the IRQ line will be reasserted and
\r
305 * the physical IRQ will be handled again if another interrupt is
\r
306 * asserted while we run - in the normal course of events this is a
\r
307 * rare occurrence so we save I2C/SPI reads. We're also assuming that
\r
308 * it's rare to get lots of interrupts firing simultaneously so try to
\r
311 static irqreturn_t sensor_interrupt(int irq, void *dev_id)
\r
313 struct sensor_private_data *sensor = (struct sensor_private_data *)dev_id;
\r
316 if (sensor_get_data(sensor->client) < 0)
\r
317 DBG(KERN_ERR "%s: Get data failed\n",__func__);
\r
318 msleep(sensor->pdata->poll_delay_ms);
\r
321 //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))
\r
322 //disable_irq_nosync(irq);
\r
323 //schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
324 DBG("%s:irq=%d\n",__func__,irq);
\r
325 return IRQ_HANDLED;
\r
329 static int sensor_irq_init(struct i2c_client *client)
\r
331 struct sensor_private_data *sensor =
\r
332 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
335 if((sensor->pdata->irq_enable)&&(sensor->pdata->irq_flags!= SENSOR_UNKNOW_DATA))
\r
337 //INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);
\r
338 if(sensor->pdata->poll_delay_ms < 0)
\r
339 sensor->pdata->poll_delay_ms = 30;
\r
340 result = gpio_request(client->irq, sensor->i2c_id->name);
\r
343 printk("%s:fail to request gpio :%d\n",__func__,client->irq);
\r
346 //gpio_pull_updown(client->irq, PullEnable);
\r
347 irq = gpio_to_irq(client->irq);
\r
348 //result = request_irq(irq, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);
\r
349 //result = request_threaded_irq(irq, NULL, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);
\r
350 result = devm_request_threaded_irq(&client->dev, irq, NULL, sensor_interrupt, sensor->pdata->irq_flags | IRQF_ONESHOT, sensor->ops->name, sensor);
\r
352 printk(KERN_ERR "%s:fail to request irq = %d, ret = 0x%x\n",__func__, irq, result);
\r
356 if((sensor->pdata->type == SENSOR_TYPE_GYROSCOPE) || (sensor->pdata->type == SENSOR_TYPE_ACCEL) || (sensor->pdata->type == SENSOR_TYPE_ANGLE))
\r
357 disable_irq_nosync(client->irq);//disable irq
\r
358 if(((sensor->pdata->type == SENSOR_TYPE_LIGHT) || (sensor->pdata->type == SENSOR_TYPE_PROXIMITY))&& (!(sensor->ops->trig & IRQF_SHARED)))
\r
359 disable_irq_nosync(client->irq);//disable irq
\r
360 if(((sensor->pdata->type == SENSOR_TYPE_TEMPERATURE) || (sensor->pdata->type == SENSOR_TYPE_PRESSURE))&& (!(sensor->ops->trig & IRQF_SHARED)))
\r
361 disable_irq_nosync(client->irq);//disable irq
\r
362 DBG("%s:use irq=%d\n",__func__,irq);
\r
364 else if(!sensor->pdata->irq_enable)
\r
366 INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);
\r
367 if(sensor->pdata->poll_delay_ms < 0)
\r
368 sensor->pdata->poll_delay_ms = 30;
\r
370 DBG("%s:use polling,delay=%d ms\n",__func__,sensor->pdata->poll_delay_ms);
\r
377 #ifdef CONFIG_HAS_EARLYSUSPEND
\r
378 static void sensor_suspend(struct early_suspend *h)
\r
380 struct sensor_private_data *sensor =
\r
381 container_of(h, struct sensor_private_data, early_suspend);
\r
383 if(sensor->ops->suspend)
\r
384 sensor->ops->suspend(sensor->client);
\r
388 static void sensor_resume(struct early_suspend *h)
\r
390 struct sensor_private_data *sensor =
\r
391 container_of(h, struct sensor_private_data, early_suspend);
\r
393 if(sensor->ops->resume)
\r
394 sensor->ops->resume(sensor->client);
\r
398 static int angle_dev_open(struct inode *inode, struct file *file)
\r
400 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
401 //struct i2c_client *client = sensor->client;
\r
410 static int angle_dev_release(struct inode *inode, struct file *file)
\r
412 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];
\r
413 //struct i2c_client *client = sensor->client;
\r
421 /* ioctl - I/O control */
\r
422 static long angle_dev_ioctl(struct file *file,
\r
423 unsigned int cmd, unsigned long arg)
\r
425 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];
\r
426 struct i2c_client *client = sensor->client;
\r
427 void __user *argp = (void __user *)arg;
\r
428 struct sensor_axis axis = {0};
\r
433 case GSENSOR_IOCTL_APP_SET_RATE:
\r
434 if (copy_from_user(&rate, argp, sizeof(rate)))
\r
445 case GSENSOR_IOCTL_START:
\r
446 DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);
\r
447 mutex_lock(&sensor->operation_mutex);
\r
448 if(++sensor->start_count == 1)
\r
450 if(sensor->status_cur == SENSOR_OFF)
\r
452 atomic_set(&(sensor->data_ready), 0);
\r
453 if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {
\r
454 mutex_unlock(&sensor->operation_mutex);
\r
455 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
458 if(sensor->pdata->irq_enable)
\r
460 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
461 enable_irq(client->irq); //enable irq
\r
465 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
467 sensor->status_cur = SENSOR_ON;
\r
470 mutex_unlock(&sensor->operation_mutex);
\r
471 DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);
\r
474 case GSENSOR_IOCTL_CLOSE:
\r
475 DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);
\r
476 mutex_lock(&sensor->operation_mutex);
\r
477 if(--sensor->start_count == 0)
\r
479 if(sensor->status_cur == SENSOR_ON)
\r
481 atomic_set(&(sensor->data_ready), 0);
\r
482 if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
\r
483 mutex_unlock(&sensor->operation_mutex);
\r
487 if(sensor->pdata->irq_enable)
\r
489 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
490 disable_irq_nosync(client->irq);//disable irq
\r
493 cancel_delayed_work_sync(&sensor->delaywork);
\r
494 sensor->status_cur = SENSOR_OFF;
\r
497 DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);
\r
500 mutex_unlock(&sensor->operation_mutex);
\r
503 case GSENSOR_IOCTL_APP_SET_RATE:
\r
504 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);
\r
505 mutex_lock(&sensor->operation_mutex);
\r
506 result = sensor_reset_rate(client, rate);
\r
508 mutex_unlock(&sensor->operation_mutex);
\r
512 sensor->status_cur = SENSOR_ON;
\r
513 mutex_unlock(&sensor->operation_mutex);
\r
514 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);
\r
517 case GSENSOR_IOCTL_GETDATA:
\r
518 mutex_lock(&sensor->data_mutex);
\r
519 memcpy(&axis, &sensor->axis, sizeof(sensor->axis)); //get data from buffer
\r
520 mutex_unlock(&sensor->data_mutex);
\r
528 case GSENSOR_IOCTL_GETDATA:
\r
529 if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {
\r
530 printk("failed to copy sense data to user space.");
\r
534 DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);
\r
545 static int gsensor_dev_open(struct inode *inode, struct file *file)
\r
547 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
548 //struct i2c_client *client = sensor->client;
\r
557 static int gsensor_dev_release(struct inode *inode, struct file *file)
\r
559 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
560 //struct i2c_client *client = sensor->client;
\r
568 /* ioctl - I/O control */
\r
569 static long gsensor_dev_ioctl(struct file *file,
\r
570 unsigned int cmd, unsigned long arg)
\r
572 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
573 struct i2c_client *client = sensor->client;
\r
574 void __user *argp = (void __user *)arg;
\r
575 struct sensor_axis axis = {0};
\r
580 case GSENSOR_IOCTL_APP_SET_RATE:
\r
581 if (copy_from_user(&rate, argp, sizeof(rate)))
\r
592 case GSENSOR_IOCTL_START:
\r
593 DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);
\r
594 mutex_lock(&sensor->operation_mutex);
\r
595 if(++sensor->start_count == 1)
\r
597 if(sensor->status_cur == SENSOR_OFF)
\r
599 atomic_set(&(sensor->data_ready), 0);
\r
600 if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {
\r
601 mutex_unlock(&sensor->operation_mutex);
\r
602 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
605 if(sensor->pdata->irq_enable)
\r
607 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
608 enable_irq(client->irq); //enable irq
\r
612 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
614 sensor->status_cur = SENSOR_ON;
\r
617 mutex_unlock(&sensor->operation_mutex);
\r
618 DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);
\r
621 case GSENSOR_IOCTL_CLOSE:
\r
622 DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);
\r
623 mutex_lock(&sensor->operation_mutex);
\r
624 if(--sensor->start_count == 0)
\r
626 if(sensor->status_cur == SENSOR_ON)
\r
628 atomic_set(&(sensor->data_ready), 0);
\r
629 if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
\r
630 mutex_unlock(&sensor->operation_mutex);
\r
634 if(sensor->pdata->irq_enable)
\r
636 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
637 disable_irq_nosync(client->irq);//disable irq
\r
640 cancel_delayed_work_sync(&sensor->delaywork);
\r
641 sensor->status_cur = SENSOR_OFF;
\r
644 DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);
\r
647 mutex_unlock(&sensor->operation_mutex);
\r
650 case GSENSOR_IOCTL_APP_SET_RATE:
\r
651 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);
\r
652 mutex_lock(&sensor->operation_mutex);
\r
653 result = sensor_reset_rate(client, rate);
\r
655 mutex_unlock(&sensor->operation_mutex);
\r
659 sensor->status_cur = SENSOR_ON;
\r
660 mutex_unlock(&sensor->operation_mutex);
\r
661 DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);
\r
664 case GSENSOR_IOCTL_GETDATA:
\r
665 mutex_lock(&sensor->data_mutex);
\r
666 memcpy(&axis, &sensor->axis, sizeof(sensor->axis)); //get data from buffer
\r
667 mutex_unlock(&sensor->data_mutex);
\r
675 case GSENSOR_IOCTL_GETDATA:
\r
676 if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {
\r
677 printk("failed to copy sense data to user space.");
\r
681 DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);
\r
691 static ssize_t gsensor_set_orientation_online(struct class *class,
\r
692 struct class_attribute *attr, const char *buf, size_t count)
\r
695 char orientation[20];
\r
698 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
699 struct sensor_platform_data *pdata = sensor->pdata;
\r
702 char *p = strstr(buf,"gsensor_class");
\r
703 int start = strcspn(p,"{");
\r
704 int end = strcspn(p,"}");
\r
706 strncpy(orientation,p+start,end-start+1);
\r
710 while(strncmp(tmp,"}",1)!=0)
\r
712 if((strncmp(tmp,",",1)==0)||(strncmp(tmp,"{",1)==0))
\r
718 else if(strncmp(tmp,"-",1)==0)
\r
720 pdata->orientation[i++]=-1;
\r
721 DBG("i=%d,data=%d\n",i,pdata->orientation[i]);
\r
726 pdata->orientation[i++]=tmp[0]-48;
\r
727 DBG("----i=%d,data=%d\n",i,pdata->orientation[i]);
\r
735 DBG("i=%d gsensor_info=%d\n",i,pdata->orientation[i]);
\r
740 static CLASS_ATTR(orientation, 0660, NULL, gsensor_set_orientation_online);
\r
742 static int gsensor_class_init(void)
\r
745 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
\r
746 g_sensor_class[SENSOR_TYPE_ACCEL] = class_create(THIS_MODULE, "gsensor_class");
\r
747 ret = class_create_file(g_sensor_class[SENSOR_TYPE_ACCEL], &class_attr_orientation);
\r
750 printk("%s:Fail to creat class\n",__func__);
\r
753 printk("%s:%s\n",__func__,sensor->i2c_id->name);
\r
759 static int compass_dev_open(struct inode *inode, struct file *file)
\r
761 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
\r
762 //struct i2c_client *client = sensor->client;
\r
766 flag = atomic_read(&sensor->flags.open_flag);
\r
769 atomic_set(&sensor->flags.open_flag, 1);
\r
770 wake_up(&sensor->flags.open_wq);
\r
773 DBG("%s\n", __func__);
\r
779 static int compass_dev_release(struct inode *inode, struct file *file)
\r
781 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
\r
782 //struct i2c_client *client = sensor->client;
\r
783 //void __user *argp = (void __user *)arg;
\r
786 flag = atomic_read(&sensor->flags.open_flag);
\r
789 atomic_set(&sensor->flags.open_flag, 0);
\r
790 wake_up(&sensor->flags.open_wq);
\r
793 DBG("%s\n", __func__);
\r
798 /* ioctl - I/O control */
799 static long compass_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
801 void __user *arg64 = compat_ptr(arg);
804 if (!file->f_op || !file->f_op->unlocked_ioctl) {
805 pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
810 case COMPAT_ECS_IOCTL_APP_SET_MFLAG:
811 if (file->f_op->unlocked_ioctl)
812 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MFLAG, (unsigned long)arg64);
814 case COMPAT_ECS_IOCTL_APP_GET_MFLAG:
815 if (file->f_op->unlocked_ioctl)
816 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MFLAG, (unsigned long)arg64);
818 case COMPAT_ECS_IOCTL_APP_SET_AFLAG:
819 if (file->f_op->unlocked_ioctl)
820 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_AFLAG, (unsigned long)arg64);
822 case COMPAT_ECS_IOCTL_APP_GET_AFLAG:
823 if (file->f_op->unlocked_ioctl)
824 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_AFLAG, (unsigned long)arg64);
826 case COMPAT_ECS_IOCTL_APP_SET_MVFLAG:
827 if (file->f_op->unlocked_ioctl)
828 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MVFLAG, (unsigned long)arg64);
830 case COMPAT_ECS_IOCTL_APP_GET_MVFLAG:
831 if (file->f_op->unlocked_ioctl)
832 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MVFLAG, (unsigned long)arg64);
834 case COMPAT_ECS_IOCTL_APP_SET_DELAY:
835 if (file->f_op->unlocked_ioctl)
836 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_DELAY, (unsigned long)arg64);
838 case COMPAT_ECS_IOCTL_APP_GET_DELAY:
839 if (file->f_op->unlocked_ioctl)
840 result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_DELAY, (unsigned long)arg64);
851 /* ioctl - I/O control */
\r
852 static long compass_dev_ioctl(struct file *file,
\r
853 unsigned int cmd, unsigned long arg)
\r
855 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
\r
856 //struct i2c_client *client = sensor->client;
\r
857 void __user *argp = (void __user *)arg;
\r
862 case ECS_IOCTL_APP_SET_MFLAG:
\r
863 case ECS_IOCTL_APP_SET_AFLAG:
\r
864 case ECS_IOCTL_APP_SET_MVFLAG:
\r
865 if (copy_from_user(&flag, argp, sizeof(flag))) {
\r
868 if (flag < 0 || flag > 1) {
\r
872 case ECS_IOCTL_APP_SET_DELAY:
\r
873 if (copy_from_user(&flag, argp, sizeof(flag))) {
\r
882 case ECS_IOCTL_APP_SET_MFLAG:
\r
883 atomic_set(&sensor->flags.m_flag, flag);
\r
884 DBG("%s:ECS_IOCTL_APP_SET_MFLAG,flag=%d\n", __func__,flag);
\r
886 case ECS_IOCTL_APP_GET_MFLAG:
\r
887 flag = atomic_read(&sensor->flags.m_flag);
\r
888 DBG("%s:ECS_IOCTL_APP_GET_MFLAG,flag=%d\n", __func__,flag);
\r
890 case ECS_IOCTL_APP_SET_AFLAG:
\r
891 atomic_set(&sensor->flags.a_flag, flag);
\r
892 DBG("%s:ECS_IOCTL_APP_SET_AFLAG,flag=%d\n", __func__,flag);
\r
894 case ECS_IOCTL_APP_GET_AFLAG:
\r
895 flag = atomic_read(&sensor->flags.a_flag);
\r
896 DBG("%s:ECS_IOCTL_APP_GET_AFLAG,flag=%d\n", __func__,flag);
\r
898 case ECS_IOCTL_APP_SET_MVFLAG:
\r
899 atomic_set(&sensor->flags.mv_flag, flag);
\r
900 DBG("%s:ECS_IOCTL_APP_SET_MVFLAG,flag=%d\n", __func__,flag);
\r
902 case ECS_IOCTL_APP_GET_MVFLAG:
\r
903 flag = atomic_read(&sensor->flags.mv_flag);
\r
904 DBG("%s:ECS_IOCTL_APP_GET_MVFLAG,flag=%d\n", __func__,flag);
\r
906 case ECS_IOCTL_APP_SET_DELAY:
\r
907 sensor->flags.delay = flag;
\r
909 case ECS_IOCTL_APP_GET_DELAY:
\r
910 flag = sensor->flags.delay;
\r
917 case ECS_IOCTL_APP_GET_MFLAG:
\r
918 case ECS_IOCTL_APP_GET_AFLAG:
\r
919 case ECS_IOCTL_APP_GET_MVFLAG:
\r
920 case ECS_IOCTL_APP_GET_DELAY:
\r
921 if (copy_to_user(argp, &flag, sizeof(flag))) {
\r
932 static int gyro_dev_open(struct inode *inode, struct file *file)
\r
934 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
\r
935 //struct i2c_client *client = sensor->client;
\r
944 static int gyro_dev_release(struct inode *inode, struct file *file)
\r
946 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
\r
947 //struct i2c_client *client = sensor->client;
\r
956 /* ioctl - I/O control */
\r
957 static long gyro_dev_ioctl(struct file *file,
\r
958 unsigned int cmd, unsigned long arg)
\r
960 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
\r
961 struct i2c_client *client = sensor->client;
\r
962 void __user *argp = (void __user *)arg;
\r
966 case L3G4200D_IOCTL_GET_ENABLE:
\r
967 result = !sensor->status_cur;
\r
968 if (copy_to_user(argp, &result, sizeof(result)))
\r
970 printk("%s:failed to copy status to user space.\n",__FUNCTION__);
\r
974 DBG("%s :L3G4200D_IOCTL_GET_ENABLE,status=%d\n",__FUNCTION__,result);
\r
976 case L3G4200D_IOCTL_SET_ENABLE:
\r
977 DBG("%s :L3G4200D_IOCTL_SET_ENABLE,flag=%d\n",__FUNCTION__,*(unsigned int *)argp);
\r
978 mutex_lock(&sensor->operation_mutex);
\r
979 if(*(unsigned int *)argp)
\r
981 if(sensor->status_cur == SENSOR_OFF)
\r
983 if ( (result = sensor->ops->active(client, 1, ODR100_BW12_5) ) < 0 ) {
\r
984 mutex_unlock(&sensor->operation_mutex);
\r
985 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
988 if(sensor->pdata->irq_enable)
\r
990 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
991 enable_irq(client->irq); //enable irq
\r
995 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
997 sensor->status_cur = SENSOR_ON;
\r
1002 if(sensor->status_cur == SENSOR_ON)
\r
1004 if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
\r
1005 mutex_unlock(&sensor->operation_mutex);
\r
1009 if(sensor->pdata->irq_enable)
\r
1011 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
1012 disable_irq_nosync(client->irq);//disable irq
\r
1015 cancel_delayed_work_sync(&sensor->delaywork);
\r
1016 sensor->status_cur = SENSOR_OFF;
\r
1020 result = sensor->status_cur;
\r
1021 if (copy_to_user(argp, &result, sizeof(result)))
\r
1023 printk("%s:failed to copy sense data to user space.\n",__FUNCTION__);
\r
1027 mutex_unlock(&sensor->operation_mutex);
\r
1028 DBG("%s:L3G4200D_IOCTL_SET_ENABLE OK\n", __func__);
\r
1030 case L3G4200D_IOCTL_SET_DELAY:
\r
1031 mutex_lock(&sensor->operation_mutex);
\r
1032 if (copy_from_user(&rate, argp, sizeof(rate)))
\r
1034 if(sensor->status_cur == SENSOR_OFF)
\r
1036 if ( (result = sensor->ops->active(client, 1, rate) ) < 0 ) {
\r
1037 mutex_unlock(&sensor->operation_mutex);
\r
1038 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
1042 if(sensor->pdata->irq_enable)
\r
1044 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
1045 enable_irq(client->irq); //enable irq
\r
1049 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
1051 sensor->status_cur = SENSOR_ON;
\r
1054 mutex_unlock(&sensor->operation_mutex);
\r
1055 DBG("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);
\r
1059 printk("%s:error,cmd=0x%x\n",__func__,cmd);
\r
1063 DBG("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);
\r
1069 static int light_dev_open(struct inode *inode, struct file *file)
\r
1071 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
\r
1072 //struct i2c_client *client = sensor->client;
\r
1082 static int light_dev_release(struct inode *inode, struct file *file)
\r
1084 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
\r
1085 //struct i2c_client *client = sensor->client;
\r
1092 #ifdef CONFIG_COMPAT
1093 static long light_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1096 void __user *arg64 = compat_ptr(arg);
1098 if (!file->f_op || !file->f_op->unlocked_ioctl) {
1099 pr_err("[DEBUG] file->f_op or file->f_op->unlocked_ioctl is null\n");
1104 case COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED:
1105 if (file->f_op->unlocked_ioctl)
1106 ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
1108 case COMPAT_LIGHTSENSOR_IOCTL_ENABLE:
1109 if (file->f_op->unlocked_ioctl)
1110 ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
1120 /* ioctl - I/O control */
\r
1121 static long light_dev_ioctl(struct file *file,
\r
1122 unsigned int cmd, unsigned long arg)
\r
1124 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
\r
1125 struct i2c_client *client = sensor->client;
\r
1126 unsigned int *argp = (unsigned int *)arg;
\r
1131 case LIGHTSENSOR_IOCTL_GET_ENABLED:
\r
1132 *argp = sensor->status_cur;
\r
1134 case LIGHTSENSOR_IOCTL_ENABLE:
\r
1135 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
\r
1136 mutex_lock(&sensor->operation_mutex);
\r
1137 if(*(unsigned int *)argp)
\r
1139 if(sensor->status_cur == SENSOR_OFF)
\r
1141 if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
\r
1142 mutex_unlock(&sensor->operation_mutex);
\r
1143 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
1146 if(sensor->pdata->irq_enable)
\r
1148 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1150 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
1151 enable_irq(client->irq); //enable irq
\r
1156 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
1159 sensor->status_cur = SENSOR_ON;
\r
1164 if(sensor->status_cur == SENSOR_ON)
\r
1166 if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
\r
1167 mutex_unlock(&sensor->operation_mutex);
\r
1171 if(sensor->pdata->irq_enable)
\r
1173 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1175 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
1176 disable_irq_nosync(client->irq);//disable irq
\r
1180 cancel_delayed_work_sync(&sensor->delaywork);
\r
1182 sensor->status_cur = SENSOR_OFF;
\r
1185 mutex_unlock(&sensor->operation_mutex);
\r
1186 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
\r
1198 static int proximity_dev_open(struct inode *inode, struct file *file)
\r
1200 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
\r
1201 //struct i2c_client *client = sensor->client;
\r
1209 static int proximity_dev_release(struct inode *inode, struct file *file)
\r
1211 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
\r
1212 //struct i2c_client *client = sensor->client;
\r
1219 #ifdef CONFIG_COMPAT
1220 static long proximity_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
1223 void __user *arg64 = compat_ptr(arg);
1225 if (!file->f_op || !file->f_op->unlocked_ioctl) {
1226 pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
1231 case COMPAT_PSENSOR_IOCTL_GET_ENABLED:
1232 if (file->f_op->unlocked_ioctl)
1233 ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
1235 case COMPAT_PSENSOR_IOCTL_ENABLE:
1236 if (file->f_op->unlocked_ioctl)
1237 ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
1247 /* ioctl - I/O control */
\r
1248 static long proximity_dev_ioctl(struct file *file,
\r
1249 unsigned int cmd, unsigned long arg)
\r
1251 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
\r
1252 struct i2c_client *client = sensor->client;
\r
1253 unsigned int *argp = (unsigned int *)arg;
\r
1257 case PSENSOR_IOCTL_GET_ENABLED:
\r
1258 *argp = sensor->status_cur;
\r
1260 case PSENSOR_IOCTL_ENABLE:
\r
1261 DBG("%s:PSENSOR_IOCTL_ENABLE start\n", __func__);
\r
1262 mutex_lock(&sensor->operation_mutex);
\r
1263 if(*(unsigned int *)argp)
\r
1265 if(sensor->status_cur == SENSOR_OFF)
\r
1267 if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
\r
1268 mutex_unlock(&sensor->operation_mutex);
\r
1269 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
1273 if(sensor->pdata->irq_enable)
\r
1275 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1277 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
1278 enable_irq(client->irq); //enable irq
\r
1283 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
1286 sensor->status_cur = SENSOR_ON;
\r
1291 if(sensor->status_cur == SENSOR_ON)
\r
1293 if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
\r
1294 mutex_unlock(&sensor->operation_mutex);
\r
1297 if(sensor->pdata->irq_enable)
\r
1299 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1301 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
1302 disable_irq_nosync(client->irq);//disable irq
\r
1306 cancel_delayed_work_sync(&sensor->delaywork);
\r
1307 sensor->status_cur = SENSOR_OFF;
\r
1310 mutex_unlock(&sensor->operation_mutex);
\r
1311 DBG("%s:PSENSOR_IOCTL_ENABLE OK\n", __func__);
\r
1322 static int temperature_dev_open(struct inode *inode, struct file *file)
\r
1324 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
\r
1325 //struct i2c_client *client = sensor->client;
\r
1334 static int temperature_dev_release(struct inode *inode, struct file *file)
\r
1336 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
\r
1337 //struct i2c_client *client = sensor->client;
\r
1346 /* ioctl - I/O control */
\r
1347 static long temperature_dev_ioctl(struct file *file,
\r
1348 unsigned int cmd, unsigned long arg)
\r
1350 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
\r
1351 struct i2c_client *client = sensor->client;
\r
1352 unsigned int *argp = (unsigned int *)arg;
\r
1357 case TEMPERATURE_IOCTL_GET_ENABLED:
\r
1358 *argp = sensor->status_cur;
\r
1360 case TEMPERATURE_IOCTL_ENABLE:
\r
1361 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
\r
1362 mutex_lock(&sensor->operation_mutex);
\r
1363 if(*(unsigned int *)argp)
\r
1365 if(sensor->status_cur == SENSOR_OFF)
\r
1367 if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
\r
1368 mutex_unlock(&sensor->operation_mutex);
\r
1369 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
1372 if(sensor->pdata->irq_enable)
\r
1374 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1376 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
1377 enable_irq(client->irq); //enable irq
\r
1382 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
1385 sensor->status_cur = SENSOR_ON;
\r
1390 if(sensor->status_cur == SENSOR_ON)
\r
1392 if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
\r
1393 mutex_unlock(&sensor->operation_mutex);
\r
1397 if(sensor->pdata->irq_enable)
\r
1399 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1401 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
1402 disable_irq_nosync(client->irq);//disable irq
\r
1406 cancel_delayed_work_sync(&sensor->delaywork);
\r
1408 sensor->status_cur = SENSOR_OFF;
\r
1411 mutex_unlock(&sensor->operation_mutex);
\r
1412 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
\r
1424 static int pressure_dev_open(struct inode *inode, struct file *file)
\r
1426 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
\r
1427 //struct i2c_client *client = sensor->client;
\r
1436 static int pressure_dev_release(struct inode *inode, struct file *file)
\r
1438 //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
\r
1439 //struct i2c_client *client = sensor->client;
\r
1448 /* ioctl - I/O control */
\r
1449 static long pressure_dev_ioctl(struct file *file,
\r
1450 unsigned int cmd, unsigned long arg)
\r
1452 struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
\r
1453 struct i2c_client *client = sensor->client;
\r
1454 unsigned int *argp = (unsigned int *)arg;
\r
1459 case PRESSURE_IOCTL_GET_ENABLED:
\r
1460 *argp = sensor->status_cur;
\r
1462 case PRESSURE_IOCTL_ENABLE:
\r
1463 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
\r
1464 mutex_lock(&sensor->operation_mutex);
\r
1465 if(*(unsigned int *)argp)
\r
1467 if(sensor->status_cur == SENSOR_OFF)
\r
1469 if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
\r
1470 mutex_unlock(&sensor->operation_mutex);
\r
1471 printk("%s:fail to active sensor,ret=%d\n",__func__,result);
\r
1474 if(sensor->pdata->irq_enable)
\r
1476 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1478 DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
\r
1479 enable_irq(client->irq); //enable irq
\r
1484 schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
\r
1487 sensor->status_cur = SENSOR_ON;
\r
1492 if(sensor->status_cur == SENSOR_ON)
\r
1494 if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
\r
1495 mutex_unlock(&sensor->operation_mutex);
\r
1499 if(sensor->pdata->irq_enable)
\r
1501 if(!(sensor->ops->trig & IRQF_SHARED))
\r
1503 DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
\r
1504 disable_irq_nosync(client->irq);//disable irq
\r
1508 cancel_delayed_work_sync(&sensor->delaywork);
\r
1510 sensor->status_cur = SENSOR_OFF;
\r
1513 mutex_unlock(&sensor->operation_mutex);
\r
1514 DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
\r
1528 static int sensor_misc_device_register(struct sensor_private_data *sensor, int type)
\r
1534 case SENSOR_TYPE_ANGLE:
\r
1535 if(!sensor->ops->misc_dev)
\r
1537 sensor->fops.owner = THIS_MODULE;
\r
1538 sensor->fops.unlocked_ioctl = angle_dev_ioctl;
\r
1539 sensor->fops.open = angle_dev_open;
\r
1540 sensor->fops.release = angle_dev_release;
\r
1542 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1543 sensor->miscdev.name = "angle";
\r
1544 sensor->miscdev.fops = &sensor->fops;
\r
1548 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1554 case SENSOR_TYPE_ACCEL:
\r
1555 if(!sensor->ops->misc_dev)
\r
1557 sensor->fops.owner = THIS_MODULE;
\r
1558 sensor->fops.unlocked_ioctl = gsensor_dev_ioctl;
\r
1559 #ifdef CONFIG_COMPAT
\r
1560 sensor->fops.compat_ioctl = gsensor_dev_ioctl;
\r
1562 sensor->fops.open = gsensor_dev_open;
\r
1563 sensor->fops.release = gsensor_dev_release;
\r
1565 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1566 sensor->miscdev.name = "mma8452_daemon";
\r
1567 sensor->miscdev.fops = &sensor->fops;
\r
1571 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1577 case SENSOR_TYPE_COMPASS:
\r
1578 if(!sensor->ops->misc_dev)
\r
1580 sensor->fops.owner = THIS_MODULE;
\r
1581 sensor->fops.unlocked_ioctl = compass_dev_ioctl;
\r
1582 #ifdef CONFIG_COMPAT
1583 sensor->fops.compat_ioctl = compass_dev_compat_ioctl;
1585 sensor->fops.open = compass_dev_open;
\r
1586 sensor->fops.release = compass_dev_release;
\r
1588 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1589 sensor->miscdev.name = "compass";
\r
1590 sensor->miscdev.fops = &sensor->fops;
\r
1594 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1600 case SENSOR_TYPE_GYROSCOPE:
\r
1601 if(!sensor->ops->misc_dev)
\r
1603 sensor->fops.owner = THIS_MODULE;
\r
1604 sensor->fops.unlocked_ioctl = gyro_dev_ioctl;
\r
1605 sensor->fops.open = gyro_dev_open;
\r
1606 sensor->fops.release = gyro_dev_release;
\r
1608 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1609 sensor->miscdev.name = "gyrosensor";
\r
1610 sensor->miscdev.fops = &sensor->fops;
\r
1614 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1620 case SENSOR_TYPE_LIGHT:
\r
1621 if(!sensor->ops->misc_dev)
\r
1623 sensor->fops.owner = THIS_MODULE;
\r
1624 sensor->fops.unlocked_ioctl = light_dev_ioctl;
\r
1625 #ifdef CONFIG_COMPAT
1626 sensor->fops.compat_ioctl = light_dev_compat_ioctl;
1628 sensor->fops.open = light_dev_open;
\r
1629 sensor->fops.release = light_dev_release;
\r
1631 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1632 sensor->miscdev.name = "lightsensor";
\r
1633 sensor->miscdev.fops = &sensor->fops;
\r
1637 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1642 case SENSOR_TYPE_PROXIMITY:
\r
1643 if(!sensor->ops->misc_dev)
\r
1645 sensor->fops.owner = THIS_MODULE;
\r
1646 sensor->fops.unlocked_ioctl = proximity_dev_ioctl;
\r
1647 #ifdef CONFIG_COMPAT
1648 sensor->fops.compat_ioctl = proximity_dev_compat_ioctl;
1650 sensor->fops.open = proximity_dev_open;
\r
1651 sensor->fops.release = proximity_dev_release;
\r
1653 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1654 sensor->miscdev.name = "psensor";
\r
1655 sensor->miscdev.fops = &sensor->fops;
\r
1659 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1664 case SENSOR_TYPE_TEMPERATURE:
\r
1665 if(!sensor->ops->misc_dev)
\r
1667 sensor->fops.owner = THIS_MODULE;
\r
1668 sensor->fops.unlocked_ioctl = temperature_dev_ioctl;
\r
1669 sensor->fops.open = temperature_dev_open;
\r
1670 sensor->fops.release = temperature_dev_release;
\r
1672 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1673 sensor->miscdev.name = "temperature";
\r
1674 sensor->miscdev.fops = &sensor->fops;
\r
1678 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1684 case SENSOR_TYPE_PRESSURE:
\r
1685 if(!sensor->ops->misc_dev)
\r
1687 sensor->fops.owner = THIS_MODULE;
\r
1688 sensor->fops.unlocked_ioctl = pressure_dev_ioctl;
\r
1689 sensor->fops.open = pressure_dev_open;
\r
1690 sensor->fops.release = pressure_dev_release;
\r
1692 sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
\r
1693 sensor->miscdev.name = "pressure";
\r
1694 sensor->miscdev.fops = &sensor->fops;
\r
1698 memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
\r
1705 printk("%s:unknow sensor type=%d\n",__func__,type);
\r
1710 sensor->miscdev.parent = &sensor->client->dev;
\r
1711 result = misc_register(&sensor->miscdev);
\r
1713 dev_err(&sensor->client->dev,
\r
1714 "fail to register misc device %s\n", sensor->miscdev.name);
\r
1718 printk("%s:miscdevice: %s\n",__func__,sensor->miscdev.name);
\r
1726 int sensor_register_slave(int type,struct i2c_client *client,
\r
1727 struct sensor_platform_data *slave_pdata,
\r
1728 struct sensor_operate *(*get_sensor_ops)(void))
\r
1731 struct sensor_operate *ops = get_sensor_ops();
\r
1732 if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))
\r
1734 printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);
\r
1737 sensor_ops[ops->id_i2c] = ops;
\r
1738 printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);
\r
1743 int sensor_unregister_slave(int type,struct i2c_client *client,
\r
1744 struct sensor_platform_data *slave_pdata,
\r
1745 struct sensor_operate *(*get_sensor_ops)(void))
\r
1748 struct sensor_operate *ops = get_sensor_ops();
\r
1749 if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))
\r
1751 printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);
\r
1754 printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);
\r
1755 sensor_ops[ops->id_i2c] = NULL;
\r
1760 int sensor_probe(struct i2c_client *client, const struct i2c_device_id *devid)
\r
1762 struct sensor_private_data *sensor =
\r
1763 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
1764 struct sensor_platform_data *pdata;
\r
1765 struct device_node *np = client->dev.of_node;
\r
1766 enum of_gpio_flags rst_flags, pwr_flags;
\r
1767 unsigned long irq_flags;
\r
1771 dev_info(&client->adapter->dev, "%s: %s,%p\n", __func__, devid->name, client);
\r
1773 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
\r
1778 dev_err(&client->dev, "no device tree\n");
\r
1781 pdata = devm_kzalloc(&client->dev,sizeof(*pdata), GFP_KERNEL);
\r
1786 sensor = devm_kzalloc(&client->dev,sizeof(*sensor), GFP_KERNEL);
\r
1792 of_property_read_u32(np,"type",&(pdata->type));
\r
1794 pdata->irq_pin = of_get_named_gpio_flags(np, "irq-gpio", 0,(enum of_gpio_flags *)&irq_flags);
\r
1795 pdata->reset_pin = of_get_named_gpio_flags(np, "reset-gpio",0,&rst_flags);
\r
1796 pdata->power_pin = of_get_named_gpio_flags(np, "power-gpio",0,&pwr_flags);
\r
1798 of_property_read_u32(np,"irq_enable",&(pdata->irq_enable));
\r
1799 of_property_read_u32(np,"poll_delay_ms",&(pdata->poll_delay_ms));
\r
1801 of_property_read_u32(np,"x_min",&(pdata->x_min));
\r
1802 of_property_read_u32(np,"y_min",&(pdata->y_min));
\r
1803 of_property_read_u32(np,"z_min",&(pdata->z_min));
\r
1804 of_property_read_u32(np,"factory",&(pdata->factory));
\r
1805 of_property_read_u32(np,"layout",&(pdata->layout));
\r
1807 of_property_read_u8(np,"address",&(pdata->address));
\r
1808 of_get_property(np, "project_name", pdata->project_name);
\r
1811 switch(pdata->layout)
\r
1814 pdata->orientation[0] = 1;
\r
1815 pdata->orientation[1] = 0;
\r
1816 pdata->orientation[2] = 0;
\r
1818 pdata->orientation[3] = 0;
\r
1819 pdata->orientation[4] = 1;
\r
1820 pdata->orientation[5] = 0;
\r
1822 pdata->orientation[6] = 0;
\r
1823 pdata->orientation[7] = 0;
\r
1824 pdata->orientation[8] = 1;
\r
1828 pdata->orientation[0] = 0;
\r
1829 pdata->orientation[1] = -1;
\r
1830 pdata->orientation[2] = 0;
\r
1832 pdata->orientation[3] = 1;
\r
1833 pdata->orientation[4] = 0;
\r
1834 pdata->orientation[5] = 0;
\r
1836 pdata->orientation[6] = 0;
\r
1837 pdata->orientation[7] = 0;
\r
1838 pdata->orientation[8] = 1;
\r
1842 pdata->orientation[0] = -1;
\r
1843 pdata->orientation[1] = 0;
\r
1844 pdata->orientation[2] = 0;
\r
1846 pdata->orientation[3] = 0;
\r
1847 pdata->orientation[4] = -1;
\r
1848 pdata->orientation[5] = 0;
\r
1850 pdata->orientation[6] = 0;
\r
1851 pdata->orientation[7] = 0;
\r
1852 pdata->orientation[8] = 1;
\r
1856 pdata->orientation[0] = 0;
\r
1857 pdata->orientation[1] = 1;
\r
1858 pdata->orientation[2] = 0;
\r
1860 pdata->orientation[3] = -1;
\r
1861 pdata->orientation[4] = 0;
\r
1862 pdata->orientation[5] = 0;
\r
1864 pdata->orientation[6] = 0;
\r
1865 pdata->orientation[7] = 0;
\r
1866 pdata->orientation[8] = 1;
\r
1870 pdata->orientation[0] = 1;
\r
1871 pdata->orientation[1] = 0;
\r
1872 pdata->orientation[2] = 0;
\r
1874 pdata->orientation[3] = 0;
\r
1875 pdata->orientation[4] = -1;
\r
1876 pdata->orientation[5] = 0;
\r
1878 pdata->orientation[6] = 0;
\r
1879 pdata->orientation[7] = 0;
\r
1880 pdata->orientation[8] = -1;
\r
1884 pdata->orientation[0] = 0;
\r
1885 pdata->orientation[1] = -1;
\r
1886 pdata->orientation[2] = 0;
\r
1888 pdata->orientation[3] = -1;
\r
1889 pdata->orientation[4] = 0;
\r
1890 pdata->orientation[5] = 0;
\r
1892 pdata->orientation[6] = 0;
\r
1893 pdata->orientation[7] = 0;
\r
1894 pdata->orientation[8] = -1;
\r
1898 pdata->orientation[0] = -1;
\r
1899 pdata->orientation[1] = 0;
\r
1900 pdata->orientation[2] = 0;
\r
1902 pdata->orientation[3] = 0;
\r
1903 pdata->orientation[4] = 1;
\r
1904 pdata->orientation[5] = 0;
\r
1906 pdata->orientation[6] = 0;
\r
1907 pdata->orientation[7] = 0;
\r
1908 pdata->orientation[8] = -1;
\r
1912 pdata->orientation[0] = 0;
\r
1913 pdata->orientation[1] = 1;
\r
1914 pdata->orientation[2] = 0;
\r
1916 pdata->orientation[3] = 1;
\r
1917 pdata->orientation[4] = 0;
\r
1918 pdata->orientation[5] = 0;
\r
1920 pdata->orientation[6] = 0;
\r
1921 pdata->orientation[7] = 0;
\r
1922 pdata->orientation[8] = -1;
\r
1926 pdata->orientation[0] = 1;
\r
1927 pdata->orientation[1] = 0;
\r
1928 pdata->orientation[2] = 0;
\r
1930 pdata->orientation[3] = 0;
\r
1931 pdata->orientation[4] = 1;
\r
1932 pdata->orientation[5] = 0;
\r
1934 pdata->orientation[6] = 0;
\r
1935 pdata->orientation[7] = 0;
\r
1936 pdata->orientation[8] = 1;
\r
1940 client->irq = pdata->irq_pin;
\r
1941 type = pdata->type;
\r
1942 pdata->irq_flags = irq_flags;
\r
1943 DBG("irq_flags = %lu padta->irq_flags = %lu\n",irq_flags, pdata->irq_flags);
\r
1944 DBG("type = %d \n",pdata->type);
\r
1945 DBG("irq = %d \n",pdata->irq);
\r
1946 DBG("irq_pin = %d \n",pdata->irq_pin);
\r
1947 DBG("pwer_pin = %d \n",pdata->power_pin);
\r
1948 DBG("reset_pin = %d \n",pdata->reset_pin);
\r
1949 DBG("irq_enable = %d \n",pdata->irq_enable);
\r
1951 DBG("poll_delay_ms = %d \n",pdata->poll_delay_ms);
\r
1952 DBG("x_min = %d \n",pdata->x_min);
\r
1953 DBG("y_min = %d \n",pdata->y_min);
\r
1954 DBG("z_min = %d \n",pdata->z_min);
\r
1955 DBG("factory = %d \n",pdata->factory);
\r
1956 DBG("layout = %d \n",pdata->layout);
\r
1957 DBG("address = 0x%x \n",pdata->address);
\r
1958 DBG("project_name = [%s] \n",pdata->project_name);
\r
1960 DBG(" == %d,%d ,%d \t ,%d ,%d ,%d , \t ,%d, %d, %d ,==%d\n",pdata->orientation[0],pdata->orientation[1],pdata->orientation[2]
\r
1961 ,pdata->orientation[3],pdata->orientation[4],pdata->orientation[5]
\r
1962 ,pdata->orientation[6],pdata->orientation[7],pdata->orientation[8],ARRAY_SIZE(pdata->orientation));
\r
1965 if((type >= SENSOR_NUM_TYPES) || (type <= SENSOR_TYPE_NULL))
\r
1967 dev_err(&client->adapter->dev, "sensor type is error %d\n", type);
\r
1969 goto out_no_free;
\r
1971 if(((int)devid->driver_data >= SENSOR_NUM_ID) || ((int)devid->driver_data <= ID_INVALID))
\r
1973 dev_err(&client->adapter->dev, "sensor id is error %d\n", (int)devid->driver_data);
\r
1975 goto out_no_free;
\r
1977 i2c_set_clientdata(client, sensor);
\r
1978 sensor->client = client;
\r
1979 sensor->pdata = pdata;
\r
1980 sensor->type = type;
\r
1981 sensor->i2c_id = (struct i2c_device_id *)devid;
\r
1984 memset(&(sensor->axis), 0, sizeof(struct sensor_axis) );
\r
1985 atomic_set(&(sensor->data_ready), 0);
\r
1986 init_waitqueue_head(&(sensor->data_ready_wq));
\r
1987 mutex_init(&sensor->data_mutex);
\r
1988 mutex_init(&sensor->operation_mutex);
\r
1989 mutex_init(&sensor->sensor_mutex);
\r
1990 mutex_init(&sensor->i2c_mutex);
\r
1992 /* As default, report all information */
\r
1993 atomic_set(&sensor->flags.m_flag, 1);
\r
1994 atomic_set(&sensor->flags.a_flag, 1);
\r
1995 atomic_set(&sensor->flags.mv_flag, 1);
\r
1996 atomic_set(&sensor->flags.open_flag, 0);
\r
1997 atomic_set(&sensor->flags.debug_flag, 1);
\r
1998 init_waitqueue_head(&sensor->flags.open_wq);
\r
1999 sensor->flags.delay = 100;
\r
2001 sensor->status_cur = SENSOR_OFF;
\r
2002 sensor->axis.x = 0;
\r
2003 sensor->axis.y = 0;
\r
2004 sensor->axis.z = 0;
\r
2006 result = sensor_chip_init(sensor->client);
\r
2008 goto out_free_memory;
\r
2010 sensor->input_dev = input_allocate_device();
\r
2011 if (!sensor->input_dev) {
\r
2013 dev_err(&client->dev,
\r
2014 "Failed to allocate input device %s\n", sensor->input_dev->name);
\r
2015 goto out_free_memory;
\r
2020 case SENSOR_TYPE_ANGLE:
\r
2021 sensor->input_dev->name = "angle";
\r
2022 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2023 /* x-axis acceleration */
\r
2024 input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2025 /* y-axis acceleration */
\r
2026 input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2027 /* z-axis acceleration */
\r
2028 input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2031 case SENSOR_TYPE_ACCEL:
\r
2032 sensor->input_dev->name = "gsensor";
\r
2033 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2034 /* x-axis acceleration */
\r
2035 input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2036 /* y-axis acceleration */
\r
2037 input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2038 /* z-axis acceleration */
\r
2039 input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
\r
2041 case SENSOR_TYPE_COMPASS:
\r
2042 sensor->input_dev->name = "compass";
\r
2043 /* Setup input device */
\r
2044 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2045 /* yaw (0, 360) */
\r
2046 input_set_abs_params(sensor->input_dev, ABS_RX, 0, 23040, 0, 0);
\r
2047 /* pitch (-180, 180) */
\r
2048 input_set_abs_params(sensor->input_dev, ABS_RY, -11520, 11520, 0, 0);
\r
2049 /* roll (-90, 90) */
\r
2050 input_set_abs_params(sensor->input_dev, ABS_RZ, -5760, 5760, 0, 0);
\r
2051 /* x-axis acceleration (720 x 8G) */
\r
2052 input_set_abs_params(sensor->input_dev, ABS_X, -5760, 5760, 0, 0);
\r
2053 /* y-axis acceleration (720 x 8G) */
\r
2054 input_set_abs_params(sensor->input_dev, ABS_Y, -5760, 5760, 0, 0);
\r
2055 /* z-axis acceleration (720 x 8G) */
\r
2056 input_set_abs_params(sensor->input_dev, ABS_Z, -5760, 5760, 0, 0);
\r
2057 /* status of magnetic sensor */
\r
2058 input_set_abs_params(sensor->input_dev, ABS_RUDDER, -32768, 3, 0, 0);
\r
2059 /* status of acceleration sensor */
\r
2060 input_set_abs_params(sensor->input_dev, ABS_WHEEL, -32768, 3, 0, 0);
\r
2061 /* x-axis of raw magnetic vector (-4096, 4095) */
\r
2062 input_set_abs_params(sensor->input_dev, ABS_HAT0X, -20480, 20479, 0, 0);
\r
2063 /* y-axis of raw magnetic vector (-4096, 4095) */
\r
2064 input_set_abs_params(sensor->input_dev, ABS_HAT0Y, -20480, 20479, 0, 0);
\r
2065 /* z-axis of raw magnetic vector (-4096, 4095) */
\r
2066 input_set_abs_params(sensor->input_dev, ABS_BRAKE, -20480, 20479, 0, 0);
\r
2068 case SENSOR_TYPE_GYROSCOPE:
\r
2069 sensor->input_dev->name = "gyro";
\r
2070 /* x-axis acceleration */
\r
2071 input_set_capability(sensor->input_dev, EV_REL, REL_RX);
\r
2072 input_set_abs_params(sensor->input_dev, ABS_RX, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2073 /* y-axis acceleration */
\r
2074 input_set_capability(sensor->input_dev, EV_REL, REL_RY);
\r
2075 input_set_abs_params(sensor->input_dev, ABS_RY, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2076 /* z-axis acceleration */
\r
2077 input_set_capability(sensor->input_dev, EV_REL, REL_RZ);
\r
2078 input_set_abs_params(sensor->input_dev, ABS_RZ, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2080 case SENSOR_TYPE_LIGHT:
\r
2081 sensor->input_dev->name = "lightsensor-level";
\r
2082 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2083 input_set_abs_params(sensor->input_dev, ABS_MISC, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2084 input_set_abs_params(sensor->input_dev, ABS_TOOL_WIDTH , sensor->ops->brightness[0],sensor->ops->brightness[1], 0, 0);
\r
2086 case SENSOR_TYPE_PROXIMITY:
\r
2087 sensor->input_dev->name = "proximity";
\r
2088 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2089 input_set_abs_params(sensor->input_dev, ABS_DISTANCE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2091 case SENSOR_TYPE_TEMPERATURE:
\r
2092 sensor->input_dev->name = "temperature";
\r
2093 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2094 input_set_abs_params(sensor->input_dev, ABS_THROTTLE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2096 case SENSOR_TYPE_PRESSURE:
\r
2097 sensor->input_dev->name = "pressure";
\r
2098 set_bit(EV_ABS, sensor->input_dev->evbit);
\r
2099 input_set_abs_params(sensor->input_dev, ABS_PRESSURE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
\r
2102 printk("%s:unknow sensor type=%d\n",__func__,type);
\r
2106 sensor->input_dev->dev.parent = &client->dev;
\r
2108 result = input_register_device(sensor->input_dev);
\r
2110 dev_err(&client->dev,
\r
2111 "Unable to register input device %s\n", sensor->input_dev->name);
\r
2112 goto out_input_register_device_failed;
\r
2115 result = sensor_irq_init(sensor->client);
\r
2117 dev_err(&client->dev,
\r
2118 "fail to init sensor irq,ret=%d\n",result);
\r
2119 goto out_input_register_device_failed;
\r
2123 sensor->miscdev.parent = &client->dev;
\r
2124 result = sensor_misc_device_register(sensor, type);
\r
2126 dev_err(&client->dev,
\r
2127 "fail to register misc device %s\n", sensor->miscdev.name);
\r
2128 goto out_misc_device_register_device_failed;
\r
2131 g_sensor[type] = sensor;
\r
2133 if((type == SENSOR_TYPE_ACCEL) && (sensor->pdata->factory)) //only support setting gsensor orientation online now
\r
2135 result = gsensor_class_init();
\r
2137 dev_err(&client->dev,
\r
2138 "fail to register misc device %s\n", sensor->i2c_id->name);
\r
2139 goto out_misc_device_register_device_failed;
\r
2143 #ifdef CONFIG_HAS_EARLYSUSPEND
\r
2144 if((sensor->ops->suspend) && (sensor->ops->resume))
\r
2146 sensor->early_suspend.suspend = sensor_suspend;
\r
2147 sensor->early_suspend.resume = sensor_resume;
\r
2148 sensor->early_suspend.level = 0x02;
\r
2149 register_early_suspend(&sensor->early_suspend);
\r
2153 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
2157 out_misc_device_register_device_failed:
\r
2158 input_unregister_device(sensor->input_dev);
\r
2159 out_input_register_device_failed:
\r
2160 input_free_device(sensor->input_dev);
\r
2164 dev_err(&client->adapter->dev, "%s failed %d\n\n", __func__, result);
\r
2169 static void sensor_shut_down(struct i2c_client *client)
\r
2171 #ifdef CONFIG_HAS_EARLYSUSPEND
\r
2172 struct sensor_private_data *sensor =
\r
2173 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
2174 if((sensor->ops->suspend) && (sensor->ops->resume))
\r
2175 unregister_early_suspend(&sensor->early_suspend);
\r
2176 DBG("%s:%s\n",__func__,sensor->i2c_id->name);
\r
2180 static int sensor_remove(struct i2c_client *client)
\r
2182 struct sensor_private_data *sensor =
\r
2183 (struct sensor_private_data *) i2c_get_clientdata(client);
\r
2186 cancel_delayed_work_sync(&sensor->delaywork);
\r
2187 misc_deregister(&sensor->miscdev);
\r
2188 input_unregister_device(sensor->input_dev);
\r
2189 input_free_device(sensor->input_dev);
\r
2191 #ifdef CONFIG_HAS_EARLYSUSPEND
\r
2192 if((sensor->ops->suspend) && (sensor->ops->resume))
\r
2193 unregister_early_suspend(&sensor->early_suspend);
\r
2198 static const struct i2c_device_id sensor_id[] = {
\r
2200 {"angle_kxtik", ANGLE_ID_KXTIK},
\r
2201 {"angle_lis3dh", ANGLE_ID_LIS3DH},
\r
2203 {"gsensor", ACCEL_ID_ALL},
\r
2204 {"gs_mma8452", ACCEL_ID_MMA845X},
\r
2205 {"gs_kxtik", ACCEL_ID_KXTIK},
\r
2206 {"gs_kxtj9", ACCEL_ID_KXTJ9},
\r
2207 {"gs_lis3dh", ACCEL_ID_LIS3DH},
\r
2208 {"gs_mma7660", ACCEL_ID_MMA7660},
\r
2209 {"gs_mxc6225", ACCEL_ID_MXC6225},
\r
2210 {"gs_dmard10", ACCEL_ID_DMARD10},
\r
2211 {"gs_lsm303d", ACCEL_ID_LSM303D},
\r
2212 {"gs_mc3230",ACCEL_ID_MC3230},
\r
2213 {"mpu6880_acc",ACCEL_ID_MPU6880},
\r
2214 {"mpu6500_acc",ACCEL_ID_MPU6500},
\r
2216 {"compass", COMPASS_ID_ALL},
\r
2217 {"ak8975", COMPASS_ID_AK8975},
\r
2218 {"ak8963", COMPASS_ID_AK8963},
\r
2219 {"ak09911", COMPASS_ID_AK09911},
\r
2220 {"mmc314x", COMPASS_ID_MMC314X},
\r
2222 {"gyro", GYRO_ID_ALL},
\r
2223 {"l3g4200d_gyro", GYRO_ID_L3G4200D},
\r
2224 {"l3g20d_gyro", GYRO_ID_L3G20D},
\r
2225 {"ewtsa_gyro", GYRO_ID_EWTSA},
\r
2226 {"k3g", GYRO_ID_K3G},
\r
2227 {"mpu6880_gyro",GYRO_ID_MPU6880},
\r
2229 {"lightsensor", LIGHT_ID_ALL},
\r
2230 {"light_cm3217", LIGHT_ID_CM3217},
\r
2231 {"light_cm3218", LIGHT_ID_CM3218},
\r
2232 {"light_cm3232", LIGHT_ID_CM3232},
\r
2233 {"light_al3006", LIGHT_ID_AL3006},
\r
2234 {"ls_stk3171", LIGHT_ID_STK3171},
\r
2235 {"ls_isl29023", LIGHT_ID_ISL29023},
\r
2236 {"ls_ap321xx", LIGHT_ID_AP321XX},
\r
2237 {"ls_photoresistor", LIGHT_ID_PHOTORESISTOR},
\r
2238 {"ls_us5152", LIGHT_ID_US5152},
\r
2239 /*proximity sensor*/
\r
2240 {"psensor", PROXIMITY_ID_ALL},
\r
2241 {"proximity_al3006", PROXIMITY_ID_AL3006},
\r
2242 {"ps_stk3171", PROXIMITY_ID_STK3171},
\r
2243 {"ps_ap321xx", PROXIMITY_ID_AP321XX},
\r
2246 {"temperature", TEMPERATURE_ID_ALL},
\r
2247 {"tmp_ms5607", TEMPERATURE_ID_MS5607},
\r
2250 {"pressure", PRESSURE_ID_ALL},
\r
2251 {"pr_ms5607", PRESSURE_ID_MS5607},
\r
2256 static struct of_device_id sensor_dt_ids[] = {
\r
2258 { .compatible = "gs_mma8452" },
\r
2259 { .compatible = "gs_lis3dh" },
\r
2260 { .compatible = "gs_lsm303d" },
\r
2261 { .compatible = "gs_mma7660" },
\r
2262 { .compatible = "gs_mxc6225" },
\r
2263 { .compatible = "gs_mc3230" },
\r
2266 { .compatible = "ak8975" },
\r
2267 { .compatible = "ak8963" },
\r
2268 { .compatible = "ak09911" },
\r
2269 { .compatible = "mmc314x" },
\r
2272 { .compatible = "l3g4200d_gyro" },
\r
2273 { .compatible = "l3g20d_gyro" },
\r
2274 { .compatible = "ewtsa_gyro" },
\r
2275 { .compatible = "k3g" },
\r
2279 { .compatible = "light_cm3217" },
\r
2280 { .compatible = "light_cm3232" },
\r
2281 { .compatible = "light_al3006" },
\r
2282 { .compatible = "ls_stk3171" },
\r
2283 { .compatible = "ls_ap321xx" },
\r
2285 { .compatible = "ls_photoresistor" },
\r
2286 { .compatible = "ls_us5152" },
\r
2288 /*temperature sensor*/
\r
2289 { .compatible = "tmp_ms5607" },
\r
2291 /*pressure sensor*/
\r
2292 { .compatible = "pr_ms5607" },
\r
2295 { .compatible = "hall_och165t" },
\r
2300 static struct i2c_driver sensor_driver = {
\r
2301 .probe = sensor_probe,
\r
2302 .remove = sensor_remove,
\r
2303 .shutdown = sensor_shut_down,
\r
2304 .id_table = sensor_id,
\r
2306 .owner = THIS_MODULE,
\r
2307 .name = "sensors",
\r
2308 .of_match_table = of_match_ptr(sensor_dt_ids),
\r
2312 static int __init sensor_init(void)
\r
2314 int res = i2c_add_driver(&sensor_driver);
\r
2315 struct proc_dir_entry *sensor_proc_entry;
\r
2316 pr_info("%s: Probe name %s\n", __func__, sensor_driver.driver.name);
\r
2318 pr_err("%s failed\n", __func__);
\r
2320 sensor_proc_entry = proc_create("driver/sensor_dbg", 0660, NULL, &sensor_proc_fops);
\r
2321 printk("%s\n", SENSOR_VERSION_AND_TIME);
\r
2325 static void __exit sensor_exit(void)
\r
2327 pr_info("%s\n", __func__);
\r
2328 i2c_del_driver(&sensor_driver);
\r
2331 late_initcall(sensor_init);
\r
2332 module_exit(sensor_exit);
\r
2334 MODULE_AUTHOR("ROCKCHIP Corporation:lw@rock-chips.com");
\r
2335 MODULE_DESCRIPTION("User space character device interface for sensors");
\r
2336 MODULE_LICENSE("GPL");
\r