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