gsensor mma8452: move devices probe before irq request, and cancle work while deinit
authorlyx <lyx@rock-chips.com>
Thu, 14 Apr 2011 13:25:28 +0000 (06:25 -0700)
committerlyx <lyx@rock-chips.com>
Thu, 14 Apr 2011 13:26:31 +0000 (06:26 -0700)
drivers/input/gsensor/mma8452.c

index 738b5a3c77ab8805d61001dbdf03406698d6d1d3..2bfd288457d3bd79dbbf7aab861dacaf7c38b208 100755 (executable)
@@ -565,7 +565,7 @@ static struct i2c_driver mma8452_driver = {
 static int mma8452_init_client(struct i2c_client *client)
 {
        struct mma8452_data *mma8452;
-       int ret;
+       int ret,irq;
        mma8452 = i2c_get_clientdata(client);
        mmaprintk("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq));
        if ( !gpio_is_valid(client->irq)) {
@@ -580,16 +580,19 @@ static int mma8452_init_client(struct i2c_client *client)
     ret = gpio_direction_input(client->irq);
     if (ret) {
         mmaprintk("failed to set mma7990_trig GPIO gpio input\n");
+               gpio_free(client->irq);
                return ret;
     }
        gpio_pull_updown(client->irq, GPIOPullUp);
-       client->irq = gpio_to_irq(client->irq);
-       ret = request_irq(client->irq, mma8452_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, mma8452);
-       mmaprintk("request irq is %d,ret is  0x%x\n",client->irq,ret);
+       irq = gpio_to_irq(client->irq);
+       ret = request_irq(irq, mma8452_interrupt, IRQF_TRIGGER_LOW, client->dev.driver->name, mma8452);
+       mmaprintk("request irq is %d,ret is  0x%x\n",irq,ret);
        if (ret ) {
+               gpio_free(client->irq);
                mmaprintk(KERN_ERR "mma8452_init_client: request irq failed,ret is %d\n",ret);
         return ret;
        }
+       client->irq = irq;
        disable_irq(client->irq);
        init_waitqueue_head(&data_ready_wq);
  
@@ -620,6 +623,12 @@ static int  mma8452_probe(struct i2c_client *client, const struct i2c_device_id
 
        this_client = client;
 
+       devid = mma8452_get_devid(this_client);
+       if ((MMA8452_DEVID != devid) && (MMA8451_DEVID != devid)) {
+               pr_info("mma8452: invalid devid\n");
+               goto exit_invalid_devid;
+       }
+
        err = mma8452_init_client(client);
        if (err < 0) {
                mmaprintk(KERN_ERR
@@ -627,12 +636,6 @@ static int  mma8452_probe(struct i2c_client *client, const struct i2c_device_id
                goto exit_request_gpio_irq_failed;
        }
 
-       devid = mma8452_get_devid(this_client);
-       if ((MMA8452_DEVID != devid) && (MMA8451_DEVID != devid)) {
-               pr_info("mma8452: invalid devid\n");
-               goto exit_invalid_devid;
-       }
-
        mma8452->input_dev = input_allocate_device();
        if (!mma8452->input_dev) {
                err = -ENOMEM;
@@ -699,9 +702,11 @@ exit_misc_device_register_mma8452_device_failed:
 exit_input_register_device_failed:
        input_free_device(mma8452->input_dev);
 exit_input_allocate_device_failed:
-exit_invalid_devid:
-    free_irq(client->irq, mma8452);
+       free_irq(client->irq, mma8452);
 exit_request_gpio_irq_failed:
+       cancel_delayed_work_sync(&mma8452->delaywork);
+       cancel_work_sync(&mma8452->work);
+exit_invalid_devid:
        kfree(mma8452); 
 exit_alloc_data_failed:
     ;