diff options
author | Axel Lin <axel.lin@ingics.com> | 2014-04-27 06:22:51 -0400 |
---|---|---|
committer | Ulf Hansson <ulf.hansson@linaro.org> | 2014-07-09 05:26:07 -0400 |
commit | 889c9e04f14253e9267bf72aafc298c81468c508 (patch) | |
tree | 4f131698dc2db98948f7be0d2091ef60b4517981 | |
parent | 5e863662add1fc00bf088dc381b787edc0a0de5b (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.c | 31 |
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) | |||
672 | static void wmt_mci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | 673 | static 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 | ||
714 | static int wmt_mci_get_ro(struct mmc_host *mmc) | 713 | static int wmt_mci_get_ro(struct mmc_host *mmc) |