[PATCH 7/7] fix-hdq-fiq-interface.patch
Andy Green
andy at openmoko.com
Tue Sep 23 01:17:50 CEST 2008
From: Sean McNeil <sean at mcneil.com>
Try to make sure about no compiler malarky by volatile. Change hdq busy
detect. Change error handling path in hdq interface to fiq.
Signed-off-by: Sean McNeil <sean at mcneil.com>
---
drivers/power/gta02_hdq.c | 20 +++++++++++++++-----
1 files changed, 15 insertions(+), 5 deletions(-)
diff --git a/drivers/power/gta02_hdq.c b/drivers/power/gta02_hdq.c
index 6c228b4..99bd366 100644
--- a/drivers/power/gta02_hdq.c
+++ b/drivers/power/gta02_hdq.c
@@ -25,6 +25,13 @@
#define HDQ_READ 0
#define HDQ_WRITE 0x80
+static int fiq_busy(void)
+{
+ int request = (volatile u8)fiq_ipc.hdq_request_ctr;
+ int transact = (volatile u8)fiq_ipc.hdq_transaction_ctr;
+
+ return (request != transact);
+}
int gta02hdq_initialized(void)
{
@@ -39,8 +46,9 @@ int gta02hdq_read(int address)
mutex_lock(&fiq_ipc.hdq_lock);
+ fiq_ipc.hdq_error = 0;
fiq_ipc.hdq_ads = address | HDQ_READ;
- fiq_ipc.hdq_request_ctr = fiq_ipc.hdq_transaction_ctr + 1;
+ fiq_ipc.hdq_request_ctr++;
fiq_kick();
/*
* FIQ takes care of it while we block our calling process
@@ -50,7 +58,7 @@ int gta02hdq_read(int address)
while (count_sleeps--) {
msleep(10); /* valid transaction always completes in < 10ms */
- if (fiq_ipc.hdq_request_ctr != fiq_ipc.hdq_transaction_ctr)
+ if (fiq_busy())
continue;
if (fiq_ipc.hdq_error) {
@@ -63,7 +71,6 @@ int gta02hdq_read(int address)
ret = fiq_ipc.hdq_rx_data;
goto done;
}
- ret = -EINVAL;
done:
mutex_unlock(&fiq_ipc.hdq_lock);
@@ -78,6 +85,7 @@ int gta02hdq_write(int address, u8 data)
mutex_lock(&fiq_ipc.hdq_lock);
+ fiq_ipc.hdq_error = 0;
fiq_ipc.hdq_ads = address | HDQ_WRITE;
fiq_ipc.hdq_tx_data = data;
fiq_ipc.hdq_request_ctr++;
@@ -90,13 +98,15 @@ int gta02hdq_write(int address, u8 data)
while (count_sleeps--) {
msleep(10); /* valid transaction always completes in < 10ms */
- if (fiq_ipc.hdq_request_ctr != fiq_ipc.hdq_transaction_ctr)
+ if (fiq_busy())
continue; /* something bad with FIQ */
if (fiq_ipc.hdq_error)
goto done; /* didn't see a response in good time */
+
+ ret = 0;
+ goto done;
}
- ret = -EINVAL;
done:
mutex_unlock(&fiq_ipc.hdq_lock);
More information about the openmoko-kernel
mailing list