r2668 - developers/nbd/ar6k/hif
nbd at sita.openmoko.org
nbd at sita.openmoko.org
Thu Aug 9 13:16:08 CEST 2007
Author: nbd
Date: 2007-08-09 13:16:08 +0200 (Thu, 09 Aug 2007)
New Revision: 2668
Modified:
developers/nbd/ar6k/hif/hif.c
Log:
ar6k: replace direct mmc_io_rw_extended calls with calls to sdio_*, use one-byte ops only (for testing)
Modified: developers/nbd/ar6k/hif/hif.c
===================================================================
--- developers/nbd/ar6k/hif/hif.c 2007-08-08 15:43:06 UTC (rev 2667)
+++ developers/nbd/ar6k/hif/hif.c 2007-08-09 11:16:08 UTC (rev 2668)
@@ -48,11 +48,6 @@
};
HTC_CALLBACKS htcCallbacks;
-#if 0
-extern A_UINT32 onebitmode;
-extern A_UINT32 busspeedlow;
-extern A_UINT32 debughif;
-#endif
#define PFX "ar6k_hif: "
#ifdef DEBUG
@@ -85,7 +80,7 @@
}
A_STATUS
-HIFReadWrite(HIF_DEVICE *device,
+HIFReadWrite(HIF_DEVICE *func,
A_UINT32 address,
A_UCHAR *buffer,
A_UINT32 length,
@@ -94,6 +89,7 @@
{
int ret;
u8 write, bang;
+ u8 reg;
/* XXX: handle bigger block sizes */
#if 0
@@ -130,17 +126,45 @@
write = (request->direction == HIF_WRITE);
bang = !(request->amode == HIF_INCREMENTAL_ADDRESS);
- printk("rwreq: %s at 0x%x [bang=%d, len=%d, async=%d]\n", (write ? "write" : "read"), address, bang, length, (request->emode == HIF_ASYNCHRONOUS));
/* XXX: does not handle block mode with blocksz != 1 properly yet */
/* Send the command out */
if (request->emode == HIF_ASYNCHRONOUS) {
- mmc_async_io_rw_extended(device->card, write, device->num, address, bang, buffer, length, hifRWCompletionHandler, context);
+ mmc_async_io_rw_extended(func->card, write, func->num, address, bang, buffer, length, hifRWCompletionHandler, context);
return A_OK;
}
- ret = mmc_io_rw_extended(device->card, write, device->num, address, bang, buffer, length);
- printk("buf: 0x%02x\n", *((u8*)buffer));
- A_MDELAY(100);
+ ret = 0;
+
+#if 1
+ while (length > 0) {
+ if (write)
+ sdio_writeb(func, *buffer, address, &ret);
+ else
+ *buffer = sdio_readb(func, address, &ret);
+
+ length--;
+ buffer++;
+ if (!bang)
+ address++;
+ }
+#else
+ else {
+ if (write) {
+ if (bang)
+ ret = sdio_writesb(func, address, buffer, length);
+ else
+ ret = sdio_memcpy_toio(func, address, buffer, length);
+ } else {
+ if (bang)
+ ret = sdio_readsb(func, buffer, address, length);
+ else
+ ret = sdio_memcpy_fromio(func, buffer, address, length);
+ }
+ }
+#endif
+ if (ret)
+ printk("fn: %d, addr:0x%04x, buf: 0x%02x, len:%d, status: %d\n", func->num, address, *((u8*)buffer), length, ret);
+
return (ret == MMC_ERR_NONE ? A_OK : A_ERROR);
}
@@ -256,12 +280,19 @@
int hifDeviceInserted(struct sdio_func *func, const struct sdio_device_id *id)
{
int ret;
+ u8 ctrl;
sdio_claim_host(func);
+
+ mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_POWER, 0, &ctrl);
+ ctrl |= SDIO_POWER_EMPC;
+ mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_POWER, ctrl, NULL);
+
ret = sdio_enable_func(func);
if (ret)
return ret;
+
/* XXX: do we need 1-bit mode? */
#if 0
BOOL enabled;
@@ -308,7 +339,6 @@
/*
* Check if the target supports block mode. This result of this check
* can be used to implement the HIFReadWrite API.
- * XXX: probably unnecessary, stack currently only does 1 byte blocks
*/
#if 0
if (HIF_DEVICE_GET_SDIO_FUNC_MAXBLKSIZE(handle)) {
@@ -372,7 +402,10 @@
* issues the first command after switching on dragon. Need to
* investigate this a bit more - TODO
*/
+#if 0
A_MDELAY(1000);
+#endif
+
/* Inform HTC */
if ((htcCallbacks.deviceInsertedHandler(func)) != A_OK) {
AR_DEBUG_PRINTF(ATH_DEBUG_TRACE, ("Device rejected\n"));
More information about the commitlog
mailing list