On Mon, Apr 02 2018, Christian Lütke-Stetzkamp wrote: > This fixes the indentaions in the file sd.c > > Signed-off-by: Christian Lütke-Stetzkamp <christian@xxxxxxxx> > --- > drivers/staging/mt7621-mmc/sd.c | 4358 +++++++++++++++++++-------------------- > 1 file changed, 2179 insertions(+), 2179 deletions(-) > > diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c > index a5b20fdb459a..5a9c049a9f05 100644 > --- a/drivers/staging/mt7621-mmc/sd.c > +++ b/drivers/staging/mt7621-mmc/sd.c > @@ -169,19 +169,19 @@ struct msdc_host *msdc_6575_host[] = {NULL,NULL,NULL,NULL}; > /* gate means clock power down */ > static int g_clk_gate = 0; > #define msdc_gate_clock(id) \ > - do { \ > - g_clk_gate &= ~(1 << ((id) + PERI_MSDC0_PDN)); \ > - } while(0) > + do { \ > + g_clk_gate &= ~(1 << ((id) + PERI_MSDC0_PDN)); \ > + } while(0) > /* not like power down register. 1 means clock on. */ > #define msdc_ungate_clock(id) \ > - do { \ > - g_clk_gate |= 1 << ((id) + PERI_MSDC0_PDN); \ > - } while(0) > + do { \ > + g_clk_gate |= 1 << ((id) + PERI_MSDC0_PDN); \ > + } while(0) > > // do we need sync object or not > void msdc_clk_status(int * status) > { > - *status = g_clk_gate; > + *status = g_clk_gate; > } > #endif /* end of --- */ > > @@ -221,34 +221,34 @@ static struct platform_device mtk_sd_device = { > /* end of +++ */ > > static int msdc_rsp[] = { > - 0, /* RESP_NONE */ > - 1, /* RESP_R1 */ > - 2, /* RESP_R2 */ > - 3, /* RESP_R3 */ > - 4, /* RESP_R4 */ > - 1, /* RESP_R5 */ > - 1, /* RESP_R6 */ > - 1, /* RESP_R7 */ > - 7, /* RESP_R1b */ > + 0, /* RESP_NONE */ > + 1, /* RESP_R1 */ > + 2, /* RESP_R2 */ > + 3, /* RESP_R3 */ > + 4, /* RESP_R4 */ > + 1, /* RESP_R5 */ > + 1, /* RESP_R6 */ > + 1, /* RESP_R7 */ > + 7, /* RESP_R1b */ > }; > > /* For Inhanced DMA */ > #define msdc_init_gpd_ex(gpd,extlen,cmd,arg,blknum) \ > - do { \ > - ((gpd_t*)gpd)->extlen = extlen; \ > - ((gpd_t*)gpd)->cmd = cmd; \ > - ((gpd_t*)gpd)->arg = arg; \ > - ((gpd_t*)gpd)->blknum = blknum; \ > - }while(0) > + do { \ > + ((gpd_t*)gpd)->extlen = extlen; \ > + ((gpd_t*)gpd)->cmd = cmd; \ > + ((gpd_t*)gpd)->arg = arg; \ > + ((gpd_t*)gpd)->blknum = blknum; \ > + }while(0) > > #define msdc_init_bd(bd, blkpad, dwpad, dptr, dlen) \ > - do { \ > - BUG_ON(dlen > 0xFFFFUL); \ > - ((bd_t*)bd)->blkpad = blkpad; \ > - ((bd_t*)bd)->dwpad = dwpad; \ > - ((bd_t*)bd)->ptr = (void*)dptr; \ > - ((bd_t*)bd)->buflen = dlen; \ > - }while(0) > + do { \ > + BUG_ON(dlen > 0xFFFFUL); \ > + ((bd_t*)bd)->blkpad = blkpad; \ > + ((bd_t*)bd)->dwpad = dwpad; \ > + ((bd_t*)bd)->ptr = (void*)dptr; \ > + ((bd_t*)bd)->buflen = dlen; \ > + }while(0) > > #define msdc_txfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_TXCNT) >> 16) > #define msdc_rxfifocnt() ((sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_RXCNT) >> 0) > @@ -262,57 +262,57 @@ static int msdc_rsp[] = { > #define msdc_dma_off() sdr_set_bits(MSDC_CFG, MSDC_CFG_PIO) > > #define msdc_retry(expr,retry,cnt) \ > - do { \ > - int backup = cnt; \ > - while (retry) { \ > - if (!(expr)) break; \ > - if (cnt-- == 0) { \ > - retry--; mdelay(1); cnt = backup; \ > - } \ > - } \ > - WARN_ON(retry == 0); \ > - } while(0) > + do { \ > + int backup = cnt; \ > + while (retry) { \ > + if (!(expr)) break; \ > + if (cnt-- == 0) { \ > + retry--; mdelay(1); cnt = backup; \ > + } \ > + } \ > + WARN_ON(retry == 0); \ > + } while(0) > > #if 0 /* --- by chhung */ > #define msdc_reset() \ > - do { \ > - int retry = 3, cnt = 1000; \ > - sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \ > - dsb(); \ > - msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \ > - } while(0) > + do { \ > + int retry = 3, cnt = 1000; \ > + sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \ > + dsb(); \ > + msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \ > + } while(0) > #else > #define msdc_reset() \ > - do { \ > - int retry = 3, cnt = 1000; \ > - sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \ > - msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \ > - } while(0) > + do { \ > + int retry = 3, cnt = 1000; \ > + sdr_set_bits(MSDC_CFG, MSDC_CFG_RST); \ > + msdc_retry(sdr_read32(MSDC_CFG) & MSDC_CFG_RST, retry, cnt); \ > + } while(0) > #endif /* end of +/- */ > > #define msdc_clr_int() \ > - do { \ > - volatile u32 val = sdr_read32(MSDC_INT); \ > - sdr_write32(MSDC_INT, val); \ > - } while(0) > + do { \ > + volatile u32 val = sdr_read32(MSDC_INT); \ > + sdr_write32(MSDC_INT, val); \ > + } while(0) > > #define msdc_clr_fifo() \ > - do { \ > - int retry = 3, cnt = 1000; \ > - sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \ > - msdc_retry(sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \ > - } while(0) > + do { \ > + int retry = 3, cnt = 1000; \ > + sdr_set_bits(MSDC_FIFOCS, MSDC_FIFOCS_CLR); \ > + msdc_retry(sdr_read32(MSDC_FIFOCS) & MSDC_FIFOCS_CLR, retry, cnt); \ > + } while(0) > > #define msdc_irq_save(val) \ > - do { \ > - val = sdr_read32(MSDC_INTEN); \ > - sdr_clr_bits(MSDC_INTEN, val); \ > - } while(0) > + do { \ > + val = sdr_read32(MSDC_INTEN); \ > + sdr_clr_bits(MSDC_INTEN, val); \ > + } while(0) > > #define msdc_irq_restore(val) \ > - do { \ > - sdr_set_bits(MSDC_INTEN, val); \ > - } while(0) > + do { \ > + sdr_set_bits(MSDC_INTEN, val); \ > + } while(0) > > /* clock source for host: global */ > #if defined (CONFIG_SOC_MT7620) > @@ -326,37 +326,37 @@ static u32 hclks[] = {50000000}; /* +/- by chhung */ > // always keep the VMC on. > //============================================ > #define msdc_vcore_on(host) \ > - do { \ > - INIT_MSG("[+]VMC ref. count<%d>", ++host->pwr_ref); \ > - (void)hwPowerOn(MT65XX_POWER_LDO_VMC, VOL_3300, "SD"); \ > - } while (0) > + do { \ > + INIT_MSG("[+]VMC ref. count<%d>", ++host->pwr_ref); \ > + (void)hwPowerOn(MT65XX_POWER_LDO_VMC, VOL_3300, "SD"); \ > + } while (0) > #define msdc_vcore_off(host) \ > - do { \ > - INIT_MSG("[-]VMC ref. count<%d>", --host->pwr_ref); \ > - (void)hwPowerDown(MT65XX_POWER_LDO_VMC, "SD"); \ > - } while (0) > + do { \ > + INIT_MSG("[-]VMC ref. count<%d>", --host->pwr_ref); \ > + (void)hwPowerDown(MT65XX_POWER_LDO_VMC, "SD"); \ > + } while (0) > > //==================================== > // the vdd output for card: global > // always keep the VMCH on. > //==================================== > #define msdc_vdd_on(host) \ > - do { \ > - (void)hwPowerOn(MT65XX_POWER_LDO_VMCH, VOL_3300, "SD"); \ > - } while (0) > + do { \ > + (void)hwPowerOn(MT65XX_POWER_LDO_VMCH, VOL_3300, "SD"); \ > + } while (0) > #define msdc_vdd_off(host) \ > - do { \ > - (void)hwPowerDown(MT65XX_POWER_LDO_VMCH, "SD"); \ > - } while (0) > + do { \ > + (void)hwPowerDown(MT65XX_POWER_LDO_VMCH, "SD"); \ > + } while (0) > > #define sdc_is_busy() (sdr_read32(SDC_STS) & SDC_STS_SDCBUSY) > #define sdc_is_cmd_busy() (sdr_read32(SDC_STS) & SDC_STS_CMDBUSY) > > #define sdc_send_cmd(cmd,arg) \ > - do { \ > - sdr_write32(SDC_ARG, (arg)); \ > - sdr_write32(SDC_CMD, (cmd)); \ > - } while(0) > + do { \ > + sdr_write32(SDC_ARG, (arg)); \ > + sdr_write32(SDC_CMD, (cmd)); \ > + } while(0) > > // can modify to read h/w register. > //#define is_card_present(h) ((sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1); > @@ -370,9 +370,9 @@ static u32 hclks[] = {50000000}; /* +/- by chhung */ > #endif > /* end of +++ */ > static unsigned int msdc_do_command(struct msdc_host *host, > - struct mmc_command *cmd, > - int tune, > - unsigned long timeout); > + struct mmc_command *cmd, > + int tune, > + unsigned long timeout); > > static int msdc_tune_cmdrsp(struct msdc_host*host,struct mmc_command *cmd); > > @@ -381,180 +381,180 @@ static void msdc_dump_card_status(struct msdc_host *host, u32 status) > { > /* N_MSG is currently a no-op */ > #if 0 > - static char *state[] = { > - "Idle", /* 0 */ > - "Ready", /* 1 */ > - "Ident", /* 2 */ > - "Stby", /* 3 */ > - "Tran", /* 4 */ > - "Data", /* 5 */ > - "Rcv", /* 6 */ > - "Prg", /* 7 */ > - "Dis", /* 8 */ > - "Reserved", /* 9 */ > - "Reserved", /* 10 */ > - "Reserved", /* 11 */ > - "Reserved", /* 12 */ > - "Reserved", /* 13 */ > - "Reserved", /* 14 */ > - "I/O mode", /* 15 */ > - }; > + static char *state[] = { > + "Idle", /* 0 */ > + "Ready", /* 1 */ > + "Ident", /* 2 */ > + "Stby", /* 3 */ > + "Tran", /* 4 */ > + "Data", /* 5 */ > + "Rcv", /* 6 */ > + "Prg", /* 7 */ > + "Dis", /* 8 */ > + "Reserved", /* 9 */ > + "Reserved", /* 10 */ > + "Reserved", /* 11 */ > + "Reserved", /* 12 */ > + "Reserved", /* 13 */ > + "Reserved", /* 14 */ > + "I/O mode", /* 15 */ > + }; > #endif > - if (status & R1_OUT_OF_RANGE) > - N_MSG(RSP, "[CARD_STATUS] Out of Range"); > - if (status & R1_ADDRESS_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Address Error"); > - if (status & R1_BLOCK_LEN_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Block Len Error"); > - if (status & R1_ERASE_SEQ_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Erase Seq Error"); > - if (status & R1_ERASE_PARAM) > - N_MSG(RSP, "[CARD_STATUS] Erase Param"); > - if (status & R1_WP_VIOLATION) > - N_MSG(RSP, "[CARD_STATUS] WP Violation"); > - if (status & R1_CARD_IS_LOCKED) > - N_MSG(RSP, "[CARD_STATUS] Card is Locked"); > - if (status & R1_LOCK_UNLOCK_FAILED) > - N_MSG(RSP, "[CARD_STATUS] Lock/Unlock Failed"); > - if (status & R1_COM_CRC_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Command CRC Error"); > - if (status & R1_ILLEGAL_COMMAND) > - N_MSG(RSP, "[CARD_STATUS] Illegal Command"); > - if (status & R1_CARD_ECC_FAILED) > - N_MSG(RSP, "[CARD_STATUS] Card ECC Failed"); > - if (status & R1_CC_ERROR) > - N_MSG(RSP, "[CARD_STATUS] CC Error"); > - if (status & R1_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Error"); > - if (status & R1_UNDERRUN) > - N_MSG(RSP, "[CARD_STATUS] Underrun"); > - if (status & R1_OVERRUN) > - N_MSG(RSP, "[CARD_STATUS] Overrun"); > - if (status & R1_CID_CSD_OVERWRITE) > - N_MSG(RSP, "[CARD_STATUS] CID/CSD Overwrite"); > - if (status & R1_WP_ERASE_SKIP) > - N_MSG(RSP, "[CARD_STATUS] WP Eraser Skip"); > - if (status & R1_CARD_ECC_DISABLED) > - N_MSG(RSP, "[CARD_STATUS] Card ECC Disabled"); > - if (status & R1_ERASE_RESET) > - N_MSG(RSP, "[CARD_STATUS] Erase Reset"); > - if (status & R1_READY_FOR_DATA) > - N_MSG(RSP, "[CARD_STATUS] Ready for Data"); > - if (status & R1_SWITCH_ERROR) > - N_MSG(RSP, "[CARD_STATUS] Switch error"); > - if (status & R1_APP_CMD) > - N_MSG(RSP, "[CARD_STATUS] App Command"); > - > - N_MSG(RSP, "[CARD_STATUS] '%s' State", state[R1_CURRENT_STATE(status)]); > + if (status & R1_OUT_OF_RANGE) > + N_MSG(RSP, "[CARD_STATUS] Out of Range"); > + if (status & R1_ADDRESS_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Address Error"); > + if (status & R1_BLOCK_LEN_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Block Len Error"); > + if (status & R1_ERASE_SEQ_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Erase Seq Error"); > + if (status & R1_ERASE_PARAM) > + N_MSG(RSP, "[CARD_STATUS] Erase Param"); > + if (status & R1_WP_VIOLATION) > + N_MSG(RSP, "[CARD_STATUS] WP Violation"); > + if (status & R1_CARD_IS_LOCKED) > + N_MSG(RSP, "[CARD_STATUS] Card is Locked"); > + if (status & R1_LOCK_UNLOCK_FAILED) > + N_MSG(RSP, "[CARD_STATUS] Lock/Unlock Failed"); > + if (status & R1_COM_CRC_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Command CRC Error"); > + if (status & R1_ILLEGAL_COMMAND) > + N_MSG(RSP, "[CARD_STATUS] Illegal Command"); > + if (status & R1_CARD_ECC_FAILED) > + N_MSG(RSP, "[CARD_STATUS] Card ECC Failed"); > + if (status & R1_CC_ERROR) > + N_MSG(RSP, "[CARD_STATUS] CC Error"); > + if (status & R1_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Error"); > + if (status & R1_UNDERRUN) > + N_MSG(RSP, "[CARD_STATUS] Underrun"); > + if (status & R1_OVERRUN) > + N_MSG(RSP, "[CARD_STATUS] Overrun"); > + if (status & R1_CID_CSD_OVERWRITE) > + N_MSG(RSP, "[CARD_STATUS] CID/CSD Overwrite"); > + if (status & R1_WP_ERASE_SKIP) > + N_MSG(RSP, "[CARD_STATUS] WP Eraser Skip"); > + if (status & R1_CARD_ECC_DISABLED) > + N_MSG(RSP, "[CARD_STATUS] Card ECC Disabled"); > + if (status & R1_ERASE_RESET) > + N_MSG(RSP, "[CARD_STATUS] Erase Reset"); > + if (status & R1_READY_FOR_DATA) > + N_MSG(RSP, "[CARD_STATUS] Ready for Data"); > + if (status & R1_SWITCH_ERROR) > + N_MSG(RSP, "[CARD_STATUS] Switch error"); > + if (status & R1_APP_CMD) > + N_MSG(RSP, "[CARD_STATUS] App Command"); > + > + N_MSG(RSP, "[CARD_STATUS] '%s' State", state[R1_CURRENT_STATE(status)]); > } > > static void msdc_dump_ocr_reg(struct msdc_host *host, u32 resp) > { > - if (resp & (1 << 7)) > - N_MSG(RSP, "[OCR] Low Voltage Range"); > - if (resp & (1 << 15)) > - N_MSG(RSP, "[OCR] 2.7-2.8 volt"); > - if (resp & (1 << 16)) > - N_MSG(RSP, "[OCR] 2.8-2.9 volt"); > - if (resp & (1 << 17)) > - N_MSG(RSP, "[OCR] 2.9-3.0 volt"); > - if (resp & (1 << 18)) > - N_MSG(RSP, "[OCR] 3.0-3.1 volt"); > - if (resp & (1 << 19)) > - N_MSG(RSP, "[OCR] 3.1-3.2 volt"); > - if (resp & (1 << 20)) > - N_MSG(RSP, "[OCR] 3.2-3.3 volt"); > - if (resp & (1 << 21)) > - N_MSG(RSP, "[OCR] 3.3-3.4 volt"); > - if (resp & (1 << 22)) > - N_MSG(RSP, "[OCR] 3.4-3.5 volt"); > - if (resp & (1 << 23)) > - N_MSG(RSP, "[OCR] 3.5-3.6 volt"); > - if (resp & (1 << 24)) > - N_MSG(RSP, "[OCR] Switching to 1.8V Accepted (S18A)"); > - if (resp & (1 << 30)) > - N_MSG(RSP, "[OCR] Card Capacity Status (CCS)"); > - if (resp & (1 << 31)) > - N_MSG(RSP, "[OCR] Card Power Up Status (Idle)"); > - else > - N_MSG(RSP, "[OCR] Card Power Up Status (Busy)"); > + if (resp & (1 << 7)) > + N_MSG(RSP, "[OCR] Low Voltage Range"); > + if (resp & (1 << 15)) > + N_MSG(RSP, "[OCR] 2.7-2.8 volt"); > + if (resp & (1 << 16)) > + N_MSG(RSP, "[OCR] 2.8-2.9 volt"); > + if (resp & (1 << 17)) > + N_MSG(RSP, "[OCR] 2.9-3.0 volt"); > + if (resp & (1 << 18)) > + N_MSG(RSP, "[OCR] 3.0-3.1 volt"); > + if (resp & (1 << 19)) > + N_MSG(RSP, "[OCR] 3.1-3.2 volt"); > + if (resp & (1 << 20)) > + N_MSG(RSP, "[OCR] 3.2-3.3 volt"); > + if (resp & (1 << 21)) > + N_MSG(RSP, "[OCR] 3.3-3.4 volt"); > + if (resp & (1 << 22)) > + N_MSG(RSP, "[OCR] 3.4-3.5 volt"); > + if (resp & (1 << 23)) > + N_MSG(RSP, "[OCR] 3.5-3.6 volt"); > + if (resp & (1 << 24)) > + N_MSG(RSP, "[OCR] Switching to 1.8V Accepted (S18A)"); > + if (resp & (1 << 30)) > + N_MSG(RSP, "[OCR] Card Capacity Status (CCS)"); > + if (resp & (1 << 31)) > + N_MSG(RSP, "[OCR] Card Power Up Status (Idle)"); > + else > + N_MSG(RSP, "[OCR] Card Power Up Status (Busy)"); > } > > static void msdc_dump_rca_resp(struct msdc_host *host, u32 resp) > { > - u32 status = (((resp >> 15) & 0x1) << 23) | > - (((resp >> 14) & 0x1) << 22) | > - (((resp >> 13) & 0x1) << 19) | > - (resp & 0x1fff); > + u32 status = (((resp >> 15) & 0x1) << 23) | > + (((resp >> 14) & 0x1) << 22) | > + (((resp >> 13) & 0x1) << 19) | > + (resp & 0x1fff); > > - N_MSG(RSP, "[RCA] 0x%.4x", resp >> 16); > - msdc_dump_card_status(host, status); > + N_MSG(RSP, "[RCA] 0x%.4x", resp >> 16); > + msdc_dump_card_status(host, status); > } > > static void msdc_dump_io_resp(struct msdc_host *host, u32 resp) > { > - u32 flags = (resp >> 8) & 0xFF; > + u32 flags = (resp >> 8) & 0xFF; > #if 0 > - char *state[] = {"DIS", "CMD", "TRN", "RFU"}; > + char *state[] = {"DIS", "CMD", "TRN", "RFU"}; > #endif > - if (flags & (1 << 7)) > - N_MSG(RSP, "[IO] COM_CRC_ERR"); > - if (flags & (1 << 6)) > - N_MSG(RSP, "[IO] Illgal command"); > - if (flags & (1 << 3)) > - N_MSG(RSP, "[IO] Error"); > - if (flags & (1 << 2)) > - N_MSG(RSP, "[IO] RFU"); > - if (flags & (1 << 1)) > - N_MSG(RSP, "[IO] Function number error"); > - if (flags & (1 << 0)) > - N_MSG(RSP, "[IO] Out of range"); > - > - N_MSG(RSP, "[IO] State: %s, Data:0x%x", state[(resp >> 12) & 0x3], resp & 0xFF); > + if (flags & (1 << 7)) > + N_MSG(RSP, "[IO] COM_CRC_ERR"); > + if (flags & (1 << 6)) > + N_MSG(RSP, "[IO] Illgal command"); > + if (flags & (1 << 3)) > + N_MSG(RSP, "[IO] Error"); > + if (flags & (1 << 2)) > + N_MSG(RSP, "[IO] RFU"); > + if (flags & (1 << 1)) > + N_MSG(RSP, "[IO] Function number error"); > + if (flags & (1 << 0)) > + N_MSG(RSP, "[IO] Out of range"); > + > + N_MSG(RSP, "[IO] State: %s, Data:0x%x", state[(resp >> 12) & 0x3], resp & 0xFF); > } > #endif > > static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > { > - u32 base = host->base; > - u32 timeout, clk_ns; > + u32 base = host->base; > + u32 timeout, clk_ns; > > - host->timeout_ns = ns; > - host->timeout_clks = clks; > + host->timeout_ns = ns; > + host->timeout_clks = clks; > > - clk_ns = 1000000000UL / host->sclk; > - timeout = ns / clk_ns + clks; > - timeout = timeout >> 16; /* in 65536 sclk cycle unit */ > - timeout = timeout > 1 ? timeout - 1 : 0; > - timeout = timeout > 255 ? 255 : timeout; > + clk_ns = 1000000000UL / host->sclk; > + timeout = ns / clk_ns + clks; > + timeout = timeout >> 16; /* in 65536 sclk cycle unit */ > + timeout = timeout > 1 ? timeout - 1 : 0; > + timeout = timeout > 255 ? 255 : timeout; > > - sdr_set_field(SDC_CFG, SDC_CFG_DTOC, timeout); > + sdr_set_field(SDC_CFG, SDC_CFG_DTOC, timeout); > > - N_MSG(OPS, "Set read data timeout: %dns %dclks -> %d x 65536 cycles", > - ns, clks, timeout + 1); > + N_MSG(OPS, "Set read data timeout: %dns %dclks -> %d x 65536 cycles", > + ns, clks, timeout + 1); > } > > /* msdc_eirq_sdio() will be called when EIRQ(for WIFI) */ > static void msdc_eirq_sdio(void *data) > { > - struct msdc_host *host = (struct msdc_host *)data; > + struct msdc_host *host = (struct msdc_host *)data; > > - N_MSG(INT, "SDIO EINT"); > + N_MSG(INT, "SDIO EINT"); > > - mmc_signal_sdio_irq(host->mmc); > + mmc_signal_sdio_irq(host->mmc); > } > > /* msdc_eirq_cd will not be used! We not using EINT for card detection. */ > static void msdc_eirq_cd(void *data) > { > - struct msdc_host *host = (struct msdc_host *)data; > + struct msdc_host *host = (struct msdc_host *)data; > > - N_MSG(INT, "CD EINT"); > + N_MSG(INT, "CD EINT"); > > #if 0 > - tasklet_hi_schedule(&host->card_tasklet); > + tasklet_hi_schedule(&host->card_tasklet); > #else > - schedule_delayed_work(&host->card_delaywork, HZ); > + schedule_delayed_work(&host->card_delaywork, HZ); > #endif > } > > @@ -565,302 +565,302 @@ static void msdc_tasklet_card(unsigned long arg) > #else > static void msdc_tasklet_card(struct work_struct *work) > { > - struct msdc_host *host = (struct msdc_host *)container_of(work, > + struct msdc_host *host = (struct msdc_host *)container_of(work, > struct msdc_host, card_delaywork.work); > #endif > - struct msdc_hw *hw = host->hw; > - u32 base = host->base; > - u32 inserted; > - u32 status = 0; > + struct msdc_hw *hw = host->hw; > + u32 base = host->base; > + u32 inserted; > + u32 status = 0; > //u32 change = 0; > > - spin_lock(&host->lock); > + spin_lock(&host->lock); > > - if (hw->get_cd_status) { // NULL > - inserted = hw->get_cd_status(); > - } else { > - status = sdr_read32(MSDC_PS); > - if (cd_active_low) > - inserted = (status & MSDC_PS_CDSTS) ? 0 : 1; > - else > - inserted = (status & MSDC_PS_CDSTS) ? 1 : 0; > - } > + if (hw->get_cd_status) { // NULL > + inserted = hw->get_cd_status(); > + } else { > + status = sdr_read32(MSDC_PS); > + if (cd_active_low) > + inserted = (status & MSDC_PS_CDSTS) ? 0 : 1; > + else > + inserted = (status & MSDC_PS_CDSTS) ? 1 : 0; > + } > > #if 0 > - change = host->card_inserted ^ inserted; > - host->card_inserted = inserted; > - > - if (change && !host->suspend) { > - if (inserted) { > - host->mmc->f_max = HOST_MAX_MCLK; // work around > - } > - mmc_detect_change(host->mmc, msecs_to_jiffies(20)); > - } > + change = host->card_inserted ^ inserted; > + host->card_inserted = inserted; > + > + if (change && !host->suspend) { > + if (inserted) { > + host->mmc->f_max = HOST_MAX_MCLK; // work around > + } > + mmc_detect_change(host->mmc, msecs_to_jiffies(20)); > + } > #else /* Make sure: handle the last interrupt */ > - host->card_inserted = inserted; > + host->card_inserted = inserted; > > - if (!host->suspend) { > - host->mmc->f_max = HOST_MAX_MCLK; > - mmc_detect_change(host->mmc, msecs_to_jiffies(20)); > - } > + if (!host->suspend) { > + host->mmc->f_max = HOST_MAX_MCLK; > + mmc_detect_change(host->mmc, msecs_to_jiffies(20)); > + } > > - IRQ_MSG("card found<%s>", inserted ? "inserted" : "removed"); > + IRQ_MSG("card found<%s>", inserted ? "inserted" : "removed"); > #endif > > - spin_unlock(&host->lock); > + spin_unlock(&host->lock); > } > > #if 0 /* --- by chhung */ > /* For E2 only */ > static u8 clk_src_bit[4] = { > - 0, 3, 5, 7 > + 0, 3, 5, 7 > }; > > static void msdc_select_clksrc(struct msdc_host* host, unsigned char clksrc) > { > - u32 val; > - u32 base = host->base; > - > - BUG_ON(clksrc > 3); > - INIT_MSG("set clock source to <%d>", clksrc); > - > - val = sdr_read32(MSDC_CLKSRC_REG); > - if (sdr_read32(MSDC_ECO_VER) >= 4) { > - val &= ~(0x3 << clk_src_bit[host->id]); > - val |= clksrc << clk_src_bit[host->id]; > - } else { > - val &= ~0x3; val |= clksrc; > - } > - sdr_write32(MSDC_CLKSRC_REG, val); > - > - host->hclk = hclks[clksrc]; > - host->hw->clk_src = clksrc; > + u32 val; > + u32 base = host->base; > + > + BUG_ON(clksrc > 3); > + INIT_MSG("set clock source to <%d>", clksrc); > + > + val = sdr_read32(MSDC_CLKSRC_REG); > + if (sdr_read32(MSDC_ECO_VER) >= 4) { > + val &= ~(0x3 << clk_src_bit[host->id]); > + val |= clksrc << clk_src_bit[host->id]; > + } else { > + val &= ~0x3; val |= clksrc; > + } > + sdr_write32(MSDC_CLKSRC_REG, val); > + > + host->hclk = hclks[clksrc]; > + host->hw->clk_src = clksrc; > } > #endif /* end of --- */ > > static void msdc_set_mclk(struct msdc_host *host, int ddr, unsigned int hz) > { > - //struct msdc_hw *hw = host->hw; > - u32 base = host->base; > - u32 mode; > - u32 flags; > - u32 div; > - u32 sclk; > - u32 hclk = host->hclk; > - //u8 clksrc = hw->clk_src; > - > - if (!hz) { // set mmc system clock to 0 ? > - //ERR_MSG("set mclk to 0!!!"); > - msdc_reset(); > - return; > - } > - > - msdc_irq_save(flags); > + //struct msdc_hw *hw = host->hw; > + u32 base = host->base; > + u32 mode; > + u32 flags; > + u32 div; > + u32 sclk; > + u32 hclk = host->hclk; > + //u8 clksrc = hw->clk_src; > + > + if (!hz) { // set mmc system clock to 0 ? > + //ERR_MSG("set mclk to 0!!!"); > + msdc_reset(); > + return; > + } > + > + msdc_irq_save(flags); > > #if defined (CONFIG_MT7621_FPGA) || defined (CONFIG_MT7628_FPGA) > - mode = 0x0; /* use divisor */ > - if (hz >= (hclk >> 1)) { > - div = 0; /* mean div = 1/2 */ > - sclk = hclk >> 1; /* sclk = clk / 2 */ > - } else { > - div = (hclk + ((hz << 2) - 1)) / (hz << 2); > - sclk = (hclk >> 2) / div; > - } > -#else > - if (ddr) { > - mode = 0x2; /* ddr mode and use divisor */ > - if (hz >= (hclk >> 2)) { > - div = 1; /* mean div = 1/4 */ > - sclk = hclk >> 2; /* sclk = clk / 4 */ > - } else { > - div = (hclk + ((hz << 2) - 1)) / (hz << 2); > - sclk = (hclk >> 2) / div; > - } > - } else if (hz >= hclk) { /* bug fix */ > - mode = 0x1; /* no divisor and divisor is ignored */ > - div = 0; > - sclk = hclk; > - } else { > - mode = 0x0; /* use divisor */ > - if (hz >= (hclk >> 1)) { > + mode = 0x0; /* use divisor */ > + if (hz >= (hclk >> 1)) { > div = 0; /* mean div = 1/2 */ > sclk = hclk >> 1; /* sclk = clk / 2 */ > - } else { > + } else { > div = (hclk + ((hz << 2) - 1)) / (hz << 2); > sclk = (hclk >> 2) / div; > - } > - } > + } > +#else > + if (ddr) { > + mode = 0x2; /* ddr mode and use divisor */ > + if (hz >= (hclk >> 2)) { > + div = 1; /* mean div = 1/4 */ > + sclk = hclk >> 2; /* sclk = clk / 4 */ > + } else { > + div = (hclk + ((hz << 2) - 1)) / (hz << 2); > + sclk = (hclk >> 2) / div; > + } > + } else if (hz >= hclk) { /* bug fix */ > + mode = 0x1; /* no divisor and divisor is ignored */ > + div = 0; > + sclk = hclk; > + } else { > + mode = 0x0; /* use divisor */ > + if (hz >= (hclk >> 1)) { > + div = 0; /* mean div = 1/2 */ > + sclk = hclk >> 1; /* sclk = clk / 2 */ > + } else { > + div = (hclk + ((hz << 2) - 1)) / (hz << 2); > + sclk = (hclk >> 2) / div; > + } > + } > #endif > - /* set clock mode and divisor */ > - sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD, mode); > - sdr_set_field(MSDC_CFG, MSDC_CFG_CKDIV, div); > + /* set clock mode and divisor */ > + sdr_set_field(MSDC_CFG, MSDC_CFG_CKMOD, mode); > + sdr_set_field(MSDC_CFG, MSDC_CFG_CKDIV, div); > > - /* wait clock stable */ > - while (!(sdr_read32(MSDC_CFG) & MSDC_CFG_CKSTB)); > + /* wait clock stable */ > + while (!(sdr_read32(MSDC_CFG) & MSDC_CFG_CKSTB)); > > - host->sclk = sclk; > - host->mclk = hz; > - msdc_set_timeout(host, host->timeout_ns, host->timeout_clks); // need? > + host->sclk = sclk; > + host->mclk = hz; > + msdc_set_timeout(host, host->timeout_ns, host->timeout_clks); // need? > > - INIT_MSG("================"); > - INIT_MSG("!!! Set<%dKHz> Source<%dKHz> -> sclk<%dKHz>", hz/1000, hclk/1000, sclk/1000); > - INIT_MSG("================"); > + INIT_MSG("================"); > + INIT_MSG("!!! Set<%dKHz> Source<%dKHz> -> sclk<%dKHz>", hz/1000, hclk/1000, sclk/1000); > + INIT_MSG("================"); > > - msdc_irq_restore(flags); > + msdc_irq_restore(flags); > } > > /* Fix me. when need to abort */ > static void msdc_abort_data(struct msdc_host *host) > { > - u32 base = host->base; > - struct mmc_command *stop = host->mrq->stop; > + u32 base = host->base; > + struct mmc_command *stop = host->mrq->stop; > > - ERR_MSG("Need to Abort. dma<%d>", host->dma_xfer); > + ERR_MSG("Need to Abort. dma<%d>", host->dma_xfer); > > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > > - // need to check FIFO count 0 ? > + // need to check FIFO count 0 ? > > - if (stop) { /* try to stop, but may not success */ > - ERR_MSG("stop when abort CMD<%d>", stop->opcode); > - (void)msdc_do_command(host, stop, 0, CMD_TIMEOUT); > - } > + if (stop) { /* try to stop, but may not success */ > + ERR_MSG("stop when abort CMD<%d>", stop->opcode); > + (void)msdc_do_command(host, stop, 0, CMD_TIMEOUT); > + } > > - //if (host->mclk >= 25000000) { > - // msdc_set_mclk(host, 0, host->mclk >> 1); > - //} > + //if (host->mclk >= 25000000) { > + // msdc_set_mclk(host, 0, host->mclk >> 1); > + //} > } > > #if 0 /* --- by chhung */ > static void msdc_pin_config(struct msdc_host *host, int mode) > { > - struct msdc_hw *hw = host->hw; > - u32 base = host->base; > - int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN; > - > - /* Config WP pin */ > - if (hw->flags & MSDC_WP_PIN_EN) { > - if (hw->config_gpio_pin) /* NULL */ > - hw->config_gpio_pin(MSDC_WP_PIN, pull); > - } > - > - switch (mode) { > - case MSDC_PIN_PULL_UP: > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 1); /* Check & FIXME */ > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */ > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 1); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 1); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0); > - break; > - case MSDC_PIN_PULL_DOWN: > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */ > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 1); /* Check & FIXME */ > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 1); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 1); > - break; > - case MSDC_PIN_PULL_NONE: > - default: > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */ > - //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */ > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0); > - break; > - } > - > - N_MSG(CFG, "Pins mode(%d), down(%d), up(%d)", > - mode, MSDC_PIN_PULL_DOWN, MSDC_PIN_PULL_UP); > + struct msdc_hw *hw = host->hw; > + u32 base = host->base; > + int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN; > + > + /* Config WP pin */ > + if (hw->flags & MSDC_WP_PIN_EN) { > + if (hw->config_gpio_pin) /* NULL */ > + hw->config_gpio_pin(MSDC_WP_PIN, pull); > + } > + > + switch (mode) { > + case MSDC_PIN_PULL_UP: > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 1); /* Check & FIXME */ > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */ > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 1); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 1); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0); > + break; > + case MSDC_PIN_PULL_DOWN: > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */ > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 1); /* Check & FIXME */ > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 1); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 1); > + break; > + case MSDC_PIN_PULL_NONE: > + default: > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPU, 0); /* Check & FIXME */ > + //sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKPD, 0); /* Check & FIXME */ > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPU, 0); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDPD, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPU, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATPD, 0); > + break; > + } > + > + N_MSG(CFG, "Pins mode(%d), down(%d), up(%d)", > + mode, MSDC_PIN_PULL_DOWN, MSDC_PIN_PULL_UP); > } > > void msdc_pin_reset(struct msdc_host *host, int mode) > { > - struct msdc_hw *hw = (struct msdc_hw *)host->hw; > - u32 base = host->base; > - int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN; > - > - /* Config reset pin */ > - if (hw->flags & MSDC_RST_PIN_EN) { > - if (hw->config_gpio_pin) /* NULL */ > - hw->config_gpio_pin(MSDC_RST_PIN, pull); > - > - if (mode == MSDC_PIN_PULL_UP) { > - sdr_clr_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST); > - } else { > - sdr_set_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST); > - } > - } > + struct msdc_hw *hw = (struct msdc_hw *)host->hw; > + u32 base = host->base; > + int pull = (mode == MSDC_PIN_PULL_UP) ? GPIO_PULL_UP : GPIO_PULL_DOWN; > + > + /* Config reset pin */ > + if (hw->flags & MSDC_RST_PIN_EN) { > + if (hw->config_gpio_pin) /* NULL */ > + hw->config_gpio_pin(MSDC_RST_PIN, pull); > + > + if (mode == MSDC_PIN_PULL_UP) { > + sdr_clr_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST); > + } else { > + sdr_set_bits(EMMC_IOCON, EMMC_IOCON_BOOTRST); > + } > + } > } > > static void msdc_core_power(struct msdc_host *host, int on) > { > - N_MSG(CFG, "Turn %s %s power (copower: %d -> %d)", > - on ? "on" : "off", "core", host->core_power, on); > - > - if (on && host->core_power == 0) { > - msdc_vcore_on(host); > - host->core_power = 1; > - msleep(1); > - } else if (!on && host->core_power == 1) { > - msdc_vcore_off(host); > - host->core_power = 0; > - msleep(1); > - } > + N_MSG(CFG, "Turn %s %s power (copower: %d -> %d)", > + on ? "on" : "off", "core", host->core_power, on); > + > + if (on && host->core_power == 0) { > + msdc_vcore_on(host); > + host->core_power = 1; > + msleep(1); > + } else if (!on && host->core_power == 1) { > + msdc_vcore_off(host); > + host->core_power = 0; > + msleep(1); > + } > } > > static void msdc_host_power(struct msdc_host *host, int on) > { > - N_MSG(CFG, "Turn %s %s power ", on ? "on" : "off", "host"); > - > - if (on) { > - //msdc_core_power(host, 1); // need do card detection. > - msdc_pin_reset(host, MSDC_PIN_PULL_UP); > - } else { > - msdc_pin_reset(host, MSDC_PIN_PULL_DOWN); > - //msdc_core_power(host, 0); > - } > + N_MSG(CFG, "Turn %s %s power ", on ? "on" : "off", "host"); > + > + if (on) { > + //msdc_core_power(host, 1); // need do card detection. > + msdc_pin_reset(host, MSDC_PIN_PULL_UP); > + } else { > + msdc_pin_reset(host, MSDC_PIN_PULL_DOWN); > + //msdc_core_power(host, 0); > + } > } > > static void msdc_card_power(struct msdc_host *host, int on) > { > - N_MSG(CFG, "Turn %s %s power ", on ? "on" : "off", "card"); > - > - if (on) { > - msdc_pin_config(host, MSDC_PIN_PULL_UP); > - if (host->hw->ext_power_on) { > - host->hw->ext_power_on(); > - } else { > - //msdc_vdd_on(host); // need todo card detection. > - } > - msleep(1); > - } else { > - if (host->hw->ext_power_off) { > - host->hw->ext_power_off(); > - } else { > - //msdc_vdd_off(host); > - } > - msdc_pin_config(host, MSDC_PIN_PULL_DOWN); > - msleep(1); > - } > + N_MSG(CFG, "Turn %s %s power ", on ? "on" : "off", "card"); > + > + if (on) { > + msdc_pin_config(host, MSDC_PIN_PULL_UP); > + if (host->hw->ext_power_on) { > + host->hw->ext_power_on(); > + } else { > + //msdc_vdd_on(host); // need todo card detection. > + } > + msleep(1); > + } else { > + if (host->hw->ext_power_off) { > + host->hw->ext_power_off(); > + } else { > + //msdc_vdd_off(host); > + } > + msdc_pin_config(host, MSDC_PIN_PULL_DOWN); > + msleep(1); > + } > } > > static void msdc_set_power_mode(struct msdc_host *host, u8 mode) > { > - N_MSG(CFG, "Set power mode(%d)", mode); > - > - if (host->power_mode == MMC_POWER_OFF && mode != MMC_POWER_OFF) { > - msdc_host_power(host, 1); > - msdc_card_power(host, 1); > - } else if (host->power_mode != MMC_POWER_OFF && mode == MMC_POWER_OFF) { > - msdc_card_power(host, 0); > - msdc_host_power(host, 0); > - } > - host->power_mode = mode; > + N_MSG(CFG, "Set power mode(%d)", mode); > + > + if (host->power_mode == MMC_POWER_OFF && mode != MMC_POWER_OFF) { > + msdc_host_power(host, 1); > + msdc_card_power(host, 1); > + } else if (host->power_mode != MMC_POWER_OFF && mode == MMC_POWER_OFF) { > + msdc_card_power(host, 0); > + msdc_host_power(host, 0); > + } > + host->power_mode = mode; > } > #endif /* end of --- */ > > @@ -871,57 +871,57 @@ static void msdc_set_power_mode(struct msdc_host *host, u8 mode) > */ > static void msdc_pm(pm_message_t state, void *data) > { > - struct msdc_host *host = (struct msdc_host *)data; > - int evt = state.event; > - > - if (evt == PM_EVENT_USER_RESUME || evt == PM_EVENT_USER_SUSPEND) { > - INIT_MSG("USR_%s: suspend<%d> power<%d>", > - evt == PM_EVENT_USER_RESUME ? "EVENT_USER_RESUME" : "EVENT_USER_SUSPEND", > - host->suspend, host->power_mode); > - } > - > - if (evt == PM_EVENT_SUSPEND || evt == PM_EVENT_USER_SUSPEND) { > - if (host->suspend) /* already suspend */ /* default 0*/ > - return; > - > - /* for memory card. already power off by mmc */ > - if (evt == PM_EVENT_SUSPEND && host->power_mode == MMC_POWER_OFF) > - return; > - > - host->suspend = 1; > - host->pm_state = state; /* default PMSG_RESUME */ > - > - INIT_MSG("%s Suspend", evt == PM_EVENT_SUSPEND ? "PM" : "USR"); > - if(host->hw->flags & MSDC_SYS_SUSPEND) /* set for card */ > - (void)mmc_suspend_host(host->mmc); > - else { > - // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* just for double confirm */ /* --- by chhung */ > - mmc_remove_host(host->mmc); > - } > - } else if (evt == PM_EVENT_RESUME || evt == PM_EVENT_USER_RESUME) { > - if (!host->suspend){ > - //ERR_MSG("warning: already resume"); > - return; > - } > - > - /* No PM resume when USR suspend */ > - if (evt == PM_EVENT_RESUME && host->pm_state.event == PM_EVENT_USER_SUSPEND) { > - ERR_MSG("PM Resume when in USR Suspend"); /* won't happen. */ > - return; > - } > - > - host->suspend = 0; > - host->pm_state = state; > - > - INIT_MSG("%s Resume", evt == PM_EVENT_RESUME ? "PM" : "USR"); > - if(host->hw->flags & MSDC_SYS_SUSPEND) { /* will not set for WIFI */ > - (void)mmc_resume_host(host->mmc); > - } > - else { > - // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* --- by chhung */ > - mmc_add_host(host->mmc); > - } > - } > + struct msdc_host *host = (struct msdc_host *)data; > + int evt = state.event; > + > + if (evt == PM_EVENT_USER_RESUME || evt == PM_EVENT_USER_SUSPEND) { > + INIT_MSG("USR_%s: suspend<%d> power<%d>", > + evt == PM_EVENT_USER_RESUME ? "EVENT_USER_RESUME" : "EVENT_USER_SUSPEND", > + host->suspend, host->power_mode); > + } > + > + if (evt == PM_EVENT_SUSPEND || evt == PM_EVENT_USER_SUSPEND) { > + if (host->suspend) /* already suspend */ /* default 0*/ > + return; > + > + /* for memory card. already power off by mmc */ > + if (evt == PM_EVENT_SUSPEND && host->power_mode == MMC_POWER_OFF) > + return; > + > + host->suspend = 1; > + host->pm_state = state; /* default PMSG_RESUME */ > + > + INIT_MSG("%s Suspend", evt == PM_EVENT_SUSPEND ? "PM" : "USR"); > + if(host->hw->flags & MSDC_SYS_SUSPEND) /* set for card */ > + (void)mmc_suspend_host(host->mmc); > + else { > + // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* just for double confirm */ /* --- by chhung */ > + mmc_remove_host(host->mmc); > + } > + } else if (evt == PM_EVENT_RESUME || evt == PM_EVENT_USER_RESUME) { > + if (!host->suspend){ > + //ERR_MSG("warning: already resume"); > + return; > + } > + > + /* No PM resume when USR suspend */ > + if (evt == PM_EVENT_RESUME && host->pm_state.event == PM_EVENT_USER_SUSPEND) { > + ERR_MSG("PM Resume when in USR Suspend"); /* won't happen. */ > + return; > + } > + > + host->suspend = 0; > + host->pm_state = state; > + > + INIT_MSG("%s Resume", evt == PM_EVENT_RESUME ? "PM" : "USR"); > + if(host->hw->flags & MSDC_SYS_SUSPEND) { /* will not set for WIFI */ > + (void)mmc_resume_host(host->mmc); > + } > + else { > + // host->mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* --- by chhung */ > + mmc_add_host(host->mmc); > + } > + } > } > #endif > > @@ -929,243 +929,243 @@ static void msdc_pm(pm_message_t state, void *data) > /* mmc_host_ops members */ > /*--------------------------------------------------------------------------*/ > static unsigned int msdc_command_start(struct msdc_host *host, > - struct mmc_command *cmd, > - int tune, /* not used */ > - unsigned long timeout) > + struct mmc_command *cmd, > + int tune, /* not used */ > + unsigned long timeout) > { > - u32 base = host->base; > - u32 opcode = cmd->opcode; > - u32 rawcmd; > - u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | > - MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | > - MSDC_INT_ACMD19_DONE; > - > - u32 resp; > - unsigned long tmo; > - > - /* Protocol layer does not provide response type, but our hardware needs > - * to know exact type, not just size! > - */ > - if (opcode == MMC_SEND_OP_COND || opcode == SD_APP_OP_COND) > - resp = RESP_R3; > - else if (opcode == MMC_SET_RELATIVE_ADDR || opcode == SD_SEND_RELATIVE_ADDR) > - resp = (mmc_cmd_type(cmd) == MMC_CMD_BCR) ? RESP_R6 : RESP_R1; > - else if (opcode == MMC_FAST_IO) > - resp = RESP_R4; > - else if (opcode == MMC_GO_IRQ_STATE) > - resp = RESP_R5; > - else if (opcode == MMC_SELECT_CARD) > - resp = (cmd->arg != 0) ? RESP_R1B : RESP_NONE; > - else if (opcode == SD_IO_RW_DIRECT || opcode == SD_IO_RW_EXTENDED) > - resp = RESP_R1; /* SDIO workaround. */ > - else if (opcode == SD_SEND_IF_COND && (mmc_cmd_type(cmd) == MMC_CMD_BCR)) > - resp = RESP_R1; > - else { > - switch (mmc_resp_type(cmd)) { > - case MMC_RSP_R1: > - resp = RESP_R1; > - break; > - case MMC_RSP_R1B: > - resp = RESP_R1B; > - break; > - case MMC_RSP_R2: > - resp = RESP_R2; > - break; > - case MMC_RSP_R3: > - resp = RESP_R3; > - break; > - case MMC_RSP_NONE: > - default: > - resp = RESP_NONE; > - break; > - } > - } > - > - cmd->error = 0; > - /* rawcmd : > - * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 | > - * stop << 14 | rw << 13 | dtype << 11 | rsptyp << 7 | brk << 6 | opcode > - */ > - rawcmd = opcode | msdc_rsp[resp] << 7 | host->blksz << 16; > - > - if (opcode == MMC_READ_MULTIPLE_BLOCK) { > - rawcmd |= (2 << 11); > - } else if (opcode == MMC_READ_SINGLE_BLOCK) { > - rawcmd |= (1 << 11); > - } else if (opcode == MMC_WRITE_MULTIPLE_BLOCK) { > - rawcmd |= ((2 << 11) | (1 << 13)); > - } else if (opcode == MMC_WRITE_BLOCK) { > - rawcmd |= ((1 << 11) | (1 << 13)); > - } else if (opcode == SD_IO_RW_EXTENDED) { > - if (cmd->data->flags & MMC_DATA_WRITE) > - rawcmd |= (1 << 13); > - if (cmd->data->blocks > 1) > - rawcmd |= (2 << 11); > - else > - rawcmd |= (1 << 11); > - } else if (opcode == SD_IO_RW_DIRECT && cmd->flags == (unsigned int)-1) { > - rawcmd |= (1 << 14); > - } else if ((opcode == SD_APP_SEND_SCR) || > - (opcode == SD_APP_SEND_NUM_WR_BLKS) || > - (opcode == SD_SWITCH && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || > - (opcode == SD_APP_SD_STATUS && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || > - (opcode == MMC_SEND_EXT_CSD && (mmc_cmd_type(cmd) == MMC_CMD_ADTC))) { > - rawcmd |= (1 << 11); > - } else if (opcode == MMC_STOP_TRANSMISSION) { > - rawcmd |= (1 << 14); > - rawcmd &= ~(0x0FFF << 16); > - } > - > - N_MSG(CMD, "CMD<%d><0x%.8x> Arg<0x%.8x>", opcode , rawcmd, cmd->arg); > - > - tmo = jiffies + timeout; > - > - if (opcode == MMC_SEND_STATUS) { > - for (;;) { > - if (!sdc_is_cmd_busy()) > - break; > - > - if (time_after(jiffies, tmo)) { > - ERR_MSG("XXX cmd_busy timeout: before CMD<%d>", opcode); > - cmd->error = (unsigned int)-ETIMEDOUT; > - msdc_reset(); > - goto end; > - } > - } > - }else { > - for (;;) { > - if (!sdc_is_busy()) > - break; > - if (time_after(jiffies, tmo)) { > - ERR_MSG("XXX sdc_busy timeout: before CMD<%d>", opcode); > - cmd->error = (unsigned int)-ETIMEDOUT; > - msdc_reset(); > - goto end; > - } > - } > - } > - > - //BUG_ON(in_interrupt()); > - host->cmd = cmd; > - host->cmd_rsp = resp; > - > - init_completion(&host->cmd_done); > - > - sdr_set_bits(MSDC_INTEN, wints); > - sdc_send_cmd(rawcmd, cmd->arg); > + u32 base = host->base; > + u32 opcode = cmd->opcode; > + u32 rawcmd; > + u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | > + MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | > + MSDC_INT_ACMD19_DONE; > + > + u32 resp; > + unsigned long tmo; > + > + /* Protocol layer does not provide response type, but our hardware needs > + * to know exact type, not just size! > + */ > + if (opcode == MMC_SEND_OP_COND || opcode == SD_APP_OP_COND) > + resp = RESP_R3; > + else if (opcode == MMC_SET_RELATIVE_ADDR || opcode == SD_SEND_RELATIVE_ADDR) > + resp = (mmc_cmd_type(cmd) == MMC_CMD_BCR) ? RESP_R6 : RESP_R1; > + else if (opcode == MMC_FAST_IO) > + resp = RESP_R4; > + else if (opcode == MMC_GO_IRQ_STATE) > + resp = RESP_R5; > + else if (opcode == MMC_SELECT_CARD) > + resp = (cmd->arg != 0) ? RESP_R1B : RESP_NONE; > + else if (opcode == SD_IO_RW_DIRECT || opcode == SD_IO_RW_EXTENDED) > + resp = RESP_R1; /* SDIO workaround. */ > + else if (opcode == SD_SEND_IF_COND && (mmc_cmd_type(cmd) == MMC_CMD_BCR)) > + resp = RESP_R1; > + else { > + switch (mmc_resp_type(cmd)) { > + case MMC_RSP_R1: > + resp = RESP_R1; > + break; > + case MMC_RSP_R1B: > + resp = RESP_R1B; > + break; > + case MMC_RSP_R2: > + resp = RESP_R2; > + break; > + case MMC_RSP_R3: > + resp = RESP_R3; > + break; > + case MMC_RSP_NONE: > + default: > + resp = RESP_NONE; > + break; > + } > + } > + > + cmd->error = 0; > + /* rawcmd : > + * vol_swt << 30 | auto_cmd << 28 | blklen << 16 | go_irq << 15 | > + * stop << 14 | rw << 13 | dtype << 11 | rsptyp << 7 | brk << 6 | opcode > + */ > + rawcmd = opcode | msdc_rsp[resp] << 7 | host->blksz << 16; > + > + if (opcode == MMC_READ_MULTIPLE_BLOCK) { > + rawcmd |= (2 << 11); > + } else if (opcode == MMC_READ_SINGLE_BLOCK) { > + rawcmd |= (1 << 11); > + } else if (opcode == MMC_WRITE_MULTIPLE_BLOCK) { > + rawcmd |= ((2 << 11) | (1 << 13)); > + } else if (opcode == MMC_WRITE_BLOCK) { > + rawcmd |= ((1 << 11) | (1 << 13)); > + } else if (opcode == SD_IO_RW_EXTENDED) { > + if (cmd->data->flags & MMC_DATA_WRITE) > + rawcmd |= (1 << 13); > + if (cmd->data->blocks > 1) > + rawcmd |= (2 << 11); > + else > + rawcmd |= (1 << 11); > + } else if (opcode == SD_IO_RW_DIRECT && cmd->flags == (unsigned int)-1) { > + rawcmd |= (1 << 14); > + } else if ((opcode == SD_APP_SEND_SCR) || > + (opcode == SD_APP_SEND_NUM_WR_BLKS) || > + (opcode == SD_SWITCH && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || > + (opcode == SD_APP_SD_STATUS && (mmc_cmd_type(cmd) == MMC_CMD_ADTC)) || > + (opcode == MMC_SEND_EXT_CSD && (mmc_cmd_type(cmd) == MMC_CMD_ADTC))) { > + rawcmd |= (1 << 11); > + } else if (opcode == MMC_STOP_TRANSMISSION) { > + rawcmd |= (1 << 14); > + rawcmd &= ~(0x0FFF << 16); > + } > + > + N_MSG(CMD, "CMD<%d><0x%.8x> Arg<0x%.8x>", opcode , rawcmd, cmd->arg); > + > + tmo = jiffies + timeout; > + > + if (opcode == MMC_SEND_STATUS) { > + for (;;) { > + if (!sdc_is_cmd_busy()) > + break; > + > + if (time_after(jiffies, tmo)) { > + ERR_MSG("XXX cmd_busy timeout: before CMD<%d>", opcode); > + cmd->error = (unsigned int)-ETIMEDOUT; > + msdc_reset(); > + goto end; > + } > + } > + }else { > + for (;;) { > + if (!sdc_is_busy()) > + break; > + if (time_after(jiffies, tmo)) { > + ERR_MSG("XXX sdc_busy timeout: before CMD<%d>", opcode); > + cmd->error = (unsigned int)-ETIMEDOUT; > + msdc_reset(); > + goto end; > + } > + } > + } > + > + //BUG_ON(in_interrupt()); > + host->cmd = cmd; > + host->cmd_rsp = resp; > + > + init_completion(&host->cmd_done); > + > + sdr_set_bits(MSDC_INTEN, wints); > + sdc_send_cmd(rawcmd, cmd->arg); > > end: > - return cmd->error; > + return cmd->error; > } > > static unsigned int msdc_command_resp(struct msdc_host *host, > - struct mmc_command *cmd, > - int tune, > - unsigned long timeout) > + struct mmc_command *cmd, > + int tune, > + unsigned long timeout) > { > - u32 base = host->base; > - u32 opcode = cmd->opcode; > - //u32 rawcmd; > - u32 resp; > - u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | > - MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | > - MSDC_INT_ACMD19_DONE; > - > - resp = host->cmd_rsp; > - > - BUG_ON(in_interrupt()); > - //init_completion(&host->cmd_done); > - //sdr_set_bits(MSDC_INTEN, wints); > - > - spin_unlock(&host->lock); > - if(!wait_for_completion_timeout(&host->cmd_done, 10*timeout)){ > - ERR_MSG("XXX CMD<%d> wait_for_completion timeout ARG<0x%.8x>", opcode, cmd->arg); > - cmd->error = (unsigned int)-ETIMEDOUT; > - msdc_reset(); > - } > - spin_lock(&host->lock); > - > - sdr_clr_bits(MSDC_INTEN, wints); > - host->cmd = NULL; > + u32 base = host->base; > + u32 opcode = cmd->opcode; > + //u32 rawcmd; > + u32 resp; > + u32 wints = MSDC_INT_CMDRDY | MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | > + MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | > + MSDC_INT_ACMD19_DONE; > + > + resp = host->cmd_rsp; > + > + BUG_ON(in_interrupt()); > + //init_completion(&host->cmd_done); > + //sdr_set_bits(MSDC_INTEN, wints); > + > + spin_unlock(&host->lock); > + if(!wait_for_completion_timeout(&host->cmd_done, 10*timeout)){ > + ERR_MSG("XXX CMD<%d> wait_for_completion timeout ARG<0x%.8x>", opcode, cmd->arg); > + cmd->error = (unsigned int)-ETIMEDOUT; > + msdc_reset(); > + } > + spin_lock(&host->lock); > + > + sdr_clr_bits(MSDC_INTEN, wints); > + host->cmd = NULL; > > //end: > #ifdef MT6575_SD_DEBUG > - switch (resp) { > - case RESP_NONE: > - N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)", opcode, cmd->error, resp); > - break; > - case RESP_R2: > - N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)= %.8x %.8x %.8x %.8x", > - opcode, cmd->error, resp, cmd->resp[0], cmd->resp[1], > - cmd->resp[2], cmd->resp[3]); > - break; > - default: /* Response types 1, 3, 4, 5, 6, 7(1b) */ > - N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)= 0x%.8x", > - opcode, cmd->error, resp, cmd->resp[0]); > - if (cmd->error == 0) { > - switch (resp) { > - case RESP_R1: > - case RESP_R1B: > - msdc_dump_card_status(host, cmd->resp[0]); > - break; > - case RESP_R3: > - msdc_dump_ocr_reg(host, cmd->resp[0]); > - break; > - case RESP_R5: > - msdc_dump_io_resp(host, cmd->resp[0]); > - break; > - case RESP_R6: > - msdc_dump_rca_resp(host, cmd->resp[0]); > - break; > - } > - } > - break; > - } > + switch (resp) { > + case RESP_NONE: > + N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)", opcode, cmd->error, resp); > + break; > + case RESP_R2: > + N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)= %.8x %.8x %.8x %.8x", > + opcode, cmd->error, resp, cmd->resp[0], cmd->resp[1], > + cmd->resp[2], cmd->resp[3]); > + break; > + default: /* Response types 1, 3, 4, 5, 6, 7(1b) */ > + N_MSG(RSP, "CMD_RSP(%d): %d RSP(%d)= 0x%.8x", > + opcode, cmd->error, resp, cmd->resp[0]); > + if (cmd->error == 0) { > + switch (resp) { > + case RESP_R1: > + case RESP_R1B: > + msdc_dump_card_status(host, cmd->resp[0]); > + break; > + case RESP_R3: > + msdc_dump_ocr_reg(host, cmd->resp[0]); > + break; > + case RESP_R5: > + msdc_dump_io_resp(host, cmd->resp[0]); > + break; > + case RESP_R6: > + msdc_dump_rca_resp(host, cmd->resp[0]); > + break; > + } > + } > + break; > + } > #endif > > - /* do we need to save card's RCA when SD_SEND_RELATIVE_ADDR */ > - > - if (!tune) { > - return cmd->error; > - } > - > - /* memory card CRC */ > - if(host->hw->flags & MSDC_REMOVABLE && cmd->error == (unsigned int)(-EIO) ) { > - if (sdr_read32(SDC_CMD) & 0x1800) { /* check if has data phase */ > - msdc_abort_data(host); > - } else { > - /* do basic: reset*/ > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > - } > - cmd->error = msdc_tune_cmdrsp(host,cmd); > - } > - > - // check DAT0 > - /* if (resp == RESP_R1B) { > - while ((sdr_read32(MSDC_PS) & 0x10000) != 0x10000); > - } */ > - /* CMD12 Error Handle */ > - > - return cmd->error; > + /* do we need to save card's RCA when SD_SEND_RELATIVE_ADDR */ > + > + if (!tune) { > + return cmd->error; > + } > + > + /* memory card CRC */ > + if(host->hw->flags & MSDC_REMOVABLE && cmd->error == (unsigned int)(-EIO) ) { > + if (sdr_read32(SDC_CMD) & 0x1800) { /* check if has data phase */ > + msdc_abort_data(host); > + } else { > + /* do basic: reset*/ > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > + } > + cmd->error = msdc_tune_cmdrsp(host,cmd); > + } > + > + // check DAT0 > + /* if (resp == RESP_R1B) { > + while ((sdr_read32(MSDC_PS) & 0x10000) != 0x10000); > + } */ > + /* CMD12 Error Handle */ > + > + return cmd->error; > } > > static unsigned int msdc_do_command(struct msdc_host *host, > - struct mmc_command *cmd, > - int tune, > - unsigned long timeout) > + struct mmc_command *cmd, > + int tune, > + unsigned long timeout) > { > - if (msdc_command_start(host, cmd, tune, timeout)) > - goto end; > + if (msdc_command_start(host, cmd, tune, timeout)) > + goto end; > > - if (msdc_command_resp(host, cmd, tune, timeout)) > - goto end; > + if (msdc_command_resp(host, cmd, tune, timeout)) > + goto end; > > end: > > - N_MSG(CMD, " return<%d> resp<0x%.8x>", cmd->error, cmd->resp[0]); > - return cmd->error; > + N_MSG(CMD, " return<%d> resp<0x%.8x>", cmd->error, cmd->resp[0]); > + return cmd->error; > } > > /* The abort condition when PIO read/write > @@ -1173,26 +1173,26 @@ static unsigned int msdc_do_command(struct msdc_host *host, > */ > static int msdc_pio_abort(struct msdc_host *host, struct mmc_data *data, unsigned long tmo) > { > - int ret = 0; > - u32 base = host->base; > - > - if (atomic_read(&host->abort)) { > - ret = 1; > - } > - > - if (time_after(jiffies, tmo)) { > - data->error = (unsigned int)-ETIMEDOUT; > - ERR_MSG("XXX PIO Data Timeout: CMD<%d>", host->mrq->cmd->opcode); > - ret = 1; > - } > - > - if(ret) { > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > - ERR_MSG("msdc pio find abort"); > - } > - return ret; > + int ret = 0; > + u32 base = host->base; > + > + if (atomic_read(&host->abort)) { > + ret = 1; > + } > + > + if (time_after(jiffies, tmo)) { > + data->error = (unsigned int)-ETIMEDOUT; > + ERR_MSG("XXX PIO Data Timeout: CMD<%d>", host->mrq->cmd->opcode); > + ret = 1; > + } > + > + if(ret) { > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > + ERR_MSG("msdc pio find abort"); > + } > + return ret; > } > > /* > @@ -1201,54 +1201,54 @@ static int msdc_pio_abort(struct msdc_host *host, struct mmc_data *data, unsigne > // pio mode data read/write > static int msdc_pio_read(struct msdc_host *host, struct mmc_data *data) > { > - struct scatterlist *sg = data->sg; > - u32 base = host->base; > - u32 num = data->sg_len; > - u32 *ptr; > - u8 *u8ptr; > - u32 left = 0; > - u32 count, size = 0; > - u32 wints = MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > - unsigned long tmo = jiffies + DAT_TIMEOUT; > - > - sdr_set_bits(MSDC_INTEN, wints); > - while (num) { > - left = sg_dma_len(sg); > - ptr = sg_virt(sg); > - while (left) { > - if ((left >= MSDC_FIFO_THD) && (msdc_rxfifocnt() >= MSDC_FIFO_THD)) { > - count = MSDC_FIFO_THD >> 2; > - do { > - *ptr++ = msdc_fifo_read32(); > - } while (--count); > - left -= MSDC_FIFO_THD; > - } else if ((left < MSDC_FIFO_THD) && msdc_rxfifocnt() >= left) { > - while (left > 3) { > - *ptr++ = msdc_fifo_read32(); > - left -= 4; > - } > - > - u8ptr = (u8 *)ptr; > - while(left) { > - * u8ptr++ = msdc_fifo_read8(); > - left--; > - } > - } > - > - if (msdc_pio_abort(host, data, tmo)) { > - goto end; > - } > - } > - size += sg_dma_len(sg); > - sg = sg_next(sg); num--; > - } > + struct scatterlist *sg = data->sg; > + u32 base = host->base; > + u32 num = data->sg_len; > + u32 *ptr; > + u8 *u8ptr; > + u32 left = 0; > + u32 count, size = 0; > + u32 wints = MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > + unsigned long tmo = jiffies + DAT_TIMEOUT; > + > + sdr_set_bits(MSDC_INTEN, wints); > + while (num) { > + left = sg_dma_len(sg); > + ptr = sg_virt(sg); > + while (left) { > + if ((left >= MSDC_FIFO_THD) && (msdc_rxfifocnt() >= MSDC_FIFO_THD)) { > + count = MSDC_FIFO_THD >> 2; > + do { > + *ptr++ = msdc_fifo_read32(); > + } while (--count); > + left -= MSDC_FIFO_THD; > + } else if ((left < MSDC_FIFO_THD) && msdc_rxfifocnt() >= left) { > + while (left > 3) { > + *ptr++ = msdc_fifo_read32(); > + left -= 4; > + } > + > + u8ptr = (u8 *)ptr; > + while(left) { > + * u8ptr++ = msdc_fifo_read8(); > + left--; > + } > + } > + > + if (msdc_pio_abort(host, data, tmo)) { > + goto end; > + } > + } > + size += sg_dma_len(sg); > + sg = sg_next(sg); num--; > + } > end: > - data->bytes_xfered += size; > - N_MSG(FIO, " PIO Read<%d>bytes", size); > + data->bytes_xfered += size; > + N_MSG(FIO, " PIO Read<%d>bytes", size); > > - sdr_clr_bits(MSDC_INTEN, wints); > - if(data->error) ERR_MSG("read pio data->error<%d> left<%d> size<%d>", data->error, left, size); > - return data->error; > + sdr_clr_bits(MSDC_INTEN, wints); > + if(data->error) ERR_MSG("read pio data->error<%d> left<%d> size<%d>", data->error, left, size); > + return data->error; > } > > /* please make sure won't using PIO when size >= 512 > @@ -1257,1125 +1257,1125 @@ static int msdc_pio_read(struct msdc_host *host, struct mmc_data *data) > */ > static int msdc_pio_write(struct msdc_host* host, struct mmc_data *data) > { > - u32 base = host->base; > - struct scatterlist *sg = data->sg; > - u32 num = data->sg_len; > - u32 *ptr; > - u8 *u8ptr; > - u32 left; > - u32 count, size = 0; > - u32 wints = MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > - unsigned long tmo = jiffies + DAT_TIMEOUT; > - > - sdr_set_bits(MSDC_INTEN, wints); > - while (num) { > - left = sg_dma_len(sg); > - ptr = sg_virt(sg); > - > - while (left) { > - if (left >= MSDC_FIFO_SZ && msdc_txfifocnt() == 0) { > - count = MSDC_FIFO_SZ >> 2; > - do { > - msdc_fifo_write32(*ptr); ptr++; > - } while (--count); > - left -= MSDC_FIFO_SZ; > - } else if (left < MSDC_FIFO_SZ && msdc_txfifocnt() == 0) { > - while (left > 3) { > - msdc_fifo_write32(*ptr); ptr++; > - left -= 4; > - } > - > - u8ptr = (u8*)ptr; > - while(left){ > - msdc_fifo_write8(*u8ptr); u8ptr++; > - left--; > - } > - } > - > - if (msdc_pio_abort(host, data, tmo)) { > - goto end; > - } > - } > - size += sg_dma_len(sg); > - sg = sg_next(sg); num--; > - } > + u32 base = host->base; > + struct scatterlist *sg = data->sg; > + u32 num = data->sg_len; > + u32 *ptr; > + u8 *u8ptr; > + u32 left; > + u32 count, size = 0; > + u32 wints = MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > + unsigned long tmo = jiffies + DAT_TIMEOUT; > + > + sdr_set_bits(MSDC_INTEN, wints); > + while (num) { > + left = sg_dma_len(sg); > + ptr = sg_virt(sg); > + > + while (left) { > + if (left >= MSDC_FIFO_SZ && msdc_txfifocnt() == 0) { > + count = MSDC_FIFO_SZ >> 2; > + do { > + msdc_fifo_write32(*ptr); ptr++; > + } while (--count); > + left -= MSDC_FIFO_SZ; > + } else if (left < MSDC_FIFO_SZ && msdc_txfifocnt() == 0) { > + while (left > 3) { > + msdc_fifo_write32(*ptr); ptr++; > + left -= 4; > + } > + > + u8ptr = (u8*)ptr; > + while(left){ > + msdc_fifo_write8(*u8ptr); u8ptr++; > + left--; > + } > + } > + > + if (msdc_pio_abort(host, data, tmo)) { > + goto end; > + } > + } > + size += sg_dma_len(sg); > + sg = sg_next(sg); num--; > + } > end: > - data->bytes_xfered += size; > - N_MSG(FIO, " PIO Write<%d>bytes", size); > - if(data->error) ERR_MSG("write pio data->error<%d>", data->error); > + data->bytes_xfered += size; > + N_MSG(FIO, " PIO Write<%d>bytes", size); > + if(data->error) ERR_MSG("write pio data->error<%d>", data->error); > > - sdr_clr_bits(MSDC_INTEN, wints); > - return data->error; > + sdr_clr_bits(MSDC_INTEN, wints); > + return data->error; > } > > #if 0 /* --- by chhung */ > // DMA resume / start / stop > static void msdc_dma_resume(struct msdc_host *host) > { > - u32 base = host->base; > + u32 base = host->base; > > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_RESUME, 1); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_RESUME, 1); > > - N_MSG(DMA, "DMA resume"); > + N_MSG(DMA, "DMA resume"); > } > #endif /* end of --- */ > > static void msdc_dma_start(struct msdc_host *host) > { > - u32 base = host->base; > - u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > + u32 base = host->base; > + u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > > - sdr_set_bits(MSDC_INTEN, wints); > - //dsb(); /* --- by chhung */ > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_START, 1); > + sdr_set_bits(MSDC_INTEN, wints); > + //dsb(); /* --- by chhung */ > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_START, 1); > > - N_MSG(DMA, "DMA start"); > + N_MSG(DMA, "DMA start"); > } > > static void msdc_dma_stop(struct msdc_host *host) > { > - u32 base = host->base; > - //u32 retries=500; > - u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > + u32 base = host->base; > + //u32 retries=500; > + u32 wints = MSDC_INTEN_XFER_COMPL | MSDC_INTEN_DATTMO | MSDC_INTEN_DATCRCERR ; > > - N_MSG(DMA, "DMA status: 0x%.8x",sdr_read32(MSDC_DMA_CFG)); > - //while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS); > + N_MSG(DMA, "DMA status: 0x%.8x",sdr_read32(MSDC_DMA_CFG)); > + //while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS); > > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1); > - while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1); > + while (sdr_read32(MSDC_DMA_CFG) & MSDC_DMA_CFG_STS); > > - //dsb(); /* --- by chhung */ > - sdr_clr_bits(MSDC_INTEN, wints); /* Not just xfer_comp */ > + //dsb(); /* --- by chhung */ > + sdr_clr_bits(MSDC_INTEN, wints); /* Not just xfer_comp */ > > - N_MSG(DMA, "DMA stop"); > + N_MSG(DMA, "DMA stop"); > } > > #if 0 /* --- by chhung */ > /* dump a gpd list */ > static void msdc_dma_dump(struct msdc_host *host, struct msdc_dma *dma) > { > - gpd_t *gpd = dma->gpd; > - bd_t *bd = dma->bd; > - bd_t *ptr; > - int i = 0; > - int p_to_v; > - > - if (dma->mode != MSDC_MODE_DMA_DESC) { > - return; > - } > - > - ERR_MSG("try to dump gpd and bd"); > - > - /* dump gpd */ > - ERR_MSG(".gpd<0x%.8x> gpd_phy<0x%.8x>", (int)gpd, (int)dma->gpd_addr); > - ERR_MSG("...hwo <%d>", gpd->hwo ); > - ERR_MSG("...bdp <%d>", gpd->bdp ); > - ERR_MSG("...chksum<0x%.8x>", gpd->chksum ); > - //ERR_MSG("...intr <0x%.8x>", gpd->intr ); > - ERR_MSG("...next <0x%.8x>", (int)gpd->next ); > - ERR_MSG("...ptr <0x%.8x>", (int)gpd->ptr ); > - ERR_MSG("...buflen<0x%.8x>", gpd->buflen ); > - //ERR_MSG("...extlen<0x%.8x>", gpd->extlen ); > - //ERR_MSG("...arg <0x%.8x>", gpd->arg ); > - //ERR_MSG("...blknum<0x%.8x>", gpd->blknum ); > - //ERR_MSG("...cmd <0x%.8x>", gpd->cmd ); > - > - /* dump bd */ > - ERR_MSG(".bd<0x%.8x> bd_phy<0x%.8x> gpd_ptr<0x%.8x>", (int)bd, (int)dma->bd_addr, (int)gpd->ptr); > - ptr = bd; > - p_to_v = ((u32)bd - (u32)dma->bd_addr); > - while (1) { > - ERR_MSG(".bd[%d]", i); i++; > - ERR_MSG("...eol <%d>", ptr->eol ); > - ERR_MSG("...chksum<0x%.8x>", ptr->chksum ); > - //ERR_MSG("...blkpad<0x%.8x>", ptr->blkpad ); > - //ERR_MSG("...dwpad <0x%.8x>", ptr->dwpad ); > - ERR_MSG("...next <0x%.8x>", (int)ptr->next ); > - ERR_MSG("...ptr <0x%.8x>", (int)ptr->ptr ); > - ERR_MSG("...buflen<0x%.8x>", (int)ptr->buflen ); > - > - if (ptr->eol == 1) { > - break; > - } > - > - /* find the next bd, virtual address of ptr->next */ > - /* don't need to enable when use malloc */ > - //BUG_ON( (ptr->next + p_to_v)!=(ptr+1) ); > - //ERR_MSG(".next bd<0x%.8x><0x%.8x>", (ptr->next + p_to_v), (ptr+1)); > - ptr++; > - } > - > - ERR_MSG("dump gpd and bd finished"); > + gpd_t *gpd = dma->gpd; > + bd_t *bd = dma->bd; > + bd_t *ptr; > + int i = 0; > + int p_to_v; > + > + if (dma->mode != MSDC_MODE_DMA_DESC) { > + return; > + } > + > + ERR_MSG("try to dump gpd and bd"); > + > + /* dump gpd */ > + ERR_MSG(".gpd<0x%.8x> gpd_phy<0x%.8x>", (int)gpd, (int)dma->gpd_addr); > + ERR_MSG("...hwo <%d>", gpd->hwo ); > + ERR_MSG("...bdp <%d>", gpd->bdp ); > + ERR_MSG("...chksum<0x%.8x>", gpd->chksum ); > + //ERR_MSG("...intr <0x%.8x>", gpd->intr ); > + ERR_MSG("...next <0x%.8x>", (int)gpd->next ); > + ERR_MSG("...ptr <0x%.8x>", (int)gpd->ptr ); > + ERR_MSG("...buflen<0x%.8x>", gpd->buflen ); > + //ERR_MSG("...extlen<0x%.8x>", gpd->extlen ); > + //ERR_MSG("...arg <0x%.8x>", gpd->arg ); > + //ERR_MSG("...blknum<0x%.8x>", gpd->blknum ); > + //ERR_MSG("...cmd <0x%.8x>", gpd->cmd ); > + > + /* dump bd */ > + ERR_MSG(".bd<0x%.8x> bd_phy<0x%.8x> gpd_ptr<0x%.8x>", (int)bd, (int)dma->bd_addr, (int)gpd->ptr); > + ptr = bd; > + p_to_v = ((u32)bd - (u32)dma->bd_addr); > + while (1) { > + ERR_MSG(".bd[%d]", i); i++; > + ERR_MSG("...eol <%d>", ptr->eol ); > + ERR_MSG("...chksum<0x%.8x>", ptr->chksum ); > + //ERR_MSG("...blkpad<0x%.8x>", ptr->blkpad ); > + //ERR_MSG("...dwpad <0x%.8x>", ptr->dwpad ); > + ERR_MSG("...next <0x%.8x>", (int)ptr->next ); > + ERR_MSG("...ptr <0x%.8x>", (int)ptr->ptr ); > + ERR_MSG("...buflen<0x%.8x>", (int)ptr->buflen ); > + > + if (ptr->eol == 1) { > + break; > + } > + > + /* find the next bd, virtual address of ptr->next */ > + /* don't need to enable when use malloc */ > + //BUG_ON( (ptr->next + p_to_v)!=(ptr+1) ); > + //ERR_MSG(".next bd<0x%.8x><0x%.8x>", (ptr->next + p_to_v), (ptr+1)); > + ptr++; > + } > + > + ERR_MSG("dump gpd and bd finished"); > } > #endif /* end of --- */ > > /* calc checksum */ > static u8 msdc_dma_calcs(u8 *buf, u32 len) > { > - u32 i, sum = 0; > - for (i = 0; i < len; i++) { > - sum += buf[i]; > - } > - return 0xFF - (u8)sum; > + u32 i, sum = 0; > + for (i = 0; i < len; i++) { > + sum += buf[i]; > + } > + return 0xFF - (u8)sum; > } > > /* gpd bd setup + dma registers */ > static int msdc_dma_config(struct msdc_host *host, struct msdc_dma *dma) > { > - u32 base = host->base; > - u32 sglen = dma->sglen; > - //u32 i, j, num, bdlen, arg, xfersz; > - u32 j, num, bdlen; > - u8 blkpad, dwpad, chksum; > - struct scatterlist *sg = dma->sg; > - gpd_t *gpd; > - bd_t *bd; > - > - switch (dma->mode) { > - case MSDC_MODE_DMA_BASIC: > - BUG_ON(dma->xfersz > 65535); > - BUG_ON(dma->sglen != 1); > - sdr_write32(MSDC_DMA_SA, PHYSADDR(sg_dma_address(sg))); > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 1); > + u32 base = host->base; > + u32 sglen = dma->sglen; > + //u32 i, j, num, bdlen, arg, xfersz; > + u32 j, num, bdlen; > + u8 blkpad, dwpad, chksum; > + struct scatterlist *sg = dma->sg; > + gpd_t *gpd; > + bd_t *bd; > + > + switch (dma->mode) { > + case MSDC_MODE_DMA_BASIC: > + BUG_ON(dma->xfersz > 65535); > + BUG_ON(dma->sglen != 1); > + sdr_write32(MSDC_DMA_SA, PHYSADDR(sg_dma_address(sg))); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_LASTBUF, 1); > //#if defined (CONFIG_RALINK_MT7620) > - if (ralink_soc == MT762X_SOC_MT7620A) > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_XFERSZ, sg_dma_len(sg)); > + if (ralink_soc == MT762X_SOC_MT7620A) > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_XFERSZ, sg_dma_len(sg)); > //#elif defined (CONFIG_RALINK_MT7621) || defined (CONFIG_RALINK_MT7628) > - else > - sdr_write32((volatile u32*)(RALINK_MSDC_BASE+0xa8), sg_dma_len(sg)); > + else > + sdr_write32((volatile u32*)(RALINK_MSDC_BASE+0xa8), sg_dma_len(sg)); > //#endif > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, dma->burstsz); > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 0); > - break; > - case MSDC_MODE_DMA_DESC: > - blkpad = (dma->flags & DMA_FLAG_PAD_BLOCK) ? 1 : 0; > - dwpad = (dma->flags & DMA_FLAG_PAD_DWORD) ? 1 : 0; > - chksum = (dma->flags & DMA_FLAG_EN_CHKSUM) ? 1 : 0; > - > - /* calculate the required number of gpd */ > - num = (sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; > - BUG_ON(num !=1 ); > - > - gpd = dma->gpd; > - bd = dma->bd; > - bdlen = sglen; > - > - /* modify gpd*/ > - //gpd->intr = 0; > - gpd->hwo = 1; /* hw will clear it */ > - gpd->bdp = 1; > - gpd->chksum = 0; /* need to clear first. */ > - gpd->chksum = (chksum ? msdc_dma_calcs((u8 *)gpd, 16) : 0); > - > - /* modify bd*/ > - for (j = 0; j < bdlen; j++) { > - msdc_init_bd(&bd[j], blkpad, dwpad, sg_dma_address(sg), sg_dma_len(sg)); > - if(j == bdlen - 1) { > - bd[j].eol = 1; /* the last bd */ > - } else { > - bd[j].eol = 0; > - } > - bd[j].chksum = 0; /* checksume need to clear first */ > - bd[j].chksum = (chksum ? msdc_dma_calcs((u8 *)(&bd[j]), 16) : 0); > - sg++; > - } > - > - dma->used_gpd += 2; > - dma->used_bd += bdlen; > - > - sdr_set_field(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, chksum); > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, dma->burstsz); > - sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1); > - > - sdr_write32(MSDC_DMA_SA, PHYSADDR((u32)dma->gpd_addr)); > - break; > - > - default: > - break; > - } > - > - N_MSG(DMA, "DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL)); > - N_MSG(DMA, "DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG)); > - N_MSG(DMA, "DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA)); > - > - return 0; > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, dma->burstsz); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 0); > + break; > + case MSDC_MODE_DMA_DESC: > + blkpad = (dma->flags & DMA_FLAG_PAD_BLOCK) ? 1 : 0; > + dwpad = (dma->flags & DMA_FLAG_PAD_DWORD) ? 1 : 0; > + chksum = (dma->flags & DMA_FLAG_EN_CHKSUM) ? 1 : 0; > + > + /* calculate the required number of gpd */ > + num = (sglen + MAX_BD_PER_GPD - 1) / MAX_BD_PER_GPD; > + BUG_ON(num !=1 ); > + > + gpd = dma->gpd; > + bd = dma->bd; > + bdlen = sglen; > + > + /* modify gpd*/ > + //gpd->intr = 0; > + gpd->hwo = 1; /* hw will clear it */ > + gpd->bdp = 1; > + gpd->chksum = 0; /* need to clear first. */ > + gpd->chksum = (chksum ? msdc_dma_calcs((u8 *)gpd, 16) : 0); > + > + /* modify bd*/ > + for (j = 0; j < bdlen; j++) { > + msdc_init_bd(&bd[j], blkpad, dwpad, sg_dma_address(sg), sg_dma_len(sg)); > + if(j == bdlen - 1) { > + bd[j].eol = 1; /* the last bd */ > + } else { > + bd[j].eol = 0; > + } > + bd[j].chksum = 0; /* checksume need to clear first */ > + bd[j].chksum = (chksum ? msdc_dma_calcs((u8 *)(&bd[j]), 16) : 0); > + sg++; > + } > + > + dma->used_gpd += 2; > + dma->used_bd += bdlen; > + > + sdr_set_field(MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, chksum); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_BRUSTSZ, dma->burstsz); > + sdr_set_field(MSDC_DMA_CTRL, MSDC_DMA_CTRL_MODE, 1); > + > + sdr_write32(MSDC_DMA_SA, PHYSADDR((u32)dma->gpd_addr)); > + break; > + > + default: > + break; > + } > + > + N_MSG(DMA, "DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL)); > + N_MSG(DMA, "DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG)); > + N_MSG(DMA, "DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA)); > + > + return 0; > } > > static void msdc_dma_setup(struct msdc_host *host, struct msdc_dma *dma, > - struct scatterlist *sg, unsigned int sglen) > + struct scatterlist *sg, unsigned int sglen) > { > - BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ > + BUG_ON(sglen > MAX_BD_NUM); /* not support currently */ > > - dma->sg = sg; > - dma->flags = DMA_FLAG_EN_CHKSUM; > - //dma->flags = DMA_FLAG_NONE; /* CHECKME */ > - dma->sglen = sglen; > - dma->xfersz = host->xfer_size; > - dma->burstsz = MSDC_BRUST_64B; > + dma->sg = sg; > + dma->flags = DMA_FLAG_EN_CHKSUM; > + //dma->flags = DMA_FLAG_NONE; /* CHECKME */ > + dma->sglen = sglen; > + dma->xfersz = host->xfer_size; > + dma->burstsz = MSDC_BRUST_64B; > > - if (sglen == 1 && sg_dma_len(sg) <= MAX_DMA_CNT) > - dma->mode = MSDC_MODE_DMA_BASIC; > - else > - dma->mode = MSDC_MODE_DMA_DESC; > + if (sglen == 1 && sg_dma_len(sg) <= MAX_DMA_CNT) > + dma->mode = MSDC_MODE_DMA_BASIC; > + else > + dma->mode = MSDC_MODE_DMA_DESC; > > - N_MSG(DMA, "DMA mode<%d> sglen<%d> xfersz<%d>", dma->mode, dma->sglen, dma->xfersz); > + N_MSG(DMA, "DMA mode<%d> sglen<%d> xfersz<%d>", dma->mode, dma->sglen, dma->xfersz); > > - msdc_dma_config(host, dma); > + msdc_dma_config(host, dma); > > - /*if (dma->mode == MSDC_MODE_DMA_DESC) { > - //msdc_dma_dump(host, dma); > - } */ > + /*if (dma->mode == MSDC_MODE_DMA_DESC) { > + //msdc_dma_dump(host, dma); > + } */ > } > > /* set block number before send command */ > static void msdc_set_blknum(struct msdc_host *host, u32 blknum) > { > - u32 base = host->base; > + u32 base = host->base; > > - sdr_write32(SDC_BLK_NUM, blknum); > + sdr_write32(SDC_BLK_NUM, blknum); > } > > static int msdc_do_request(struct mmc_host*mmc, struct mmc_request*mrq) > { > - struct msdc_host *host = mmc_priv(mmc); > - struct mmc_command *cmd; > - struct mmc_data *data; > - u32 base = host->base; > - //u32 intsts = 0; > - unsigned int left=0; > - int dma = 0, read = 1, dir = DMA_FROM_DEVICE, send_type=0; > + struct msdc_host *host = mmc_priv(mmc); > + struct mmc_command *cmd; > + struct mmc_data *data; > + u32 base = host->base; > + //u32 intsts = 0; > + unsigned int left=0; > + int dma = 0, read = 1, dir = DMA_FROM_DEVICE, send_type=0; > > - #define SND_DAT 0 > - #define SND_CMD 1 > +#define SND_DAT 0 > +#define SND_CMD 1 > > - BUG_ON(mmc == NULL); > - BUG_ON(mrq == NULL); > + BUG_ON(mmc == NULL); > + BUG_ON(mrq == NULL); > > - host->error = 0; > - atomic_set(&host->abort, 0); > + host->error = 0; > + atomic_set(&host->abort, 0); > > - cmd = mrq->cmd; > - data = mrq->cmd->data; > + cmd = mrq->cmd; > + data = mrq->cmd->data; > > #if 0 /* --- by chhung */ > - //if(host->id ==1){ > - N_MSG(OPS, "enable clock!"); > - msdc_ungate_clock(host->id); > - //} > + //if(host->id ==1){ > + N_MSG(OPS, "enable clock!"); > + msdc_ungate_clock(host->id); > + //} > #endif /* end of --- */ > > - if (!data) { > - send_type=SND_CMD; > - if (msdc_do_command(host, cmd, 1, CMD_TIMEOUT) != 0) { > - goto done; > - } > - } else { > - BUG_ON(data->blksz > HOST_MAX_BLKSZ); > - send_type=SND_DAT; > - > - data->error = 0; > - read = data->flags & MMC_DATA_READ ? 1 : 0; > - host->data = data; > - host->xfer_size = data->blocks * data->blksz; > - host->blksz = data->blksz; > - > - /* deside the transfer mode */ > - if (drv_mode[host->id] == MODE_PIO) { > - host->dma_xfer = dma = 0; > - } else if (drv_mode[host->id] == MODE_DMA) { > - host->dma_xfer = dma = 1; > - } else if (drv_mode[host->id] == MODE_SIZE_DEP) { > - host->dma_xfer = dma = ((host->xfer_size >= dma_size[host->id]) ? 1 : 0); > - } > - > - if (read) { > - if ((host->timeout_ns != data->timeout_ns) || > - (host->timeout_clks != data->timeout_clks)) { > - msdc_set_timeout(host, data->timeout_ns, data->timeout_clks); > - } > - } > - > - msdc_set_blknum(host, data->blocks); > - //msdc_clr_fifo(); /* no need */ > - > - if (dma) { > - msdc_dma_on(); /* enable DMA mode first!! */ > - init_completion(&host->xfer_done); > - > - /* start the command first*/ > - if (msdc_command_start(host, cmd, 1, CMD_TIMEOUT) != 0) > - goto done; > - > - dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; > - (void)dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len, dir); > - msdc_dma_setup(host, &host->dma, data->sg, data->sg_len); > - > - /* then wait command done */ > - if (msdc_command_resp(host, cmd, 1, CMD_TIMEOUT) != 0) > - goto done; > - > - /* for read, the data coming too fast, then CRC error > - start DMA no business with CRC. */ > - //init_completion(&host->xfer_done); > - msdc_dma_start(host); > - > - spin_unlock(&host->lock); > - if(!wait_for_completion_timeout(&host->xfer_done, DAT_TIMEOUT)){ > - ERR_MSG("XXX CMD<%d> wait xfer_done<%d> timeout!!", cmd->opcode, data->blocks * data->blksz); > - ERR_MSG(" DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA)); > - ERR_MSG(" DMA_CA = 0x%x", sdr_read32(MSDC_DMA_CA)); > - ERR_MSG(" DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL)); > - ERR_MSG(" DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG)); > - data->error = (unsigned int)-ETIMEDOUT; > - > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > - } > - spin_lock(&host->lock); > - msdc_dma_stop(host); > - } else { > - /* Firstly: send command */ > - if (msdc_do_command(host, cmd, 1, CMD_TIMEOUT) != 0) { > - goto done; > - } > - > - /* Secondly: pio data phase */ > - if (read) { > - if (msdc_pio_read(host, data)){ > - goto done; > - } > - } else { > - if (msdc_pio_write(host, data)) { > - goto done; > - } > - } > - > - /* For write case: make sure contents in fifo flushed to device */ > - if (!read) { > - while (1) { > - left=msdc_txfifocnt(); > - if (left == 0) { > - break; > - } > - if (msdc_pio_abort(host, data, jiffies + DAT_TIMEOUT)) { > - break; > - /* Fix me: what about if data error, when stop ? how to? */ > - } > - } > - } else { > - /* Fix me: read case: need to check CRC error */ > - } > - > - /* For write case: SDCBUSY and Xfer_Comp will assert when DAT0 not busy. > - For read case : SDCBUSY and Xfer_Comp will assert when last byte read out from FIFO. > - */ > - > - /* try not to wait xfer_comp interrupt. > - the next command will check SDC_BUSY. > - SDC_BUSY means xfer_comp assert > - */ > - > - } // PIO mode > - > - /* Last: stop transfer */ > - if (data->stop){ > - if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { > - goto done; > - } > - } > - } > + if (!data) { > + send_type=SND_CMD; > + if (msdc_do_command(host, cmd, 1, CMD_TIMEOUT) != 0) { > + goto done; > + } > + } else { > + BUG_ON(data->blksz > HOST_MAX_BLKSZ); > + send_type=SND_DAT; > + > + data->error = 0; > + read = data->flags & MMC_DATA_READ ? 1 : 0; > + host->data = data; > + host->xfer_size = data->blocks * data->blksz; > + host->blksz = data->blksz; > + > + /* deside the transfer mode */ > + if (drv_mode[host->id] == MODE_PIO) { > + host->dma_xfer = dma = 0; > + } else if (drv_mode[host->id] == MODE_DMA) { > + host->dma_xfer = dma = 1; > + } else if (drv_mode[host->id] == MODE_SIZE_DEP) { > + host->dma_xfer = dma = ((host->xfer_size >= dma_size[host->id]) ? 1 : 0); > + } > + > + if (read) { > + if ((host->timeout_ns != data->timeout_ns) || > + (host->timeout_clks != data->timeout_clks)) { > + msdc_set_timeout(host, data->timeout_ns, data->timeout_clks); > + } > + } > + > + msdc_set_blknum(host, data->blocks); > + //msdc_clr_fifo(); /* no need */ > + > + if (dma) { > + msdc_dma_on(); /* enable DMA mode first!! */ > + init_completion(&host->xfer_done); > + > + /* start the command first*/ > + if (msdc_command_start(host, cmd, 1, CMD_TIMEOUT) != 0) > + goto done; > + > + dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; > + (void)dma_map_sg(mmc_dev(mmc), data->sg, data->sg_len, dir); > + msdc_dma_setup(host, &host->dma, data->sg, data->sg_len); > + > + /* then wait command done */ > + if (msdc_command_resp(host, cmd, 1, CMD_TIMEOUT) != 0) > + goto done; > + > + /* for read, the data coming too fast, then CRC error > + start DMA no business with CRC. */ > + //init_completion(&host->xfer_done); > + msdc_dma_start(host); > + > + spin_unlock(&host->lock); > + if(!wait_for_completion_timeout(&host->xfer_done, DAT_TIMEOUT)){ > + ERR_MSG("XXX CMD<%d> wait xfer_done<%d> timeout!!", cmd->opcode, data->blocks * data->blksz); > + ERR_MSG(" DMA_SA = 0x%x", sdr_read32(MSDC_DMA_SA)); > + ERR_MSG(" DMA_CA = 0x%x", sdr_read32(MSDC_DMA_CA)); > + ERR_MSG(" DMA_CTRL = 0x%x", sdr_read32(MSDC_DMA_CTRL)); > + ERR_MSG(" DMA_CFG = 0x%x", sdr_read32(MSDC_DMA_CFG)); > + data->error = (unsigned int)-ETIMEDOUT; > + > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > + } > + spin_lock(&host->lock); > + msdc_dma_stop(host); > + } else { > + /* Firstly: send command */ > + if (msdc_do_command(host, cmd, 1, CMD_TIMEOUT) != 0) { > + goto done; > + } > + > + /* Secondly: pio data phase */ > + if (read) { > + if (msdc_pio_read(host, data)){ > + goto done; > + } > + } else { > + if (msdc_pio_write(host, data)) { > + goto done; > + } > + } > + > + /* For write case: make sure contents in fifo flushed to device */ > + if (!read) { > + while (1) { > + left=msdc_txfifocnt(); > + if (left == 0) { > + break; > + } > + if (msdc_pio_abort(host, data, jiffies + DAT_TIMEOUT)) { > + break; > + /* Fix me: what about if data error, when stop ? how to? */ > + } > + } > + } else { > + /* Fix me: read case: need to check CRC error */ > + } > + > + /* For write case: SDCBUSY and Xfer_Comp will assert when DAT0 not busy. > + For read case : SDCBUSY and Xfer_Comp will assert when last byte read out from FIFO. > + */ > + > + /* try not to wait xfer_comp interrupt. > + the next command will check SDC_BUSY. > + SDC_BUSY means xfer_comp assert > + */ > + > + } // PIO mode > + > + /* Last: stop transfer */ > + if (data->stop){ > + if (msdc_do_command(host, data->stop, 0, CMD_TIMEOUT) != 0) { > + goto done; > + } > + } > + } > > done: > - if (data != NULL) { > - host->data = NULL; > - host->dma_xfer = 0; > - if (dma != 0) { > - msdc_dma_off(); > - host->dma.used_bd = 0; > - host->dma.used_gpd = 0; > - dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len, dir); > - } > - host->blksz = 0; > + if (data != NULL) { > + host->data = NULL; > + host->dma_xfer = 0; > + if (dma != 0) { > + msdc_dma_off(); > + host->dma.used_bd = 0; > + host->dma.used_gpd = 0; > + dma_unmap_sg(mmc_dev(mmc), data->sg, data->sg_len, dir); > + } > + host->blksz = 0; > > #if 0 // don't stop twice! > - if(host->hw->flags & MSDC_REMOVABLE && data->error) { > - msdc_abort_data(host); > - /* reset in IRQ, stop command has issued. -> No need */ > - } > + if(host->hw->flags & MSDC_REMOVABLE && data->error) { > + msdc_abort_data(host); > + /* reset in IRQ, stop command has issued. -> No need */ > + } > #endif > > - N_MSG(OPS, "CMD<%d> data<%s %s> blksz<%d> block<%d> error<%d>",cmd->opcode, (dma? "dma":"pio"), > - (read ? "read ":"write") ,data->blksz, data->blocks, data->error); > - } > + N_MSG(OPS, "CMD<%d> data<%s %s> blksz<%d> block<%d> error<%d>",cmd->opcode, (dma? "dma":"pio"), > + (read ? "read ":"write") ,data->blksz, data->blocks, data->error); > + } > > #if 0 /* --- by chhung */ > #if 1 > - //if(host->id==1) { > - if(send_type==SND_CMD) { > - if(cmd->opcode == MMC_SEND_STATUS) { > - if((cmd->resp[0] & CARD_READY_FOR_DATA) ||(CARD_CURRENT_STATE(cmd->resp[0]) != 7)){ > - N_MSG(OPS,"disable clock, CMD13 IDLE"); > - msdc_gate_clock(host->id); > - } > - } else { > - N_MSG(OPS,"disable clock, CMD<%d>", cmd->opcode); > - msdc_gate_clock(host->id); > - } > - } else { > - if(read) { > - N_MSG(OPS,"disable clock!!! Read CMD<%d>",cmd->opcode); > - msdc_gate_clock(host->id); > - } > - } > - //} > + //if(host->id==1) { > + if(send_type==SND_CMD) { > + if(cmd->opcode == MMC_SEND_STATUS) { > + if((cmd->resp[0] & CARD_READY_FOR_DATA) ||(CARD_CURRENT_STATE(cmd->resp[0]) != 7)){ > + N_MSG(OPS,"disable clock, CMD13 IDLE"); > + msdc_gate_clock(host->id); > + } > + } else { > + N_MSG(OPS,"disable clock, CMD<%d>", cmd->opcode); > + msdc_gate_clock(host->id); > + } > + } else { > + if(read) { > + N_MSG(OPS,"disable clock!!! Read CMD<%d>",cmd->opcode); > + msdc_gate_clock(host->id); > + } > + } > + //} > #else > - msdc_gate_clock(host->id); > + msdc_gate_clock(host->id); > #endif > #endif /* end of --- */ > > - if (mrq->cmd->error) host->error = 0x001; > - if (mrq->data && mrq->data->error) host->error |= 0x010; > - if (mrq->stop && mrq->stop->error) host->error |= 0x100; > + if (mrq->cmd->error) host->error = 0x001; > + if (mrq->data && mrq->data->error) host->error |= 0x010; > + if (mrq->stop && mrq->stop->error) host->error |= 0x100; > > - //if (host->error) ERR_MSG("host->error<%d>", host->error); > + //if (host->error) ERR_MSG("host->error<%d>", host->error); > > - return host->error; > + return host->error; > } > > static int msdc_app_cmd(struct mmc_host *mmc, struct msdc_host *host) > { > - struct mmc_command cmd; > - struct mmc_request mrq; > - u32 err; > + struct mmc_command cmd; > + struct mmc_request mrq; > + u32 err; > > - memset(&cmd, 0, sizeof(struct mmc_command)); > - cmd.opcode = MMC_APP_CMD; > + memset(&cmd, 0, sizeof(struct mmc_command)); > + cmd.opcode = MMC_APP_CMD; > #if 0 /* bug: we meet mmc->card is null when ACMD6 */ > - cmd.arg = mmc->card->rca << 16; > + cmd.arg = mmc->card->rca << 16; > #else > - cmd.arg = host->app_cmd_arg; > + cmd.arg = host->app_cmd_arg; > #endif > - cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; > + cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R1 | MMC_CMD_AC; > > - memset(&mrq, 0, sizeof(struct mmc_request)); > - mrq.cmd = &cmd; cmd.mrq = &mrq; > - cmd.data = NULL; > + memset(&mrq, 0, sizeof(struct mmc_request)); > + mrq.cmd = &cmd; cmd.mrq = &mrq; > + cmd.data = NULL; > > - err = msdc_do_command(host, &cmd, 0, CMD_TIMEOUT); > - return err; > + err = msdc_do_command(host, &cmd, 0, CMD_TIMEOUT); > + return err; > } > > static int msdc_tune_cmdrsp(struct msdc_host*host, struct mmc_command *cmd) > { > - int result = -1; > - u32 base = host->base; > - u32 rsmpl, cur_rsmpl, orig_rsmpl; > - u32 rrdly, cur_rrdly = 0xffffffff, orig_rrdly; > - u32 skip = 1; > - > - /* ==== don't support 3.0 now ==== > - 1: R_SMPL[1] > - 2: PAD_CMD_RESP_RXDLY[26:22] > - ==========================*/ > - > - // save the previous tune result > - sdr_get_field(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl); > - sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, orig_rrdly); > - > - rrdly = 0; > - do { > - for (rsmpl = 0; rsmpl < 2; rsmpl++) { > - /* Lv1: R_SMPL[1] */ > - cur_rsmpl = (orig_rsmpl + rsmpl) % 2; > - if (skip == 1) { > - skip = 0; > - continue; > - } > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL, cur_rsmpl); > - > - if (host->app_cmd) { > - result = msdc_app_cmd(host->mmc, host); > - if (result) { > - ERR_MSG("TUNE_CMD app_cmd<%d> failed: RESP_RXDLY<%d>,R_SMPL<%d>", > - host->mrq->cmd->opcode, cur_rrdly, cur_rsmpl); > - continue; > - } > - } > - result = msdc_do_command(host, cmd, 0, CMD_TIMEOUT); // not tune. > - ERR_MSG("TUNE_CMD<%d> %s PAD_CMD_RESP_RXDLY[26:22]<%d> R_SMPL[1]<%d>", cmd->opcode, > - (result == 0) ? "PASS" : "FAIL", cur_rrdly, cur_rsmpl); > - > - if (result == 0) { > - return 0; > - } > - if (result != (unsigned int)(-EIO)) { > - ERR_MSG("TUNE_CMD<%d> Error<%d> not -EIO", cmd->opcode, result); > - return result; > - } > - > - /* should be EIO */ > - if (sdr_read32(SDC_CMD) & 0x1800) { /* check if has data phase */ > - msdc_abort_data(host); > - } > - } > - > - /* Lv2: PAD_CMD_RESP_RXDLY[26:22] */ > - cur_rrdly = (orig_rrdly + rrdly + 1) % 32; > - sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, cur_rrdly); > - }while (++rrdly < 32); > - > - return result; > + int result = -1; > + u32 base = host->base; > + u32 rsmpl, cur_rsmpl, orig_rsmpl; > + u32 rrdly, cur_rrdly = 0xffffffff, orig_rrdly; > + u32 skip = 1; > + > + /* ==== don't support 3.0 now ==== > + 1: R_SMPL[1] > + 2: PAD_CMD_RESP_RXDLY[26:22] > + ==========================*/ > + > + // save the previous tune result > + sdr_get_field(MSDC_IOCON, MSDC_IOCON_RSPL, orig_rsmpl); > + sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, orig_rrdly); > + > + rrdly = 0; > + do { > + for (rsmpl = 0; rsmpl < 2; rsmpl++) { > + /* Lv1: R_SMPL[1] */ > + cur_rsmpl = (orig_rsmpl + rsmpl) % 2; > + if (skip == 1) { > + skip = 0; > + continue; > + } > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL, cur_rsmpl); > + > + if (host->app_cmd) { > + result = msdc_app_cmd(host->mmc, host); > + if (result) { > + ERR_MSG("TUNE_CMD app_cmd<%d> failed: RESP_RXDLY<%d>,R_SMPL<%d>", > + host->mrq->cmd->opcode, cur_rrdly, cur_rsmpl); > + continue; > + } > + } > + result = msdc_do_command(host, cmd, 0, CMD_TIMEOUT); // not tune. > + ERR_MSG("TUNE_CMD<%d> %s PAD_CMD_RESP_RXDLY[26:22]<%d> R_SMPL[1]<%d>", cmd->opcode, > + (result == 0) ? "PASS" : "FAIL", cur_rrdly, cur_rsmpl); > + > + if (result == 0) { > + return 0; > + } > + if (result != (unsigned int)(-EIO)) { > + ERR_MSG("TUNE_CMD<%d> Error<%d> not -EIO", cmd->opcode, result); > + return result; > + } > + > + /* should be EIO */ > + if (sdr_read32(SDC_CMD) & 0x1800) { /* check if has data phase */ > + msdc_abort_data(host); > + } > + } > + > + /* Lv2: PAD_CMD_RESP_RXDLY[26:22] */ > + cur_rrdly = (orig_rrdly + rrdly + 1) % 32; > + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_CMDRRDLY, cur_rrdly); > + }while (++rrdly < 32); > + > + return result; > } > > /* Support SD2.0 Only */ > static int msdc_tune_bread(struct mmc_host *mmc, struct mmc_request *mrq) > { > - struct msdc_host *host = mmc_priv(mmc); > - u32 base = host->base; > - u32 ddr=0; > - u32 dcrc=0; > - u32 rxdly, cur_rxdly0, cur_rxdly1; > - u32 dsmpl, cur_dsmpl, orig_dsmpl; > - u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3; > - u32 cur_dat4, cur_dat5, cur_dat6, cur_dat7; > - u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3; > - u32 orig_dat4, orig_dat5, orig_dat6, orig_dat7; > - int result = -1; > - u32 skip = 1; > - > - sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, orig_dsmpl); > - > - /* Tune Method 2. */ > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1); > - > - rxdly = 0; > - do { > - for (dsmpl = 0; dsmpl < 2; dsmpl++) { > - cur_dsmpl = (orig_dsmpl + dsmpl) % 2; > - if (skip == 1) { > - skip = 0; > - continue; > - } > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl); > - > - if (host->app_cmd) { > - result = msdc_app_cmd(host->mmc, host); > - if (result) { > - ERR_MSG("TUNE_BREAD app_cmd<%d> failed", host->mrq->cmd->opcode); > - continue; > - } > - } > - result = msdc_do_request(mmc,mrq); > - > - sdr_get_field(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc); /* RO */ > - if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG; > - ERR_MSG("TUNE_BREAD<%s> dcrc<0x%x> DATRDDLY0/1<0x%x><0x%x> dsmpl<0x%x>", > - (result == 0 && dcrc == 0) ? "PASS" : "FAIL", dcrc, > - sdr_read32(MSDC_DAT_RDDLY0), sdr_read32(MSDC_DAT_RDDLY1), cur_dsmpl); > - > - /* Fix me: result is 0, but dcrc is still exist */ > - if (result == 0 && dcrc == 0) { > - goto done; > - } else { > - /* there is a case: command timeout, and data phase not processed */ > - if (mrq->data->error != 0 && mrq->data->error != (unsigned int)(-EIO)) { > - ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>", > - result, mrq->cmd->error, mrq->data->error); > - goto done; > - } > - } > - } > - > - cur_rxdly0 = sdr_read32(MSDC_DAT_RDDLY0); > - cur_rxdly1 = sdr_read32(MSDC_DAT_RDDLY1); > - > - /* E1 ECO. YD: Reverse */ > - if (sdr_read32(MSDC_ECO_VER) >= 4) { > - orig_dat0 = (cur_rxdly0 >> 24) & 0x1F; > - orig_dat1 = (cur_rxdly0 >> 16) & 0x1F; > - orig_dat2 = (cur_rxdly0 >> 8) & 0x1F; > - orig_dat3 = (cur_rxdly0 >> 0) & 0x1F; > - orig_dat4 = (cur_rxdly1 >> 24) & 0x1F; > - orig_dat5 = (cur_rxdly1 >> 16) & 0x1F; > - orig_dat6 = (cur_rxdly1 >> 8) & 0x1F; > - orig_dat7 = (cur_rxdly1 >> 0) & 0x1F; > - } else { > - orig_dat0 = (cur_rxdly0 >> 0) & 0x1F; > - orig_dat1 = (cur_rxdly0 >> 8) & 0x1F; > - orig_dat2 = (cur_rxdly0 >> 16) & 0x1F; > - orig_dat3 = (cur_rxdly0 >> 24) & 0x1F; > - orig_dat4 = (cur_rxdly1 >> 0) & 0x1F; > - orig_dat5 = (cur_rxdly1 >> 8) & 0x1F; > - orig_dat6 = (cur_rxdly1 >> 16) & 0x1F; > - orig_dat7 = (cur_rxdly1 >> 24) & 0x1F; > - } > - > - if (ddr) { > - cur_dat0 = (dcrc & (1 << 0) || dcrc & (1 << 8)) ? ((orig_dat0 + 1) % 32) : orig_dat0; > - cur_dat1 = (dcrc & (1 << 1) || dcrc & (1 << 9)) ? ((orig_dat1 + 1) % 32) : orig_dat1; > - cur_dat2 = (dcrc & (1 << 2) || dcrc & (1 << 10)) ? ((orig_dat2 + 1) % 32) : orig_dat2; > - cur_dat3 = (dcrc & (1 << 3) || dcrc & (1 << 11)) ? ((orig_dat3 + 1) % 32) : orig_dat3; > - } else { > - cur_dat0 = (dcrc & (1 << 0)) ? ((orig_dat0 + 1) % 32) : orig_dat0; > - cur_dat1 = (dcrc & (1 << 1)) ? ((orig_dat1 + 1) % 32) : orig_dat1; > - cur_dat2 = (dcrc & (1 << 2)) ? ((orig_dat2 + 1) % 32) : orig_dat2; > - cur_dat3 = (dcrc & (1 << 3)) ? ((orig_dat3 + 1) % 32) : orig_dat3; > - } > - cur_dat4 = (dcrc & (1 << 4)) ? ((orig_dat4 + 1) % 32) : orig_dat4; > - cur_dat5 = (dcrc & (1 << 5)) ? ((orig_dat5 + 1) % 32) : orig_dat5; > - cur_dat6 = (dcrc & (1 << 6)) ? ((orig_dat6 + 1) % 32) : orig_dat6; > - cur_dat7 = (dcrc & (1 << 7)) ? ((orig_dat7 + 1) % 32) : orig_dat7; > - > - cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); > - cur_rxdly1 = (cur_dat4 << 24) | (cur_dat5 << 16) | (cur_dat6 << 8) | (cur_dat7 << 0); > - > - sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); > - sdr_write32(MSDC_DAT_RDDLY1, cur_rxdly1); > - > - } while (++rxdly < 32); > + struct msdc_host *host = mmc_priv(mmc); > + u32 base = host->base; > + u32 ddr=0; > + u32 dcrc=0; > + u32 rxdly, cur_rxdly0, cur_rxdly1; > + u32 dsmpl, cur_dsmpl, orig_dsmpl; > + u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3; > + u32 cur_dat4, cur_dat5, cur_dat6, cur_dat7; > + u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3; > + u32 orig_dat4, orig_dat5, orig_dat6, orig_dat7; > + int result = -1; > + u32 skip = 1; > + > + sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, orig_dsmpl); > + > + /* Tune Method 2. */ > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1); > + > + rxdly = 0; > + do { > + for (dsmpl = 0; dsmpl < 2; dsmpl++) { > + cur_dsmpl = (orig_dsmpl + dsmpl) % 2; > + if (skip == 1) { > + skip = 0; > + continue; > + } > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl); > + > + if (host->app_cmd) { > + result = msdc_app_cmd(host->mmc, host); > + if (result) { > + ERR_MSG("TUNE_BREAD app_cmd<%d> failed", host->mrq->cmd->opcode); > + continue; > + } > + } > + result = msdc_do_request(mmc,mrq); > + > + sdr_get_field(SDC_DCRC_STS, SDC_DCRC_STS_POS|SDC_DCRC_STS_NEG, dcrc); /* RO */ > + if (!ddr) dcrc &= ~SDC_DCRC_STS_NEG; > + ERR_MSG("TUNE_BREAD<%s> dcrc<0x%x> DATRDDLY0/1<0x%x><0x%x> dsmpl<0x%x>", > + (result == 0 && dcrc == 0) ? "PASS" : "FAIL", dcrc, > + sdr_read32(MSDC_DAT_RDDLY0), sdr_read32(MSDC_DAT_RDDLY1), cur_dsmpl); > + > + /* Fix me: result is 0, but dcrc is still exist */ > + if (result == 0 && dcrc == 0) { > + goto done; > + } else { > + /* there is a case: command timeout, and data phase not processed */ > + if (mrq->data->error != 0 && mrq->data->error != (unsigned int)(-EIO)) { > + ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>", > + result, mrq->cmd->error, mrq->data->error); > + goto done; > + } > + } > + } > + > + cur_rxdly0 = sdr_read32(MSDC_DAT_RDDLY0); > + cur_rxdly1 = sdr_read32(MSDC_DAT_RDDLY1); > + > + /* E1 ECO. YD: Reverse */ > + if (sdr_read32(MSDC_ECO_VER) >= 4) { > + orig_dat0 = (cur_rxdly0 >> 24) & 0x1F; > + orig_dat1 = (cur_rxdly0 >> 16) & 0x1F; > + orig_dat2 = (cur_rxdly0 >> 8) & 0x1F; > + orig_dat3 = (cur_rxdly0 >> 0) & 0x1F; > + orig_dat4 = (cur_rxdly1 >> 24) & 0x1F; > + orig_dat5 = (cur_rxdly1 >> 16) & 0x1F; > + orig_dat6 = (cur_rxdly1 >> 8) & 0x1F; > + orig_dat7 = (cur_rxdly1 >> 0) & 0x1F; > + } else { > + orig_dat0 = (cur_rxdly0 >> 0) & 0x1F; > + orig_dat1 = (cur_rxdly0 >> 8) & 0x1F; > + orig_dat2 = (cur_rxdly0 >> 16) & 0x1F; > + orig_dat3 = (cur_rxdly0 >> 24) & 0x1F; > + orig_dat4 = (cur_rxdly1 >> 0) & 0x1F; > + orig_dat5 = (cur_rxdly1 >> 8) & 0x1F; > + orig_dat6 = (cur_rxdly1 >> 16) & 0x1F; > + orig_dat7 = (cur_rxdly1 >> 24) & 0x1F; > + } > + > + if (ddr) { > + cur_dat0 = (dcrc & (1 << 0) || dcrc & (1 << 8)) ? ((orig_dat0 + 1) % 32) : orig_dat0; > + cur_dat1 = (dcrc & (1 << 1) || dcrc & (1 << 9)) ? ((orig_dat1 + 1) % 32) : orig_dat1; > + cur_dat2 = (dcrc & (1 << 2) || dcrc & (1 << 10)) ? ((orig_dat2 + 1) % 32) : orig_dat2; > + cur_dat3 = (dcrc & (1 << 3) || dcrc & (1 << 11)) ? ((orig_dat3 + 1) % 32) : orig_dat3; > + } else { > + cur_dat0 = (dcrc & (1 << 0)) ? ((orig_dat0 + 1) % 32) : orig_dat0; > + cur_dat1 = (dcrc & (1 << 1)) ? ((orig_dat1 + 1) % 32) : orig_dat1; > + cur_dat2 = (dcrc & (1 << 2)) ? ((orig_dat2 + 1) % 32) : orig_dat2; > + cur_dat3 = (dcrc & (1 << 3)) ? ((orig_dat3 + 1) % 32) : orig_dat3; > + } > + cur_dat4 = (dcrc & (1 << 4)) ? ((orig_dat4 + 1) % 32) : orig_dat4; > + cur_dat5 = (dcrc & (1 << 5)) ? ((orig_dat5 + 1) % 32) : orig_dat5; > + cur_dat6 = (dcrc & (1 << 6)) ? ((orig_dat6 + 1) % 32) : orig_dat6; > + cur_dat7 = (dcrc & (1 << 7)) ? ((orig_dat7 + 1) % 32) : orig_dat7; > + > + cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); > + cur_rxdly1 = (cur_dat4 << 24) | (cur_dat5 << 16) | (cur_dat6 << 8) | (cur_dat7 << 0); > + > + sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); > + sdr_write32(MSDC_DAT_RDDLY1, cur_rxdly1); > + > + } while (++rxdly < 32); > > done: > - return result; > + return result; > } > > static int msdc_tune_bwrite(struct mmc_host *mmc,struct mmc_request *mrq) > { > - struct msdc_host *host = mmc_priv(mmc); > - u32 base = host->base; > - > - u32 wrrdly, cur_wrrdly = 0xffffffff, orig_wrrdly; > - u32 dsmpl, cur_dsmpl, orig_dsmpl; > - u32 rxdly, cur_rxdly0; > - u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3; > - u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3; > - int result = -1; > - u32 skip = 1; > - > - // MSDC_IOCON_DDR50CKD need to check. [Fix me] > - > - sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, orig_wrrdly); > - sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, orig_dsmpl ); > - > - /* Tune Method 2. just DAT0 */ > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1); > - cur_rxdly0 = sdr_read32(MSDC_DAT_RDDLY0); > - > - /* E1 ECO. YD: Reverse */ > - if (sdr_read32(MSDC_ECO_VER) >= 4) { > - orig_dat0 = (cur_rxdly0 >> 24) & 0x1F; > - orig_dat1 = (cur_rxdly0 >> 16) & 0x1F; > - orig_dat2 = (cur_rxdly0 >> 8) & 0x1F; > - orig_dat3 = (cur_rxdly0 >> 0) & 0x1F; > - } else { > - orig_dat0 = (cur_rxdly0 >> 0) & 0x1F; > - orig_dat1 = (cur_rxdly0 >> 8) & 0x1F; > - orig_dat2 = (cur_rxdly0 >> 16) & 0x1F; > - orig_dat3 = (cur_rxdly0 >> 24) & 0x1F; > - } > - > - rxdly = 0; > - do { > - wrrdly = 0; > - do { > - for (dsmpl = 0; dsmpl < 2; dsmpl++) { > - cur_dsmpl = (orig_dsmpl + dsmpl) % 2; > - if (skip == 1) { > - skip = 0; > - continue; > - } > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl); > - > - if (host->app_cmd) { > - result = msdc_app_cmd(host->mmc, host); > - if (result) { > - ERR_MSG("TUNE_BWRITE app_cmd<%d> failed", host->mrq->cmd->opcode); > - continue; > - } > - } > - result = msdc_do_request(mmc,mrq); > - > - ERR_MSG("TUNE_BWRITE<%s> DSPL<%d> DATWRDLY<%d> MSDC_DAT_RDDLY0<0x%x>", > - result == 0 ? "PASS" : "FAIL", > - cur_dsmpl, cur_wrrdly, cur_rxdly0); > - > - if (result == 0) { > - goto done; > - } > - else { > - /* there is a case: command timeout, and data phase not processed */ > - if (mrq->data->error != (unsigned int)(-EIO)) { > - ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>", > - result, mrq->cmd->error, mrq->data->error); > - goto done; > - } > - } > - } > - cur_wrrdly = (orig_wrrdly + wrrdly + 1) % 32; > - sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, cur_wrrdly); > - } while (++wrrdly < 32); > - > - cur_dat0 = (orig_dat0 + rxdly) % 32; /* only adjust bit-1 for crc */ > - cur_dat1 = orig_dat1; > - cur_dat2 = orig_dat2; > - cur_dat3 = orig_dat3; > - > - cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); > - sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); > - } while (++rxdly < 32); > + struct msdc_host *host = mmc_priv(mmc); > + u32 base = host->base; > + > + u32 wrrdly, cur_wrrdly = 0xffffffff, orig_wrrdly; > + u32 dsmpl, cur_dsmpl, orig_dsmpl; > + u32 rxdly, cur_rxdly0; > + u32 orig_dat0, orig_dat1, orig_dat2, orig_dat3; > + u32 cur_dat0, cur_dat1, cur_dat2, cur_dat3; > + int result = -1; > + u32 skip = 1; > + > + // MSDC_IOCON_DDR50CKD need to check. [Fix me] > + > + sdr_get_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, orig_wrrdly); > + sdr_get_field(MSDC_IOCON, MSDC_IOCON_DSPL, orig_dsmpl ); > + > + /* Tune Method 2. just DAT0 */ > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DDLSEL, 1); > + cur_rxdly0 = sdr_read32(MSDC_DAT_RDDLY0); > + > + /* E1 ECO. YD: Reverse */ > + if (sdr_read32(MSDC_ECO_VER) >= 4) { > + orig_dat0 = (cur_rxdly0 >> 24) & 0x1F; > + orig_dat1 = (cur_rxdly0 >> 16) & 0x1F; > + orig_dat2 = (cur_rxdly0 >> 8) & 0x1F; > + orig_dat3 = (cur_rxdly0 >> 0) & 0x1F; > + } else { > + orig_dat0 = (cur_rxdly0 >> 0) & 0x1F; > + orig_dat1 = (cur_rxdly0 >> 8) & 0x1F; > + orig_dat2 = (cur_rxdly0 >> 16) & 0x1F; > + orig_dat3 = (cur_rxdly0 >> 24) & 0x1F; > + } > + > + rxdly = 0; > + do { > + wrrdly = 0; > + do { > + for (dsmpl = 0; dsmpl < 2; dsmpl++) { > + cur_dsmpl = (orig_dsmpl + dsmpl) % 2; > + if (skip == 1) { > + skip = 0; > + continue; > + } > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, cur_dsmpl); > + > + if (host->app_cmd) { > + result = msdc_app_cmd(host->mmc, host); > + if (result) { > + ERR_MSG("TUNE_BWRITE app_cmd<%d> failed", host->mrq->cmd->opcode); > + continue; > + } > + } > + result = msdc_do_request(mmc,mrq); > + > + ERR_MSG("TUNE_BWRITE<%s> DSPL<%d> DATWRDLY<%d> MSDC_DAT_RDDLY0<0x%x>", > + result == 0 ? "PASS" : "FAIL", > + cur_dsmpl, cur_wrrdly, cur_rxdly0); > + > + if (result == 0) { > + goto done; > + } > + else { > + /* there is a case: command timeout, and data phase not processed */ > + if (mrq->data->error != (unsigned int)(-EIO)) { > + ERR_MSG("TUNE_READ: result<0x%x> cmd_error<%d> data_error<%d>", > + result, mrq->cmd->error, mrq->data->error); > + goto done; > + } > + } > + } > + cur_wrrdly = (orig_wrrdly + wrrdly + 1) % 32; > + sdr_set_field(MSDC_PAD_TUNE, MSDC_PAD_TUNE_DATWRDLY, cur_wrrdly); > + } while (++wrrdly < 32); > + > + cur_dat0 = (orig_dat0 + rxdly) % 32; /* only adjust bit-1 for crc */ > + cur_dat1 = orig_dat1; > + cur_dat2 = orig_dat2; > + cur_dat3 = orig_dat3; > + > + cur_rxdly0 = (cur_dat0 << 24) | (cur_dat1 << 16) | (cur_dat2 << 8) | (cur_dat3 << 0); > + sdr_write32(MSDC_DAT_RDDLY0, cur_rxdly0); > + } while (++rxdly < 32); > > done: > - return result; > + return result; > } > > static int msdc_get_card_status(struct mmc_host *mmc, struct msdc_host *host, u32 *status) > { > - struct mmc_command cmd; > - struct mmc_request mrq; > - u32 err; > - > - memset(&cmd, 0, sizeof(struct mmc_command)); > - cmd.opcode = MMC_SEND_STATUS; > - if (mmc->card) { > - cmd.arg = mmc->card->rca << 16; > - } else { > - ERR_MSG("cmd13 mmc card is null"); > - cmd.arg = host->app_cmd_arg; > - } > - cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC; > - > - memset(&mrq, 0, sizeof(struct mmc_request)); > - mrq.cmd = &cmd; cmd.mrq = &mrq; > - cmd.data = NULL; > - > - err = msdc_do_command(host, &cmd, 1, CMD_TIMEOUT); > - > - if (status) { > - *status = cmd.resp[0]; > - } > - > - return err; > + struct mmc_command cmd; > + struct mmc_request mrq; > + u32 err; > + > + memset(&cmd, 0, sizeof(struct mmc_command)); > + cmd.opcode = MMC_SEND_STATUS; > + if (mmc->card) { > + cmd.arg = mmc->card->rca << 16; > + } else { > + ERR_MSG("cmd13 mmc card is null"); > + cmd.arg = host->app_cmd_arg; > + } > + cmd.flags = MMC_RSP_SPI_R2 | MMC_RSP_R1 | MMC_CMD_AC; > + > + memset(&mrq, 0, sizeof(struct mmc_request)); > + mrq.cmd = &cmd; cmd.mrq = &mrq; > + cmd.data = NULL; > + > + err = msdc_do_command(host, &cmd, 1, CMD_TIMEOUT); > + > + if (status) { > + *status = cmd.resp[0]; > + } > + > + return err; > } > > static int msdc_check_busy(struct mmc_host *mmc, struct msdc_host *host) > { > - u32 err = 0; > - u32 status = 0; > + u32 err = 0; > + u32 status = 0; > > - do { > - err = msdc_get_card_status(mmc, host, &status); > - if (err) return err; > - /* need cmd12? */ > - ERR_MSG("cmd<13> resp<0x%x>", status); > - } while (R1_CURRENT_STATE(status) == 7); > + do { > + err = msdc_get_card_status(mmc, host, &status); > + if (err) return err; > + /* need cmd12? */ > + ERR_MSG("cmd<13> resp<0x%x>", status); > + } while (R1_CURRENT_STATE(status) == 7); > > - return err; > + return err; > } > > /* failed when msdc_do_request */ > static int msdc_tune_request(struct mmc_host *mmc, struct mmc_request *mrq) > { > - struct msdc_host *host = mmc_priv(mmc); > - struct mmc_command *cmd; > - struct mmc_data *data; > - //u32 base = host->base; > - int ret=0, read; > - > - cmd = mrq->cmd; > - data = mrq->cmd->data; > - > - read = data->flags & MMC_DATA_READ ? 1 : 0; > - > - if (read) { > - if (data->error == (unsigned int)(-EIO)) { > - ret = msdc_tune_bread(mmc,mrq); > - } > - } else { > - ret = msdc_check_busy(mmc, host); > - if (ret){ > - ERR_MSG("XXX cmd13 wait program done failed"); > - return ret; > - } > - /* CRC and TO */ > - /* Fix me: don't care card status? */ > - ret = msdc_tune_bwrite(mmc,mrq); > - } > - > - return ret; > + struct msdc_host *host = mmc_priv(mmc); > + struct mmc_command *cmd; > + struct mmc_data *data; > + //u32 base = host->base; > + int ret=0, read; > + > + cmd = mrq->cmd; > + data = mrq->cmd->data; > + > + read = data->flags & MMC_DATA_READ ? 1 : 0; > + > + if (read) { > + if (data->error == (unsigned int)(-EIO)) { > + ret = msdc_tune_bread(mmc,mrq); > + } > + } else { > + ret = msdc_check_busy(mmc, host); > + if (ret){ > + ERR_MSG("XXX cmd13 wait program done failed"); > + return ret; > + } > + /* CRC and TO */ > + /* Fix me: don't care card status? */ > + ret = msdc_tune_bwrite(mmc,mrq); > + } > + > + return ret; > } > > /* ops.request */ > static void msdc_ops_request(struct mmc_host *mmc,struct mmc_request *mrq) > { > - struct msdc_host *host = mmc_priv(mmc); > + struct msdc_host *host = mmc_priv(mmc); > > - //=== for sdio profile === > + //=== for sdio profile === > #if 0 /* --- by chhung */ > - u32 old_H32, old_L32, new_H32, new_L32; > - u32 ticks = 0, opcode = 0, sizes = 0, bRx = 0; > + u32 old_H32, old_L32, new_H32, new_L32; > + u32 ticks = 0, opcode = 0, sizes = 0, bRx = 0; > #endif /* end of --- */ > > - if(host->mrq){ > - ERR_MSG("XXX host->mrq<0x%.8x>", (int)host->mrq); > - BUG(); > - } > + if(host->mrq){ > + ERR_MSG("XXX host->mrq<0x%.8x>", (int)host->mrq); > + BUG(); > + } > > - if (!is_card_present(host) || host->power_mode == MMC_POWER_OFF) { > - ERR_MSG("cmd<%d> card<%d> power<%d>", mrq->cmd->opcode, is_card_present(host), host->power_mode); > - mrq->cmd->error = (unsigned int)-ENOMEDIUM; > + if (!is_card_present(host) || host->power_mode == MMC_POWER_OFF) { > + ERR_MSG("cmd<%d> card<%d> power<%d>", mrq->cmd->opcode, is_card_present(host), host->power_mode); > + mrq->cmd->error = (unsigned int)-ENOMEDIUM; > > #if 1 > - mrq->done(mrq); // call done directly. > + mrq->done(mrq); // call done directly. > #else > - mrq->cmd->retries = 0; // please don't retry. > - mmc_request_done(mmc, mrq); > + mrq->cmd->retries = 0; // please don't retry. > + mmc_request_done(mmc, mrq); > #endif > > - return; > - } > + return; > + } > > - /* start to process */ > - spin_lock(&host->lock); > + /* start to process */ > + spin_lock(&host->lock); > #if 0 /* --- by chhung */ > - if (sdio_pro_enable) { //=== for sdio profile === > - if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53) { > - GPT_GetCounter64(&old_L32, &old_H32); > - } > - } > + if (sdio_pro_enable) { //=== for sdio profile === > + if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53) { > + GPT_GetCounter64(&old_L32, &old_H32); > + } > + } > #endif /* end of --- */ > > - host->mrq = mrq; > + host->mrq = mrq; > > - if (msdc_do_request(mmc,mrq)) { > - if(host->hw->flags & MSDC_REMOVABLE && ralink_soc == MT762X_SOC_MT7621AT && mrq->data && mrq->data->error) { > - msdc_tune_request(mmc,mrq); > - } > - } > + if (msdc_do_request(mmc,mrq)) { > + if(host->hw->flags & MSDC_REMOVABLE && ralink_soc == MT762X_SOC_MT7621AT && mrq->data && mrq->data->error) { > + msdc_tune_request(mmc,mrq); > + } > + } > > - /* ==== when request done, check if app_cmd ==== */ > - if (mrq->cmd->opcode == MMC_APP_CMD) { > - host->app_cmd = 1; > - host->app_cmd_arg = mrq->cmd->arg; /* save the RCA */ > - } else { > - host->app_cmd = 0; > - //host->app_cmd_arg = 0; > - } > + /* ==== when request done, check if app_cmd ==== */ > + if (mrq->cmd->opcode == MMC_APP_CMD) { > + host->app_cmd = 1; > + host->app_cmd_arg = mrq->cmd->arg; /* save the RCA */ > + } else { > + host->app_cmd = 0; > + //host->app_cmd_arg = 0; > + } > > - host->mrq = NULL; > + host->mrq = NULL; > > #if 0 /* --- by chhung */ > - //=== for sdio profile === > - if (sdio_pro_enable) { > - if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53) { > - GPT_GetCounter64(&new_L32, &new_H32); > - ticks = msdc_time_calc(old_L32, old_H32, new_L32, new_H32); > - > - opcode = mrq->cmd->opcode; > - if (mrq->cmd->data) { > - sizes = mrq->cmd->data->blocks * mrq->cmd->data->blksz; > - bRx = mrq->cmd->data->flags & MMC_DATA_READ ? 1 : 0 ; > - } else { > - bRx = mrq->cmd->arg & 0x80000000 ? 1 : 0; > - } > - > - if (!mrq->cmd->error) { > - msdc_performance(opcode, sizes, bRx, ticks); > - } > - } > - } > + //=== for sdio profile === > + if (sdio_pro_enable) { > + if (mrq->cmd->opcode == 52 || mrq->cmd->opcode == 53) { > + GPT_GetCounter64(&new_L32, &new_H32); > + ticks = msdc_time_calc(old_L32, old_H32, new_L32, new_H32); > + > + opcode = mrq->cmd->opcode; > + if (mrq->cmd->data) { > + sizes = mrq->cmd->data->blocks * mrq->cmd->data->blksz; > + bRx = mrq->cmd->data->flags & MMC_DATA_READ ? 1 : 0 ; > + } else { > + bRx = mrq->cmd->arg & 0x80000000 ? 1 : 0; > + } > + > + if (!mrq->cmd->error) { > + msdc_performance(opcode, sizes, bRx, ticks); > + } > + } > + } > #endif /* end of --- */ > - spin_unlock(&host->lock); > + spin_unlock(&host->lock); > > - mmc_request_done(mmc, mrq); > + mmc_request_done(mmc, mrq); > > - return; > + return; > } > > /* called by ops.set_ios */ > static void msdc_set_buswidth(struct msdc_host *host, u32 width) > { > - u32 base = host->base; > - u32 val = sdr_read32(SDC_CFG); > - > - val &= ~SDC_CFG_BUSWIDTH; > - > - switch (width) { > - default: > - case MMC_BUS_WIDTH_1: > - width = 1; > - val |= (MSDC_BUS_1BITS << 16); > - break; > - case MMC_BUS_WIDTH_4: > - val |= (MSDC_BUS_4BITS << 16); > - break; > - case MMC_BUS_WIDTH_8: > - val |= (MSDC_BUS_8BITS << 16); > - break; > - } > - > - sdr_write32(SDC_CFG, val); > - > - N_MSG(CFG, "Bus Width = %d", width); > + u32 base = host->base; > + u32 val = sdr_read32(SDC_CFG); > + > + val &= ~SDC_CFG_BUSWIDTH; > + > + switch (width) { > + default: > + case MMC_BUS_WIDTH_1: > + width = 1; > + val |= (MSDC_BUS_1BITS << 16); > + break; > + case MMC_BUS_WIDTH_4: > + val |= (MSDC_BUS_4BITS << 16); > + break; > + case MMC_BUS_WIDTH_8: > + val |= (MSDC_BUS_8BITS << 16); > + break; > + } > + > + sdr_write32(SDC_CFG, val); > + > + N_MSG(CFG, "Bus Width = %d", width); > } > > /* ops.set_ios */ > static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) > { > - struct msdc_host *host = mmc_priv(mmc); > - struct msdc_hw *hw=host->hw; > - u32 base = host->base; > - u32 ddr = 0; > + struct msdc_host *host = mmc_priv(mmc); > + struct msdc_hw *hw=host->hw; > + u32 base = host->base; > + u32 ddr = 0; > > #ifdef MT6575_SD_DEBUG > - static char *vdd[] = { > - "1.50v", "1.55v", "1.60v", "1.65v", "1.70v", "1.80v", "1.90v", > - "2.00v", "2.10v", "2.20v", "2.30v", "2.40v", "2.50v", "2.60v", > - "2.70v", "2.80v", "2.90v", "3.00v", "3.10v", "3.20v", "3.30v", > - "3.40v", "3.50v", "3.60v" > - }; > - static char *power_mode[] = { > - "OFF", "UP", "ON" > - }; > - static char *bus_mode[] = { > - "UNKNOWN", "OPENDRAIN", "PUSHPULL" > - }; > - static char *timing[] = { > - "LEGACY", "MMC_HS", "SD_HS" > - }; > - > - printk("SET_IOS: CLK(%dkHz), BUS(%s), BW(%u), PWR(%s), VDD(%s), TIMING(%s)", > - ios->clock / 1000, bus_mode[ios->bus_mode], > - (ios->bus_width == MMC_BUS_WIDTH_4) ? 4 : 1, > - power_mode[ios->power_mode], vdd[ios->vdd], timing[ios->timing]); > + static char *vdd[] = { > + "1.50v", "1.55v", "1.60v", "1.65v", "1.70v", "1.80v", "1.90v", > + "2.00v", "2.10v", "2.20v", "2.30v", "2.40v", "2.50v", "2.60v", > + "2.70v", "2.80v", "2.90v", "3.00v", "3.10v", "3.20v", "3.30v", > + "3.40v", "3.50v", "3.60v" > + }; > + static char *power_mode[] = { > + "OFF", "UP", "ON" > + }; > + static char *bus_mode[] = { > + "UNKNOWN", "OPENDRAIN", "PUSHPULL" > + }; > + static char *timing[] = { > + "LEGACY", "MMC_HS", "SD_HS" > + }; > + > + printk("SET_IOS: CLK(%dkHz), BUS(%s), BW(%u), PWR(%s), VDD(%s), TIMING(%s)", > + ios->clock / 1000, bus_mode[ios->bus_mode], > + (ios->bus_width == MMC_BUS_WIDTH_4) ? 4 : 1, > + power_mode[ios->power_mode], vdd[ios->vdd], timing[ios->timing]); > #endif > > - msdc_set_buswidth(host, ios->bus_width); > - > - /* Power control ??? */ > - switch (ios->power_mode) { > - case MMC_POWER_OFF: > - case MMC_POWER_UP: > - // msdc_set_power_mode(host, ios->power_mode); /* --- by chhung */ > - break; > - case MMC_POWER_ON: > - host->power_mode = MMC_POWER_ON; > - break; > - default: > - break; > - } > - > - /* Clock control */ > - if (host->mclk != ios->clock) { > - if(ios->clock > 25000000) { > - //if (!(host->hw->flags & MSDC_REMOVABLE)) { > - INIT_MSG("SD data latch edge<%d>", hw->data_edge); > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL, hw->cmd_edge); > - sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, hw->data_edge); > - //} /* for tuning debug */ > - } else { /* default value */ > - sdr_write32(MSDC_IOCON, 0x00000000); > - // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000); > - sdr_write32(MSDC_DAT_RDDLY0, 0x10101010); // for MT7620 E2 and afterward > - sdr_write32(MSDC_DAT_RDDLY1, 0x00000000); > - // sdr_write32(MSDC_PAD_TUNE, 0x00000000); > - sdr_write32(MSDC_PAD_TUNE, 0x84101010); // for MT7620 E2 and afterward > - } > - msdc_set_mclk(host, ddr, ios->clock); > - } > + msdc_set_buswidth(host, ios->bus_width); > + > + /* Power control ??? */ > + switch (ios->power_mode) { > + case MMC_POWER_OFF: > + case MMC_POWER_UP: > + // msdc_set_power_mode(host, ios->power_mode); /* --- by chhung */ > + break; > + case MMC_POWER_ON: > + host->power_mode = MMC_POWER_ON; > + break; > + default: > + break; > + } > + > + /* Clock control */ > + if (host->mclk != ios->clock) { > + if(ios->clock > 25000000) { > + //if (!(host->hw->flags & MSDC_REMOVABLE)) { > + INIT_MSG("SD data latch edge<%d>", hw->data_edge); > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_RSPL, hw->cmd_edge); > + sdr_set_field(MSDC_IOCON, MSDC_IOCON_DSPL, hw->data_edge); > + //} /* for tuning debug */ > + } else { /* default value */ > + sdr_write32(MSDC_IOCON, 0x00000000); > + // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000); > + sdr_write32(MSDC_DAT_RDDLY0, 0x10101010); // for MT7620 E2 and afterward > + sdr_write32(MSDC_DAT_RDDLY1, 0x00000000); > + // sdr_write32(MSDC_PAD_TUNE, 0x00000000); > + sdr_write32(MSDC_PAD_TUNE, 0x84101010); // for MT7620 E2 and afterward > + } > + msdc_set_mclk(host, ddr, ios->clock); > + } > } > > /* ops.get_ro */ > static int msdc_ops_get_ro(struct mmc_host *mmc) > { > - struct msdc_host *host = mmc_priv(mmc); > - u32 base = host->base; > - unsigned long flags; > - int ro = 0; > - > - if (host->hw->flags & MSDC_WP_PIN_EN) { /* set for card */ > - spin_lock_irqsave(&host->lock, flags); > - ro = (sdr_read32(MSDC_PS) >> 31); > - spin_unlock_irqrestore(&host->lock, flags); > - } > - return ro; > + struct msdc_host *host = mmc_priv(mmc); > + u32 base = host->base; > + unsigned long flags; > + int ro = 0; > + > + if (host->hw->flags & MSDC_WP_PIN_EN) { /* set for card */ > + spin_lock_irqsave(&host->lock, flags); > + ro = (sdr_read32(MSDC_PS) >> 31); > + spin_unlock_irqrestore(&host->lock, flags); > + } > + return ro; > } > > /* ops.get_cd */ > static int msdc_ops_get_cd(struct mmc_host *mmc) > { > - struct msdc_host *host = mmc_priv(mmc); > - u32 base = host->base; > - unsigned long flags; > - int present = 1; > - > - /* for sdio, MSDC_REMOVABLE not set, always return 1 */ > - if (!(host->hw->flags & MSDC_REMOVABLE)) { > - /* For sdio, read H/W always get<1>, but may timeout some times */ > + struct msdc_host *host = mmc_priv(mmc); > + u32 base = host->base; > + unsigned long flags; > + int present = 1; > + > + /* for sdio, MSDC_REMOVABLE not set, always return 1 */ > + if (!(host->hw->flags & MSDC_REMOVABLE)) { > + /* For sdio, read H/W always get<1>, but may timeout some times */ > #if 1 > - host->card_inserted = 1; > - return 1; > + host->card_inserted = 1; > + return 1; > #else > - host->card_inserted = (host->pm_state.event == PM_EVENT_USER_RESUME) ? 1 : 0; > - INIT_MSG("sdio ops_get_cd<%d>", host->card_inserted); > - return host->card_inserted; > + host->card_inserted = (host->pm_state.event == PM_EVENT_USER_RESUME) ? 1 : 0; > + INIT_MSG("sdio ops_get_cd<%d>", host->card_inserted); > + return host->card_inserted; > #endif > - } > + } > > - /* MSDC_CD_PIN_EN set for card */ > - if (host->hw->flags & MSDC_CD_PIN_EN) { > - spin_lock_irqsave(&host->lock, flags); > + /* MSDC_CD_PIN_EN set for card */ > + if (host->hw->flags & MSDC_CD_PIN_EN) { > + spin_lock_irqsave(&host->lock, flags); > #if 0 > - present = host->card_inserted; /* why not read from H/W: Fix me*/ > + present = host->card_inserted; /* why not read from H/W: Fix me*/ > #else > - // CD > - if (cd_active_low) > - present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1; > - else > - present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 1 : 0; > - host->card_inserted = present; > + // CD > + if (cd_active_low) > + present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 0 : 1; > + else > + present = (sdr_read32(MSDC_PS) & MSDC_PS_CDSTS) ? 1 : 0; > + host->card_inserted = present; > #endif > - spin_unlock_irqrestore(&host->lock, flags); > - } else { > - present = 0; /* TODO? Check DAT3 pins for card detection */ > - } > + spin_unlock_irqrestore(&host->lock, flags); > + } else { > + present = 0; /* TODO? Check DAT3 pins for card detection */ > + } > > - INIT_MSG("ops_get_cd return<%d>", present); > - return present; > + INIT_MSG("ops_get_cd return<%d>", present); > + return present; > } > > /* ops.enable_sdio_irq */ > static void msdc_ops_enable_sdio_irq(struct mmc_host *mmc, int enable) > { > - struct msdc_host *host = mmc_priv(mmc); > - struct msdc_hw *hw = host->hw; > - u32 base = host->base; > - u32 tmp; > - > - if (hw->flags & MSDC_EXT_SDIO_IRQ) { /* yes for sdio */ > - if (enable) { > - hw->enable_sdio_eirq(); /* combo_sdio_enable_eirq */ > - } else { > - hw->disable_sdio_eirq(); /* combo_sdio_disable_eirq */ > - } > - } else { > - ERR_MSG("XXX "); /* so never enter here */ > - tmp = sdr_read32(SDC_CFG); > - /* FIXME. Need to interrupt gap detection */ > - if (enable) { > - tmp |= (SDC_CFG_SDIOIDE | SDC_CFG_SDIOINTWKUP); > - } else { > - tmp &= ~(SDC_CFG_SDIOIDE | SDC_CFG_SDIOINTWKUP); > - } > - sdr_write32(SDC_CFG, tmp); > - } > + struct msdc_host *host = mmc_priv(mmc); > + struct msdc_hw *hw = host->hw; > + u32 base = host->base; > + u32 tmp; > + > + if (hw->flags & MSDC_EXT_SDIO_IRQ) { /* yes for sdio */ > + if (enable) { > + hw->enable_sdio_eirq(); /* combo_sdio_enable_eirq */ > + } else { > + hw->disable_sdio_eirq(); /* combo_sdio_disable_eirq */ > + } > + } else { > + ERR_MSG("XXX "); /* so never enter here */ > + tmp = sdr_read32(SDC_CFG); > + /* FIXME. Need to interrupt gap detection */ > + if (enable) { > + tmp |= (SDC_CFG_SDIOIDE | SDC_CFG_SDIOINTWKUP); > + } else { > + tmp &= ~(SDC_CFG_SDIOIDE | SDC_CFG_SDIOINTWKUP); > + } > + sdr_write32(SDC_CFG, tmp); > + } > } > > static struct mmc_host_ops mt_msdc_ops = { > - .request = msdc_ops_request, > - .set_ios = msdc_ops_set_ios, > - .get_ro = msdc_ops_get_ro, > - .get_cd = msdc_ops_get_cd, > - .enable_sdio_irq = msdc_ops_enable_sdio_irq, > + .request = msdc_ops_request, > + .set_ios = msdc_ops_set_ios, > + .get_ro = msdc_ops_get_ro, > + .get_cd = msdc_ops_get_cd, > + .enable_sdio_irq = msdc_ops_enable_sdio_irq, > }; > > /*--------------------------------------------------------------------------*/ > @@ -2383,150 +2383,150 @@ static struct mmc_host_ops mt_msdc_ops = { > /*--------------------------------------------------------------------------*/ > static irqreturn_t msdc_irq(int irq, void *dev_id) > { > - struct msdc_host *host = (struct msdc_host *)dev_id; > - struct mmc_data *data = host->data; > - struct mmc_command *cmd = host->cmd; > - u32 base = host->base; > + struct msdc_host *host = (struct msdc_host *)dev_id; > + struct mmc_data *data = host->data; > + struct mmc_command *cmd = host->cmd; > + u32 base = host->base; > > - u32 cmdsts = MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | MSDC_INT_CMDRDY | > - MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMDRDY | > - MSDC_INT_ACMD19_DONE; > - u32 datsts = MSDC_INT_DATCRCERR |MSDC_INT_DATTMO; > + u32 cmdsts = MSDC_INT_RSPCRCERR | MSDC_INT_CMDTMO | MSDC_INT_CMDRDY | > + MSDC_INT_ACMDCRCERR | MSDC_INT_ACMDTMO | MSDC_INT_ACMDRDY | > + MSDC_INT_ACMD19_DONE; > + u32 datsts = MSDC_INT_DATCRCERR |MSDC_INT_DATTMO; > > - u32 intsts = sdr_read32(MSDC_INT); > - u32 inten = sdr_read32(MSDC_INTEN); inten &= intsts; > + u32 intsts = sdr_read32(MSDC_INT); > + u32 inten = sdr_read32(MSDC_INTEN); inten &= intsts; > > - sdr_write32(MSDC_INT, intsts); /* clear interrupts */ > - /* MSG will cause fatal error */ > + sdr_write32(MSDC_INT, intsts); /* clear interrupts */ > + /* MSG will cause fatal error */ > > - /* card change interrupt */ > - if (intsts & MSDC_INT_CDSC){ > - if (mtk_sw_poll) > - return IRQ_HANDLED; > - IRQ_MSG("MSDC_INT_CDSC irq<0x%.8x>", intsts); > + /* card change interrupt */ > + if (intsts & MSDC_INT_CDSC){ > + if (mtk_sw_poll) > + return IRQ_HANDLED; > + IRQ_MSG("MSDC_INT_CDSC irq<0x%.8x>", intsts); > #if 0 /* ---/+++ by chhung: fix slot mechanical bounce issue */ > - tasklet_hi_schedule(&host->card_tasklet); > + tasklet_hi_schedule(&host->card_tasklet); > #else > - schedule_delayed_work(&host->card_delaywork, HZ); > + schedule_delayed_work(&host->card_delaywork, HZ); > #endif > - /* tuning when plug card ? */ > - } > - > - /* sdio interrupt */ > - if (intsts & MSDC_INT_SDIOIRQ){ > - IRQ_MSG("XXX MSDC_INT_SDIOIRQ"); /* seems not sdio irq */ > - //mmc_signal_sdio_irq(host->mmc); > - } > - > - /* transfer complete interrupt */ > - if (data != NULL) { > - if (inten & MSDC_INT_XFER_COMPL) { > - data->bytes_xfered = host->dma.xfersz; > - complete(&host->xfer_done); > - } > - > - if (intsts & datsts) { > - /* do basic reset, or stop command will sdc_busy */ > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > - atomic_set(&host->abort, 1); /* For PIO mode exit */ > - > - if (intsts & MSDC_INT_DATTMO){ > - IRQ_MSG("XXX CMD<%d> MSDC_INT_DATTMO", host->mrq->cmd->opcode); > - data->error = (unsigned int)-ETIMEDOUT; > - } > - else if (intsts & MSDC_INT_DATCRCERR){ > - IRQ_MSG("XXX CMD<%d> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", host->mrq->cmd->opcode, sdr_read32(SDC_DCRC_STS)); > - data->error = (unsigned int)-EIO; > - } > - > - //if(sdr_read32(MSDC_INTEN) & MSDC_INT_XFER_COMPL) { > - if (host->dma_xfer) { > - complete(&host->xfer_done); /* Read CRC come fast, XFER_COMPL not enabled */ > - } /* PIO mode can't do complete, because not init */ > - } > - } > - > - /* command interrupts */ > - if ((cmd != NULL) && (intsts & cmdsts)) { > - if ((intsts & MSDC_INT_CMDRDY) || (intsts & MSDC_INT_ACMDRDY) || > - (intsts & MSDC_INT_ACMD19_DONE)) { > - u32 *rsp = &cmd->resp[0]; > - > - switch (host->cmd_rsp) { > - case RESP_NONE: > - break; > - case RESP_R2: > - *rsp++ = sdr_read32(SDC_RESP3); *rsp++ = sdr_read32(SDC_RESP2); > - *rsp++ = sdr_read32(SDC_RESP1); *rsp++ = sdr_read32(SDC_RESP0); > - break; > - default: /* Response types 1, 3, 4, 5, 6, 7(1b) */ > - if ((intsts & MSDC_INT_ACMDRDY) || (intsts & MSDC_INT_ACMD19_DONE)) { > - *rsp = sdr_read32(SDC_ACMD_RESP); > - } else { > - *rsp = sdr_read32(SDC_RESP0); > - } > - break; > - } > - } else if ((intsts & MSDC_INT_RSPCRCERR) || (intsts & MSDC_INT_ACMDCRCERR)) { > - if(intsts & MSDC_INT_ACMDCRCERR){ > - IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDCRCERR",cmd->opcode); > - } > - else { > - IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR",cmd->opcode); > - } > - cmd->error = (unsigned int)-EIO; > - } else if ((intsts & MSDC_INT_CMDTMO) || (intsts & MSDC_INT_ACMDTMO)) { > - if(intsts & MSDC_INT_ACMDTMO){ > - IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDTMO",cmd->opcode); > - } > - else { > - IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO",cmd->opcode); > - } > - cmd->error = (unsigned int)-ETIMEDOUT; > - msdc_reset(); > - msdc_clr_fifo(); > - msdc_clr_int(); > - } > - complete(&host->cmd_done); > - } > - > - /* mmc irq interrupts */ > - if (intsts & MSDC_INT_MMCIRQ) { > - printk(KERN_INFO "msdc[%d] MMCIRQ: SDC_CSTS=0x%.8x\r\n", host->id, sdr_read32(SDC_CSTS)); > - } > + /* tuning when plug card ? */ > + } > + > + /* sdio interrupt */ > + if (intsts & MSDC_INT_SDIOIRQ){ > + IRQ_MSG("XXX MSDC_INT_SDIOIRQ"); /* seems not sdio irq */ > + //mmc_signal_sdio_irq(host->mmc); > + } > + > + /* transfer complete interrupt */ > + if (data != NULL) { > + if (inten & MSDC_INT_XFER_COMPL) { > + data->bytes_xfered = host->dma.xfersz; > + complete(&host->xfer_done); > + } > + > + if (intsts & datsts) { > + /* do basic reset, or stop command will sdc_busy */ > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > + atomic_set(&host->abort, 1); /* For PIO mode exit */ > + > + if (intsts & MSDC_INT_DATTMO){ > + IRQ_MSG("XXX CMD<%d> MSDC_INT_DATTMO", host->mrq->cmd->opcode); > + data->error = (unsigned int)-ETIMEDOUT; > + } > + else if (intsts & MSDC_INT_DATCRCERR){ > + IRQ_MSG("XXX CMD<%d> MSDC_INT_DATCRCERR, SDC_DCRC_STS<0x%x>", host->mrq->cmd->opcode, sdr_read32(SDC_DCRC_STS)); > + data->error = (unsigned int)-EIO; > + } > + > + //if(sdr_read32(MSDC_INTEN) & MSDC_INT_XFER_COMPL) { > + if (host->dma_xfer) { > + complete(&host->xfer_done); /* Read CRC come fast, XFER_COMPL not enabled */ > + } /* PIO mode can't do complete, because not init */ > + } > + } > + > + /* command interrupts */ > + if ((cmd != NULL) && (intsts & cmdsts)) { > + if ((intsts & MSDC_INT_CMDRDY) || (intsts & MSDC_INT_ACMDRDY) || > + (intsts & MSDC_INT_ACMD19_DONE)) { > + u32 *rsp = &cmd->resp[0]; > + > + switch (host->cmd_rsp) { > + case RESP_NONE: > + break; > + case RESP_R2: > + *rsp++ = sdr_read32(SDC_RESP3); *rsp++ = sdr_read32(SDC_RESP2); > + *rsp++ = sdr_read32(SDC_RESP1); *rsp++ = sdr_read32(SDC_RESP0); > + break; > + default: /* Response types 1, 3, 4, 5, 6, 7(1b) */ > + if ((intsts & MSDC_INT_ACMDRDY) || (intsts & MSDC_INT_ACMD19_DONE)) { > + *rsp = sdr_read32(SDC_ACMD_RESP); > + } else { > + *rsp = sdr_read32(SDC_RESP0); > + } > + break; > + } > + } else if ((intsts & MSDC_INT_RSPCRCERR) || (intsts & MSDC_INT_ACMDCRCERR)) { > + if(intsts & MSDC_INT_ACMDCRCERR){ > + IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDCRCERR",cmd->opcode); > + } > + else { > + IRQ_MSG("XXX CMD<%d> MSDC_INT_RSPCRCERR",cmd->opcode); > + } > + cmd->error = (unsigned int)-EIO; > + } else if ((intsts & MSDC_INT_CMDTMO) || (intsts & MSDC_INT_ACMDTMO)) { > + if(intsts & MSDC_INT_ACMDTMO){ > + IRQ_MSG("XXX CMD<%d> MSDC_INT_ACMDTMO",cmd->opcode); > + } > + else { > + IRQ_MSG("XXX CMD<%d> MSDC_INT_CMDTMO",cmd->opcode); > + } > + cmd->error = (unsigned int)-ETIMEDOUT; > + msdc_reset(); > + msdc_clr_fifo(); > + msdc_clr_int(); > + } > + complete(&host->cmd_done); > + } > + > + /* mmc irq interrupts */ > + if (intsts & MSDC_INT_MMCIRQ) { > + printk(KERN_INFO "msdc[%d] MMCIRQ: SDC_CSTS=0x%.8x\r\n", host->id, sdr_read32(SDC_CSTS)); > + } > > #ifdef MT6575_SD_DEBUG > - { > + { > /* msdc_int_reg *int_reg = (msdc_int_reg*)&intsts;*/ > - N_MSG(INT, "IRQ_EVT(0x%x): MMCIRQ(%d) CDSC(%d), ACRDY(%d), ACTMO(%d), ACCRE(%d) AC19DN(%d)", > - intsts, > - int_reg->mmcirq, > - int_reg->cdsc, > - int_reg->atocmdrdy, > - int_reg->atocmdtmo, > - int_reg->atocmdcrc, > - int_reg->atocmd19done); > - N_MSG(INT, "IRQ_EVT(0x%x): SDIO(%d) CMDRDY(%d), CMDTMO(%d), RSPCRC(%d), CSTA(%d)", > - intsts, > - int_reg->sdioirq, > - int_reg->cmdrdy, > - int_reg->cmdtmo, > - int_reg->rspcrc, > - int_reg->csta); > - N_MSG(INT, "IRQ_EVT(0x%x): XFCMP(%d) DXDONE(%d), DATTMO(%d), DATCRC(%d), DMAEMP(%d)", > - intsts, > - int_reg->xfercomp, > - int_reg->dxferdone, > - int_reg->dattmo, > - int_reg->datcrc, > - int_reg->dmaqempty); > - > - } > + N_MSG(INT, "IRQ_EVT(0x%x): MMCIRQ(%d) CDSC(%d), ACRDY(%d), ACTMO(%d), ACCRE(%d) AC19DN(%d)", > + intsts, > + int_reg->mmcirq, > + int_reg->cdsc, > + int_reg->atocmdrdy, > + int_reg->atocmdtmo, > + int_reg->atocmdcrc, > + int_reg->atocmd19done); > + N_MSG(INT, "IRQ_EVT(0x%x): SDIO(%d) CMDRDY(%d), CMDTMO(%d), RSPCRC(%d), CSTA(%d)", > + intsts, > + int_reg->sdioirq, > + int_reg->cmdrdy, > + int_reg->cmdtmo, > + int_reg->rspcrc, > + int_reg->csta); > + N_MSG(INT, "IRQ_EVT(0x%x): XFCMP(%d) DXDONE(%d), DATTMO(%d), DATCRC(%d), DMAEMP(%d)", > + intsts, > + int_reg->xfercomp, > + int_reg->dxferdone, > + int_reg->dattmo, > + int_reg->datcrc, > + int_reg->dmaqempty); > + > + } > #endif > > - return IRQ_HANDLED; > + return IRQ_HANDLED; > } > > /*--------------------------------------------------------------------------*/ > @@ -2542,9 +2542,9 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable) > if ((hw->flags & MSDC_CD_PIN_EN) == 0) { > /* Pull down card detection pin since it is not avaiable */ > /* > - if (hw->config_gpio_pin) > - hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN); > - */ > + if (hw->config_gpio_pin) > + hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN); > + */ > sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); > sdr_clr_bits(MSDC_INTEN, MSDC_INTEN_CDSC); > sdr_clr_bits(SDC_CFG, SDC_CFG_INSWKUP); > @@ -2554,238 +2554,238 @@ static void msdc_enable_cd_irq(struct msdc_host *host, int enable) > N_MSG(CFG, "CD IRQ Eanable(%d)", enable); > > if (enable) { > - if (hw->enable_cd_eirq) { /* not set, never enter */ > - hw->enable_cd_eirq(); > - } else { > - /* card detection circuit relies on the core power so that the core power > - * shouldn't be turned off. Here adds a reference count to keep > - * the core power alive. > - */ > - //msdc_vcore_on(host); //did in msdc_init_hw() > - > - if (hw->config_gpio_pin) /* NULL */ > - hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_UP); > - > - sdr_set_field(MSDC_PS, MSDC_PS_CDDEBOUNCE, DEFAULT_DEBOUNCE); > - sdr_set_bits(MSDC_PS, MSDC_PS_CDEN); > - sdr_set_bits(MSDC_INTEN, MSDC_INTEN_CDSC); > - sdr_set_bits(SDC_CFG, SDC_CFG_INSWKUP); /* not in document! Fix me */ > - } > - } else { > - if (hw->disable_cd_eirq) { > - hw->disable_cd_eirq(); > - } else { > - if (hw->config_gpio_pin) /* NULL */ > - hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN); > - > - sdr_clr_bits(SDC_CFG, SDC_CFG_INSWKUP); > - sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); > - sdr_clr_bits(MSDC_INTEN, MSDC_INTEN_CDSC); > - > - /* Here decreases a reference count to core power since card > - * detection circuit is shutdown. > - */ > - //msdc_vcore_off(host); > - } > - } > + if (hw->enable_cd_eirq) { /* not set, never enter */ > + hw->enable_cd_eirq(); > + } else { > + /* card detection circuit relies on the core power so that the core power > + * shouldn't be turned off. Here adds a reference count to keep > + * the core power alive. > + */ > + //msdc_vcore_on(host); //did in msdc_init_hw() > + > + if (hw->config_gpio_pin) /* NULL */ > + hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_UP); > + > + sdr_set_field(MSDC_PS, MSDC_PS_CDDEBOUNCE, DEFAULT_DEBOUNCE); > + sdr_set_bits(MSDC_PS, MSDC_PS_CDEN); > + sdr_set_bits(MSDC_INTEN, MSDC_INTEN_CDSC); > + sdr_set_bits(SDC_CFG, SDC_CFG_INSWKUP); /* not in document! Fix me */ > + } > + } else { > + if (hw->disable_cd_eirq) { > + hw->disable_cd_eirq(); > + } else { > + if (hw->config_gpio_pin) /* NULL */ > + hw->config_gpio_pin(MSDC_CD_PIN, GPIO_PULL_DOWN); > + > + sdr_clr_bits(SDC_CFG, SDC_CFG_INSWKUP); > + sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); > + sdr_clr_bits(MSDC_INTEN, MSDC_INTEN_CDSC); > + > + /* Here decreases a reference count to core power since card > + * detection circuit is shutdown. > + */ > + //msdc_vcore_off(host); > + } > + } > } > > /* called by msdc_drv_probe */ > static void msdc_init_hw(struct msdc_host *host) > { > - u32 base = host->base; > - struct msdc_hw *hw = host->hw; > + u32 base = host->base; > + struct msdc_hw *hw = host->hw; > > #ifdef MT6575_SD_DEBUG > - msdc_reg[host->id] = (struct msdc_regs *)host->base; > + msdc_reg[host->id] = (struct msdc_regs *)host->base; > #endif > > - /* Power on */ > + /* Power on */ > #if 0 /* --- by chhung */ > - msdc_vcore_on(host); > - msdc_pin_reset(host, MSDC_PIN_PULL_UP); > - msdc_select_clksrc(host, hw->clk_src); > - enable_clock(PERI_MSDC0_PDN + host->id, "SD"); > - msdc_vdd_on(host); > + msdc_vcore_on(host); > + msdc_pin_reset(host, MSDC_PIN_PULL_UP); > + msdc_select_clksrc(host, hw->clk_src); > + enable_clock(PERI_MSDC0_PDN + host->id, "SD"); > + msdc_vdd_on(host); > #endif /* end of --- */ > - /* Configure to MMC/SD mode */ > - sdr_set_field(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC); > + /* Configure to MMC/SD mode */ > + sdr_set_field(MSDC_CFG, MSDC_CFG_MODE, MSDC_SDMMC); > > - /* Reset */ > - msdc_reset(); > - msdc_clr_fifo(); > + /* Reset */ > + msdc_reset(); > + msdc_clr_fifo(); > > - /* Disable card detection */ > - sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); > + /* Disable card detection */ > + sdr_clr_bits(MSDC_PS, MSDC_PS_CDEN); > > - /* Disable and clear all interrupts */ > - sdr_clr_bits(MSDC_INTEN, sdr_read32(MSDC_INTEN)); > - sdr_write32(MSDC_INT, sdr_read32(MSDC_INT)); > + /* Disable and clear all interrupts */ > + sdr_clr_bits(MSDC_INTEN, sdr_read32(MSDC_INTEN)); > + sdr_write32(MSDC_INT, sdr_read32(MSDC_INT)); > > #if 1 > /* reset tuning parameter */ > - sdr_write32(MSDC_PAD_CTL0, 0x00090000); > - sdr_write32(MSDC_PAD_CTL1, 0x000A0000); > - sdr_write32(MSDC_PAD_CTL2, 0x000A0000); > - // sdr_write32(MSDC_PAD_TUNE, 0x00000000); > - sdr_write32(MSDC_PAD_TUNE, 0x84101010); // for MT7620 E2 and afterward > - // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000); > - sdr_write32(MSDC_DAT_RDDLY0, 0x10101010); // for MT7620 E2 and afterward > - sdr_write32(MSDC_DAT_RDDLY1, 0x00000000); > - sdr_write32(MSDC_IOCON, 0x00000000); > + sdr_write32(MSDC_PAD_CTL0, 0x00090000); > + sdr_write32(MSDC_PAD_CTL1, 0x000A0000); > + sdr_write32(MSDC_PAD_CTL2, 0x000A0000); > + // sdr_write32(MSDC_PAD_TUNE, 0x00000000); > + sdr_write32(MSDC_PAD_TUNE, 0x84101010); // for MT7620 E2 and afterward > + // sdr_write32(MSDC_DAT_RDDLY0, 0x00000000); > + sdr_write32(MSDC_DAT_RDDLY0, 0x10101010); // for MT7620 E2 and afterward > + sdr_write32(MSDC_DAT_RDDLY1, 0x00000000); > + sdr_write32(MSDC_IOCON, 0x00000000); > #if 0 // use MT7620 default value: 0x403c004f > - sdr_write32(MSDC_PATCH_BIT0, 0x003C000F); /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/ > + sdr_write32(MSDC_PATCH_BIT0, 0x003C000F); /* bit0 modified: Rx Data Clock Source: 1 -> 2.0*/ > #endif > > - if (sdr_read32(MSDC_ECO_VER) >= 4) { > - if (host->id == 1) { > - sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, 1); > - sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, 1); > + if (sdr_read32(MSDC_ECO_VER) >= 4) { > + if (host->id == 1) { > + sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_WRDAT_CRCS, 1); > + sdr_set_field(MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMD_RSP, 1); > > - /* internal clock: latch read data */ > - sdr_set_bits(MSDC_PATCH_BIT0, MSDC_PATCH_BIT_CKGEN_CK); > - } > - } > + /* internal clock: latch read data */ > + sdr_set_bits(MSDC_PATCH_BIT0, MSDC_PATCH_BIT_CKGEN_CK); > + } > + } > #endif > > - /* for safety, should clear SDC_CFG.SDIO_INT_DET_EN & set SDC_CFG.SDIO in > - pre-loader,uboot,kernel drivers. and SDC_CFG.SDIO_INT_DET_EN will be only > - set when kernel driver wants to use SDIO bus interrupt */ > - /* Configure to enable SDIO mode. it's must otherwise sdio cmd5 failed */ > - sdr_set_bits(SDC_CFG, SDC_CFG_SDIO); > + /* for safety, should clear SDC_CFG.SDIO_INT_DET_EN & set SDC_CFG.SDIO in > + pre-loader,uboot,kernel drivers. and SDC_CFG.SDIO_INT_DET_EN will be only > + set when kernel driver wants to use SDIO bus interrupt */ > + /* Configure to enable SDIO mode. it's must otherwise sdio cmd5 failed */ > + sdr_set_bits(SDC_CFG, SDC_CFG_SDIO); > > - /* disable detect SDIO device interupt function */ > - sdr_clr_bits(SDC_CFG, SDC_CFG_SDIOIDE); > + /* disable detect SDIO device interupt function */ > + sdr_clr_bits(SDC_CFG, SDC_CFG_SDIOIDE); > > - /* eneable SMT for glitch filter */ > - sdr_set_bits(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSMT); > - sdr_set_bits(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSMT); > - sdr_set_bits(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSMT); > + /* eneable SMT for glitch filter */ > + sdr_set_bits(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKSMT); > + sdr_set_bits(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDSMT); > + sdr_set_bits(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATSMT); > > #if 1 > - /* set clk, cmd, dat pad driving */ > - sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, hw->clk_drv); > - sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, hw->clk_drv); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, hw->cmd_drv); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, hw->cmd_drv); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, hw->dat_drv); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, hw->dat_drv); > + /* set clk, cmd, dat pad driving */ > + sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, hw->clk_drv); > + sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, hw->clk_drv); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, hw->cmd_drv); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, hw->cmd_drv); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, hw->dat_drv); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, hw->dat_drv); > #else > - sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 0); > - sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 0); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 0); > - sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 0); > - sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 0); > + sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVN, 0); > + sdr_set_field(MSDC_PAD_CTL0, MSDC_PAD_CTL0_CLKDRVP, 0); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVN, 0); > + sdr_set_field(MSDC_PAD_CTL1, MSDC_PAD_CTL1_CMDDRVP, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVN, 0); > + sdr_set_field(MSDC_PAD_CTL2, MSDC_PAD_CTL2_DATDRVP, 0); > #endif > > - /* set sampling edge */ > + /* set sampling edge */ > > - /* write crc timeout detection */ > - sdr_set_field(MSDC_PATCH_BIT0, 1 << 30, 1); > + /* write crc timeout detection */ > + sdr_set_field(MSDC_PATCH_BIT0, 1 << 30, 1); > > - /* Configure to default data timeout */ > - sdr_set_field(SDC_CFG, SDC_CFG_DTOC, DEFAULT_DTOC); > + /* Configure to default data timeout */ > + sdr_set_field(SDC_CFG, SDC_CFG_DTOC, DEFAULT_DTOC); > > - msdc_set_buswidth(host, MMC_BUS_WIDTH_1); > + msdc_set_buswidth(host, MMC_BUS_WIDTH_1); > > - N_MSG(FUC, "init hardware done!"); > + N_MSG(FUC, "init hardware done!"); > } > > /* called by msdc_drv_remove */ > static void msdc_deinit_hw(struct msdc_host *host) > { > - u32 base = host->base; > + u32 base = host->base; > > - /* Disable and clear all interrupts */ > - sdr_clr_bits(MSDC_INTEN, sdr_read32(MSDC_INTEN)); > - sdr_write32(MSDC_INT, sdr_read32(MSDC_INT)); > + /* Disable and clear all interrupts */ > + sdr_clr_bits(MSDC_INTEN, sdr_read32(MSDC_INTEN)); > + sdr_write32(MSDC_INT, sdr_read32(MSDC_INT)); > > - /* Disable card detection */ > - msdc_enable_cd_irq(host, 0); > - // msdc_set_power_mode(host, MMC_POWER_OFF); /* make sure power down */ /* --- by chhung */ > + /* Disable card detection */ > + msdc_enable_cd_irq(host, 0); > + // msdc_set_power_mode(host, MMC_POWER_OFF); /* make sure power down */ /* --- by chhung */ > } > > /* init gpd and bd list in msdc_drv_probe */ > static void msdc_init_gpd_bd(struct msdc_host *host, struct msdc_dma *dma) > { > - gpd_t *gpd = dma->gpd; > - bd_t *bd = dma->bd; > - bd_t *ptr, *prev; > - > - /* we just support one gpd */ > - int bdlen = MAX_BD_PER_GPD; > - > - /* init the 2 gpd */ > - memset(gpd, 0, sizeof(gpd_t) * 2); > - //gpd->next = (void *)virt_to_phys(gpd + 1); /* pointer to a null gpd, bug! kmalloc <-> virt_to_phys */ > - //gpd->next = (dma->gpd_addr + 1); /* bug */ > - gpd->next = (void *)((u32)dma->gpd_addr + sizeof(gpd_t)); > - > - //gpd->intr = 0; > - gpd->bdp = 1; /* hwo, cs, bd pointer */ > - //gpd->ptr = (void*)virt_to_phys(bd); > - gpd->ptr = (void *)dma->bd_addr; /* physical address */ > - > - memset(bd, 0, sizeof(bd_t) * bdlen); > - ptr = bd + bdlen - 1; > - //ptr->eol = 1; /* 0 or 1 [Fix me]*/ > - //ptr->next = 0; > - > - while (ptr != bd) { > - prev = ptr - 1; > - prev->next = (void *)(dma->bd_addr + sizeof(bd_t) *(ptr - bd)); > - ptr = prev; > - } > + gpd_t *gpd = dma->gpd; > + bd_t *bd = dma->bd; > + bd_t *ptr, *prev; > + > + /* we just support one gpd */ > + int bdlen = MAX_BD_PER_GPD; > + > + /* init the 2 gpd */ > + memset(gpd, 0, sizeof(gpd_t) * 2); > + //gpd->next = (void *)virt_to_phys(gpd + 1); /* pointer to a null gpd, bug! kmalloc <-> virt_to_phys */ > + //gpd->next = (dma->gpd_addr + 1); /* bug */ > + gpd->next = (void *)((u32)dma->gpd_addr + sizeof(gpd_t)); > + > + //gpd->intr = 0; > + gpd->bdp = 1; /* hwo, cs, bd pointer */ > + //gpd->ptr = (void*)virt_to_phys(bd); > + gpd->ptr = (void *)dma->bd_addr; /* physical address */ > + > + memset(bd, 0, sizeof(bd_t) * bdlen); > + ptr = bd + bdlen - 1; > + //ptr->eol = 1; /* 0 or 1 [Fix me]*/ > + //ptr->next = 0; > + > + while (ptr != bd) { > + prev = ptr - 1; > + prev->next = (void *)(dma->bd_addr + sizeof(bd_t) *(ptr - bd)); > + ptr = prev; > + } > } > > static int msdc_drv_probe(struct platform_device *pdev) > { > - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - __iomem void *base; > - struct mmc_host *mmc; > - struct resource *mem; > - struct msdc_host *host; > - struct msdc_hw *hw; > - int ret, irq; > - > - pdev->dev.platform_data = &msdc0_hw; > - > - if (of_property_read_bool(pdev->dev.of_node, "mtk,wp-en")) > - msdc0_hw.flags |= MSDC_WP_PIN_EN; > - > - /* Allocate MMC host for this device */ > - mmc = mmc_alloc_host(sizeof(struct msdc_host), &pdev->dev); > - if (!mmc) return -ENOMEM; > - > - hw = (struct msdc_hw*)pdev->dev.platform_data; > - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - irq = platform_get_irq(pdev, 0); > - > - //BUG_ON((!hw) || (!mem) || (irq < 0)); /* --- by chhung */ > - > - base = devm_ioremap_resource(&pdev->dev, res); > - if (IS_ERR(base)) > - return PTR_ERR(base); > - > - /* Set host parameters to mmc */ > - mmc->ops = &mt_msdc_ops; > - mmc->f_min = HOST_MIN_MCLK; > - mmc->f_max = HOST_MAX_MCLK; > - mmc->ocr_avail = MSDC_OCR_AVAIL; > - > - /* For sd card: MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED, > - For sdio : MSDC_EXT_SDIO_IRQ | MSDC_HIGHSPEED */ > - if (hw->flags & MSDC_HIGHSPEED) { > - mmc->caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; > - } > - if (hw->data_pins == 4) { /* current data_pins are all 4*/ > - mmc->caps |= MMC_CAP_4_BIT_DATA; > - } else if (hw->data_pins == 8) { > - mmc->caps |= MMC_CAP_8_BIT_DATA; > - } > - if ((hw->flags & MSDC_SDIO_IRQ) || (hw->flags & MSDC_EXT_SDIO_IRQ)) > - mmc->caps |= MMC_CAP_SDIO_IRQ; /* yes for sdio */ > + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + __iomem void *base; > + struct mmc_host *mmc; > + struct resource *mem; > + struct msdc_host *host; > + struct msdc_hw *hw; > + int ret, irq; > + > + pdev->dev.platform_data = &msdc0_hw; > + > + if (of_property_read_bool(pdev->dev.of_node, "mtk,wp-en")) > + msdc0_hw.flags |= MSDC_WP_PIN_EN; > + > + /* Allocate MMC host for this device */ > + mmc = mmc_alloc_host(sizeof(struct msdc_host), &pdev->dev); > + if (!mmc) return -ENOMEM; > + > + hw = (struct msdc_hw*)pdev->dev.platform_data; > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + irq = platform_get_irq(pdev, 0); > + > + //BUG_ON((!hw) || (!mem) || (irq < 0)); /* --- by chhung */ > + > + base = devm_ioremap_resource(&pdev->dev, res); > + if (IS_ERR(base)) > + return PTR_ERR(base); > + > + /* Set host parameters to mmc */ > + mmc->ops = &mt_msdc_ops; > + mmc->f_min = HOST_MIN_MCLK; > + mmc->f_max = HOST_MAX_MCLK; > + mmc->ocr_avail = MSDC_OCR_AVAIL; > + > + /* For sd card: MSDC_SYS_SUSPEND | MSDC_WP_PIN_EN | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED, > + For sdio : MSDC_EXT_SDIO_IRQ | MSDC_HIGHSPEED */ > + if (hw->flags & MSDC_HIGHSPEED) { > + mmc->caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED; > + } > + if (hw->data_pins == 4) { /* current data_pins are all 4*/ > + mmc->caps |= MMC_CAP_4_BIT_DATA; > + } else if (hw->data_pins == 8) { > + mmc->caps |= MMC_CAP_8_BIT_DATA; > + } > + if ((hw->flags & MSDC_SDIO_IRQ) || (hw->flags & MSDC_EXT_SDIO_IRQ)) > + mmc->caps |= MMC_CAP_SDIO_IRQ; /* yes for sdio */ > > cd_active_low = !of_property_read_bool(pdev->dev.of_node, "mediatek,cd-high"); > mtk_sw_poll = of_property_read_bool(pdev->dev.of_node, "mediatek,cd-poll"); > @@ -2793,193 +2793,193 @@ static int msdc_drv_probe(struct platform_device *pdev) > if (mtk_sw_poll) > mmc->caps |= MMC_CAP_NEEDS_POLL; > > - /* MMC core transfer sizes tunable parameters */ > + /* MMC core transfer sizes tunable parameters */ > #if LINUX_VERSION_CODE > KERNEL_VERSION(3,10,0) > - mmc->max_segs = MAX_HW_SGMTS; > + mmc->max_segs = MAX_HW_SGMTS; > #else > - mmc->max_hw_segs = MAX_HW_SGMTS; > - mmc->max_phys_segs = MAX_PHY_SGMTS; > + mmc->max_hw_segs = MAX_HW_SGMTS; > + mmc->max_phys_segs = MAX_PHY_SGMTS; > #endif > - mmc->max_seg_size = MAX_SGMT_SZ; > - mmc->max_blk_size = HOST_MAX_BLKSZ; > - mmc->max_req_size = MAX_REQ_SZ; > - mmc->max_blk_count = mmc->max_req_size; > - > - host = mmc_priv(mmc); > - host->hw = hw; > - host->mmc = mmc; > - host->id = pdev->id; > - if (host->id < 0 || host->id >= 4) > - host->id = 0; > - host->error = 0; > - host->irq = irq; > - host->base = (unsigned long) base; > - host->mclk = 0; /* mclk: the request clock of mmc sub-system */ > - host->hclk = hclks[hw->clk_src]; /* hclk: clock of clock source to msdc controller */ > - host->sclk = 0; /* sclk: the really clock after divition */ > - host->pm_state = PMSG_RESUME; > - host->suspend = 0; > - host->core_clkon = 0; > - host->card_clkon = 0; > - host->core_power = 0; > - host->power_mode = MMC_POWER_OFF; > + mmc->max_seg_size = MAX_SGMT_SZ; > + mmc->max_blk_size = HOST_MAX_BLKSZ; > + mmc->max_req_size = MAX_REQ_SZ; > + mmc->max_blk_count = mmc->max_req_size; > + > + host = mmc_priv(mmc); > + host->hw = hw; > + host->mmc = mmc; > + host->id = pdev->id; > + if (host->id < 0 || host->id >= 4) > + host->id = 0; > + host->error = 0; > + host->irq = irq; > + host->base = (unsigned long) base; > + host->mclk = 0; /* mclk: the request clock of mmc sub-system */ > + host->hclk = hclks[hw->clk_src]; /* hclk: clock of clock source to msdc controller */ > + host->sclk = 0; /* sclk: the really clock after divition */ > + host->pm_state = PMSG_RESUME; > + host->suspend = 0; > + host->core_clkon = 0; > + host->card_clkon = 0; > + host->core_power = 0; > + host->power_mode = MMC_POWER_OFF; > // host->card_inserted = hw->flags & MSDC_REMOVABLE ? 0 : 1; > - host->timeout_ns = 0; > - host->timeout_clks = DEFAULT_DTOC * 65536; > + host->timeout_ns = 0; > + host->timeout_clks = DEFAULT_DTOC * 65536; > > - host->mrq = NULL; > - //init_MUTEX(&host->sem); /* we don't need to support multiple threads access */ > + host->mrq = NULL; > + //init_MUTEX(&host->sem); /* we don't need to support multiple threads access */ > > - host->dma.used_gpd = 0; > - host->dma.used_bd = 0; > - mmc_dev(mmc)->dma_mask = NULL; > + host->dma.used_gpd = 0; > + host->dma.used_bd = 0; > + mmc_dev(mmc)->dma_mask = NULL; > > - /* using dma_alloc_coherent*/ /* todo: using 1, for all 4 slots */ > - host->dma.gpd = dma_alloc_coherent(NULL, MAX_GPD_NUM * sizeof(gpd_t), &host->dma.gpd_addr, GFP_KERNEL); > - host->dma.bd = dma_alloc_coherent(NULL, MAX_BD_NUM * sizeof(bd_t), &host->dma.bd_addr, GFP_KERNEL); > - BUG_ON((!host->dma.gpd) || (!host->dma.bd)); > - msdc_init_gpd_bd(host, &host->dma); > - /*for emmc*/ > - msdc_6575_host[pdev->id] = host; > + /* using dma_alloc_coherent*/ /* todo: using 1, for all 4 slots */ > + host->dma.gpd = dma_alloc_coherent(NULL, MAX_GPD_NUM * sizeof(gpd_t), &host->dma.gpd_addr, GFP_KERNEL); > + host->dma.bd = dma_alloc_coherent(NULL, MAX_BD_NUM * sizeof(bd_t), &host->dma.bd_addr, GFP_KERNEL); > + BUG_ON((!host->dma.gpd) || (!host->dma.bd)); > + msdc_init_gpd_bd(host, &host->dma); > + /*for emmc*/ > + msdc_6575_host[pdev->id] = host; > > #if 0 > - tasklet_init(&host->card_tasklet, msdc_tasklet_card, (ulong)host); > + tasklet_init(&host->card_tasklet, msdc_tasklet_card, (ulong)host); > #else > - INIT_DELAYED_WORK(&host->card_delaywork, msdc_tasklet_card); > + INIT_DELAYED_WORK(&host->card_delaywork, msdc_tasklet_card); > #endif > - spin_lock_init(&host->lock); > - msdc_init_hw(host); > + spin_lock_init(&host->lock); > + msdc_init_hw(host); > > if (ralink_soc == MT762X_SOC_MT7621AT) > ret = request_irq((unsigned int)irq, msdc_irq, 0, dev_name(&pdev->dev), host); > else > ret = request_irq((unsigned int)irq, msdc_irq, IRQF_TRIGGER_LOW, dev_name(&pdev->dev), host); > > - if (ret) goto release; > - // mt65xx_irq_unmask(irq); /* --- by chhung */ > + if (ret) goto release; > + // mt65xx_irq_unmask(irq); /* --- by chhung */ > > - if (hw->flags & MSDC_CD_PIN_EN) { /* not set for sdio */ > - if (hw->request_cd_eirq) { /* not set for MT6575 */ > - hw->request_cd_eirq(msdc_eirq_cd, (void*)host); /* msdc_eirq_cd will not be used! */ > - } > - } > + if (hw->flags & MSDC_CD_PIN_EN) { /* not set for sdio */ > + if (hw->request_cd_eirq) { /* not set for MT6575 */ > + hw->request_cd_eirq(msdc_eirq_cd, (void*)host); /* msdc_eirq_cd will not be used! */ > + } > + } > > - if (hw->request_sdio_eirq) /* set to combo_sdio_request_eirq() for WIFI */ > - hw->request_sdio_eirq(msdc_eirq_sdio, (void*)host); /* msdc_eirq_sdio() will be called when EIRQ */ > + if (hw->request_sdio_eirq) /* set to combo_sdio_request_eirq() for WIFI */ > + hw->request_sdio_eirq(msdc_eirq_sdio, (void*)host); /* msdc_eirq_sdio() will be called when EIRQ */ > > - if (hw->register_pm) {/* yes for sdio */ > + if (hw->register_pm) {/* yes for sdio */ > #ifdef CONFIG_PM > - hw->register_pm(msdc_pm, (void*)host); /* combo_sdio_register_pm() */ > + hw->register_pm(msdc_pm, (void*)host); /* combo_sdio_register_pm() */ > #endif > - if(hw->flags & MSDC_SYS_SUSPEND) { /* will not set for WIFI */ > - ERR_MSG("MSDC_SYS_SUSPEND and register_pm both set"); > - } > - //mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* pm not controlled by system but by client. */ /* --- by chhung */ > - } > + if(hw->flags & MSDC_SYS_SUSPEND) { /* will not set for WIFI */ > + ERR_MSG("MSDC_SYS_SUSPEND and register_pm both set"); > + } > + //mmc->pm_flags |= MMC_PM_IGNORE_PM_NOTIFY; /* pm not controlled by system but by client. */ /* --- by chhung */ > + } > > - platform_set_drvdata(pdev, mmc); > + platform_set_drvdata(pdev, mmc); > > - ret = mmc_add_host(mmc); > - if (ret) goto free_irq; > + ret = mmc_add_host(mmc); > + if (ret) goto free_irq; > > - /* Config card detection pin and enable interrupts */ > - if (hw->flags & MSDC_CD_PIN_EN) { /* set for card */ > - msdc_enable_cd_irq(host, 1); > - } else { > - msdc_enable_cd_irq(host, 0); > - } > + /* Config card detection pin and enable interrupts */ > + if (hw->flags & MSDC_CD_PIN_EN) { /* set for card */ > + msdc_enable_cd_irq(host, 1); > + } else { > + msdc_enable_cd_irq(host, 0); > + } > > - return 0; > + return 0; > > free_irq: > - free_irq(irq, host); > + free_irq(irq, host); > release: > - platform_set_drvdata(pdev, NULL); > - msdc_deinit_hw(host); > + platform_set_drvdata(pdev, NULL); > + msdc_deinit_hw(host); > > #if 0 > - tasklet_kill(&host->card_tasklet); > + tasklet_kill(&host->card_tasklet); > #else > - cancel_delayed_work_sync(&host->card_delaywork); > + cancel_delayed_work_sync(&host->card_delaywork); > #endif > > - if (mem) > - release_mem_region(mem->start, mem->end - mem->start + 1); > + if (mem) > + release_mem_region(mem->start, mem->end - mem->start + 1); > > - mmc_free_host(mmc); > + mmc_free_host(mmc); > > - return ret; > + return ret; > } > > /* 4 device share one driver, using "drvdata" to show difference */ > static int msdc_drv_remove(struct platform_device *pdev) > { > - struct mmc_host *mmc; > - struct msdc_host *host; > - struct resource *mem; > + struct mmc_host *mmc; > + struct msdc_host *host; > + struct resource *mem; > > - mmc = platform_get_drvdata(pdev); > - BUG_ON(!mmc); > + mmc = platform_get_drvdata(pdev); > + BUG_ON(!mmc); > > - host = mmc_priv(mmc); > - BUG_ON(!host); > + host = mmc_priv(mmc); > + BUG_ON(!host); > > - ERR_MSG("removed !!!"); > + ERR_MSG("removed !!!"); > > - platform_set_drvdata(pdev, NULL); > - mmc_remove_host(host->mmc); > - msdc_deinit_hw(host); > + platform_set_drvdata(pdev, NULL); > + mmc_remove_host(host->mmc); > + msdc_deinit_hw(host); > > #if 0 > - tasklet_kill(&host->card_tasklet); > + tasklet_kill(&host->card_tasklet); > #else > - cancel_delayed_work_sync(&host->card_delaywork); > + cancel_delayed_work_sync(&host->card_delaywork); > #endif > - free_irq(host->irq, host); > + free_irq(host->irq, host); > > - dma_free_coherent(NULL, MAX_GPD_NUM * sizeof(gpd_t), host->dma.gpd, host->dma.gpd_addr); > - dma_free_coherent(NULL, MAX_BD_NUM * sizeof(bd_t), host->dma.bd, host->dma.bd_addr); > + dma_free_coherent(NULL, MAX_GPD_NUM * sizeof(gpd_t), host->dma.gpd, host->dma.gpd_addr); > + dma_free_coherent(NULL, MAX_BD_NUM * sizeof(bd_t), host->dma.bd, host->dma.bd_addr); > > - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > - if (mem) > - release_mem_region(mem->start, mem->end - mem->start + 1); > + if (mem) > + release_mem_region(mem->start, mem->end - mem->start + 1); > > - mmc_free_host(host->mmc); > + mmc_free_host(host->mmc); > > - return 0; > + return 0; > } > > /* Fix me: Power Flow */ > #ifdef CONFIG_PM > static int msdc_drv_suspend(struct platform_device *pdev, pm_message_t state) > { > - int ret = 0; > - struct mmc_host *mmc = platform_get_drvdata(pdev); > - struct msdc_host *host = mmc_priv(mmc); > + int ret = 0; > + struct mmc_host *mmc = platform_get_drvdata(pdev); > + struct msdc_host *host = mmc_priv(mmc); > > - if (mmc && state.event == PM_EVENT_SUSPEND && (host->hw->flags & MSDC_SYS_SUSPEND)) { /* will set for card */ > - msdc_pm(state, (void*)host); > - } > + if (mmc && state.event == PM_EVENT_SUSPEND && (host->hw->flags & MSDC_SYS_SUSPEND)) { /* will set for card */ > + msdc_pm(state, (void*)host); > + } > > - return ret; > + return ret; > } > > static int msdc_drv_resume(struct platform_device *pdev) > { > - int ret = 0; > - struct mmc_host *mmc = platform_get_drvdata(pdev); > - struct msdc_host *host = mmc_priv(mmc); > - struct pm_message state; > - > - state.event = PM_EVENT_RESUME; > - if (mmc && (host->hw->flags & MSDC_SYS_SUSPEND)) {/* will set for card */ > - msdc_pm(state, (void*)host); > - } > + int ret = 0; > + struct mmc_host *mmc = platform_get_drvdata(pdev); > + struct msdc_host *host = mmc_priv(mmc); > + struct pm_message state; > + > + state.event = PM_EVENT_RESUME; > + if (mmc && (host->hw->flags & MSDC_SYS_SUSPEND)) {/* will set for card */ > + msdc_pm(state, (void*)host); > + } > > - /* This mean WIFI not controller by PM */ > + /* This mean WIFI not controller by PM */ > > - return ret; > + return ret; > } > #endif > > @@ -2990,17 +2990,17 @@ static const struct of_device_id mt7620_sdhci_match[] = { > MODULE_DEVICE_TABLE(of, mt7620_sdhci_match); > > static struct platform_driver mt_msdc_driver = { > - .probe = msdc_drv_probe, > - .remove = msdc_drv_remove, > + .probe = msdc_drv_probe, > + .remove = msdc_drv_remove, > #ifdef CONFIG_PM > - .suspend = msdc_drv_suspend, > - .resume = msdc_drv_resume, > + .suspend = msdc_drv_suspend, > + .resume = msdc_drv_resume, > #endif > - .driver = { > - .name = DRV_NAME, > - .owner = THIS_MODULE, > - .of_match_table = mt7620_sdhci_match, > - }, > + .driver = { > + .name = DRV_NAME, > + .owner = THIS_MODULE, > + .of_match_table = mt7620_sdhci_match, > + }, > }; > > /*--------------------------------------------------------------------------*/ > @@ -3008,61 +3008,61 @@ static struct platform_driver mt_msdc_driver = { > /*--------------------------------------------------------------------------*/ > static int __init mt_msdc_init(void) > { > - int ret; > + int ret; > /* +++ by chhung */ > - u32 reg; > + u32 reg; > > #if defined (CONFIG_MTD_ANY_RALINK) > - extern int ra_check_flash_type(void); > - if(ra_check_flash_type() == 2) { /* NAND */ > - printk("%s: !!!!! SDXC Module Initialize Fail !!!!!", __func__); > - return 0; > - } > + extern int ra_check_flash_type(void); > + if(ra_check_flash_type() == 2) { /* NAND */ > + printk("%s: !!!!! SDXC Module Initialize Fail !!!!!", __func__); > + return 0; > + } > #endif > - printk("MTK MSDC device init.\n"); > - mtk_sd_device.dev.platform_data = &msdc0_hw; > -if (ralink_soc == MT762X_SOC_MT7620A || ralink_soc == MT762X_SOC_MT7621AT) { > + printk("MTK MSDC device init.\n"); > + mtk_sd_device.dev.platform_data = &msdc0_hw; > + if (ralink_soc == MT762X_SOC_MT7620A || ralink_soc == MT762X_SOC_MT7621AT) { > //#if defined (CONFIG_RALINK_MT7620) || defined (CONFIG_RALINK_MT7621) > - reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x60)) & ~(0x3<<18); > + reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x60)) & ~(0x3<<18); > //#if defined (CONFIG_RALINK_MT7620) > - if (ralink_soc == MT762X_SOC_MT7620A) > - reg |= 0x1<<18; > + if (ralink_soc == MT762X_SOC_MT7620A) > + reg |= 0x1<<18; > //#endif > -} else { > + } else { > //#elif defined (CONFIG_RALINK_MT7628) > - /* TODO: maybe omitted when RAether already toggle AGPIO_CFG */ > - reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x3c)); > - reg |= 0x1e << 16; > - sdr_write32((volatile u32*)(RALINK_SYSCTL_BASE + 0x3c), reg); > + /* TODO: maybe omitted when RAether already toggle AGPIO_CFG */ > + reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x3c)); > + reg |= 0x1e << 16; > + sdr_write32((volatile u32*)(RALINK_SYSCTL_BASE + 0x3c), reg); > > - reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x60)) & ~(0x3<<10); > + reg = sdr_read32((volatile u32*)(RALINK_SYSCTL_BASE + 0x60)) & ~(0x3<<10); > #if defined (CONFIG_MTK_MMC_EMMC_8BIT) > - reg |= 0x3<<26 | 0x3<<28 | 0x3<<30; > - msdc0_hw.data_pins = 8, > + reg |= 0x3<<26 | 0x3<<28 | 0x3<<30; > + msdc0_hw.data_pins = 8, > #endif > //#endif > -} > - sdr_write32((volatile u32*)(RALINK_SYSCTL_BASE + 0x60), reg); > - //platform_device_register(&mtk_sd_device); > + } Indenting this '}' so far looks weird. You fix it in a later patch so it doesn't really matter, but I thought I'd mention it. Still gets Reviewed-by: NeilBrown <neil@xxxxxxxxxx> Thanks, NeilBrown
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel