rk30:improve gyrosensor suspend and resume function
authorlw@rock-chips.com <lw@rock-chips.com>
Thu, 5 Apr 2012 04:17:12 +0000 (12:17 +0800)
committerlw <lw@rock-chips.com>
Thu, 5 Apr 2012 04:17:39 +0000 (12:17 +0800)
drivers/input/gyroscope/l3g4200d.c

index 2c2c9403f2bfb952fed9565ec0c6f02f56af6b6e..52986d462854d7b1563b0a9c1a012e219be962d2 100755 (executable)
@@ -33,9 +33,9 @@
 #endif
 
 #if 0
-#define mmaprintk(x...) printk(x)
+#define DBG(x...) printk(x)
 #else
-#define mmaprintk(x...)  
+#define DBG(x...)  
 #endif
 static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id *id);
 
@@ -263,10 +263,10 @@ static char l3g4200d_get_devid(struct i2c_client *client)
        int tempvalue;
         tempvalue=l3g4200d_read_reg(client, WHO_AM_I);
        if ((tempvalue & 0x00FF) == 0x00D3) {
-               mmaprintk(KERN_INFO "I2C driver registered!\n");
+               DBG(KERN_INFO "I2C driver registered!\n");
                return 1;
        } else {                
-               mmaprintk(KERN_INFO "I2C driver %d!\n",tempvalue);      
+               DBG(KERN_INFO "I2C driver %d!\n",tempvalue);    
                return 0;
        }       
 }
@@ -281,7 +281,7 @@ static int l3g4200d_active(struct i2c_client *client,int enable)
                tmp |=ACTIVE_MASK;
        else
                tmp &=~ACTIVE_MASK;
-       mmaprintk("l3g4200d_active %s (0x%x)\n",enable?"active":"standby",tmp); 
+       DBG("l3g4200d_active %s (0x%x)\n",enable?"active":"standby",tmp);       
        ret = l3g4200d_write_reg(client,CTRL_REG1,tmp);
        return ret;
 }
