aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAxel Lin <axel.lin@ingics.com>2014-04-27 06:22:51 -0400
committerUlf Hansson <ulf.hansson@linaro.org>2014-07-09 05:26:07 -0400
commit889c9e04f14253e9267bf72aafc298c81468c508 (patch)
tree4f131698dc2db98948f7be0d2091ef60b4517981
parent5e863662add1fc00bf088dc381b787edc0a0de5b (diff)
mmc: wmt-sdmmc: Fix settting BM_EIGHTBIT_MODE bit in wmt_mci_set_ios()
For MMC_BUS_WIDTH_8 case, current code missed setting BM_EIGHTBIT_MODE bit. Also has a small refactor to make the code looks better in readability. So the bit settings witch below logic: SDMMC_BUSMODE register: Set EIGHTBIT_MODE bit for 8 bit mode, Set FOURBIT_MODE bit for 4 bit mode. Clear both EIGHTBIT_MODE and FOURBIT_MODE bits for 1 bit mode. SDMMC_EXTCTRL register: Set EXT_EIGHTBIT bit for 8 bit mode, Clear EXT_EIGHTBIT bit for 1/4 bit mode. Add define for EXT_EIGHTBIT to avoid using magic number. BM_ONEBIT_MASK is no longer used, thus remove it. This patch is untested due to lack of platform with 8-bit hardware. However since the code is there, it's good to make the code match the document. Signed-off-by: Axel Lin <axel.lin@ingics.com> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-rw-r--r--drivers/mmc/host/wmt-sdmmc.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/mmc/host/wmt-sdmmc.c b/drivers/mmc/host/wmt-sdmmc.c
index 282891a8e451..f064bcbe0068 100644
--- a/drivers/mmc/host/wmt-sdmmc.c
+++ b/drivers/mmc/host/wmt-sdmmc.c
@@ -72,7 +72,6 @@
72#define BM_SPI_CS 0x20 72#define BM_SPI_CS 0x20
73#define BM_SD_POWER 0x40 73#define BM_SD_POWER 0x40
74#define BM_SOFT_RESET 0x80 74#define BM_SOFT_RESET 0x80
75#define BM_ONEBIT_MASK 0xFD
76 75
77/* SDMMC_BLKLEN bit fields */ 76/* SDMMC_BLKLEN bit fields */
78#define BLKL_CRCERR_ABORT 0x0800 77#define BLKL_CRCERR_ABORT 0x0800
@@ -120,6 +119,8 @@
120#define STS2_DATARSP_BUSY 0x20 119#define STS2_DATARSP_BUSY 0x20
121#define STS2_DIS_FORCECLK 0x80 120#define STS2_DIS_FORCECLK 0x80
122 121
122/* SDMMC_EXTCTRL bit fields */
123#define EXT_EIGHTBIT 0x04
123 124
124/* MMC/SD DMA Controller Registers */ 125/* MMC/SD DMA Controller Registers */
125#define SDDMA_GCR 0x100 126#define SDDMA_GCR 0x100
@@ -672,7 +673,7 @@ static void wmt_mci_request(struct mmc_host *mmc, struct mmc_request *req)
672static void wmt_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) 673static void wmt_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
673{ 674{
674 struct wmt_mci_priv *priv; 675 struct wmt_mci_priv *priv;
675 u32 reg_tmp; 676 u32 busmode, extctrl;
676 677
677 priv = mmc_priv(mmc); 678 priv = mmc_priv(mmc);
678 679
@@ -687,28 +688,26 @@ static void wmt_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
687 if (ios->clock != 0) 688 if (ios->clock != 0)
688 clk_set_rate(priv->clk_sdmmc, ios->clock); 689 clk_set_rate(priv->clk_sdmmc, ios->clock);
689 690
691 busmode = readb(priv->sdmmc_base + SDMMC_BUSMODE);
692 extctrl = readb(priv->sdmmc_base + SDMMC_EXTCTRL);
693
694 busmode &= ~(BM_EIGHTBIT_MODE | BM_FOURBIT_MODE);
695 extctrl &= ~EXT_EIGHTBIT;
696
690 switch (ios->bus_width) { 697 switch (ios->bus_width) {
691 case MMC_BUS_WIDTH_8: 698 case MMC_BUS_WIDTH_8:
692 reg_tmp = readb(priv->sdmmc_base + SDMMC_EXTCTRL); 699 busmode |= BM_EIGHTBIT_MODE;
693 writeb(reg_tmp | 0x04, priv->sdmmc_base + SDMMC_EXTCTRL); 700 extctrl |= EXT_EIGHTBIT;
694 break; 701 break;
695 case MMC_BUS_WIDTH_4: 702 case MMC_BUS_WIDTH_4:
696 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE); 703 busmode |= BM_FOURBIT_MODE;
697 writeb(reg_tmp | BM_FOURBIT_MODE, priv->sdmmc_base +
698 SDMMC_BUSMODE);
699
700 reg_tmp = readb(priv->sdmmc_base + SDMMC_EXTCTRL);
701 writeb(reg_tmp & 0xFB, priv->sdmmc_base + SDMMC_EXTCTRL);
702 break; 704 break;
703 case MMC_BUS_WIDTH_1: 705 case MMC_BUS_WIDTH_1:
704 reg_tmp = readb(priv->sdmmc_base + SDMMC_BUSMODE);
705 writeb(reg_tmp & BM_ONEBIT_MASK, priv->sdmmc_base +
706 SDMMC_BUSMODE);
707
708 reg_tmp = readb(priv->sdmmc_base + SDMMC_EXTCTRL);
709 writeb(reg_tmp & 0xFB, priv->sdmmc_base + SDMMC_EXTCTRL);
710 break; 706 break;
711 } 707 }
708
709 writeb(busmode, priv->sdmmc_base + SDMMC_BUSMODE);
710 writeb(extctrl, priv->sdmmc_base + SDMMC_EXTCTRL);
712} 711}
713 712
714static int wmt_mci_get_ro(struct mmc_host *mmc) 713static int wmt_mci_get_ro(struct mmc_host *mmc)