[U-Boot] [PATCH 2/8] mmc: sdhci: rework Samsung specfic code
Minkyu Kang
promsoft at gmail.com
Mon Jun 13 08:59:36 CEST 2011
Dear Rob Herring,
On 12 June 2011 06:46, Rob Herring <robherring2 at gmail.com> wrote:
> From: Rob Herring <rob.herring at calxeda.com>
>
> Move the register definitions into the sdhci.c file. Set the base
> address from the board init code.
>
> The Samsung SDHCI controller has extra registers. Make them conditional
> on CONFIG_MMC_S5P.
>
> Signed-off-by: Rob Herring <rob.herring at calxeda.com>
> ---
> arch/arm/include/asm/arch-s5pc1xx/mmc.h | 73 --------------------------
> arch/arm/include/asm/arch-s5pc2xx/mmc.h | 73 --------------------------
> board/samsung/goni/goni.c | 4 +-
> board/samsung/universal_c210/universal.c | 8 ++-
> drivers/mmc/sdhci.c | 82 +++++++++++++++++++++++-------
> include/sdhci.h | 18 +++++++
> 6 files changed, 89 insertions(+), 169 deletions(-)
> delete mode 100644 arch/arm/include/asm/arch-s5pc1xx/mmc.h
> delete mode 100644 arch/arm/include/asm/arch-s5pc2xx/mmc.h
> create mode 100644 include/sdhci.h
>
> diff --git a/board/samsung/universal_c210/universal.c b/board/samsung/universal_c210/universal.c
> index b65bc6e..b0e76e8 100644
> --- a/board/samsung/universal_c210/universal.c
> +++ b/board/samsung/universal_c210/universal.c
> @@ -23,10 +23,10 @@
> */
>
> #include <common.h>
> +#include <sdhci.h>
> #include <asm/io.h>
> #include <asm/arch/adc.h>
> #include <asm/arch/gpio.h>
> -#include <asm/arch/mmc.h>
>
> DECLARE_GLOBAL_DATA_PTR;
>
> @@ -151,6 +151,7 @@ int checkboard(void)
> int board_mmc_init(bd_t *bis)
> {
> int i, err;
> + u32 base;
>
> switch (get_hwrev()) {
> case 0:
> @@ -217,7 +218,8 @@ int board_mmc_init(bd_t *bis)
> * mmc0 : eMMC (8-bit buswidth)
> * mmc2 : SD card (4-bit buswidth)
> */
> - err = s5p_mmc_init(0, 8);
> + base = samsung_get_base_mmc();
> + err = sdhci_mmc_init((void *)base, 8);
>
> /*
> * Check the T-flash detect pin
> @@ -241,7 +243,7 @@ int board_mmc_init(bd_t *bis)
> /* GPK2[0:6] drv 4x */
> gpio_set_drv(&gpio2->k2, i, GPIO_DRV_4X);
> }
> - err = s5p_mmc_init(2, 4);
> + err = sdhci_mmc_init((void *)(base + 0x20000), 4);
No, please use the macro instead of constant. (pass the device number to macro)
> }
>
> return err;
> diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
> index 280738f..c82bde0 100644
> --- a/drivers/mmc/sdhci.c
> +++ b/drivers/mmc/sdhci.c
> @@ -21,18 +21,56 @@
> #include <common.h>
> #include <mmc.h>
> #include <asm/io.h>
> -#include <asm/arch/mmc.h>
> #include <asm/arch/clk.h>
>
> +struct sdhci_mmc {
> + unsigned int sysad;
> + unsigned short blksize;
> + unsigned short blkcnt;
> + unsigned int argument;
> + unsigned short trnmod;
> + unsigned short cmdreg;
> + unsigned int rspreg0;
> + unsigned int rspreg1;
> + unsigned int rspreg2;
> + unsigned int rspreg3;
> + unsigned int bdata;
> + unsigned int prnsts;
> + unsigned char hostctl;
> + unsigned char pwrcon;
> + unsigned char blkgap;
> + unsigned char wakcon;
> + unsigned short clkcon;
> + unsigned char timeoutcon;
> + unsigned char swrst;
> + unsigned int norintsts; /* errintsts */
> + unsigned int norintstsen; /* errintstsen */
> + unsigned int norintsigen; /* errintsigen */
> + unsigned short acmd12errsts;
> + unsigned char res1[2];
> + unsigned int capareg;
> + unsigned char res2[4];
> + unsigned int maxcurr;
> + unsigned char res3[0x34];
> + unsigned int control2;
> + unsigned int control3;
> + unsigned char res4[4];
> + unsigned int control4;
> + unsigned char res5[0x6e];
> + unsigned short hcver;
> +};
> +
> +struct mmc_host {
> + struct sdhci_mmc *reg;
> + unsigned int version; /* SDHCI spec. version */
> + unsigned int clock; /* Current clock (MHz) */
> + int dev_index;
> +};
Please move this structures to header file.
> +
> /* support 4 mmc hosts */
> struct mmc mmc_dev[4];
> struct mmc_host mmc_host[4];
> -
> -static inline struct s5p_mmc *s5p_get_base_mmc(int dev_index)
> -{
> - unsigned long offset = dev_index * sizeof(struct s5p_mmc);
> - return (struct s5p_mmc *)(samsung_get_base_mmc() + offset);
> -}
> +int dev_count;
>
> static void mmc_prepare_data(struct mmc_host *host, struct mmc_data *data)
> {
> @@ -255,6 +293,7 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
> unsigned long timeout;
> unsigned long ctrl2;
>
> +#ifdef CONFIG_S5P_MMC
> /*
> * SELBASECLK[5:4]
> * 00/01 = HCLK
> @@ -265,7 +304,7 @@ static void mmc_change_clock(struct mmc_host *host, uint clock)
> ctrl2 &= ~(3 << 4);
> ctrl2 |= (2 << 4);
> writel(ctrl2, &host->reg->control2);
> -
> +#endif
> writew(0, &host->reg->clkcon);
>
> /* XXX: we assume that clock is between 40MHz and 50MHz */
> @@ -320,6 +359,7 @@ static void mmc_set_ios(struct mmc *mmc)
>
> debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock);
>
> +#ifdef CONFIG_S5P_MMC
> /*
> * SELCLKPADDS[17:16]
> * 00 = 2mA
> @@ -349,7 +389,7 @@ static void mmc_set_ios(struct mmc *mmc)
> * 10 = Delay4 (inverter delay + 2ns)
> */
> writel(0x8080, &host->reg->control3);
> -
> +#endif
> mmc_change_clock(host, mmc->clock);
>
> ctrl = readb(&host->reg->hostctl);
> @@ -445,14 +485,21 @@ static int mmc_core_init(struct mmc *mmc)
> return 0;
> }
>
> -static int s5p_mmc_initialize(int dev_index, int bus_width)
> +static int sdhci_mmc_initialize(void *base, int bus_width)
> {
> struct mmc *mmc;
> + struct mmc_host *host;
> +
> + if (dev_count >= 4)
> + return -1;
>
> - mmc = &mmc_dev[dev_index];
> + mmc = &mmc_dev[dev_count];
> + host = &mmc_host[dev_count];
> + host->dev_index = dev_count;
> + dev_count++;
NAK.
dev_index is not a count number, it's a h/w device number.
This change is wrong. (Maybe you misunderstood this concept)
Please keep the dev_index.
>
> - sprintf(mmc->name, "SAMSUNG SD/MMC");
> - mmc->priv = &mmc_host[dev_index];
> + sprintf(mmc->name, "SDHCI SD/MMC");
> + mmc->priv = host;
> mmc->send_cmd = mmc_send_cmd;
> mmc->set_ios = mmc_set_ios;
> mmc->init = mmc_core_init;
> @@ -467,16 +514,15 @@ static int s5p_mmc_initialize(int dev_index, int bus_width)
> mmc->f_min = 400000;
> mmc->f_max = 52000000;
>
> - mmc_host[dev_index].dev_index = dev_index;
Ditto. Please keep the dev_index.
> - mmc_host[dev_index].clock = 0;
> - mmc_host[dev_index].reg = s5p_get_base_mmc(dev_index);
> + host->clock = 0;
> + host->reg = base;
> mmc->b_max = 0;
> mmc_register(mmc);
>
> return 0;
> }
>
> -int s5p_mmc_init(int dev_index, int bus_width)
> +int sdhci_mmc_init(void *base, int bus_width)
> {
> - return s5p_mmc_initialize(dev_index, bus_width);
> + return sdhci_mmc_initialize(base, bus_width);
> }
Thanks
Minkyu Kang
--
from. prom.
www.promsoft.net
More information about the U-Boot
mailing list