Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Sep 2006 20:28:18 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 106030 for review
Message-ID:  <200609122028.k8CKSIbL079268@repoman.freebsd.org>

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

Change 106030 by imp@imp_lighthouse on 2006/09/12 20:27:42

	Break out mmc detection code to its own routine.
	Add stubbed sd card detection code
	minor formatting nits.

Affected files ...

.. //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#3 edit

Differences ...

==== //depot/projects/arm/src/sys/arm/at91/at91_qdmmc.c#3 (text+ko) ====

@@ -128,7 +128,8 @@
 
 	error = RD4(sc, MCI_SR) & MCI_SR_ERROR;
 	if (error) {
-		if ((cmd != AT91C_SDCARD_APP_OP_COND_CMD) && (cmd != AT91C_MMC_SEND_OP_COND_CMD)) {
+		if ((cmd != AT91C_SDCARD_APP_OP_COND_CMD) &&
+		    (cmd != AT91C_MMC_SEND_OP_COND_CMD)) {
 			//printf("qdmmc: Error 0x%x\n", error);
 			return (error);
 		}
@@ -150,6 +151,137 @@
 }
 
 static int
+at91_qdmmc_sdcard_init(device_t dev)
+{
+	return (ENXIO);
+}
+
+static int
+at91_qdmmc_mmc_init(device_t dev)
+{
+	struct at91_qdmmc_softc *sc = device_get_softc(dev);
+	uint32_t cond;
+	int err;
+
+	err = 0;
+	/* get all cards into idle state */
+	at91_qdmmc_SendCommand(dev, AT91C_MMC_GO_IDLE_STATE_CMD,
+	    AT91C_NO_ARGUMENT);
+
+	/* check operating conditions */
+	do {	/* loop on busy */
+		err = at91_qdmmc_SendCommand(dev, AT91C_MMC_SEND_OP_COND_CMD,
+		    AT91C_MMC_HOST_VOLTAGE_RANGE);
+		if (err != 0) {
+			err = 0;
+			printf("No MMC cards found\n");
+			goto out;
+		}
+		cond = RD4(sc, MCI_RSPR);
+	} while ((cond & AT91C_CARD_POWER_UP_BUSY) == 0);
+	printf("at91_qdmmc_attach: operating conditions: 0x%x\n",
+	    cond & ~(AT91C_CARD_POWER_UP_BUSY));
+
+	/* now find our cards */
+	for(sc->nb_cards = 0; sc->nb_cards < MMC_MAX; sc->nb_cards++) {
+		int status;
+		int card = sc->nb_cards;
+		status = at91_qdmmc_SendCommand(dev, AT91C_MMC_ALL_SEND_CID_CMD,
+		    AT91C_NO_ARGUMENT);
+		if (status != 0) {
+			break;
+		}
+		sc->cards[card].CID[0] = RD4(sc, MCI_RSPR + 0);
+		sc->cards[card].CID[1] = RD4(sc, MCI_RSPR + 4);
+		sc->cards[card].CID[2] = RD4(sc, MCI_RSPR + 8);
+		sc->cards[card].CID[3] = RD4(sc, MCI_RSPR + 12);
+		printf("Found MMC %i - CID = 0x%x%x%x%x\n", card,
+		    sc->cards[card].CID[0],
+		    sc->cards[card].CID[1],
+		    sc->cards[card].CID[2],
+		    sc->cards[card].CID[3]);
+		printf("MMC %i: Vendor-ID = 0x%x\n", card,
+		    sc->cards[card].CID[0] >> 24),
+		printf("MMC %i: OEM-ID = 0x%x\n", card,
+		    (sc->cards[card].CID[0] >> 8) & 0xffff),
+		sc->cards[card].name[0] = (sc->cards[card].CID[0] >> 0) & 0xff;
+		sc->cards[card].name[1] = (sc->cards[card].CID[1] >> 24) & 0xff;
+		sc->cards[card].name[2] = (sc->cards[card].CID[1] >> 16) & 0xff;
+		sc->cards[card].name[3] = (sc->cards[card].CID[1] >> 8) & 0xff;
+		sc->cards[card].name[4] = (sc->cards[card].CID[1] >> 0) & 0xff;
+		sc->cards[card].name[5] = (sc->cards[card].CID[2] >> 24) & 0xff;
+		sc->cards[card].name[6] = '\0';
+		printf("MMC %i: Productname = %s\n", card,
+		    sc->cards[card].name);
+		printf("MMC %i: Revision = 0x%x\n", card,
+		    (sc->cards[card].CID[2] >> 16) & 0xff),
+		printf("MMC %i: Serial = 0x%x\n", card,
+		    (sc->cards[card].CID[2] << 16) |
+		    (sc->cards[card].CID[3] >> 16));
+		int year = 1997;
+		year += ((sc->cards[card].CID[3] >> 8) & 0xf);
+		int month = 0;
+		month += ((sc->cards[card].CID[3] >> 12) & 0xf);
+		printf("MMC %i: Manufacturing Date = %i/%i\n", card, year,
+		    month);
+
+		sc->cards[card].addr = card + AT91C_FIRST_RCA;
+		status = at91_qdmmc_SendCommand(dev,
+		    AT91C_MMC_SET_RELATIVE_ADDR_CMD,
+		    (sc->cards[card].addr) << 16);
+		if (status != 0) {
+			printf("Failed to set address for MMC %i\n", card);
+			goto out;
+		}
+		printf("Set MMC %i address to 0x%x\n", card,
+		    sc->cards[card].addr);
+
+		status = at91_qdmmc_SendCommand(dev, AT91C_SEND_CSD_CMD,
+		    (sc->cards[card].addr) << 16);
+		if (status != 0) {
+			printf("Failed to get CSD for MMC %i\n", card);
+			goto out;
+		}
+		sc->cards[card].CSD[0] = RD4(sc, MCI_RSPR + 0);
+		sc->cards[card].CSD[1] = RD4(sc, MCI_RSPR + 4);
+		sc->cards[card].CSD[2] = RD4(sc, MCI_RSPR + 8);
+		sc->cards[card].CSD[3] = RD4(sc, MCI_RSPR + 12);
+		printf("MMC %i: CSD = 0x%x%x%x%x\n", card,
+		    sc->cards[card].CSD[0],
+		    sc->cards[card].CSD[1],
+		    sc->cards[card].CSD[2],
+		    sc->cards[card].CSD[3]);
+		uint64_t c_size;
+		uint64_t c_size_mult;
+		sc->cards[card].sector_size =
+		    1 << ((sc->cards[card].CSD[1] >> 16) & 0xf);
+		printf("MMC %i: Blocksize = %i Bytes\n", card,
+		    sc->cards[card].sector_size);
+		c_size = ((sc->cards[card].CSD[1] & 0x3ff) << 2) |
+		    ((sc->cards[card].CSD[2] >> 30) & 0x3);
+		printf("MMC %i: c_size = %lld\n", card, c_size);
+		c_size_mult = (sc->cards[card].CSD[2] >> 15) & 0x7;
+		c_size_mult = 1 << (c_size_mult + 2);
+		printf("MMC %i: c_size_mult = %lld\n", card, c_size_mult);
+		sc->cards[card].size = sc->cards[card].sector_size *
+		    (c_size + 1) * c_size_mult;
+		printf("MMC %i: Size = %lld Bytes\n", card,
+		    sc->cards[card].size);
+		/* declare clockrate to 5MHz - XXX the card may allow more */
+		sc->cards[card].mode = 5 * MCI_MR_CLKDIV | MCI_MR_PWSDIV |
+		    (MCI_MR_PWSDIV << 1 | AT91C_MCI_MR_PDCMODE);
+		sc->cards[card].mode = 75 * MCI_MR_CLKDIV | MCI_MR_PWSDIV |
+		    (MCI_MR_PWSDIV << 1);
+
+		bioq_init(&sc->cards[0].bio_queue);
+	}
+	if (sc->nb_cards == 0)
+		err = ENXIO;
+out:;
+	return (err);
+}
+
+static int
 at91_qdmmc_attach(device_t dev)
 {
 	/* XXX: asumes MCK = 60MHz */
@@ -217,97 +349,15 @@
 		goto out;
 	}
 
-	/* get all cards into idle state */
-	at91_qdmmc_SendCommand(dev, AT91C_MMC_GO_IDLE_STATE_CMD, AT91C_NO_ARGUMENT);
-
-	/* check operating conditions */
-	uint32_t cond;
-	do {	/* loop on busy */
-		err = at91_qdmmc_SendCommand(dev, AT91C_MMC_SEND_OP_COND_CMD, AT91C_MMC_HOST_VOLTAGE_RANGE);
-		if (err != 0) {
+	if (at91_qdmmc_mmc_init(dev) != 0) {
+		printf("No MMC Cards found, trying SD\n");
+		if (at91_qdmmc_sdcard_init(dev) != 0) {
+			printf("No SD Cards found\n");
 			err = 0;
-			printf("No MMC cards found\n");
 			goto out;
 		}
-		cond = RD4(sc, MCI_RSPR);
-	} while ((cond & AT91C_CARD_POWER_UP_BUSY) == 0);
-	printf("at91_qdmmc_attach: operating conditions: 0x%x\n", cond & ~(AT91C_CARD_POWER_UP_BUSY));
-
-	/* now find our cards */
-	for(sc->nb_cards = 0; sc->nb_cards < MMC_MAX; sc->nb_cards++) { // max out at 30 cards
-		int status;
-		int card = sc->nb_cards;
-		status = at91_qdmmc_SendCommand(dev, AT91C_MMC_ALL_SEND_CID_CMD, AT91C_NO_ARGUMENT);
-		if (status != 0) {
-			break;
-		}
-		sc->cards[card].CID[0] = RD4(sc, MCI_RSPR + 0);
-		sc->cards[card].CID[1] = RD4(sc, MCI_RSPR + 4);
-		sc->cards[card].CID[2] = RD4(sc, MCI_RSPR + 8);
-		sc->cards[card].CID[3] = RD4(sc, MCI_RSPR + 12);
-		printf("Found MMC %i - CID = 0x%x%x%x%x\n", card,
-		    sc->cards[card].CID[0],
-		    sc->cards[card].CID[1],
-		    sc->cards[card].CID[2],
-		    sc->cards[card].CID[3]);
-		printf("MMC %i: Vendor-ID = 0x%x\n", card, sc->cards[card].CID[0] >> 24),
-		printf("MMC %i: OEM-ID = 0x%x\n", card, (sc->cards[card].CID[0] >> 8) & 0xffff),
-		sc->cards[card].name[0] = (sc->cards[card].CID[0] >> 0) & 0xff;;
-		sc->cards[card].name[1] = (sc->cards[card].CID[1] >> 24) & 0xff;;
-		sc->cards[card].name[2] = (sc->cards[card].CID[1] >> 16) & 0xff;;
-		sc->cards[card].name[3] = (sc->cards[card].CID[1] >> 8) & 0xff;;
-		sc->cards[card].name[4] = (sc->cards[card].CID[1] >> 0) & 0xff;;
-		sc->cards[card].name[5] = (sc->cards[card].CID[2] >> 24) & 0xff;;
-		sc->cards[card].name[6] = '\0';
-		printf("MMC %i: Productname = %s\n", card, sc->cards[card].name);
-		printf("MMC %i: Revision = 0x%x\n", card, (sc->cards[card].CID[2] >> 16) & 0xff),
-		printf("MMC %i: Serial = 0x%x\n", card,
-		    (sc->cards[card].CID[2] << 16) | (sc->cards[card].CID[3] >> 16));
-		int year = 1997;
-		year += ((sc->cards[card].CID[3] >> 8) & 0xf);
-		int month = 0;
-		month += ((sc->cards[card].CID[3] >> 12) & 0xf);
-		printf("MMC %i: Manufacturing Date = %i/%i\n", card, year, month);
-
-		sc->cards[card].addr = card + AT91C_FIRST_RCA;
-		status = at91_qdmmc_SendCommand(dev, AT91C_MMC_SET_RELATIVE_ADDR_CMD, (sc->cards[card].addr) << 16);
-		if (status != 0) {
-			printf("Failed to set address for MMC %i\n", card);
-			goto out;
-		}
-		printf("Set MMC %i address to 0x%x\n", card, sc->cards[card].addr);
-
-		status = at91_qdmmc_SendCommand(dev, AT91C_SEND_CSD_CMD, (sc->cards[card].addr) << 16);
-		if (status != 0) {
-			printf("Failed to get CSD for MMC %i\n", card);
-			goto out;
-		}
-		sc->cards[card].CSD[0] = RD4(sc, MCI_RSPR + 0);
-		sc->cards[card].CSD[1] = RD4(sc, MCI_RSPR + 4);
-		sc->cards[card].CSD[2] = RD4(sc, MCI_RSPR + 8);
-		sc->cards[card].CSD[3] = RD4(sc, MCI_RSPR + 12);
-		printf("MMC %i: CSD = 0x%x%x%x%x\n", card,
-		    sc->cards[card].CSD[0],
-		    sc->cards[card].CSD[1],
-		    sc->cards[card].CSD[2],
-		    sc->cards[card].CSD[3]);
-		uint64_t c_size;
-		uint64_t c_size_mult;
-		sc->cards[card].sector_size = 1 << ((sc->cards[card].CSD[1] >> 16) & 0xf);
-		printf("MMC %i: Blocksize = %i Bytes\n", card, sc->cards[card].sector_size);
-		c_size = ((sc->cards[card].CSD[1] & 0x3ff) << 2) | ((sc->cards[card].CSD[2] >> 30) & 0x3);
-		printf("MMC %i: c_size = %lld\n", card, c_size);
-		c_size_mult = (sc->cards[card].CSD[2] >> 15) & 0x7;
-		c_size_mult = 1 << (c_size_mult + 2);
-		printf("MMC %i: c_size_mult = %lld\n", card, c_size_mult);
-		sc->cards[card].size = sc->cards[card].sector_size * (c_size + 1) * c_size_mult;
-		printf("MMC %i: Size = %lld Bytes\n", card, sc->cards[card].size);
-		/* declare clockrate to 5MHz - XXX the card may allow more */
-		sc->cards[card].mode = 5 * MCI_MR_CLKDIV | MCI_MR_PWSDIV | (MCI_MR_PWSDIV << 1 | AT91C_MCI_MR_PDCMODE);
-		sc->cards[card].mode = 75 * MCI_MR_CLKDIV | MCI_MR_PWSDIV | (MCI_MR_PWSDIV << 1);
-
-		bioq_init(&sc->cards[0].bio_queue);
 	}
+	
 	if (sc->nb_cards == 0) {
 		printf("No MMC cards found\n");
 		goto out;



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