|
|
@@ -492,7 +492,7 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
host->align_buffer, host->align_buffer_sz, direction);
|
|
|
if (dma_mapping_error(mmc_dev(host->mmc), host->align_addr))
|
|
|
goto fail;
|
|
|
- BUG_ON(host->align_addr & host->align_mask);
|
|
|
+ BUG_ON(host->align_addr & SDHCI_ADMA2_MASK);
|
|
|
|
|
|
host->sg_count = sdhci_pre_dma_transfer(host, data);
|
|
|
if (host->sg_count < 0)
|
|
|
@@ -514,8 +514,8 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
* the (up to three) bytes that screw up the
|
|
|
* alignment.
|
|
|
*/
|
|
|
- offset = (host->align_sz - (addr & host->align_mask)) &
|
|
|
- host->align_mask;
|
|
|
+ offset = (SDHCI_ADMA2_ALIGN - (addr & SDHCI_ADMA2_MASK)) &
|
|
|
+ SDHCI_ADMA2_MASK;
|
|
|
if (offset) {
|
|
|
if (data->flags & MMC_DATA_WRITE) {
|
|
|
buffer = sdhci_kmap_atomic(sg, &flags);
|
|
|
@@ -529,8 +529,8 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
|
|
|
BUG_ON(offset > 65536);
|
|
|
|
|
|
- align += host->align_sz;
|
|
|
- align_addr += host->align_sz;
|
|
|
+ align += SDHCI_ADMA2_ALIGN;
|
|
|
+ align_addr += SDHCI_ADMA2_ALIGN;
|
|
|
|
|
|
desc += host->desc_sz;
|
|
|
|
|
|
@@ -540,9 +540,12 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,
|
|
|
|
|
|
BUG_ON(len > 65536);
|
|
|
|
|
|
- /* tran, valid */
|
|
|
- sdhci_adma_write_desc(host, desc, addr, len, ADMA2_TRAN_VALID);
|
|
|
- desc += host->desc_sz;
|
|
|
+ if (len) {
|
|
|
+ /* tran, valid */
|
|
|
+ sdhci_adma_write_desc(host, desc, addr, len,
|
|
|
+ ADMA2_TRAN_VALID);
|
|
|
+ desc += host->desc_sz;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* If this triggers then we have a calculation bug
|
|
|
@@ -608,7 +611,7 @@ static void sdhci_adma_table_post(struct sdhci_host *host,
|
|
|
/* Do a quick scan of the SG list for any unaligned mappings */
|
|
|
has_unaligned = false;
|
|
|
for_each_sg(data->sg, sg, host->sg_count, i)
|
|
|
- if (sg_dma_address(sg) & host->align_mask) {
|
|
|
+ if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
|
|
|
has_unaligned = true;
|
|
|
break;
|
|
|
}
|
|
|
@@ -620,15 +623,15 @@ static void sdhci_adma_table_post(struct sdhci_host *host,
|
|
|
align = host->align_buffer;
|
|
|
|
|
|
for_each_sg(data->sg, sg, host->sg_count, i) {
|
|
|
- if (sg_dma_address(sg) & host->align_mask) {
|
|
|
- size = host->align_sz -
|
|
|
- (sg_dma_address(sg) & host->align_mask);
|
|
|
+ if (sg_dma_address(sg) & SDHCI_ADMA2_MASK) {
|
|
|
+ size = SDHCI_ADMA2_ALIGN -
|
|
|
+ (sg_dma_address(sg) & SDHCI_ADMA2_MASK);
|
|
|
|
|
|
buffer = sdhci_kmap_atomic(sg, &flags);
|
|
|
memcpy(buffer, align, size);
|
|
|
sdhci_kunmap_atomic(buffer, &flags);
|
|
|
|
|
|
- align += host->align_sz;
|
|
|
+ align += SDHCI_ADMA2_ALIGN;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -768,8 +771,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
|
|
|
if (unlikely(broken)) {
|
|
|
for_each_sg(data->sg, sg, data->sg_len, i) {
|
|
|
if (sg->length & 0x3) {
|
|
|
- DBG("Reverting to PIO because of "
|
|
|
- "transfer size (%d)\n",
|
|
|
+ DBG("Reverting to PIO because of transfer size (%d)\n",
|
|
|
sg->length);
|
|
|
host->flags &= ~SDHCI_REQ_USE_DMA;
|
|
|
break;
|
|
|
@@ -803,8 +805,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)
|
|
|
if (unlikely(broken)) {
|
|
|
for_each_sg(data->sg, sg, data->sg_len, i) {
|
|
|
if (sg->offset & 0x3) {
|
|
|
- DBG("Reverting to PIO because of "
|
|
|
- "bad alignment\n");
|
|
|
+ DBG("Reverting to PIO because of bad alignment\n");
|
|
|
host->flags &= ~SDHCI_REQ_USE_DMA;
|
|
|
break;
|
|
|
}
|
|
|
@@ -1016,8 +1017,8 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)
|
|
|
|
|
|
while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) {
|
|
|
if (timeout == 0) {
|
|
|
- pr_err("%s: Controller never released "
|
|
|
- "inhibit bit(s).\n", mmc_hostname(host->mmc));
|
|
|
+ pr_err("%s: Controller never released inhibit bit(s).\n",
|
|
|
+ mmc_hostname(host->mmc));
|
|
|
sdhci_dumpregs(host);
|
|
|
cmd->error = -EIO;
|
|
|
tasklet_schedule(&host->finish_tasklet);
|
|
|
@@ -1254,8 +1255,8 @@ clock_set:
|
|
|
while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
|
|
|
& SDHCI_CLOCK_INT_STABLE)) {
|
|
|
if (timeout == 0) {
|
|
|
- pr_err("%s: Internal clock never "
|
|
|
- "stabilised.\n", mmc_hostname(host->mmc));
|
|
|
+ pr_err("%s: Internal clock never stabilised.\n",
|
|
|
+ mmc_hostname(host->mmc));
|
|
|
sdhci_dumpregs(host);
|
|
|
return;
|
|
|
}
|
|
|
@@ -1274,19 +1275,6 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
|
|
|
struct mmc_host *mmc = host->mmc;
|
|
|
u8 pwr = 0;
|
|
|
|
|
|
- if (!IS_ERR(mmc->supply.vmmc)) {
|
|
|
- spin_unlock_irq(&host->lock);
|
|
|
- mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
|
|
|
- spin_lock_irq(&host->lock);
|
|
|
-
|
|
|
- if (mode != MMC_POWER_OFF)
|
|
|
- sdhci_writeb(host, SDHCI_POWER_ON, SDHCI_POWER_CONTROL);
|
|
|
- else
|
|
|
- sdhci_writeb(host, 0, SDHCI_POWER_CONTROL);
|
|
|
-
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
if (mode != MMC_POWER_OFF) {
|
|
|
switch (1 << vdd) {
|
|
|
case MMC_VDD_165_195:
|
|
|
@@ -1301,7 +1289,9 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
|
|
|
pwr = SDHCI_POWER_330;
|
|
|
break;
|
|
|
default:
|
|
|
- BUG();
|
|
|
+ WARN(1, "%s: Invalid vdd %#x\n",
|
|
|
+ mmc_hostname(host->mmc), vdd);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1345,6 +1335,12 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned char mode,
|
|
|
if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER)
|
|
|
mdelay(10);
|
|
|
}
|
|
|
+
|
|
|
+ if (!IS_ERR(mmc->supply.vmmc)) {
|
|
|
+ spin_unlock_irq(&host->lock);
|
|
|
+ mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd);
|
|
|
+ spin_lock_irq(&host->lock);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*****************************************************************************\
|
|
|
@@ -1540,8 +1536,8 @@ static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios)
|
|
|
else if (ios->drv_type == MMC_SET_DRIVER_TYPE_D)
|
|
|
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_D;
|
|
|
else {
|
|
|
- pr_warn("%s: invalid driver type, default to "
|
|
|
- "driver type B\n", mmc_hostname(mmc));
|
|
|
+ pr_warn("%s: invalid driver type, default to driver type B\n",
|
|
|
+ mmc_hostname(mmc));
|
|
|
ctrl_2 |= SDHCI_CTRL_DRV_TYPE_B;
|
|
|
}
|
|
|
|
|
|
@@ -2015,10 +2011,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
|
|
|
if (!host->tuning_done) {
|
|
|
- pr_info(DRIVER_NAME ": Timeout waiting for "
|
|
|
- "Buffer Read Ready interrupt during tuning "
|
|
|
- "procedure, falling back to fixed sampling "
|
|
|
- "clock\n");
|
|
|
+ pr_info(DRIVER_NAME ": Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock\n");
|
|
|
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
|
|
ctrl &= ~SDHCI_CTRL_TUNED_CLK;
|
|
|
ctrl &= ~SDHCI_CTRL_EXEC_TUNING;
|
|
|
@@ -2046,9 +2039,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
|
|
sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2);
|
|
|
}
|
|
|
if (!(ctrl & SDHCI_CTRL_TUNED_CLK)) {
|
|
|
- pr_info(DRIVER_NAME ": Tuning procedure"
|
|
|
- " failed, falling back to fixed sampling"
|
|
|
- " clock\n");
|
|
|
+ pr_info(DRIVER_NAME ": Tuning procedure failed, falling back to fixed sampling clock\n");
|
|
|
err = -EIO;
|
|
|
}
|
|
|
|
|
|
@@ -2293,8 +2284,8 @@ static void sdhci_timeout_timer(unsigned long data)
|
|
|
spin_lock_irqsave(&host->lock, flags);
|
|
|
|
|
|
if (host->mrq) {
|
|
|
- pr_err("%s: Timeout waiting for hardware "
|
|
|
- "interrupt.\n", mmc_hostname(host->mmc));
|
|
|
+ pr_err("%s: Timeout waiting for hardware interrupt.\n",
|
|
|
+ mmc_hostname(host->mmc));
|
|
|
sdhci_dumpregs(host);
|
|
|
|
|
|
if (host->data) {
|
|
|
@@ -2325,9 +2316,8 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask)
|
|
|
BUG_ON(intmask == 0);
|
|
|
|
|
|
if (!host->cmd) {
|
|
|
- pr_err("%s: Got command interrupt 0x%08x even "
|
|
|
- "though no command operation was in progress.\n",
|
|
|
- mmc_hostname(host->mmc), (unsigned)intmask);
|
|
|
+ pr_err("%s: Got command interrupt 0x%08x even though no command operation was in progress.\n",
|
|
|
+ mmc_hostname(host->mmc), (unsigned)intmask);
|
|
|
sdhci_dumpregs(host);
|
|
|
return;
|
|
|
}
|
|
|
@@ -2356,8 +2346,7 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask, u32 *mask)
|
|
|
*/
|
|
|
if (host->cmd->flags & MMC_RSP_BUSY) {
|
|
|
if (host->cmd->data)
|
|
|
- DBG("Cannot wait for busy signal when also "
|
|
|
- "doing a data transfer");
|
|
|
+ DBG("Cannot wait for busy signal when also doing a data transfer");
|
|
|
else if (!(host->quirks & SDHCI_QUIRK_NO_BUSY_IRQ)
|
|
|
&& !host->busy_handle) {
|
|
|
/* Mark that command complete before busy is ended */
|
|
|
@@ -2451,9 +2440,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- pr_err("%s: Got data interrupt 0x%08x even "
|
|
|
- "though no data operation was in progress.\n",
|
|
|
- mmc_hostname(host->mmc), (unsigned)intmask);
|
|
|
+ pr_err("%s: Got data interrupt 0x%08x even though no data operation was in progress.\n",
|
|
|
+ mmc_hostname(host->mmc), (unsigned)intmask);
|
|
|
sdhci_dumpregs(host);
|
|
|
|
|
|
return;
|
|
|
@@ -2760,7 +2748,7 @@ static int sdhci_runtime_pm_put(struct sdhci_host *host)
|
|
|
|
|
|
static void sdhci_runtime_pm_bus_on(struct sdhci_host *host)
|
|
|
{
|
|
|
- if (host->runtime_suspended || host->bus_on)
|
|
|
+ if (host->bus_on)
|
|
|
return;
|
|
|
host->bus_on = true;
|
|
|
pm_runtime_get_noresume(host->mmc->parent);
|
|
|
@@ -2768,7 +2756,7 @@ static void sdhci_runtime_pm_bus_on(struct sdhci_host *host)
|
|
|
|
|
|
static void sdhci_runtime_pm_bus_off(struct sdhci_host *host)
|
|
|
{
|
|
|
- if (host->runtime_suspended || !host->bus_on)
|
|
|
+ if (!host->bus_on)
|
|
|
return;
|
|
|
host->bus_on = false;
|
|
|
pm_runtime_put_noidle(host->mmc->parent);
|
|
|
@@ -2896,9 +2884,8 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
host->version = (host->version & SDHCI_SPEC_VER_MASK)
|
|
|
>> SDHCI_SPEC_VER_SHIFT;
|
|
|
if (host->version > SDHCI_SPEC_300) {
|
|
|
- pr_err("%s: Unknown controller version (%d). "
|
|
|
- "You may experience problems.\n", mmc_hostname(mmc),
|
|
|
- host->version);
|
|
|
+ pr_err("%s: Unknown controller version (%d). You may experience problems.\n",
|
|
|
+ mmc_hostname(mmc), host->version);
|
|
|
}
|
|
|
|
|
|
caps[0] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps :
|
|
|
@@ -2967,24 +2954,17 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
if (host->flags & SDHCI_USE_64_BIT_DMA) {
|
|
|
host->adma_table_sz = (SDHCI_MAX_SEGS * 2 + 1) *
|
|
|
SDHCI_ADMA2_64_DESC_SZ;
|
|
|
- host->align_buffer_sz = SDHCI_MAX_SEGS *
|
|
|
- SDHCI_ADMA2_64_ALIGN;
|
|
|
host->desc_sz = SDHCI_ADMA2_64_DESC_SZ;
|
|
|
- host->align_sz = SDHCI_ADMA2_64_ALIGN;
|
|
|
- host->align_mask = SDHCI_ADMA2_64_ALIGN - 1;
|
|
|
} else {
|
|
|
host->adma_table_sz = (SDHCI_MAX_SEGS * 2 + 1) *
|
|
|
SDHCI_ADMA2_32_DESC_SZ;
|
|
|
- host->align_buffer_sz = SDHCI_MAX_SEGS *
|
|
|
- SDHCI_ADMA2_32_ALIGN;
|
|
|
host->desc_sz = SDHCI_ADMA2_32_DESC_SZ;
|
|
|
- host->align_sz = SDHCI_ADMA2_32_ALIGN;
|
|
|
- host->align_mask = SDHCI_ADMA2_32_ALIGN - 1;
|
|
|
}
|
|
|
host->adma_table = dma_alloc_coherent(mmc_dev(mmc),
|
|
|
host->adma_table_sz,
|
|
|
&host->adma_addr,
|
|
|
GFP_KERNEL);
|
|
|
+ host->align_buffer_sz = SDHCI_MAX_SEGS * SDHCI_ADMA2_ALIGN;
|
|
|
host->align_buffer = kmalloc(host->align_buffer_sz, GFP_KERNEL);
|
|
|
if (!host->adma_table || !host->align_buffer) {
|
|
|
if (host->adma_table)
|
|
|
@@ -2998,7 +2978,7 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
host->flags &= ~SDHCI_USE_ADMA;
|
|
|
host->adma_table = NULL;
|
|
|
host->align_buffer = NULL;
|
|
|
- } else if (host->adma_addr & host->align_mask) {
|
|
|
+ } else if (host->adma_addr & (SDHCI_ADMA2_DESC_ALIGN - 1)) {
|
|
|
pr_warn("%s: unable to allocate aligned ADMA descriptor\n",
|
|
|
mmc_hostname(mmc));
|
|
|
host->flags &= ~SDHCI_USE_ADMA;
|
|
|
@@ -3031,8 +3011,8 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
if (host->max_clk == 0 || host->quirks &
|
|
|
SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN) {
|
|
|
if (!host->ops->get_max_clock) {
|
|
|
- pr_err("%s: Hardware doesn't specify base clock "
|
|
|
- "frequency.\n", mmc_hostname(mmc));
|
|
|
+ pr_err("%s: Hardware doesn't specify base clock frequency.\n",
|
|
|
+ mmc_hostname(mmc));
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
host->max_clk = host->ops->get_max_clock(host);
|
|
|
@@ -3294,8 +3274,8 @@ int sdhci_add_host(struct sdhci_host *host)
|
|
|
mmc->ocr_avail_mmc &= host->ocr_avail_mmc;
|
|
|
|
|
|
if (mmc->ocr_avail == 0) {
|
|
|
- pr_err("%s: Hardware doesn't report any "
|
|
|
- "support voltages.\n", mmc_hostname(mmc));
|
|
|
+ pr_err("%s: Hardware doesn't report any support voltages.\n",
|
|
|
+ mmc_hostname(mmc));
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|