Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jul 2009 20:40:10 GMT
From:      Ulf Lilleengen <lulf@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 166473 for review
Message-ID:  <200907232040.n6NKeAha075942@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=166473

Change 166473 by lulf@lulf_nobby on 2009/07/23 20:40:06

	- Set the clock frequency correctly. Makes the device accept commands,
	  but it still fails to probe the card correctly.

Affected files ...

.. //depot/projects/avr32/src/sys/dev/mmc/atmel_mci.c#6 edit
.. //depot/projects/avr32/src/sys/dev/mmc/mmc.c#6 edit

Differences ...

==== //depot/projects/avr32/src/sys/dev/mmc/atmel_mci.c#6 (text+ko) ====

@@ -138,8 +138,8 @@
 
 	WR4(sc, MCI_CR, MCI_CR_MCIEN);		/* Enable controller */
 	WR4(sc, MCI_IDR, 0xffffffff);		/* Turn off interrupts */
-	WR4(sc, MCI_DTOR, MCI_DTOR_DTOMUL_1M | 1);
-	WR4(sc, MCI_MR, 0x834a);	// XXX GROSS HACK FROM LINUX
+//	WR4(sc, MCI_DTOR, MCI_DTOR_DTOMUL_1M | 1);
+//	WR4(sc, MCI_MR, 0x834a);	// XXX GROSS HACK FROM LINUX
 	WR4(sc, MCI_SDCR, 0);			/* SLOT A, 1 bit bus */
 }
 
@@ -200,8 +200,9 @@
 		goto out;
 	}
 	mci_clockfreq = devclk_get_rate(dev);
-	sc->host.f_min = 375000; //XXX
-	sc->host.f_max = mci_clockfreq / 2;	/* Typically 65 MHz (XXX: too much?) */
+#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
+	sc->host.f_min = DIV_ROUND_UP(mci_clockfreq, 512);
+	sc->host.f_max = mci_clockfreq / 2;
 	sc->host.host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340;
 	if (sc->wire4)
 		sc->host.caps = MMC_CAP_4_BIT_DATA;
@@ -299,10 +300,19 @@
 		clkdiv = 0;
 	} else {
 		WR4(sc, MCI_CR, MCI_CR_MCIEN);
+		
 		if ((mci_clockfreq % (ios->clock * 2)) == 0)
 			clkdiv = ((mci_clockfreq / ios->clock) / 2) - 1;
 		else
 			clkdiv = (mci_clockfreq / ios->clock) / 2;
+		
+/*
+#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
+		clkdiv = DIV_ROUND_UP(mci_clockfreq, 2 * host->f_min) - 1;
+                if (clkdiv > 255) {
+                        printf("ATMEL MCI: clock too slow\n");
+                        clkdiv = 255;
+                }*/
 	}
 	if (ios->bus_width == bus_width_4)
 		WR4(sc, MCI_SDCR, RD4(sc, MCI_SDCR) | MCI_SDCR_SDCBUS);
@@ -404,7 +414,7 @@
 			ier = MCI_SR_TXBUFE;
 		}
 	}
