uboot/drivers/mmc/mv_sdhci.c
<<
>>
Prefs
   1#include <common.h>
   2#include <malloc.h>
   3#include <sdhci.h>
   4
   5#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
   6static struct sdhci_ops mv_ops;
   7
   8#if defined(CONFIG_SHEEVA_88SV331xV5)
   9#define SD_CE_ATA_2     0xEA
  10#define  MMC_CARD       0x1000
  11#define  MMC_WIDTH      0x0100
  12static inline void mv_sdhci_writeb(struct sdhci_host *host, u8 val, int reg)
  13{
  14        struct mmc *mmc = host->mmc;
  15        u32 ata = (unsigned long)host->ioaddr + SD_CE_ATA_2;
  16
  17        if (!IS_SD(mmc) && reg == SDHCI_HOST_CONTROL) {
  18                if (mmc->bus_width == 8)
  19                        writew(readw(ata) | (MMC_CARD | MMC_WIDTH), ata);
  20                else
  21                        writew(readw(ata) & ~(MMC_CARD | MMC_WIDTH), ata);
  22        }
  23
  24        writeb(val, host->ioaddr + reg);
  25}
  26
  27#else
  28#define mv_sdhci_writeb NULL
  29#endif /* CONFIG_SHEEVA_88SV331xV5 */
  30#endif /* CONFIG_MMC_SDHCI_IO_ACCESSORS */
  31
  32static char *MVSDH_NAME = "mv_sdh";
  33int mv_sdh_init(unsigned long regbase, u32 max_clk, u32 min_clk, u32 quirks)
  34{
  35        struct sdhci_host *host = NULL;
  36        host = (struct sdhci_host *)malloc(sizeof(struct sdhci_host));
  37        if (!host) {
  38                printf("sdh_host malloc fail!\n");
  39                return 1;
  40        }
  41
  42        host->name = MVSDH_NAME;
  43        host->ioaddr = (void *)regbase;
  44        host->quirks = quirks;
  45#ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS
  46        memset(&mv_ops, 0, sizeof(struct sdhci_ops));
  47        mv_ops.write_b = mv_sdhci_writeb;
  48        host->ops = &mv_ops;
  49#endif
  50        if (quirks & SDHCI_QUIRK_REG32_RW)
  51                host->version = sdhci_readl(host, SDHCI_HOST_VERSION - 2) >> 16;
  52        else
  53                host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
  54        return add_sdhci(host, max_clk, min_clk);
  55}
  56