2011-06-07 10:49:47

by Mark Brown

[permalink] [raw]
Subject: [PATCH] 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 <[email protected]>
---
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 77babcf..09e6c3e 100644
--- a/drivers/mfd/wm8994-core.c
+++ b/drivers/mfd/wm8994-core.c
@@ -316,7 +316,7 @@ static int wm8994_suspend(struct device *dev)
static int wm8994_resume(struct device *dev)
{
struct wm8994 *wm8994 = dev_get_drvdata(dev);
- int ret;
+ int ret, i;

/* We may have lied to the PM core about suspending */
if (!wm8994->suspended)
@@ -329,10 +329,16 @@ static int wm8994_resume(struct device *dev)
return ret;
}

- ret = wm8994_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK,
- WM8994_NUM_IRQ_REGS * 2, &wm8994->irq_masks_cur);
- if (ret < 0)
- dev_err(dev, "Failed to restore interrupt masks: %d\n", ret);
+ /* Write register at a time as we use the cache on the CPU so store
+ * it in native endian.
+ */
+ for (i = 0; i < ARRAY_SIZE(wm8994->irq_masks_cur); i++) {
+ ret = wm8994_reg_write(wm8994, WM8994_INTERRUPT_STATUS_1_MASK
+ + i, wm8994->irq_masks_cur[i]);
+ if (ret < 0)
+ dev_err(dev, "Failed to restore interrupt masks: %d\n",
+ ret);
+ }

ret = wm8994_write(wm8994, WM8994_LDO_1, WM8994_NUM_LDO_REGS * 2,
&wm8994->ldo_regs);
--
1.7.5.3


2011-06-20 10:16:06

by Samuel Ortiz

[permalink] [raw]
Subject: Re: [PATCH] mfd: Fix WM8994 IRQ register cache restore on resume

Hi Mark,

On Tue, Jun 07, 2011 at 11:49:42AM +0100, Mark Brown wrote:
> 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.
Thanks, patch applied now.

Cheers,
Samuel.

--
Intel Open Source Technology Centre
http://oss.intel.com/