From owner-p4-projects@FreeBSD.ORG Wed Sep 27 00:13:00 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9A89A16A492; Wed, 27 Sep 2006 00:13:00 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 5BC2416A47B for ; Wed, 27 Sep 2006 00:13:00 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5EAD043D5C for ; Wed, 27 Sep 2006 00:12:59 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k8R0Cx2B001554 for ; Wed, 27 Sep 2006 00:12:59 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k8R0Cwsj001551 for perforce@freebsd.org; Wed, 27 Sep 2006 00:12:58 GMT (envelope-from imp@freebsd.org) Date: Wed, 27 Sep 2006 00:12:58 GMT Message-Id: <200609270012.k8R0Cwsj001551@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 106752 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Sep 2006 00:13:00 -0000 http://perforce.freebsd.org/chv.cgi?CH=106752 Change 106752 by imp@imp_lighthouse on 2006/09/27 00:12:25 queue mmc commands to mmc bridge parts. now, to make the bridge part grok it... Affected files ... .. //depot/projects/arm/src/sys/dev/mmc/mmc.c#5 edit .. //depot/projects/arm/src/sys/dev/mmc/mmcbr_if.m#4 edit .. //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#6 edit Differences ... ==== //depot/projects/arm/src/sys/dev/mmc/mmc.c#5 (text+ko) ==== @@ -62,6 +62,12 @@ static void mmc_delayed_attach(void *); +static void +mmc_ms_delay(int ms) +{ + DELAY(1000 * ms); /* XXX BAD */ +} + static int mmc_probe(device_t dev) { @@ -132,9 +138,61 @@ } static void +mmc_wakeup(struct mmc_request *req) +{ + wakeup(req); +} + +static int +mmc_wait_for_req(struct mmc_softc *sc, struct mmc_request *req) +{ + int err; + + req->done = mmc_wakeup; + MMCBR_REQUEST(device_get_parent(sc->dev), sc->dev, req); + MMC_LOCK(sc); + do { + err = msleep(req, &sc->sc_mtx, PZERO | PCATCH, "mmcreq", + hz / 10); + } while (!(req->flags & MMC_REQ_DONE) && err == 0); + MMC_UNLOCK(sc); + return (err); +} + +static int +mmc_wait_for_cmd(struct mmc_softc *sc, struct mmc_command *cmd, int retries) +{ + struct mmc_request mreq; + + memset(&mreq, 0, sizeof(mreq)); + memset(cmd->resp, 0, sizeof(cmd->resp)); + cmd->retries = retries; + cmd->data = NULL; + mreq.cmd = cmd; + mmc_wait_for_req(sc, &mreq); + return (cmd->error); +} + +static void mmc_idle_cards(struct mmc_softc *sc) { - // XXX write me + device_t dev; + struct mmc_command cmd; + + dev = sc->dev; + mmcbr_set_chip_select(dev, cs_high); + mmcbr_update_ios(dev); + mmc_ms_delay(1); + + cmd.opcode = MMC_GO_IDLE_STATE; + cmd.arg = 0; + cmd.flags = MMC_RSP_NONE | MMC_CMD_BC; + mmc_wait_for_cmd(sc, &cmd, 0); + mmc_ms_delay(1); + + mmcbr_set_chip_select(dev, cs_dontcare); + mmcbr_update_ios(dev); + mmc_ms_delay(1); } static int @@ -164,14 +222,12 @@ mmcbr_set_power_mode(dev, power_up); mmcbr_set_clock(dev, 0); mmcbr_update_ios(dev); - - // delay 1ms ? + mmc_ms_delay(1); mmcbr_set_clock(dev, mmcbr_get_f_min(sc->dev)); mmcbr_set_power_mode(dev, power_on); mmcbr_update_ios(dev); - - // delay 2ms ? + mmc_ms_delay(2); } static void ==== //depot/projects/arm/src/sys/dev/mmc/mmcbr_if.m#4 (text+ko) ==== ==== //depot/projects/arm/src/sys/dev/mmc/mmcreg.h#6 (text+ko) ==== @@ -25,7 +25,7 @@ */ #ifndef DEV_MMC_MMCREG_H -#define DEV_MMC_MMCREG_H +#define DEV_MMC_MMCREG_H /* * This file contains the register definitions for the mmc and sd busses. @@ -40,36 +40,44 @@ uint32_t arg; uint32_t resp[4]; uint32_t flags; /* Expected responses */ -#define MMC_RSP_NONE (0UL << 0) -#define MMC_RSP_SHORT (1UL << 0) -#define MMC_RSP_LONG (2UL << 0) -#define MMC_RSP_MASK (3UL << 0) -#define MMC_RSP_CRC (1UL << 3) /* Expect valid crc */ -#define MMC_RSP_BUSY (1UL << 4) /* Card may send busy */ +#define MMC_RSP_PRESENT (1ul << 0) /* Response */ +#define MMC_RSP_136 (1ul << 1) /* 136 bit response */ +#define MMC_RSP_CRC (1ul << 2) /* Expect valid crc */ +#define MMC_RSP_BUSY (1ul << 3) /* Card may send busy */ +#define MMC_RSP_OPCODE (1ul << 4) /* Response include opcode */ +#define MMC_CMD_AC (0ul << 5) /* AC? */ +#define MMC_CMD_ADTC (1ul << 5) /* ADTC? */ +#define MMC_CMD_BC (2ul << 5) /* BC? */ +#define MMC_CMD_BCR (3ul << 5) /* BCR? */ +#define MMC_RSP_MASK 0x1ful +#define MMC_CMD_MASK (3ul << 5) /* Possible response types defined in the standard: */ -#define MMC_RSP_R1 (MMC_RSP_SHORT | MMC_RSP_CRC) -#define MMC_RSP_R1B (MMC_RSP_SHORT | MMC_RSP_CRC | MMC_RSP_BUSY) -#define MMC_RSP_R2 (MMC_RSP_LONG | MMC_RSP_CRC) -#define MMC_RSP_R3 (MMC_RSP_SHORT) -#define MMC_RSP_R6 (MMC_RSP_SHORT | MMC_RSP_CRC) - uint32_t retires; +#define MMC_RSP_NONE (0) +#define MMC_RSP_R1 (MMC_RPS_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE) +#define MMC_RSP_R1B (MMC_RSP_PRESENT | MMC_RSP_CRC | MMC_RSP_OPCODE | MMC_RSP_BUSY) +#define MMC_RSP_R2 (MMC_RSP_PRESENT | MMC_RSP_136 | MMC_RSP_CRC) +#define MMC_RSP_R3 (MMC_RSP_PRESENT) +#define MMC_RSP_R6 (MMC_RSP_PRESENT | MMC_RSP_CRC) +/* R7 -- new in sd 2.0 */ +#define MMC_RSP(x) ((x) & MMC_RSP_MASK) + uint32_t retries; uint32_t error; -#define MMC_ERR_NONE 0 -#define MMC_ERR_TIMEOUT 1 -#define MMC_ERR_BADCRC 2 -#define MMC_ERR_FIFO 3 -#define MMC_ERR_FAILED 4 -#define MMC_ERR_INVALID 5 +#define MMC_ERR_NONE 0 +#define MMC_ERR_TIMEOUT 1 +#define MMC_ERR_BADCRC 2 +#define MMC_ERR_FIFO 3 +#define MMC_ERR_FAILED 4 +#define MMC_ERR_INVALID 5 struct mmc_data *data; /* Data segment with cmd */ struct mmc_request *mrq; /* backpointer to request */ }; struct mmc_data { uint32_t flags; -#define MMC_DATA_WRITE (1UL << 8) -#define MMC_DATA_READ (1UL << 9) -#define MMC_DATA_STREAM (1UL << 10) +#define MMC_DATA_WRITE (1UL << 8) +#define MMC_DATA_READ (1UL << 9) +#define MMC_DATA_STREAM (1UL << 10) struct mmc_request *mrq; }; @@ -79,17 +87,122 @@ struct mmc_command *stop; void (*done)(struct mmc_request *); /* Completion function */ void *done_data; /* requestor set data */ + uint32_t flags; +#define MMC_REQ_DONE 1 }; +/* Command definitions */ + +/* Class 0 and 1: Basic commands & read stream commands */ +#define MMC_GO_IDLE_STATE 0 +#define MMC_SEND_OP_COND 1 +#define MMC_ALL_SEND_CID 2 +#define MMC_SET_RELATIVE_ADDR 3 +#define MMC_SET_DSR 4 + /* reserved: 5 */ +#define MMC_SELECT_CARD 7 +#define MMC_DESELECT_CARD 7 +#define MMC_SEND_IF_COND 8 +#define MMC_SEND_CSD 9 +#define MMC_SEND_CID 10 +#define MMC_READ_DAT_UNTIL_STOP 11 +#define MMC_STOP_TRANSMISSION 12 +#define MMC_SEND_STATUS 13 + /* reserved: 14 */ +#define MMC_GO_INACTIVE_STATE 15 + +/* Class 2: Block oriented read commands */ +#define MMC_SET_BLOCKLEN 16 +#define MMC_READ_SINGLE_BLOCK 17 +#define MMC_READ_MULTIPLE_BLOCK 18 + /* reserved: 19 */ + +/* Class 3: Stream write commands */ +#define MMC_WRITE_DAT_UNTIL_STOP 20 + /* reserved: 21 */ + /* reserved: 22 */ + +/* Class 4: Block oriented write commands */ +#define MMC_SET_BLOCK_COUNT 23 +#define MMC_WRITE_BLOCK 24 +#define MMC_WRITE_MULTIPLE_BLOCK 25 +#define MMC_PROGARM_CID 26 +#define MMC_PROGRAM_CSD 27 + +/* Class 6: Block oriented write protection commands */ +#define MMC_SET_WRITE_PROT 28 +#define MMC_CLR_WRITE_PROT 29 +#define MMC_SEND_WRITE_PROT 30 + /* reserved: 31 */ + +/* Class 5: Erase commands */ +#define SD_ERASE_WR_BLK_START 32 +#define SD_ERASE_WR_BLK_END 33 + /* 34 -- reserved old command */ +#define MMC_ERASE_GROUP_START 35 +#define MMC_ERASE_GROUP_END 36 + /* 37 -- reserved old command */ +#define MMC_ERASE 38 + +/* Class 9: I/O mode commands */ +#define MMC_FAST_IO 39 +#define MMC_GO_IRQ_STATE 40 + /* reserved: 41 */ + +/* Class 7: Lock card */ +#define MMC_LOCK_UNLOCK 42 + /* reserved: 43 */ + /* reserved: 44 */ + /* reserved: 45 */ + /* reserved: 46 */ + /* reserved: 47 */ + /* reserved: 48 */ + /* reserved: 49 */ + /* reserved: 50 */ + /* reserved: 51 */ + /* reserved: 54 */ + +/* Class 8: Application specific commands */ +#define MMC_APP_CMD 55 +#define MMC_GEN_CMD 56 + /* reserved: 57 */ + /* reserved: 58 */ + /* reserved: 59 */ + /* reserved for mfg: 60 */ + /* reserved for mfg: 61 */ + /* reserved for mfg: 62 */ + /* reserved for mfg: 63 */ + +/* Class 9: I/O cards (sd) */ +#define SD_IO_RW_DIRECT 52 +#define SD_IO_RW_EXTENDED 53 + +/* Class 10: Switch function commands */ +#define SD_SWITCH_FUNC 6 + /* reserved: 34 */ + /* reserved: 35 */ + /* reserved: 36 */ + /* reserved: 37 */ + /* reserved: 50 */ + /* reserved: 57 */ + + +/* Application specific commands for SD */ +#define ACMD_SET_BUS_WIDTH 6 +#define ACMD_SD_STATUS 13 +#define ACMD_SEND_NUM_WR_BLOCKS 22 +#define ACMD_SET_WR_BLK_ERASE_COUNT 23 +#define ACMD_SD_SEND_OP_COND 41 +#define ACMD_SET_CLR_CARD_DETECT 42 +#define ACMD_SEND_SCR 51 + /* OCR bits */ -#define MMC_OCR_145_150 (1U << 0) /* Vdd voltage 1.45 ~ 1.50 */ -#define MMC_OCR_150_155 (1U << 1) /* Vdd voltage 1.50 ~ 1.50 */ -#define MMC_OCR_155_160 (1U << 2) /* Vdd voltage 1.55 ~ 1.60 */ -#define MMC_OCR_160_165 (1U << 3) /* Vdd voltage 1.60 ~ 1.65 */ -#define MMC_OCR_165_170 (1U << 4) /* Vdd voltage 1.65 ~ 1.70 */ -#define MMC_OCR_170_180 (1U << 5) /* Vdd voltage 1.70 ~ 1.80 */ -#define MMC_OCR_180_190 (1U << 6) /* Vdd voltage 1.80 ~ 1.90 */ -#define MMC_OCR_190_200 (1U << 7) /* Vdd voltage 1.90 ~ 2.00 */ + +/* in SD 2.0 spec, bits 8-14 are now marked reserved */ +/* Low voltage in SD2.0 spec is bit 7, TBD voltage */ +/* Low voltage in MC 3.31 spec is bit 7, 1.65-1.95V */ +/* Linux has defines for lower bits down to 0, for reasons unknown */ +#define MMC_OCR_LOW_VOLTAGE (1u << 7) /* Low Voltage Range -- tbd */ #define MMC_OCR_200_210 (1U << 8) /* Vdd voltage 2.00 ~ 2.10 */ #define MMC_OCR_210_220 (1U << 9) /* Vdd voltage 2.10 ~ 2.20 */ #define MMC_OCR_220_230 (1U << 10) /* Vdd voltage 2.20 ~ 2.30 */ @@ -106,6 +219,7 @@ #define MMC_OCR_330_340 (1U << 21) /* Vdd voltage 3.30 ~ 3.40 */ #define MMC_OCR_340_350 (1U << 22) /* Vdd voltage 3.40 ~ 3.50 */ #define MMC_OCR_350_360 (1U << 23) /* Vdd voltage 3.50 ~ 3.60 */ -#define MMC_OCR_CARD_BUSY (1U << 31) /* Card Power up status */ +#define MMC_OCR_CCS (1u << 30) /* Card Capacity status (SD vs SDHC) */ +#define MMC_OCR_CARD_BUSY (1U << 31) /* Card Power up status */ #endif /* DEV_MMCREG_H */