Dear Rob Herring, On 12 June 2011 06:46, Rob Herring <robherri...@gmail.com> wrote: > From: Rob Herring <rob.herr...@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.herr...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot