From cccbc4a7906cbacb6f60586c0db84fb2cac3d86d Mon Sep 17 00:00:00 2001 From: lyx Date: Thu, 14 Apr 2011 06:25:28 -0700 Subject: [PATCH] gsensor mma8452: move devices probe before irq request, and cancle work while deinit --- drivers/input/gsensor/mma8452.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/drivers/input/gsensor/mma8452.c b/drivers/input/gsensor/mma8452.c index 738b5a3c77ab..2bfd288457d3 100755 --- a/drivers/input/gsensor/mma8452.c +++ b/drivers/input/gsensor/mma8452.c @@ -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: ; -- 2.34.1