]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
input: misc: inv: prevent IRQ revival
authorSang-Hun Lee <sanlee@nvidia.com>
Wed, 9 Oct 2013 21:14:24 +0000 (14:14 -0700)
committerMitch Luban <mluban@nvidia.com>
Wed, 18 Dec 2013 05:58:47 +0000 (21:58 -0800)
Problem description:
 - nvi_work_function may revive IRQ which was disabled
   during suspend and shutdown

Fix description:
 - Add a flag stop_workqueue which is set during suspend
   and shutdown
 - If the flag is set, make workqueue not revive the IRQ

Bug 1361923

Change-Id: I498091602ef9c43b75c0a17d7fe0837624271959
Signed-off-by: Sang-Hun Lee <sanlee@nvidia.com>
Reviewed-on: http://git-master/r/284347
Reviewed-on: http://git-master/r/330860
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Robert Collins <rcollins@nvidia.com>
Reviewed-by: Erik Lilliebjerg <elilliebjerg@nvidia.com>
Reviewed-by: Mitch Luban <mluban@nvidia.com>
drivers/input/misc/mpu/inv_gyro.c
drivers/input/misc/mpu/inv_gyro.h

index 857a5adebd527bfc589aec9d788bcafe9057de36..02bfab481f5a7a59516ca7780f74a4d053cdb3d8 100644 (file)
@@ -4486,6 +4486,7 @@ static int nvi_suspend(struct device *dev)
        if (!inf->irq_disabled)
                disable_irq_nosync(inf->i2c->irq);
        inf->irq_disabled = true;
+       inf->stop_workqueue = true;
        spin_unlock_irqrestore(&inf->time_stamp_lock, flags);
        synchronize_irq(inf->i2c->irq);
 
@@ -4511,6 +4512,7 @@ static int nvi_resume(struct device *dev)
        if (inf->irq_disabled)
                enable_irq(inf->i2c->irq);
        inf->irq_disabled = false;
+       inf->stop_workqueue = false;
        spin_unlock_irqrestore(&inf->time_stamp_lock, flags);
 
        mutex_lock(&inf->mutex);
@@ -4540,6 +4542,7 @@ static void nvi_shutdown(struct i2c_client *client)
        if (!inf->irq_disabled)
                disable_irq_nosync(client->irq);
        inf->irq_disabled = true;
+       inf->stop_workqueue = true;
        spin_unlock_irqrestore(&inf->time_stamp_lock, flags);
        synchronize_irq(inf->i2c->irq);
 
@@ -4642,7 +4645,8 @@ static void nvi_work_func(struct work_struct *work)
        }
 
        spin_lock_irqsave(&inf->time_stamp_lock, flags);
-       if (inf->irq_disabled && !(inf->suspend || inf->shutdown)) {
+       if (inf->irq_disabled && !inf->stop_workqueue
+               && !(inf->suspend || inf->shutdown)) {
                enable_irq(inf->i2c->irq);
                inf->irq_disabled = false;
        }
index 3c73312e207056fc0d173814c92adbfddcdf429b..5dac9aa4d2e94d518c65cc799be891454f99a0c9 100644 (file)
@@ -442,6 +442,7 @@ struct inv_gyro_state_s {
        u16 fifo_sample_size;
        bool shutdown;
        bool suspend;
+       bool stop_workqueue;
        bool fifo_reset_3050;
        bool mot_det_en;
        s64 fifo_ts;