@@ -336,7 +336,7 @@ static int l3g4200d_start(struct i2c_client *client, char rate)
 { 
     struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
     
-    mmaprintk("%s::enter\n",__FUNCTION__); 
+    DBG("%s::enter\n",__FUNCTION__); 
     if (l3g4200d->status == L3G4200D_OPEN) {
         return 0;      
     }
@@ -346,7 +346,7 @@ static int l3g4200d_start(struct i2c_client *client, char rate)
 
 static int l3g4200d_close_dev(struct i2c_client *client)
 {      
-       mmaprintk("%s :enter\n",__FUNCTION__);  
+       DBG("%s :enter\n",__FUNCTION__);        
        disable_irq_nosync(client->irq);
        return l3g4200d_active(client,0);
 }
@@ -354,7 +354,7 @@ static int l3g4200d_close_dev(struct i2c_client *client)
 static int l3g4200d_close(struct i2c_client *client)
 {
        struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
-       mmaprintk("%s::enter\n",__FUNCTION__); 
+       DBG("%s::enter\n",__FUNCTION__); 
        l3g4200d->status = L3G4200D_CLOSE;
 
        return l3g4200d_close_dev(client);
@@ -364,9 +364,9 @@ static int l3g4200d_reset_rate(struct i2c_client *client, char rate)
 {
        int ret = 0;
        
-       mmaprintk("%s\n",__func__);
+       DBG("%s\n",__func__);
        
-    ret = l3g4200d_close_dev(client);
//   ret = l3g4200d_close_dev(client);
     ret = l3g4200d_start_dev(client, rate);
   
        return ret ;
@@ -395,7 +395,7 @@ static void l3g4200d_report_value(struct i2c_client *client, struct l3g4200d_axi
        input_report_rel(l3g4200d->input_dev, ABS_RY, axis->y);
        input_report_rel(l3g4200d->input_dev, ABS_RZ, axis->z);
        input_sync(l3g4200d->input_dev);
-       mmaprintk("%s:x==%d  y==%d z==%d\n",__func__,axis->x,axis->y,axis->z);
+       DBG("%s:x==%d  y==%d z==%d\n",__func__,axis->x,axis->y,axis->z);
 }
 
 
@@ -422,7 +422,7 @@ static int l3g4200d_get_data(struct i2c_client *client)
        hw_d[1] = (short) (((gyro_data[3]) << 8) | gyro_data[2]);
        hw_d[2] = (short) (((gyro_data[5]) << 8) | gyro_data[4]);
 
-       mmaprintk("%s: x==%d  y==%d z==%d x==%d  y==%d z==%d\n",__func__, gyro_data[0],gyro_data[1],gyro_data[2],gyro_data[3],gyro_data[4],gyro_data[5]);
+       DBG("%s: x==%d  y==%d z==%d x==%d  y==%d z==%d\n",__func__, gyro_data[0],gyro_data[1],gyro_data[2],gyro_data[3],gyro_data[4],gyro_data[5]);
 
 
        axis.x = ((this_data->pdata->negate_x) ? (-hw_d[this_data->pdata->axis_map_x])
@@ -454,13 +454,13 @@ static int l3g4200d_trans_buff(char *rbuf, int size)
 
 static int l3g4200d_open(struct inode *inode, struct file *file)
 {
-       mmaprintk("%s :enter\n",__FUNCTION__);  
+       DBG("%s :enter\n",__FUNCTION__);        
        return 0;//nonseekable_open(inode, file);
 }
 
 static int l3g4200d_release(struct inode *inode, struct file *file)
 {
-       mmaprintk("%s :enter\n",__FUNCTION__);  
+       DBG("%s :enter\n",__FUNCTION__);        
        return 0;
 }
 #define RBUFF_SIZE             12      /* Rx buffer size */
@@ -477,7 +477,7 @@ static long l3g4200d_ioctl( struct file *file, unsigned int cmd,unsigned long ar
        
        switch (cmd) {
        case L3G4200D_IOCTL_GET_ENABLE: 
-               mmaprintk("%s :L3G4200D_IOCTL_GET_ENABLE\n",__FUNCTION__);      
+               DBG("%s :L3G4200D_IOCTL_GET_ENABLE\n",__FUNCTION__);    
                ret=!l3g4200d->status;
                if (copy_to_user(argp, &ret, sizeof(ret)))
                {
@@ -485,12 +485,20 @@ static long l3g4200d_ioctl( struct file *file, unsigned int cmd,unsigned long ar
                        return -EFAULT;
                }
                break;
-       //case ECS_IOCTL_START:
        case L3G4200D_IOCTL_SET_ENABLE:                 
-               mmaprintk("%s :L3G4200D_IOCTL_SET_ENABLE\n",__FUNCTION__);      
-               ret = l3g4200d_start(client, ODR100_BW12_5);
-               if (ret < 0)
+               DBG("%s :L3G4200D_IOCTL_SET_ENABLE,flag=%d\n",__FUNCTION__,*(unsigned int *)argp);
+               if(*(unsigned int *)argp)
+               {
+                       ret = l3g4200d_start(client, ODR100_BW12_5);
+                       if (ret < 0)
+                       return ret;
+               }
+               else
+               {
+                       ret = l3g4200d_close(client);
+                       if (ret < 0)
                        return ret;
+               }
                ret=l3g4200d->status;
                if (copy_to_user(argp, &ret, sizeof(ret)))
                {
@@ -498,14 +506,8 @@ static long l3g4200d_ioctl( struct file *file, unsigned int cmd,unsigned long ar
                        return -EFAULT;
                }
                break;
-       case ECS_IOCTL_CLOSE:           
-               mmaprintk("%s :ECS_IOCTL_CLOSE\n",__FUNCTION__);
-               ret = l3g4200d_close(client);
-               if (ret < 0)
-                       return ret;
-               break;
        case L3G4200D_IOCTL_SET_DELAY:          
-               mmaprintk("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);
+               DBG("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);
                if (copy_from_user(&rate, argp, sizeof(rate)))
                return -EFAULT;
                ret = l3g4200d_reset_rate(client, 0x00);//rate<<4);//0x20               
@@ -526,7 +528,7 @@ static long l3g4200d_ioctl( struct file *file, unsigned int cmd,unsigned long ar
                return -ENOTTY;
        }
        
-       mmaprintk("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);
+       DBG("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);
        return 0;
 }
 
@@ -536,7 +538,7 @@ static void l3g4200d_work_func(struct work_struct *work)
        struct i2c_client *client = l3g4200d->client;
        
        if (l3g4200d_get_data(client) < 0) 
-               mmaprintk(KERN_ERR "L3G4200D mma_work_func: Get data failed\n");
+               DBG(KERN_ERR "L3G4200D mma_work_func: Get data failed\n");
                
        enable_irq(client->irq);                
 }
@@ -548,7 +550,7 @@ static void  l3g4200d_delaywork_func(struct work_struct *work)
        struct i2c_client *client = l3g4200d->client;
 
        if (l3g4200d_get_data(client) < 0) 
-               mmaprintk(KERN_ERR "L3G4200D mma_work_func: Get data failed\n");
+               DBG(KERN_ERR "L3G4200D mma_work_func: Get data failed\n");
        enable_irq(client->irq);                
 }
 
@@ -558,7 +560,7 @@ static irqreturn_t l3g4200d_interrupt(int irq, void *dev_id)
        
        disable_irq_nosync(irq);
        schedule_delayed_work(&l3g4200d->delaywork, msecs_to_jiffies(200));
-       mmaprintk("%s :enter\n",__FUNCTION__);  
+       DBG("%s :enter\n",__FUNCTION__);        
        return IRQ_HANDLED;
 }
 
@@ -594,29 +596,30 @@ static int l3g4200d_remove(struct i2c_client *client)
 #ifdef CONFIG_HAS_EARLYSUSPEND
 static void l3g4200d_suspend(struct early_suspend *h)
 {
-       //struct i2c_client *client = container_of(l3g4200d_device.parent, struct i2c_client, dev);
-       //struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
-//     if(l3g4200d->status == L3G4200D_OPEN)
-//     {
-               //l3g4200d->status = L3G4200D_SUSPEND;
-//             l3g4200d_close_dev(client);
-//     }
+       struct i2c_client *client = container_of(l3g4200d_device.parent, struct i2c_client, dev);
+       struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
+       if(l3g4200d->status == L3G4200D_OPEN)
+       {
+               l3g4200d_close_dev(client);
+       }
+       
+       DBG("%s:%d\n",__func__,l3g4200d->status);
 }
 
 static void l3g4200d_resume(struct early_suspend *h)
 {
-       //struct i2c_client *client = container_of(l3g4200d_device.parent, struct i2c_client, dev);
-   // struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
-       //mmaprintk("Gsensor mma7760 resume!! l3g4200d->status %d\n",l3g4200d->status);
-       //if((l3g4200d->status == L3G4200D_SUSPEND) && (l3g4200d->status != L3G4200D_OPEN))
-//     if (l3g4200d->status == L3G4200D_OPEN)
-//             l3g4200d_start_dev(client,l3g4200d->curr_tate);
+       struct i2c_client *client = container_of(l3g4200d_device.parent, struct i2c_client, dev);
+       struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
+       if (l3g4200d->status == L3G4200D_OPEN)
+               l3g4200d_start_dev(client,l3g4200d->curr_tate);
+       
+       DBG("%s:%d\n",__func__,l3g4200d->status);
 }
 #else
 static int l3g4200d_suspend(struct i2c_client *client, pm_message_t mesg)
 {
        int ret=0;
-       //mmaprintk("Gsensor mma7760 enter 2 level  suspend l3g4200d->status %d\n",l3g4200d->status);
+       //DBG("Gsensor mma7760 enter 2 level  suspend l3g4200d->status %d\n",l3g4200d->status);
        //struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
        //if(l3g4200d->status == L3G4200D_OPEN)
        //{
@@ -629,7 +632,7 @@ static int l3g4200d_resume(struct i2c_client *client)
 {
        int ret=0;
        //struct l3g4200d_data *l3g4200d = (struct l3g4200d_data *)i2c_get_clientdata(client);
-       //mmaprintk("Gsensor mma7760 2 level resume!! l3g4200d->status %d\n",l3g4200d->status);
+       //DBG("Gsensor mma7760 2 level resume!! l3g4200d->status %d\n",l3g4200d->status);
        //if((l3g4200d->status == L3G4200D_SUSPEND) && (l3g4200d->status != L3G4200D_OPEN))
        //if (l3g4200d->status == L3G4200D_OPEN)
        //ret = l3g4200d_start_dev(client, l3g4200d->curr_tate);
@@ -661,27 +664,27 @@ static int l3g4200d_init_client(struct i2c_client *client)
        struct l3g4200d_data *l3g4200d;
        int ret;
        l3g4200d = i2c_get_clientdata(client);
-       mmaprintk("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq));
+       DBG("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq));
        if ( !gpio_is_valid(client->irq)) {
-               mmaprintk("+++++++++++gpio_is_invalid\n");
+               DBG("+++++++++++gpio_is_invalid\n");
                return -EINVAL;
        }
        ret = gpio_request(client->irq, "l3g4200d_int");
        if (ret) {
-               mmaprintk( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq));
+               DBG( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq));
                return ret;
        }
        ret = gpio_direction_input(client->irq);
        if (ret) {
-       mmaprintk("failed to set mma7990_trig GPIO gpio input\n");
+       DBG("failed to set mma7990_trig GPIO gpio input\n");
                return ret;
        }
        gpio_pull_updown(client->irq, GPIOPullUp);
        client->irq = gpio_to_irq(client->irq);
        ret = request_irq(client->irq, l3g4200d_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, l3g4200d);
-       mmaprintk("request irq is %d,ret is  0x%x\n",client->irq,ret);
+       DBG("request irq is %d,ret is  0x%x\n",client->irq,ret);
        if (ret ) {
-               mmaprintk(KERN_ERR "l3g4200d_init_client: request irq failed,ret is %d\n",ret);
+               DBG(KERN_ERR "l3g4200d_init_client: request irq failed,ret is %d\n",ret);
         return ret;
        }
        disable_irq(client->irq);
@@ -728,7 +731,7 @@ static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id
 
        l3g4200d = kzalloc(sizeof(struct l3g4200d_data), GFP_KERNEL);
        if (!l3g4200d) {
-               mmaprintk("[l3g4200d]:alloc data failed.\n");
+               DBG("[l3g4200d]:alloc data failed.\n");
                err = -ENOMEM;
                goto exit_alloc_data_failed;
        }
@@ -743,7 +746,7 @@ static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id
 
        err = l3g4200d_init_client(client);
        if (err < 0) {
-               mmaprintk(KERN_ERR
+               DBG(KERN_ERR
                       "l3g4200d_probe: l3g4200d_init_client failed\n");
                goto exit_request_gpio_irq_failed;
        }
@@ -766,7 +769,7 @@ static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id
        l3g4200d->input_dev = input_allocate_device();
        if (!l3g4200d->input_dev) {
                err = -ENOMEM;
-               mmaprintk(KERN_ERR
+               DBG(KERN_ERR
                       "l3g4200d_probe: Failed to allocate input device\n");
                goto exit_input_allocate_device_failed;
        }
@@ -788,7 +791,7 @@ static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id
 
        err = input_register_device(l3g4200d->input_dev);
        if (err < 0) {
-               mmaprintk(KERN_ERR
+               DBG(KERN_ERR
                       "l3g4200d_probe: Unable to register input device: %s\n",
                       l3g4200d->input_dev->name);
                goto exit_input_register_device_failed;
@@ -797,14 +800,14 @@ static int  l3g4200d_probe(struct i2c_client *client, const struct i2c_device_id
        l3g4200d_device.parent = &client->dev;
        err = misc_register(&l3g4200d_device);
        if (err < 0) {
-               mmaprintk(KERN_ERR
+               DBG(KERN_ERR
                       "l3g4200d_probe: mmad_device register failed\n");
                goto exit_misc_device_register_l3g4200d_device_failed;
        }
 
        err = gsensor_sysfs_init();
        if (err < 0) {
-               mmaprintk(KERN_ERR
+               DBG(KERN_ERR
             "l3g4200d_probe: gsensor sysfs init failed\n");
                goto exit_gsensor_sysfs_init_failed;
        }
@@ -843,7 +846,7 @@ exit_kfree:
 exit_request_gpio_irq_failed:
        kfree(l3g4200d);        
 exit_alloc_data_failed:
-       mmaprintk("%s error\n",__FUNCTION__);
+       DBG("%s error\n",__FUNCTION__);
        return err;
 }