Since OMAP4 has added new set of registers , this patch adds different array's for OMAP3 and OMAP4 and choose the right one during run time.Newly added registers are updated at the bottom of array.
Cc: Kevin Hilman <khil...@deeprootsystems.com> Cc: Adrian Hunter <adrian.hun...@nokia.com> Cc: Andrew Morton <a...@linux-foundation.org> Cc: Madhusudhan Chikkature <madhu...@ti.com> Signed-off-by: Kishore Kadiyala <kishore.kadiy...@ti.com> --- arch/arm/mach-omap2/hsmmc.c | 6 + arch/arm/plat-omap/include/plat/mmc.h | 76 ++++++++++ drivers/mmc/host/omap_hsmmc.c | 251 +++++++++++++++------------------ 3 files changed, 198 insertions(+), 135 deletions(-) diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 5d97af9..f131ef0 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c @@ -266,6 +266,12 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers) mmc->slots[0].internal_clock = !c->ext_clock; mmc->dma_mask = 0xffffffff; + /* Register offset Mapping */ + if (cpu_is_omap44xx()) + mmc->regs_map = (u16 *) omap4_mmc_reg_map; + else + mmc->regs_map = (u16 *) omap3_mmc_reg_map; + mmc->get_context_loss_count = hsmmc_get_context_loss; mmc->slots[0].switch_pin = c->gpio_cd; diff --git a/arch/arm/plat-omap/include/plat/mmc.h b/arch/arm/plat-omap/include/plat/mmc.h index 4afaf62..29dcc81 100644 --- a/arch/arm/plat-omap/include/plat/mmc.h +++ b/arch/arm/plat-omap/include/plat/mmc.h @@ -53,6 +53,79 @@ struct mmc_dev_attr { u8 flags; }; +enum { + OMAP_HSMMC_SYSCONFIG = 0, + OMAP_HSMMC_SYSSTATUS, + OMAP_HSMMC_CON, + OMAP_HSMMC_BLK, + OMAP_HSMMC_ARG, + OMAP_HSMMC_CMD, + OMAP_HSMMC_RSP10, + OMAP_HSMMC_RSP32, + OMAP_HSMMC_RSP54, + OMAP_HSMMC_RSP76, + OMAP_HSMMC_DATA, + OMAP_HSMMC_PSTATE, + OMAP_HSMMC_HCTL, + OMAP_HSMMC_SYSCTL, + OMAP_HSMMC_STAT, + OMAP_HSMMC_IE, + OMAP_HSMMC_ISE, + OMAP_HSMMC_CAPA, + OMAP_HSMMC_CUR_CAPA, + OMAP_HSMMC_FE, + OMAP_HSMMC_ADMA_ES, + OMAP_HSMMC_ADMA_SAL, + OMAP_HSMMC_REV, +}; + +static const u16 omap3_mmc_reg_map[] = { + [OMAP_HSMMC_SYSCONFIG] = 0x0010, + [OMAP_HSMMC_SYSSTATUS] = 0x0014, + [OMAP_HSMMC_CON] = 0x002C, + [OMAP_HSMMC_BLK] = 0x0104, + [OMAP_HSMMC_ARG] = 0x0108, + [OMAP_HSMMC_CMD] = 0x010C, + [OMAP_HSMMC_RSP10] = 0x0110, + [OMAP_HSMMC_RSP32] = 0x0114, + [OMAP_HSMMC_RSP54] = 0x0118, + [OMAP_HSMMC_RSP76] = 0x011C, + [OMAP_HSMMC_DATA] = 0x0120, + [OMAP_HSMMC_PSTATE] = 0x0124, + [OMAP_HSMMC_HCTL] = 0x0128, + [OMAP_HSMMC_SYSCTL] = 0x012C, + [OMAP_HSMMC_STAT] = 0x0130, + [OMAP_HSMMC_IE] = 0x0134, + [OMAP_HSMMC_ISE] = 0x0138, + [OMAP_HSMMC_CAPA] = 0x0140, +}; + +static const u16 omap4_mmc_reg_map[] = { + [OMAP_HSMMC_SYSCONFIG] = 0x0110, + [OMAP_HSMMC_SYSSTATUS] = 0x0114, + [OMAP_HSMMC_CON] = 0x012C, + [OMAP_HSMMC_BLK] = 0x0204, + [OMAP_HSMMC_ARG] = 0x0208, + [OMAP_HSMMC_CMD] = 0x020C, + [OMAP_HSMMC_RSP10] = 0x0210, + [OMAP_HSMMC_RSP32] = 0x0214, + [OMAP_HSMMC_RSP54] = 0x0218, + [OMAP_HSMMC_RSP76] = 0x021C, + [OMAP_HSMMC_DATA] = 0x0220, + [OMAP_HSMMC_PSTATE] = 0x0224, + [OMAP_HSMMC_HCTL] = 0x0228, + [OMAP_HSMMC_SYSCTL] = 0x022C, + [OMAP_HSMMC_STAT] = 0x0230, + [OMAP_HSMMC_IE] = 0x0234, + [OMAP_HSMMC_ISE] = 0x0238, + [OMAP_HSMMC_CAPA] = 0x0240, + [OMAP_HSMMC_CUR_CAPA] = 0x0248, + [OMAP_HSMMC_FE] = 0x0250, + [OMAP_HSMMC_ADMA_ES] = 0x0254, + [OMAP_HSMMC_ADMA_SAL] = 0x0258, + [OMAP_HSMMC_REV] = 0x02FC, +}; + struct omap_mmc_platform_data { /* back-link to device */ struct device *dev; @@ -60,6 +133,9 @@ struct omap_mmc_platform_data { /* number of slots per controller */ unsigned nr_slots:2; + /* Register Offset Map */ + u16 *regs_map; + /* set if your board has components or wiring that limits the * maximum frequency on the MMC bus */ unsigned int max_freq; diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index df0f5b0..c113bfd 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c @@ -40,25 +40,6 @@ #include <plat/mmc.h> #include <plat/cpu.h> -/* OMAP HSMMC Host Controller Registers */ -#define OMAP_HSMMC_SYSCONFIG 0x0010 -#define OMAP_HSMMC_SYSSTATUS 0x0014 -#define OMAP_HSMMC_CON 0x002C -#define OMAP_HSMMC_BLK 0x0104 -#define OMAP_HSMMC_ARG 0x0108 -#define OMAP_HSMMC_CMD 0x010C -#define OMAP_HSMMC_RSP10 0x0110 -#define OMAP_HSMMC_RSP32 0x0114 -#define OMAP_HSMMC_RSP54 0x0118 -#define OMAP_HSMMC_RSP76 0x011C -#define OMAP_HSMMC_DATA 0x0120 -#define OMAP_HSMMC_HCTL 0x0128 -#define OMAP_HSMMC_SYSCTL 0x012C -#define OMAP_HSMMC_STAT 0x0130 -#define OMAP_HSMMC_IE 0x0134 -#define OMAP_HSMMC_ISE 0x0138 -#define OMAP_HSMMC_CAPA 0x0140 - #define VS18 (1 << 26) #define VS30 (1 << 25) #define SDVS18 (0x5 << 9) @@ -135,11 +116,11 @@ /* * MMC Host controller read/write API's */ -#define OMAP_HSMMC_READ(base, reg) \ - __raw_readl((base) + OMAP_HSMMC_##reg) +#define OMAP_HSMMC_READ(host, reg) \ + __raw_readl((host->base) + (host->regs[OMAP_HSMMC_##reg])) -#define OMAP_HSMMC_WRITE(base, reg, val) \ - __raw_writel((val), (base) + OMAP_HSMMC_##reg) +#define OMAP_HSMMC_WRITE(host, reg, val) \ + __raw_writel((val), (host->base) + (host->regs[OMAP_HSMMC_##reg])) struct omap_hsmmc_host { struct device *dev; @@ -168,6 +149,7 @@ struct omap_hsmmc_host { unsigned int dma_sg_idx; unsigned char bus_mode; unsigned char power_mode; + u16 *regs; u32 *buffer; u32 bytesleft; int suspended; @@ -519,9 +501,9 @@ static void omap_hsmmc_gpio_free(struct omap_mmc_platform_data *pdata) */ static void omap_hsmmc_stop_clock(struct omap_hsmmc_host *host) { - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN); - if ((OMAP_HSMMC_READ(host->base, SYSCTL) & CEN) != 0x0) + OMAP_HSMMC_WRITE(host, SYSCTL, + OMAP_HSMMC_READ(host, SYSCTL) & ~CEN); + if ((OMAP_HSMMC_READ(host, SYSCTL) & CEN) != 0x0) dev_dbg(mmc_dev(host->mmc), "MMC Clock is not stoped\n"); } @@ -534,16 +516,16 @@ static void omap_hsmmc_enable_irq(struct omap_hsmmc_host *host) else irq_mask = INT_EN_MASK; - OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); - OMAP_HSMMC_WRITE(host->base, ISE, irq_mask); - OMAP_HSMMC_WRITE(host->base, IE, irq_mask); + OMAP_HSMMC_WRITE(host, STAT, STAT_CLEAR); + OMAP_HSMMC_WRITE(host, ISE, irq_mask); + OMAP_HSMMC_WRITE(host, IE, irq_mask); } static void omap_hsmmc_disable_irq(struct omap_hsmmc_host *host) { - OMAP_HSMMC_WRITE(host->base, ISE, 0); - OMAP_HSMMC_WRITE(host->base, IE, 0); - OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); + OMAP_HSMMC_WRITE(host, ISE, 0); + OMAP_HSMMC_WRITE(host, IE, 0); + OMAP_HSMMC_WRITE(host, STAT, STAT_CLEAR); } #ifdef CONFIG_PM @@ -583,19 +565,19 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) /* Wait for hardware reset */ timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); - while ((OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE) != RESETDONE + while ((OMAP_HSMMC_READ(host, SYSSTATUS) & RESETDONE) != RESETDONE && time_before(jiffies, timeout)) ; /* Do software reset */ - OMAP_HSMMC_WRITE(host->base, SYSCONFIG, SOFTRESET); + OMAP_HSMMC_WRITE(host, SYSCONFIG, SOFTRESET); timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); - while ((OMAP_HSMMC_READ(host->base, SYSSTATUS) & RESETDONE) != RESETDONE + while ((OMAP_HSMMC_READ(host, SYSSTATUS) & RESETDONE) != RESETDONE && time_before(jiffies, timeout)) ; - OMAP_HSMMC_WRITE(host->base, SYSCONFIG, - OMAP_HSMMC_READ(host->base, SYSCONFIG) | AUTOIDLE); + OMAP_HSMMC_WRITE(host, SYSCONFIG, + OMAP_HSMMC_READ(host, SYSCONFIG) | AUTOIDLE); if (host->id == OMAP_MMC1_DEVID) { if (host->power_mode != MMC_POWER_OFF && @@ -609,17 +591,17 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) capa = VS18; } - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) | hctl); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) | hctl); - OMAP_HSMMC_WRITE(host->base, CAPA, - OMAP_HSMMC_READ(host->base, CAPA) | capa); + OMAP_HSMMC_WRITE(host, CAPA, + OMAP_HSMMC_READ(host, CAPA) | capa); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) | SDBP); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) | SDBP); timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); - while ((OMAP_HSMMC_READ(host->base, HCTL) & SDBP) != SDBP + while ((OMAP_HSMMC_READ(host, HCTL) & SDBP) != SDBP && time_before(jiffies, timeout)) ; @@ -629,20 +611,20 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) if (host->power_mode == MMC_POWER_OFF) goto out; - con = OMAP_HSMMC_READ(host->base, CON); + con = OMAP_HSMMC_READ(host, CON); switch (ios->bus_width) { case MMC_BUS_WIDTH_8: - OMAP_HSMMC_WRITE(host->base, CON, con | DW8); + OMAP_HSMMC_WRITE(host, CON, con | DW8); break; case MMC_BUS_WIDTH_4: - OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT); + OMAP_HSMMC_WRITE(host, CON, con & ~DW8); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) | FOUR_BIT); break; case MMC_BUS_WIDTH_1: - OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT); + OMAP_HSMMC_WRITE(host, CON, con & ~DW8); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) & ~FOUR_BIT); break; } @@ -658,25 +640,23 @@ static int omap_hsmmc_context_restore(struct omap_hsmmc_host *host) dsor = 250; } - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) & ~CEN); - OMAP_HSMMC_WRITE(host->base, SYSCTL, (dsor << 6) | (DTO << 16)); - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) | ICE); + OMAP_HSMMC_WRITE(host, SYSCTL, OMAP_HSMMC_READ(host, SYSCTL) & ~CEN); + OMAP_HSMMC_WRITE(host, SYSCTL, (dsor << 6) | (DTO << 16)); + OMAP_HSMMC_WRITE(host, SYSCTL, OMAP_HSMMC_READ(host, SYSCTL) | ICE); timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); - while ((OMAP_HSMMC_READ(host->base, SYSCTL) & ICS) != ICS + while ((OMAP_HSMMC_READ(host, SYSCTL) & ICS) != ICS && time_before(jiffies, timeout)) ; - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) | CEN); + OMAP_HSMMC_WRITE(host, SYSCTL, + OMAP_HSMMC_READ(host, SYSCTL) | CEN); - con = OMAP_HSMMC_READ(host->base, CON); + con = OMAP_HSMMC_READ(host, CON); if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) - OMAP_HSMMC_WRITE(host->base, CON, con | OD); + OMAP_HSMMC_WRITE(host, CON, con | OD); else - OMAP_HSMMC_WRITE(host->base, CON, con & ~OD); + OMAP_HSMMC_WRITE(host, CON, con & ~OD); out: host->context_loss = context_loss; @@ -727,20 +707,20 @@ static void send_init_stream(struct omap_hsmmc_host *host) disable_irq(host->irq); - OMAP_HSMMC_WRITE(host->base, IE, INT_EN_MASK); - OMAP_HSMMC_WRITE(host->base, CON, - OMAP_HSMMC_READ(host->base, CON) | INIT_STREAM); - OMAP_HSMMC_WRITE(host->base, CMD, INIT_STREAM_CMD); + OMAP_HSMMC_WRITE(host, IE, INT_EN_MASK); + OMAP_HSMMC_WRITE(host, CON, + OMAP_HSMMC_READ(host, CON) | INIT_STREAM); + OMAP_HSMMC_WRITE(host, CMD, INIT_STREAM_CMD); timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); while ((reg != CC) && time_before(jiffies, timeout)) - reg = OMAP_HSMMC_READ(host->base, STAT) & CC; + reg = OMAP_HSMMC_READ(host, STAT) & CC; - OMAP_HSMMC_WRITE(host->base, CON, - OMAP_HSMMC_READ(host->base, CON) & ~INIT_STREAM); + OMAP_HSMMC_WRITE(host, CON, + OMAP_HSMMC_READ(host, CON) & ~INIT_STREAM); - OMAP_HSMMC_WRITE(host->base, STAT, STAT_CLEAR); - OMAP_HSMMC_READ(host->base, STAT); + OMAP_HSMMC_WRITE(host, STAT, STAT_CLEAR); + OMAP_HSMMC_READ(host, STAT); enable_irq(host->irq); } @@ -829,8 +809,8 @@ omap_hsmmc_start_command(struct omap_hsmmc_host *host, struct mmc_command *cmd, host->req_in_progress = 1; - OMAP_HSMMC_WRITE(host->base, ARG, cmd->arg); - OMAP_HSMMC_WRITE(host->base, CMD, cmdreg); + OMAP_HSMMC_WRITE(host, ARG, cmd->arg); + OMAP_HSMMC_WRITE(host, CMD, cmdreg); } static int @@ -904,13 +884,13 @@ omap_hsmmc_cmd_done(struct omap_hsmmc_host *host, struct mmc_command *cmd) if (cmd->flags & MMC_RSP_PRESENT) { if (cmd->flags & MMC_RSP_136) { /* response type 2 */ - cmd->resp[3] = OMAP_HSMMC_READ(host->base, RSP10); - cmd->resp[2] = OMAP_HSMMC_READ(host->base, RSP32); - cmd->resp[1] = OMAP_HSMMC_READ(host->base, RSP54); - cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP76); + cmd->resp[3] = OMAP_HSMMC_READ(host, RSP10); + cmd->resp[2] = OMAP_HSMMC_READ(host, RSP32); + cmd->resp[1] = OMAP_HSMMC_READ(host, RSP54); + cmd->resp[0] = OMAP_HSMMC_READ(host, RSP76); } else { /* response types 1, 1b, 3, 4, 5, 6 */ - cmd->resp[0] = OMAP_HSMMC_READ(host->base, RSP10); + cmd->resp[0] = OMAP_HSMMC_READ(host, RSP10); } } if ((host->data == NULL && !host->response_busy) || cmd->error) @@ -983,14 +963,14 @@ static inline void omap_hsmmc_reset_controller_fsm(struct omap_hsmmc_host *host, unsigned long limit = (loops_per_jiffy * msecs_to_jiffies(MMC_TIMEOUT_MS)); - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) | bit); + OMAP_HSMMC_WRITE(host, SYSCTL, + OMAP_HSMMC_READ(host, SYSCTL) | bit); - while ((OMAP_HSMMC_READ(host->base, SYSCTL) & bit) && + while ((OMAP_HSMMC_READ(host, SYSCTL) & bit) && (i++ < limit)) cpu_relax(); - if (OMAP_HSMMC_READ(host->base, SYSCTL) & bit) + if (OMAP_HSMMC_READ(host, SYSCTL) & bit) dev_err(mmc_dev(host->mmc), "Timeout waiting on controller reset in %s\n", __func__); @@ -1003,9 +983,9 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status) if (!host->req_in_progress) { do { - OMAP_HSMMC_WRITE(host->base, STAT, status); + OMAP_HSMMC_WRITE(host, STAT, status); /* Flush posted write */ - status = OMAP_HSMMC_READ(host->base, STAT); + status = OMAP_HSMMC_READ(host, STAT); } while (status & INT_EN_MASK); return; } @@ -1062,7 +1042,7 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status) } } - OMAP_HSMMC_WRITE(host->base, STAT, status); + OMAP_HSMMC_WRITE(host, STAT, status); if (end_cmd || ((status & CC) && host->cmd)) omap_hsmmc_cmd_done(host, host->cmd); @@ -1078,11 +1058,11 @@ static irqreturn_t omap_hsmmc_irq(int irq, void *dev_id) struct omap_hsmmc_host *host = dev_id; int status; - status = OMAP_HSMMC_READ(host->base, STAT); + status = OMAP_HSMMC_READ(host, STAT); do { omap_hsmmc_do_irq(host, status); /* Flush posted write */ - status = OMAP_HSMMC_READ(host->base, STAT); + status = OMAP_HSMMC_READ(host, STAT); } while (status & INT_EN_MASK); return IRQ_HANDLED; @@ -1092,10 +1072,10 @@ static void set_sd_bus_power(struct omap_hsmmc_host *host) { unsigned long i; - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) | SDBP); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) | SDBP); for (i = 0; i < loops_per_jiffy; i++) { - if (OMAP_HSMMC_READ(host->base, HCTL) & SDBP) + if (OMAP_HSMMC_READ(host, HCTL) & SDBP) break; cpu_relax(); } @@ -1132,9 +1112,9 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd) if (ret != 0) goto err; - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) & SDVSCLR); - reg_val = OMAP_HSMMC_READ(host->base, HCTL); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) & SDVSCLR); + reg_val = OMAP_HSMMC_READ(host, HCTL); /* * If a MMC dual voltage card is detected, the set_ios fn calls @@ -1156,7 +1136,7 @@ static int omap_hsmmc_switch_opcond(struct omap_hsmmc_host *host, int vdd) else reg_val |= SDVS30; - OMAP_HSMMC_WRITE(host->base, HCTL, reg_val); + OMAP_HSMMC_WRITE(host, HCTL, reg_val); set_sd_bus_power(host); return 0; @@ -1252,12 +1232,12 @@ static void omap_hsmmc_config_dma_params(struct omap_hsmmc_host *host, dma_ch = host->dma_ch; if (data->flags & MMC_DATA_WRITE) { omap_set_dma_dest_params(dma_ch, 0, OMAP_DMA_AMODE_CONSTANT, - (host->mapbase + OMAP_HSMMC_DATA), 0, 0); + (host->mapbase + host->regs[OMAP_HSMMC_DATA]), 0, 0); omap_set_dma_src_params(dma_ch, 0, OMAP_DMA_AMODE_POST_INC, sg_dma_address(sgl), 0, 0); } else { omap_set_dma_src_params(dma_ch, 0, OMAP_DMA_AMODE_CONSTANT, - (host->mapbase + OMAP_HSMMC_DATA), 0, 0); + (host->mapbase + host->regs[OMAP_HSMMC_DATA]), 0, 0); omap_set_dma_dest_params(dma_ch, 0, OMAP_DMA_AMODE_POST_INC, sg_dma_address(sgl), 0, 0); } @@ -1370,7 +1350,7 @@ static void set_data_timeout(struct omap_hsmmc_host *host, unsigned int timeout, cycle_ns; uint32_t reg, clkd, dto = 0; - reg = OMAP_HSMMC_READ(host->base, SYSCTL); + reg = OMAP_HSMMC_READ(host, SYSCTL); clkd = (reg & CLKD_MASK) >> CLKD_SHIFT; if (clkd == 0) clkd = 1; @@ -1397,7 +1377,7 @@ static void set_data_timeout(struct omap_hsmmc_host *host, reg &= ~DTO_MASK; reg |= dto << DTO_SHIFT; - OMAP_HSMMC_WRITE(host->base, SYSCTL, reg); + OMAP_HSMMC_WRITE(host, SYSCTL, reg); } /* @@ -1410,7 +1390,7 @@ omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req) host->data = req->data; if (req->data == NULL) { - OMAP_HSMMC_WRITE(host->base, BLK, 0); + OMAP_HSMMC_WRITE(host, BLK, 0); /* * Set an arbitrary 100ms data timeout for commands with * busy signal. @@ -1420,7 +1400,7 @@ omap_hsmmc_prepare_data(struct omap_hsmmc_host *host, struct mmc_request *req) return 0; } - OMAP_HSMMC_WRITE(host->base, BLK, (req->data->blksz) + OMAP_HSMMC_WRITE(host, BLK, (req->data->blksz) | (req->data->blocks << 16)); set_data_timeout(host, req->data->timeout_ns, req->data->timeout_clks); @@ -1515,20 +1495,20 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) /* FIXME: set registers based only on changes to ios */ - con = OMAP_HSMMC_READ(host->base, CON); + con = OMAP_HSMMC_READ(host, CON); switch (mmc->ios.bus_width) { case MMC_BUS_WIDTH_8: - OMAP_HSMMC_WRITE(host->base, CON, con | DW8); + OMAP_HSMMC_WRITE(host, CON, con | DW8); break; case MMC_BUS_WIDTH_4: - OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) | FOUR_BIT); + OMAP_HSMMC_WRITE(host, CON, con & ~DW8); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) | FOUR_BIT); break; case MMC_BUS_WIDTH_1: - OMAP_HSMMC_WRITE(host->base, CON, con & ~DW8); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) & ~FOUR_BIT); + OMAP_HSMMC_WRITE(host, CON, con & ~DW8); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) & ~FOUR_BIT); break; } @@ -1536,7 +1516,7 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) /* Only MMC1 can interface at 3V without some flavor * of external transceiver; but they all handle 1.8V. */ - if ((OMAP_HSMMC_READ(host->base, HCTL) & SDVSDET) && + if ((OMAP_HSMMC_READ(host, HCTL) & SDVSDET) && (ios->vdd == DUAL_VOLT_OCR_BIT)) { /* * The mmc_select_voltage fn of the core does @@ -1562,30 +1542,30 @@ static void omap_hsmmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) dsor = 250; } omap_hsmmc_stop_clock(host); - regval = OMAP_HSMMC_READ(host->base, SYSCTL); + regval = OMAP_HSMMC_READ(host, SYSCTL); regval = regval & ~(CLKD_MASK); regval = regval | (dsor << 6) | (DTO << 16); - OMAP_HSMMC_WRITE(host->base, SYSCTL, regval); - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) | ICE); + OMAP_HSMMC_WRITE(host, SYSCTL, regval); + OMAP_HSMMC_WRITE(host, SYSCTL, + OMAP_HSMMC_READ(host, SYSCTL) | ICE); /* Wait till the ICS bit is set */ timeout = jiffies + msecs_to_jiffies(MMC_TIMEOUT_MS); - while ((OMAP_HSMMC_READ(host->base, SYSCTL) & ICS) != ICS + while ((OMAP_HSMMC_READ(host, SYSCTL) & ICS) != ICS && time_before(jiffies, timeout)) msleep(1); - OMAP_HSMMC_WRITE(host->base, SYSCTL, - OMAP_HSMMC_READ(host->base, SYSCTL) | CEN); + OMAP_HSMMC_WRITE(host, SYSCTL, + OMAP_HSMMC_READ(host, SYSCTL) | CEN); if (do_send_init_stream) send_init_stream(host); - con = OMAP_HSMMC_READ(host->base, CON); + con = OMAP_HSMMC_READ(host, CON); if (ios->bus_mode == MMC_BUSMODE_OPENDRAIN) - OMAP_HSMMC_WRITE(host->base, CON, con | OD); + OMAP_HSMMC_WRITE(host, CON, con | OD); else - OMAP_HSMMC_WRITE(host->base, CON, con & ~OD); + OMAP_HSMMC_WRITE(host, CON, con & ~OD); if (host->power_mode == MMC_POWER_OFF) mmc_host_disable(host->mmc); @@ -1624,15 +1604,15 @@ static void omap_hsmmc_conf_bus_power(struct omap_hsmmc_host *host) capa = VS18; } - value = OMAP_HSMMC_READ(host->base, HCTL) & ~SDVS_MASK; - OMAP_HSMMC_WRITE(host->base, HCTL, value | hctl); + value = OMAP_HSMMC_READ(host, HCTL) & ~SDVS_MASK; + OMAP_HSMMC_WRITE(host, HCTL, value | hctl); - value = OMAP_HSMMC_READ(host->base, CAPA); - OMAP_HSMMC_WRITE(host->base, CAPA, value | capa); + value = OMAP_HSMMC_READ(host, CAPA); + OMAP_HSMMC_WRITE(host, CAPA, value | capa); /* Set the controller to AUTO IDLE mode */ - value = OMAP_HSMMC_READ(host->base, SYSCONFIG); - OMAP_HSMMC_WRITE(host->base, SYSCONFIG, value | AUTOIDLE); + value = OMAP_HSMMC_READ(host, SYSCONFIG); + OMAP_HSMMC_WRITE(host, SYSCONFIG, value | AUTOIDLE); /* Set SD bus power bit */ set_sd_bus_power(host); @@ -1915,19 +1895,19 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data) pm_runtime_get_sync(host->dev); seq_printf(s, "SYSCONFIG:\t0x%08x\n", - OMAP_HSMMC_READ(host->base, SYSCONFIG)); + OMAP_HSMMC_READ(host, SYSCONFIG)); seq_printf(s, "CON:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, CON)); + OMAP_HSMMC_READ(host, CON)); seq_printf(s, "HCTL:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, HCTL)); + OMAP_HSMMC_READ(host, HCTL)); seq_printf(s, "SYSCTL:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, SYSCTL)); + OMAP_HSMMC_READ(host, SYSCTL)); seq_printf(s, "IE:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, IE)); + OMAP_HSMMC_READ(host, IE)); seq_printf(s, "ISE:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, ISE)); + OMAP_HSMMC_READ(host, ISE)); seq_printf(s, "CAPA:\t\t0x%08x\n", - OMAP_HSMMC_READ(host->base, CAPA)); + OMAP_HSMMC_READ(host, CAPA)); pm_runtime_put_sync(host->dev); @@ -2011,6 +1991,7 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev) host->slot_id = 0; host->mapbase = res->start; host->base = ioremap(host->mapbase, SZ_4K); + host->regs = (u16 *) pdata->regs_map; host->power_mode = MMC_POWER_OFF; platform_set_drvdata(pdev, host); @@ -2276,8 +2257,8 @@ static int omap_hsmmc_suspend(struct device *dev) ret = mmc_suspend_host(host->mmc); if (ret == 0) { omap_hsmmc_disable_irq(host); - OMAP_HSMMC_WRITE(host->base, HCTL, - OMAP_HSMMC_READ(host->base, HCTL) & ~SDBP); + OMAP_HSMMC_WRITE(host, HCTL, + OMAP_HSMMC_READ(host, HCTL) & ~SDBP); mmc_host_disable(host->mmc); if (host->got_dbclk) -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html