static void tegra_mmc_set_ios(struct mmc *mmc) { struct mmc_host *host = mmc->priv; unsigned char ctrl; debug(" mmc_set_ios called\n"); debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock); /* Change clock first */ mmc_change_clock(host, mmc->clock); ctrl = readb(&host->reg->hostctl); /* * WIDE8[5] * 0 = Depend on WIDE4 * 1 = 8-bit mode * WIDE4[1] * 1 = 4-bit mode * 0 = 1-bit mode */ if (mmc->bus_width == 8) ctrl |= (1 << 5); else if (mmc->bus_width == 4) ctrl |= (1 << 1); else ctrl &= ~(1 << 1); writeb(ctrl, &host->reg->hostctl); debug("mmc_set_ios: hostctl = %08X\n", ctrl); }
static void mmc_set_ios(struct mmc *mmc) { struct mmc_host *host = mmc->priv; unsigned char ctrl; unsigned long val; debug("bus_width: %x, clock: %d\n", mmc->bus_width, mmc->clock); /* * SELCLKPADDS[17:16] * 00 = 2mA * 01 = 4mA * 10 = 7mA * 11 = 9mA */ writel(0x3 << 16, &host->reg->control4); val = readl(&host->reg->control2); val &= (0x3 << 4); val |= (1 << 31) | /* write status clear async mode enable */ (1 << 30) | /* command conflict mask enable */ (1 << 14) | /* Feedback Clock Enable for Rx Clock */ (1 << 8); /* SDCLK hold enable */ writel(val, &host->reg->control2); /* * FCSEL1[15] FCSEL0[7] * FCSel[1:0] : Rx Feedback Clock Delay Control * Inverter delay means10ns delay if SDCLK 50MHz setting * 01 = Delay1 (basic delay) * 11 = Delay2 (basic delay + 2ns) * 00 = Delay3 (inverter delay) * 10 = Delay4 (inverter delay + 2ns) */ writel(0x8080, &host->reg->control3); mmc_change_clock(host, mmc->clock); ctrl = readb(&host->reg->hostctl); /* * WIDE8[5] * 0 = Depend on WIDE4 * 1 = 8-bit mode * WIDE4[1] * 1 = 4-bit mode * 0 = 1-bit mode */ if (mmc->bus_width == 8) ctrl |= (1 << 5); else if (mmc->bus_width == 4) ctrl |= (1 << 1); else ctrl &= ~(1 << 1); /* * OUTEDGEINV[2] * 1 = Riging edge output * 0 = Falling edge output */ ctrl &= ~(1 << 2); writeb(ctrl, &host->reg->hostctl); }