diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2011-06-07 06:49:42 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2011-07-31 17:28:21 -0400 |
commit | 98ae1ccaf62d5006884e01159bf7a63174b0fc03 (patch) | |
tree | a0c293451f24aad6a823d7b1e7a12e49878c69ff /drivers/mfd/wm8994-core.c | |
parent | 78bb3688ea1830672b8095fb6388593f582cd591 (diff) |
mfd: Fix WM8994 IRQ register cache restore on resume
When the byte swap was factored out into the per-register I/O functions
the register restore for the IRQ mask cache (which we use and store in
CPU native format for the interrupt handler) was not updated to do a byte
swap when it uses the bulk I/O. Fix this by writing the cache out one
register at a time.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'drivers/mfd/wm8994-core.c')
-rw-r--r-- | drivers/mfd/wm8994-core.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index 18f19b7198a0..7caf0d82a9a2 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
@@ -316,7 +316,7 @@ static int wm8994_suspend(struct device *dev) | |||
316 | static int wm8994_resume(struct device *dev) | 316 | static int wm8994_resume(struct device *dev) |
317 | { | 317 | { |
318 | struct wm8994 *wm8994 = dev_get_drvdata(dev); | 318 | struct wm8994 *wm8994 = dev_get_drvdata(dev); |
319 | int ret; | 319 | int ret, i; |
320 | 320 | ||
321 | /* We may have lied to the PM core about suspending */ | 321 | /* We may have lied to the PM core about suspending */ |
322 | if (!wm8994->suspended) | 322 | if (!wm8994->suspended) |
@@ -329,10 +329,16 @@ static int wm8994_resume(struct device *dev) | |||
329 | return ret; | 329 | return ret; |
330 | } | 330 | } |
331 | 331 | ||
332 | ret = wm8994_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK, | 332 | /* Write register at a time as we use the cache on the CPU so store |
333 | WM8994_NUM_IRQ_REGS * 2, &wm8994->irq_masks_cur); | 333 | * it in native endian. |
334 | if (ret < 0) | 334 | */ |
335 | dev_err(dev, "Failed to restore interrupt masks: %d\n", ret); | 335 | for (i = 0; i < ARRAY_SIZE(wm8994->irq_masks_cur); i++) { |
336 | ret = wm8994_reg_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK | ||
337 | + i, wm8994->irq_masks_cur[i]); | ||
338 | if (ret < 0) | ||
339 | dev_err(dev, "Failed to restore interrupt masks: %d\n", | ||
340 | ret); | ||
341 | } | ||
336 | 342 | ||
337 | ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, | 343 | ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2, |
338 | &wm8994->ldo_regs); | 344 | &wm8994->ldo_regs); |