diff options
author | Mike Chan <mike@android.com> | 2010-04-01 15:35:03 -0700 |
---|---|---|
committer | Arve Hjønnevåg <arve@android.com> | 2010-05-18 21:24:20 -0700 |
commit | 320c65d3a7340ddaa03bf668f08feeb5e65654c4 (patch) | |
tree | 5614d08659442a2a25a84ec70da0f9724ccef973 | |
parent | 9fbed6b0f5347b37ecefe65302419d6cc0ec1df9 (diff) | |
download | experimental-320c65d3a7340ddaa03bf668f08feeb5e65654c4.tar.gz |
i2c: akm8973: Disable on akm_aot_release() instead of pm hooks.
When close is called on the fd and akm_aot_release() is called disable
interrupts and have akm8973 auto power down..
Change-Id: Ice8168321a3427443069bb39d796d4c2667bfc7f
Signed-off-by: Mike Chan <mike@android.com>
-rw-r--r-- | drivers/i2c/chips/akm8973.c | 31 |
1 files changed, 5 insertions, 26 deletions
diff --git a/drivers/i2c/chips/akm8973.c b/drivers/i2c/chips/akm8973.c index f19c5de3144..723eac70d98 100644 --- a/drivers/i2c/chips/akm8973.c +++ b/drivers/i2c/chips/akm8973.c @@ -59,8 +59,6 @@ static int failure_count = 0; static short akmd_delay = 0; -static atomic_t suspend_flag = ATOMIC_INIT(0); - static struct akm8973_platform_data *pdata; static int AKI2C_RxData(char *rxData, int length) @@ -223,7 +221,8 @@ static int AKECS_TransRBuff(char *rbuf, int size) wait_event_interruptible_timeout(data_ready_wq, atomic_read(&data_ready), 1000); if (!atomic_read(&data_ready)) { - if (!atomic_read(&suspend_flag)) { + /* Ignore data errors if there are no open handles */ + if (atomic_read(&open_count) > 0) { printk(KERN_ERR "AKM8973 AKECS_TransRBUFF: Data not ready\n"); failure_count++; @@ -315,6 +314,7 @@ static int akm_aot_open(struct inode *inode, struct file *file) if (atomic_cmpxchg(&open_count, 0, 1) == 0) { if (atomic_cmpxchg(&open_flag, 0, 1) == 0) { atomic_set(&reserve_open_flag, 1); + enable_irq(this_client->irq); wake_up(&open_wq); ret = 0; } @@ -328,6 +328,7 @@ static int akm_aot_release(struct inode *inode, struct file *file) atomic_set(&open_flag, 0); atomic_set(&open_count, 0); wake_up(&open_wq); + disable_irq(this_client->irq); return 0; } @@ -553,23 +554,6 @@ static irqreturn_t akm8973_interrupt(int irq, void *dev_id) return IRQ_HANDLED; } -static void akm8973_suspend(struct device *device) -{ - atomic_set(&suspend_flag, 1); - atomic_set(&reserve_open_flag, atomic_read(&open_flag)); - atomic_set(&open_flag, 0); - wake_up(&open_wq); - disable_irq(this_client->irq); -} - -static void akm8973_resume(struct device *device) -{ - enable_irq(this_client->irq); - atomic_set(&suspend_flag, 0); - atomic_set(&open_flag, atomic_read(&reserve_open_flag)); - wake_up(&open_wq); -} - static struct file_operations akmd_fops = { .owner = THIS_MODULE, .open = akmd_open, @@ -632,6 +616,7 @@ int akm8973_probe(struct i2c_client *client, const struct i2c_device_id *id) err = request_irq(client->irq, akm8973_interrupt, IRQF_TRIGGER_HIGH, "akm8973", akm); + disable_irq(this_client->irq); if (err < 0) { printk(KERN_ERR"AKM8973 akm8973_probe: request irq failed\n"); @@ -740,18 +725,12 @@ static const struct i2c_device_id akm8973_id[] = { { } }; -static struct dev_pm_ops akm8973_pm_ops = { - .suspend_noirq = akm8973_suspend, - .resume_noirq = akm8973_resume, -}; - static struct i2c_driver akm8973_driver = { .probe = akm8973_probe, .remove = akm8973_remove, .id_table = akm8973_id, .driver = { .name = AKM8973_I2C_NAME, - .pm = &akm8973_pm_ops, }, }; |