static void s3c_hsmmc_set_ios(struct mmc *mmc) { struct sdhci_host *host = mmc->priv; u8 ctrl; dbg("set_ios: bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock); setup_sdhci0_cfg_card(host); sdhci_change_clock(host, mmc->clock); ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL); if (mmc->bus_width == MMC_BUS_WIDTH_8) ctrl |= SDHCI_CTRL_8BITBUS; else ctrl &= ~SDHCI_CTRL_8BITBUS; if (mmc->bus_width == MMC_BUS_WIDTH_4) ctrl |= SDHCI_CTRL_4BITBUS; else ctrl &= ~SDHCI_CTRL_4BITBUS; ctrl &= ~SDHCI_CTRL_HISPD; writeb(ctrl, host->ioaddr + SDHCI_HOST_CONTROL); }
static int s3c_hsmmc_init(struct mmc *mmc) { struct sdhci_host *host = (struct sdhci_host *)mmc->priv; sdhci_reset(host, SDHCI_RESET_ALL); host->version = readw(host->ioaddr + SDHCI_HOST_VERSION); sdhci_init(host); sdhci_change_clock(host, 400000); return 0; }
static void sdhci_s3c_change_clock(struct sdhci_host *host, unsigned int clock) { struct sdhci_s3c *ourhost = to_s3c(host); unsigned int best = UINT_MAX; unsigned int delta; int best_src = 0; int src; u32 ctrl; for (src = 0; src < MAX_BUS_CLK; src++) { delta = sdhci_s3c_consider_clock(ourhost, src, clock); if (delta < best) { best = delta; best_src = src; } } dev_dbg(&ourhost->pdev->dev, "selected source %d, clock %d, delta %d\n", best_src, clock, best); /* turn clock off to card before changing clock source */ writew(0, host->ioaddr + SDHCI_CLOCK_CONTROL); /* select the new clock source */ if (ourhost->cur_clk != best_src) { struct clk *clk = ourhost->clk_bus[best_src]; ourhost->cur_clk = best_src; host->max_clk = clk_get_rate(clk); host->timeout_clk = host->max_clk / 1000; ctrl = readl(host->ioaddr + S3C_SDHCI_CONTROL2); ctrl &= ~S3C_SDHCI_CTRL2_SELBASECLK_MASK; ctrl |= best_src << S3C_SDHCI_CTRL2_SELBASECLK_SHIFT; writel(ctrl, host->ioaddr + S3C_SDHCI_CONTROL2); } sdhci_change_clock(host, clock); }