* [PATCH] spi/pxa2xx: check status register as well to determine if the device is off
@ 2013-09-04 10:37 Mika Westerberg
2013-09-04 19:14 ` Mark Brown
0 siblings, 1 reply; 2+ messages in thread
From: Mika Westerberg @ 2013-09-04 10:37 UTC (permalink / raw)
To: linux-spi
Cc: Eric Miao, Russell King, Haojian Zhuang, Mark Brown,
Mika Westerberg, linux-kernel
The current interrupt handler calls pm_runtime_suspended() to check if the
device is suspended or not. However, runtime PM status of the device is
only set to suspended once all PM runtime suspend hooks have executed.
In case of Intel Lynxpoint we have the device bound to the ACPI power
domain and its runtime suspend hook will put the device to D3hot (or D3cold
if possible). This means that the device is powered off before its state is
set to runtime suspended. While in this state the device might get an
interrupt that is meant for another device (as the interrupt line is
shared), and because the device is powered off accessing its registers will
return 0xffffffff that the driver misinterprets as an invalid state.
When this happens user will see messages like below on the console:
pxa2xx-spi INT33C0:00: bad message state in interrupt handler
Fix this by checking the status register for ~0 and returning IRQ_NONE in
that case.
Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
---
drivers/spi/spi-pxa2xx.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index e0fd6f6..2cbab8a 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -546,8 +546,17 @@ static irqreturn_t ssp_int(int irq, void *dev_id)
if (pm_runtime_suspended(&drv_data->pdev->dev))
return IRQ_NONE;
- sccr1_reg = read_SSCR1(reg);
+ /*
+ * If the device is not yet in RPM suspended state and we get an
+ * interrupt that is meant for another device, check if status bits
+ * are all set to one. That means that the device is already
+ * powered off.
+ */
status = read_SSSR(reg);
+ if (status == ~0)
+ return IRQ_NONE;
+
+ sccr1_reg = read_SSCR1(reg);
/* Ignore possible writes if we don't need to write */
if (!(sccr1_reg & SSCR1_TIE))
--
1.8.4.rc3
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] spi/pxa2xx: check status register as well to determine if the device is off
2013-09-04 10:37 [PATCH] spi/pxa2xx: check status register as well to determine if the device is off Mika Westerberg
@ 2013-09-04 19:14 ` Mark Brown
0 siblings, 0 replies; 2+ messages in thread
From: Mark Brown @ 2013-09-04 19:14 UTC (permalink / raw)
To: Mika Westerberg
Cc: linux-spi, Eric Miao, Russell King, Haojian Zhuang, linux-kernel
[-- Attachment #1: Type: text/plain, Size: 307 bytes --]
On Wed, Sep 04, 2013 at 01:37:43PM +0300, Mika Westerberg wrote:
> The current interrupt handler calls pm_runtime_suspended() to check if the
> device is suspended or not. However, runtime PM status of the device is
> only set to suspended once all PM runtime suspend hooks have executed.
Applied, thanks.
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-09-04 19:15 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-04 10:37 [PATCH] spi/pxa2xx: check status register as well to determine if the device is off Mika Westerberg
2013-09-04 19:14 ` Mark Brown
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome