static int ftsdc010_init(struct mmc *mmc) { struct ftsdc010_chip *chip = mmc->priv; struct ftsdc010_mmc __iomem *regs = chip->regs; uint32_t ts; chip->fifo = (readl(®s->feature) & 0xff) << 2; /* 1. chip reset */ writel(FTSDC010_CMD_SDC_RST, ®s->cmd); for (ts = get_timer(0); get_timer(ts) < CFG_RST_TIMEOUT; ) { if (readl(®s->cmd) & FTSDC010_CMD_SDC_RST) continue; break; } if (readl(®s->cmd) & FTSDC010_CMD_SDC_RST) { printf("ftsdc010: reset failed\n"); return -EOPNOTSUPP; } /* 2. enter low speed mode (400k card detection) */ ftsdc010_clkset(mmc, 400000); /* 3. interrupt disabled */ writel(0, ®s->int_mask); return 0; }
static void ftsdc010_set_ios(struct mmc *mmc) { struct ftsdc010_chip *chip = mmc->priv; struct ftsdc010_mmc __iomem *regs = chip->regs; ftsdc010_clkset(mmc, mmc->clock); clrbits_le32(®s->bwr, FTSDC010_BWR_MODE_MASK); switch (mmc->bus_width) { case 4: setbits_le32(®s->bwr, FTSDC010_BWR_MODE_4BIT); break; case 8: setbits_le32(®s->bwr, FTSDC010_BWR_MODE_8BIT); break; default: setbits_le32(®s->bwr, FTSDC010_BWR_MODE_1BIT); break; } }