-//	printf("CMDR %x ARGR %x with data\n", cmdr, cmd->arg);
+	printf("CMDR %x ARGR %x with data\n", cmdr, cmd->arg);
 	WR4(sc, MCI_ARGR, cmd->arg);
 	if (cmdr & MCI_CMDR_TRCMD_START) {
 		if (cmdr & MCI_CMDR_TRDIR) {
@@ -429,12 +439,12 @@
 	// assert locked
 	if (!(sc->flags & CMD_STARTED)) {
 		sc->flags |= CMD_STARTED;
-//		printf("Starting CMD\n");
+		printf("Starting CMD\n");
 		atmel_mci_start_cmd(sc, req->cmd);
 		return;
 	}
 	if (!(sc->flags & STOP_STARTED) && req->stop) {
-//		printf("Starting Stop\n");
+		printf("Starting Stop\n");
 		sc->flags |= STOP_STARTED;
 		atmel_mci_start_cmd(sc, req->stop);
 		return;
@@ -540,7 +550,7 @@
 
 	ATMEL_MCI_LOCK(sc);
 	sr = RD4(sc, MCI_SR) & RD4(sc, MCI_IMR);
-//	printf("i 0x%x\n", sr);
+	printf("i 0x%x\n", sr);
 	cmd = sc->curcmd;
 	if (sr & MCI_SR_ERROR) {
 		// Ignore CRC errors on CMD2 and ACMD47, per relevant standards
@@ -562,40 +572,40 @@
 		}
 	} else {
 		if (sr & MCI_SR_TXBUFE) {
-//			printf("TXBUFE\n");
+			printf("TXBUFE\n");
 			atmel_mci_xmit_done(sc);
 		}
 		if (sr & MCI_SR_RXBUFF) {
-//			printf("RXBUFF\n");
+			printf("RXBUFF\n");
 			WR4(sc, MCI_IDR, MCI_SR_RXBUFF);
 			WR4(sc, MCI_IER, MCI_SR_CMDRDY);
 		}
 		if (sr & MCI_SR_ENDTX) {
-//			printf("ENDTX\n");
+			printf("ENDTX\n");
 		}
 		if (sr & MCI_SR_ENDRX) {
-//			printf("ENDRX\n");
+			printf("ENDRX\n");
 			atmel_mci_read_done(sc);
 		}
 		if (sr & MCI_SR_NOTBUSY) {
-//			printf("NOTBUSY\n");
+			printf("NOTBUSY\n");
 			WR4(sc, MCI_IDR, MCI_SR_NOTBUSY);
 			WR4(sc, MCI_IER, MCI_SR_CMDRDY);
 		}
 		if (sr & MCI_SR_DTIP) {
-//			printf("Data transfer in progress\n");
+			printf("Data transfer in progress\n");
 		}
 		if (sr & MCI_SR_BLKE) {
-//			printf("Block transfer end\n");
+			printf("Block transfer end\n");
 		}
 		if (sr & MCI_SR_TXRDY) {
-//			printf("Ready to transmit\n");
+			printf("Ready to transmit\n");
 		}
 		if (sr & MCI_SR_RXRDY) {
-//			printf("Ready to receive\n");
+			printf("Ready to receive\n");
 		}
 		if (sr & MCI_SR_CMDRDY) {
-//			printf("Command ready\n");
+			printf("Command ready\n");
 			done = 1;
 			cmd->error = MMC_ERR_NONE;
 		}
@@ -606,7 +616,7 @@
 			for (i = 0; i < ((cmd->flags & MMC_RSP_136) ? 4 : 1);
 			     i++) {
 				cmd->resp[i] = RD4(sc, MCI_RSPR + i * 4);
-//				printf("RSPR[%d] = %x\n", i, cmd->resp[i]);
+				printf("RSPR[%d] = %x\n", i, cmd->resp[i]);
 			}
 		}
 		atmel_mci_start(sc);

==== //depot/projects/avr32/src/sys/dev/mmc/mmc.c#6 (text+ko) ====

@@ -107,7 +107,7 @@
 
 SYSCTL_NODE(_hw, OID_AUTO, mmc, CTLFLAG_RD, NULL, "mmc driver");
 
-static int mmc_debug;
+static int mmc_debug = 4;
 SYSCTL_INT(_hw_mmc, OID_AUTO, debug, CTLFLAG_RW, &mmc_debug, 0, "Debug level");
 
 /* bus entry points */
@@ -453,8 +453,9 @@
 		if (err != MMC_ERR_NONE)
 			break;
 		if ((cmd.resp[0] & MMC_OCR_CARD_BUSY) ||
-		    (ocr & MMC_OCR_VOLTAGE) == 0)
+		    (ocr & MMC_OCR_VOLTAGE) == 0) {
 			break;
+		}
 		err = MMC_ERR_TIMEOUT;
 		mmc_ms_delay(10);
 	}
@@ -1304,7 +1305,7 @@
 {
 	uint32_t ocr;
 	device_t dev;
-	int err;
+	int err, err2;
 
 	dev = sc->dev;
 	if (mmcbr_get_power_mode(dev) != power_on) {
@@ -1320,10 +1321,12 @@
 		err = mmc_send_if_cond(sc, 1);
 		if ((bootverbose || mmc_debug) && err == 0)
 			device_printf(sc->dev, "SD 2.0 interface conditions: OK\n");
-		if (mmc_send_app_op_cond(sc, err ? 0 : MMC_OCR_CCS, &ocr) !=
-		    MMC_ERR_NONE) {
-			if (bootverbose || mmc_debug)
+		err2 = mmc_send_app_op_cond(sc, err ? 0 : MMC_OCR_CCS, &ocr);
+		if (err2 != MMC_ERR_NONE) {
+			if (bootverbose || mmc_debug) {
+				device_printf(sc->dev, "ERR: %d, err2: %d, ocr: 0x%x\n", err, err2,   ocr);
 				device_printf(sc->dev, "SD probe: failed\n");
+			}
 			/*
 			 * Failed, try MMC
 			 */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200907232040.n6NKeAha075942>