diff options
Diffstat (limited to 'drivers/mmc/host/sdhci.c')
| -rw-r--r-- | drivers/mmc/host/sdhci.c | 2100 | 
1 files changed, 1694 insertions, 406 deletions
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 782c0ee3c92..47055f3f01b 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -16,14 +16,19 @@  #include <linux/delay.h>  #include <linux/highmem.h>  #include <linux/io.h> +#include <linux/module.h>  #include <linux/dma-mapping.h>  #include <linux/slab.h>  #include <linux/scatterlist.h>  #include <linux/regulator/consumer.h> +#include <linux/pm_runtime.h>  #include <linux/leds.h> +#include <linux/mmc/mmc.h>  #include <linux/mmc/host.h> +#include <linux/mmc/card.h> +#include <linux/mmc/slot-gpio.h>  #include "sdhci.h" @@ -37,56 +42,89 @@  #define SDHCI_USE_LEDS_CLASS  #endif +#define MAX_TUNING_LOOP 40 + +#define ADMA_SIZE	((128 * 2 + 1) * 4) +  static unsigned int debug_quirks = 0; +static unsigned int debug_quirks2; -static void sdhci_prepare_data(struct sdhci_host *, struct mmc_data *);  static void sdhci_finish_data(struct sdhci_host *); -static void sdhci_send_command(struct sdhci_host *, struct mmc_command *);  static void sdhci_finish_command(struct sdhci_host *); +static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode); +static void sdhci_tuning_timer(unsigned long data); +static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable); + +#ifdef CONFIG_PM_RUNTIME +static int sdhci_runtime_pm_get(struct sdhci_host *host); +static int sdhci_runtime_pm_put(struct sdhci_host *host); +static void sdhci_runtime_pm_bus_on(struct sdhci_host *host); +static void sdhci_runtime_pm_bus_off(struct sdhci_host *host); +#else +static inline int sdhci_runtime_pm_get(struct sdhci_host *host) +{ +	return 0; +} +static inline int sdhci_runtime_pm_put(struct sdhci_host *host) +{ +	return 0; +} +static void sdhci_runtime_pm_bus_on(struct sdhci_host *host) +{ +} +static void sdhci_runtime_pm_bus_off(struct sdhci_host *host) +{ +} +#endif  static void sdhci_dumpregs(struct sdhci_host *host)  { -	printk(KERN_DEBUG DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n", +	pr_debug(DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n",  		mmc_hostname(host->mmc)); -	printk(KERN_DEBUG DRIVER_NAME ": Sys addr: 0x%08x | Version:  0x%08x\n", +	pr_debug(DRIVER_NAME ": Sys addr: 0x%08x | Version:  0x%08x\n",  		sdhci_readl(host, SDHCI_DMA_ADDRESS),  		sdhci_readw(host, SDHCI_HOST_VERSION)); -	printk(KERN_DEBUG DRIVER_NAME ": Blk size: 0x%08x | Blk cnt:  0x%08x\n", +	pr_debug(DRIVER_NAME ": Blk size: 0x%08x | Blk cnt:  0x%08x\n",  		sdhci_readw(host, SDHCI_BLOCK_SIZE),  		sdhci_readw(host, SDHCI_BLOCK_COUNT)); -	printk(KERN_DEBUG DRIVER_NAME ": Argument: 0x%08x | Trn mode: 0x%08x\n", +	pr_debug(DRIVER_NAME ": Argument: 0x%08x | Trn mode: 0x%08x\n",  		sdhci_readl(host, SDHCI_ARGUMENT),  		sdhci_readw(host, SDHCI_TRANSFER_MODE)); -	printk(KERN_DEBUG DRIVER_NAME ": Present:  0x%08x | Host ctl: 0x%08x\n", +	pr_debug(DRIVER_NAME ": Present:  0x%08x | Host ctl: 0x%08x\n",  		sdhci_readl(host, SDHCI_PRESENT_STATE),  		sdhci_readb(host, SDHCI_HOST_CONTROL)); -	printk(KERN_DEBUG DRIVER_NAME ": Power:    0x%08x | Blk gap:  0x%08x\n", +	pr_debug(DRIVER_NAME ": Power:    0x%08x | Blk gap:  0x%08x\n",  		sdhci_readb(host, SDHCI_POWER_CONTROL),  		sdhci_readb(host, SDHCI_BLOCK_GAP_CONTROL)); -	printk(KERN_DEBUG DRIVER_NAME ": Wake-up:  0x%08x | Clock:    0x%08x\n", +	pr_debug(DRIVER_NAME ": Wake-up:  0x%08x | Clock:    0x%08x\n",  		sdhci_readb(host, SDHCI_WAKE_UP_CONTROL),  		sdhci_readw(host, SDHCI_CLOCK_CONTROL)); -	printk(KERN_DEBUG DRIVER_NAME ": Timeout:  0x%08x | Int stat: 0x%08x\n", +	pr_debug(DRIVER_NAME ": Timeout:  0x%08x | Int stat: 0x%08x\n",  		sdhci_readb(host, SDHCI_TIMEOUT_CONTROL),  		sdhci_readl(host, SDHCI_INT_STATUS)); -	printk(KERN_DEBUG DRIVER_NAME ": Int enab: 0x%08x | Sig enab: 0x%08x\n", +	pr_debug(DRIVER_NAME ": Int enab: 0x%08x | Sig enab: 0x%08x\n",  		sdhci_readl(host, SDHCI_INT_ENABLE),  		sdhci_readl(host, SDHCI_SIGNAL_ENABLE)); -	printk(KERN_DEBUG DRIVER_NAME ": AC12 err: 0x%08x | Slot int: 0x%08x\n", +	pr_debug(DRIVER_NAME ": AC12 err: 0x%08x | Slot int: 0x%08x\n",  		sdhci_readw(host, SDHCI_ACMD12_ERR),  		sdhci_readw(host, SDHCI_SLOT_INT_STATUS)); -	printk(KERN_DEBUG DRIVER_NAME ": Caps:     0x%08x | Max curr: 0x%08x\n", +	pr_debug(DRIVER_NAME ": Caps:     0x%08x | Caps_1:   0x%08x\n",  		sdhci_readl(host, SDHCI_CAPABILITIES), +		sdhci_readl(host, SDHCI_CAPABILITIES_1)); +	pr_debug(DRIVER_NAME ": Cmd:      0x%08x | Max curr: 0x%08x\n", +		sdhci_readw(host, SDHCI_COMMAND),  		sdhci_readl(host, SDHCI_MAX_CURRENT)); +	pr_debug(DRIVER_NAME ": Host ctl2: 0x%08x\n", +		sdhci_readw(host, SDHCI_HOST_CONTROL2));  	if (host->flags & SDHCI_USE_ADMA) -		printk(KERN_DEBUG DRIVER_NAME ": ADMA Err: 0x%08x | ADMA Ptr: 0x%08x\n", +		pr_debug(DRIVER_NAME ": ADMA Err: 0x%08x | ADMA Ptr: 0x%08x\n",  		       readl(host->ioaddr + SDHCI_ADMA_ERROR),  		       readl(host->ioaddr + SDHCI_ADMA_ADDRESS)); -	printk(KERN_DEBUG DRIVER_NAME ": ===========================================\n"); +	pr_debug(DRIVER_NAME ": ===========================================\n");  }  /*****************************************************************************\ @@ -95,38 +133,26 @@ static void sdhci_dumpregs(struct sdhci_host *host)   *                                                                           *  \*****************************************************************************/ -static void sdhci_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set) -{ -	u32 ier; - -	ier = sdhci_readl(host, SDHCI_INT_ENABLE); -	ier &= ~clear; -	ier |= set; -	sdhci_writel(host, ier, SDHCI_INT_ENABLE); -	sdhci_writel(host, ier, SDHCI_SIGNAL_ENABLE); -} - -static void sdhci_unmask_irqs(struct sdhci_host *host, u32 irqs) -{ -	sdhci_clear_set_irqs(host, 0, irqs); -} - -static void sdhci_mask_irqs(struct sdhci_host *host, u32 irqs) -{ -	sdhci_clear_set_irqs(host, irqs, 0); -} -  static void sdhci_set_card_detection(struct sdhci_host *host, bool enable)  { -	u32 irqs = SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT; +	u32 present; -	if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) +	if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || +	    (host->mmc->caps & MMC_CAP_NONREMOVABLE))  		return; -	if (enable) -		sdhci_unmask_irqs(host, irqs); -	else -		sdhci_mask_irqs(host, irqs); +	if (enable) { +		present = sdhci_readl(host, SDHCI_PRESENT_STATE) & +				      SDHCI_CARD_PRESENT; + +		host->ier |= present ? SDHCI_INT_CARD_REMOVE : +				       SDHCI_INT_CARD_INSERT; +	} else { +		host->ier &= ~(SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT); +	} + +	sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +	sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);  }  static void sdhci_enable_card_detection(struct sdhci_host *host) @@ -139,24 +165,18 @@ static void sdhci_disable_card_detection(struct sdhci_host *host)  	sdhci_set_card_detection(host, false);  } -static void sdhci_reset(struct sdhci_host *host, u8 mask) +void sdhci_reset(struct sdhci_host *host, u8 mask)  {  	unsigned long timeout; -	u32 uninitialized_var(ier); - -	if (host->quirks & SDHCI_QUIRK_NO_CARD_NO_RESET) { -		if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & -			SDHCI_CARD_PRESENT)) -			return; -	} - -	if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET) -		ier = sdhci_readl(host, SDHCI_INT_ENABLE);  	sdhci_writeb(host, mask, SDHCI_SOFTWARE_RESET); -	if (mask & SDHCI_RESET_ALL) +	if (mask & SDHCI_RESET_ALL) {  		host->clock = 0; +		/* Reset-all turns off SD Bus Power */ +		if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) +			sdhci_runtime_pm_bus_off(host); +	}  	/* Wait max 100 ms */  	timeout = 100; @@ -164,7 +184,7 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask)  	/* hw clears the bit when it's done */  	while (sdhci_readb(host, SDHCI_SOFTWARE_RESET) & mask) {  		if (timeout == 0) { -			printk(KERN_ERR "%s: Reset 0x%x never completed.\n", +			pr_err("%s: Reset 0x%x never completed.\n",  				mmc_hostname(host->mmc), (int)mask);  			sdhci_dumpregs(host);  			return; @@ -172,9 +192,28 @@ static void sdhci_reset(struct sdhci_host *host, u8 mask)  		timeout--;  		mdelay(1);  	} +} +EXPORT_SYMBOL_GPL(sdhci_reset); + +static void sdhci_do_reset(struct sdhci_host *host, u8 mask) +{ +	if (host->quirks & SDHCI_QUIRK_NO_CARD_NO_RESET) { +		if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & +			SDHCI_CARD_PRESENT)) +			return; +	} -	if (host->quirks & SDHCI_QUIRK_RESTORE_IRQS_AFTER_RESET) -		sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, ier); +	host->ops->reset(host, mask); + +	if (mask & SDHCI_RESET_ALL) { +		if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { +			if (host->ops->enable_dma) +				host->ops->enable_dma(host); +		} + +		/* Resetting the controller clears many */ +		host->preset_enabled = false; +	}  }  static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios); @@ -182,15 +221,18 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios);  static void sdhci_init(struct sdhci_host *host, int soft)  {  	if (soft) -		sdhci_reset(host, SDHCI_RESET_CMD|SDHCI_RESET_DATA); +		sdhci_do_reset(host, SDHCI_RESET_CMD|SDHCI_RESET_DATA);  	else -		sdhci_reset(host, SDHCI_RESET_ALL); +		sdhci_do_reset(host, SDHCI_RESET_ALL); + +	host->ier = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | +		    SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | +		    SDHCI_INT_INDEX | SDHCI_INT_END_BIT | SDHCI_INT_CRC | +		    SDHCI_INT_TIMEOUT | SDHCI_INT_DATA_END | +		    SDHCI_INT_RESPONSE; -	sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, -		SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | -		SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_INDEX | -		SDHCI_INT_END_BIT | SDHCI_INT_CRC | SDHCI_INT_TIMEOUT | -		SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE); +	sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +	sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);  	if (soft) {  		/* force clock reconfiguration */ @@ -202,6 +244,19 @@ static void sdhci_init(struct sdhci_host *host, int soft)  static void sdhci_reinit(struct sdhci_host *host)  {  	sdhci_init(host, 0); +	/* +	 * Retuning stuffs are affected by different cards inserted and only +	 * applicable to UHS-I cards. So reset these fields to their initial +	 * value when card is removed. +	 */ +	if (host->flags & SDHCI_USING_RETUNING_TIMER) { +		host->flags &= ~SDHCI_USING_RETUNING_TIMER; + +		del_timer_sync(&host->tuning_timer); +		host->flags &= ~SDHCI_NEEDS_RETUNING; +		host->mmc->max_blk_count = +			(host->quirks & SDHCI_QUIRK_NO_MULTIBLOCK) ? 1 : 65535; +	}  	sdhci_enable_card_detection(host);  } @@ -232,11 +287,14 @@ static void sdhci_led_control(struct led_classdev *led,  	spin_lock_irqsave(&host->lock, flags); +	if (host->runtime_suspended) +		goto out; +  	if (brightness == LED_OFF)  		sdhci_deactivate_led(host);  	else  		sdhci_activate_led(host); - +out:  	spin_unlock_irqrestore(&host->lock, flags);  }  #endif @@ -381,12 +439,12 @@ static void sdhci_transfer_pio(struct sdhci_host *host)  static char *sdhci_kmap_atomic(struct scatterlist *sg, unsigned long *flags)  {  	local_irq_save(*flags); -	return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset; +	return kmap_atomic(sg_page(sg)) + sg->offset;  }  static void sdhci_kunmap_atomic(void *buffer, unsigned long *flags)  { -	kunmap_atomic(buffer, KM_BIO_SRC_IRQ); +	kunmap_atomic(buffer);  	local_irq_restore(*flags);  } @@ -430,11 +488,6 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,  	else  		direction = DMA_TO_DEVICE; -	/* -	 * The ADMA descriptor table is mapped further down as we -	 * need to fill it with data first. -	 */ -  	host->align_addr = dma_map_single(mmc_dev(host->mmc),  		host->align_buffer, 128 * 4, direction);  	if (dma_mapping_error(mmc_dev(host->mmc), host->align_addr)) @@ -495,7 +548,7 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,  		 * If this triggers then we have a calculation bug  		 * somewhere. :/  		 */ -		WARN_ON((desc - host->adma_desc) > (128 * 2 + 1) * 4); +		WARN_ON((desc - host->adma_desc) > ADMA_SIZE);  	}  	if (host->quirks & SDHCI_QUIRK_NO_ENDATTR_IN_NOPDESC) { @@ -523,17 +576,8 @@ static int sdhci_adma_table_pre(struct sdhci_host *host,  			host->align_addr, 128 * 4, direction);  	} -	host->adma_addr = dma_map_single(mmc_dev(host->mmc), -		host->adma_desc, (128 * 2 + 1) * 4, DMA_TO_DEVICE); -	if (dma_mapping_error(mmc_dev(host->mmc), host->adma_addr)) -		goto unmap_entries; -	BUG_ON(host->adma_addr & 0x3); -  	return 0; -unmap_entries: -	dma_unmap_sg(mmc_dev(host->mmc), data->sg, -		data->sg_len, direction);  unmap_align:  	dma_unmap_single(mmc_dev(host->mmc), host->align_addr,  		128 * 4, direction); @@ -551,19 +595,25 @@ static void sdhci_adma_table_post(struct sdhci_host *host,  	u8 *align;  	char *buffer;  	unsigned long flags; +	bool has_unaligned;  	if (data->flags & MMC_DATA_READ)  		direction = DMA_FROM_DEVICE;  	else  		direction = DMA_TO_DEVICE; -	dma_unmap_single(mmc_dev(host->mmc), host->adma_addr, -		(128 * 2 + 1) * 4, DMA_TO_DEVICE); -  	dma_unmap_single(mmc_dev(host->mmc), host->align_addr,  		128 * 4, direction); -	if (data->flags & MMC_DATA_READ) { +	/* 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) & 3) { +			has_unaligned = true; +			break; +		} + +	if (has_unaligned && data->flags & MMC_DATA_READ) {  		dma_sync_sg_for_cpu(mmc_dev(host->mmc), data->sg,  			data->sg_len, direction); @@ -587,9 +637,10 @@ static void sdhci_adma_table_post(struct sdhci_host *host,  		data->sg_len, direction);  } -static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_data *data) +static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_command *cmd)  {  	u8 count; +	struct mmc_data *data = cmd->data;  	unsigned target_timeout, current_timeout;  	/* @@ -601,12 +652,18 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_data *data)  	if (host->quirks & SDHCI_QUIRK_BROKEN_TIMEOUT_VAL)  		return 0xE; -	/* timeout in us */ -	target_timeout = data->timeout_ns / 1000 + -		data->timeout_clks / host->clock; +	/* Unspecified timeout, assume max */ +	if (!data && !cmd->busy_timeout) +		return 0xE; -	if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK) -		host->timeout_clk = host->clock / 1000; +	/* timeout in us */ +	if (!data) +		target_timeout = cmd->busy_timeout * 1000; +	else { +		target_timeout = data->timeout_ns / 1000; +		if (host->clock) +			target_timeout += data->timeout_clks / host->clock; +	}  	/*  	 * Figure out needed cycles. @@ -628,8 +685,8 @@ static u8 sdhci_calc_timeout(struct sdhci_host *host, struct mmc_data *data)  	}  	if (count >= 0xF) { -		printk(KERN_WARNING "%s: Too large timeout requested!\n", -			mmc_hostname(host->mmc)); +		DBG("%s: Too large timeout 0x%x requested for CMD%d!\n", +		    mmc_hostname(host->mmc), count, cmd->opcode);  		count = 0xE;  	} @@ -642,20 +699,29 @@ static void sdhci_set_transfer_irqs(struct sdhci_host *host)  	u32 dma_irqs = SDHCI_INT_DMA_END | SDHCI_INT_ADMA_ERROR;  	if (host->flags & SDHCI_REQ_USE_DMA) -		sdhci_clear_set_irqs(host, pio_irqs, dma_irqs); +		host->ier = (host->ier & ~pio_irqs) | dma_irqs;  	else -		sdhci_clear_set_irqs(host, dma_irqs, pio_irqs); +		host->ier = (host->ier & ~dma_irqs) | pio_irqs; + +	sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +	sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);  } -static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data) +static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd)  {  	u8 count;  	u8 ctrl; +	struct mmc_data *data = cmd->data;  	int ret;  	WARN_ON(host->data); -	if (data == NULL) +	if (data || (cmd->flags & MMC_RSP_BUSY)) { +		count = sdhci_calc_timeout(host, cmd); +		sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); +	} + +	if (!data)  		return;  	/* Sanity checks */ @@ -665,9 +731,7 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)  	host->data = data;  	host->data_early = 0; - -	count = sdhci_calc_timeout(host, data); -	sdhci_writeb(host, count, SDHCI_TIMEOUT_CONTROL); +	host->data->bytes_xfered = 0;  	if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA))  		host->flags |= SDHCI_REQ_USE_DMA; @@ -803,28 +867,43 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data)  	sdhci_set_transfer_irqs(host); -	/* We do not handle DMA boundaries, so set it to max (512 KiB) */ -	sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, data->blksz), SDHCI_BLOCK_SIZE); +	/* Set the DMA boundary value and block size */ +	sdhci_writew(host, SDHCI_MAKE_BLKSZ(SDHCI_DEFAULT_BOUNDARY_ARG, +		data->blksz), SDHCI_BLOCK_SIZE);  	sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT);  }  static void sdhci_set_transfer_mode(struct sdhci_host *host, -	struct mmc_data *data) +	struct mmc_command *cmd)  {  	u16 mode; +	struct mmc_data *data = cmd->data; -	if (data == NULL) +	if (data == NULL) { +		/* clear Auto CMD settings for no data CMDs */ +		mode = sdhci_readw(host, SDHCI_TRANSFER_MODE); +		sdhci_writew(host, mode & ~(SDHCI_TRNS_AUTO_CMD12 | +				SDHCI_TRNS_AUTO_CMD23), SDHCI_TRANSFER_MODE);  		return; +	}  	WARN_ON(!host->data);  	mode = SDHCI_TRNS_BLK_CNT_EN; -	if (data->blocks > 1) { -		if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) -			mode |= SDHCI_TRNS_MULTI | SDHCI_TRNS_ACMD12; -		else -			mode |= SDHCI_TRNS_MULTI; +	if (mmc_op_multi(cmd->opcode) || data->blocks > 1) { +		mode |= SDHCI_TRNS_MULTI; +		/* +		 * If we are sending CMD23, CMD12 never gets sent +		 * on successful completion (so no Auto-CMD12). +		 */ +		if (!host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD12)) +			mode |= SDHCI_TRNS_AUTO_CMD12; +		else if (host->mrq->sbc && (host->flags & SDHCI_AUTO_CMD23)) { +			mode |= SDHCI_TRNS_AUTO_CMD23; +			sdhci_writel(host, host->mrq->sbc->arg, SDHCI_ARGUMENT2); +		}  	} +  	if (data->flags & MMC_DATA_READ)  		mode |= SDHCI_TRNS_READ;  	if (host->flags & SDHCI_REQ_USE_DMA) @@ -864,14 +943,22 @@ static void sdhci_finish_data(struct sdhci_host *host)  	else  		data->bytes_xfered = data->blksz * data->blocks; -	if (data->stop) { +	/* +	 * Need to send CMD12 if - +	 * a) open-ended multiblock transfer (no CMD23) +	 * b) error in multiblock transfer +	 */ +	if (data->stop && +	    (data->error || +	     !host->mrq->sbc)) { +  		/*  		 * The controller needs a reset of internal state machines  		 * upon error conditions.  		 */  		if (data->error) { -			sdhci_reset(host, SDHCI_RESET_CMD); -			sdhci_reset(host, SDHCI_RESET_DATA); +			sdhci_do_reset(host, SDHCI_RESET_CMD); +			sdhci_do_reset(host, SDHCI_RESET_DATA);  		}  		sdhci_send_command(host, data->stop); @@ -879,7 +966,7 @@ static void sdhci_finish_data(struct sdhci_host *host)  		tasklet_schedule(&host->finish_tasklet);  } -static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) +void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)  {  	int flags;  	u32 mask; @@ -901,7 +988,7 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)  	while (sdhci_readl(host, SDHCI_PRESENT_STATE) & mask) {  		if (timeout == 0) { -			printk(KERN_ERR "%s: Controller never released " +			pr_err("%s: Controller never released "  				"inhibit bit(s).\n", mmc_hostname(host->mmc));  			sdhci_dumpregs(host);  			cmd->error = -EIO; @@ -912,18 +999,23 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)  		mdelay(1);  	} -	mod_timer(&host->timer, jiffies + 10 * HZ); +	timeout = jiffies; +	if (!cmd->data && cmd->busy_timeout > 9000) +		timeout += DIV_ROUND_UP(cmd->busy_timeout, 1000) * HZ + HZ; +	else +		timeout += 10 * HZ; +	mod_timer(&host->timer, timeout);  	host->cmd = cmd; -	sdhci_prepare_data(host, cmd->data); +	sdhci_prepare_data(host, cmd);  	sdhci_writel(host, cmd->arg, SDHCI_ARGUMENT); -	sdhci_set_transfer_mode(host, cmd->data); +	sdhci_set_transfer_mode(host, cmd);  	if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) { -		printk(KERN_ERR "%s: Unsupported response type!\n", +		pr_err("%s: Unsupported response type!\n",  			mmc_hostname(host->mmc));  		cmd->error = -EINVAL;  		tasklet_schedule(&host->finish_tasklet); @@ -943,11 +1035,15 @@ static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd)  		flags |= SDHCI_CMD_CRC;  	if (cmd->flags & MMC_RSP_OPCODE)  		flags |= SDHCI_CMD_INDEX; -	if (cmd->data) + +	/* CMD19 is special in that the Data Present Select should be set */ +	if (cmd->data || cmd->opcode == MMC_SEND_TUNING_BLOCK || +	    cmd->opcode == MMC_SEND_TUNING_BLOCK_HS200)  		flags |= SDHCI_CMD_DATA;  	sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND);  } +EXPORT_SYMBOL_GPL(sdhci_send_command);  static void sdhci_finish_command(struct sdhci_host *host)  { @@ -973,44 +1069,117 @@ static void sdhci_finish_command(struct sdhci_host *host)  	host->cmd->error = 0; -	if (host->data && host->data_early) -		sdhci_finish_data(host); +	/* Finished CMD23, now send actual command. */ +	if (host->cmd == host->mrq->sbc) { +		host->cmd = NULL; +		sdhci_send_command(host, host->mrq->cmd); +	} else { -	if (!host->cmd->data) -		tasklet_schedule(&host->finish_tasklet); +		/* Processed actual command. */ +		if (host->data && host->data_early) +			sdhci_finish_data(host); -	host->cmd = NULL; +		if (!host->cmd->data) +			tasklet_schedule(&host->finish_tasklet); + +		host->cmd = NULL; +	}  } -static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) +static u16 sdhci_get_preset_value(struct sdhci_host *host)  { -	int div; -	u16 clk; -	unsigned long timeout; +	u16 preset = 0; + +	switch (host->timing) { +	case MMC_TIMING_UHS_SDR12: +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12); +		break; +	case MMC_TIMING_UHS_SDR25: +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR25); +		break; +	case MMC_TIMING_UHS_SDR50: +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR50); +		break; +	case MMC_TIMING_UHS_SDR104: +	case MMC_TIMING_MMC_HS200: +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR104); +		break; +	case MMC_TIMING_UHS_DDR50: +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_DDR50); +		break; +	default: +		pr_warn("%s: Invalid UHS-I mode selected\n", +			mmc_hostname(host->mmc)); +		preset = sdhci_readw(host, SDHCI_PRESET_FOR_SDR12); +		break; +	} +	return preset; +} -	if (clock == host->clock) -		return; +void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) +{ +	int div = 0; /* Initialized for compiler warning */ +	int real_div = div, clk_mul = 1; +	u16 clk = 0; +	unsigned long timeout; -	if (host->ops->set_clock) { -		host->ops->set_clock(host, clock); -		if (host->quirks & SDHCI_QUIRK_NONSTANDARD_CLOCK) -			return; -	} +	host->mmc->actual_clock = 0;  	sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);  	if (clock == 0) -		goto out; +		return;  	if (host->version >= SDHCI_SPEC_300) { -		/* Version 3.00 divisors must be a multiple of 2. */ -		if (host->max_clk <= clock) -			div = 1; -		else { -			for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; div += 2) { -				if ((host->max_clk / div) <= clock) +		if (host->preset_enabled) { +			u16 pre_val; + +			clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); +			pre_val = sdhci_get_preset_value(host); +			div = (pre_val & SDHCI_PRESET_SDCLK_FREQ_MASK) +				>> SDHCI_PRESET_SDCLK_FREQ_SHIFT; +			if (host->clk_mul && +				(pre_val & SDHCI_PRESET_CLKGEN_SEL_MASK)) { +				clk = SDHCI_PROG_CLOCK_MODE; +				real_div = div + 1; +				clk_mul = host->clk_mul; +			} else { +				real_div = max_t(int, 1, div << 1); +			} +			goto clock_set; +		} + +		/* +		 * Check if the Host Controller supports Programmable Clock +		 * Mode. +		 */ +		if (host->clk_mul) { +			for (div = 1; div <= 1024; div++) { +				if ((host->max_clk * host->clk_mul / div) +					<= clock)  					break;  			} +			/* +			 * Set Programmable Clock Mode in the Clock +			 * Control register. +			 */ +			clk = SDHCI_PROG_CLOCK_MODE; +			real_div = div; +			clk_mul = host->clk_mul; +			div--; +		} else { +			/* Version 3.00 divisors must be a multiple of 2. */ +			if (host->max_clk <= clock) +				div = 1; +			else { +				for (div = 2; div < SDHCI_MAX_DIV_SPEC_300; +				     div += 2) { +					if ((host->max_clk / div) <= clock) +						break; +				} +			} +			real_div = div; +			div >>= 1;  		}  	} else {  		/* Version 2.00 divisors must be a power of 2. */ @@ -1018,10 +1187,15 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)  			if ((host->max_clk / div) <= clock)  				break;  		} +		real_div = div; +		div >>= 1;  	} -	div >>= 1; -	clk = (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT; +clock_set: +	if (real_div) +		host->mmc->actual_clock = (host->max_clk * clk_mul) / real_div; + +	clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;  	clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)  		<< SDHCI_DIVIDER_HI_SHIFT;  	clk |= SDHCI_CLOCK_INT_EN; @@ -1032,7 +1206,7 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)  	while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))  		& SDHCI_CLOCK_INT_STABLE)) {  		if (timeout == 0) { -			printk(KERN_ERR "%s: Internal clock never " +			pr_err("%s: Internal clock never "  				"stabilised.\n", mmc_hostname(host->mmc));  			sdhci_dumpregs(host);  			return; @@ -1043,17 +1217,16 @@ static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)  	clk |= SDHCI_CLOCK_CARD_EN;  	sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); - -out: -	host->clock = clock;  } +EXPORT_SYMBOL_GPL(sdhci_set_clock); -static void sdhci_set_power(struct sdhci_host *host, unsigned short power) +static void sdhci_set_power(struct sdhci_host *host, unsigned char mode, +			    unsigned short vdd)  {  	u8 pwr = 0; -	if (power != (unsigned short)-1) { -		switch (1 << power) { +	if (mode != MMC_POWER_OFF) { +		switch (1 << vdd) {  		case MMC_VDD_165_195:  			pwr = SDHCI_POWER_180;  			break; @@ -1077,33 +1250,45 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)  	if (pwr == 0) {  		sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); -		return; -	} +		if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) +			sdhci_runtime_pm_bus_off(host); +		vdd = 0; +	} else { +		/* +		 * Spec says that we should clear the power reg before setting +		 * a new value. Some controllers don't seem to like this though. +		 */ +		if (!(host->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE)) +			sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); -	/* -	 * Spec says that we should clear the power reg before setting -	 * a new value. Some controllers don't seem to like this though. -	 */ -	if (!(host->quirks & SDHCI_QUIRK_SINGLE_POWER_WRITE)) -		sdhci_writeb(host, 0, SDHCI_POWER_CONTROL); +		/* +		 * At least the Marvell CaFe chip gets confused if we set the +		 * voltage and set turn on power at the same time, so set the +		 * voltage first. +		 */ +		if (host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER) +			sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); + +		pwr |= SDHCI_POWER_ON; -	/* -	 * At least the Marvell CaFe chip gets confused if we set the voltage -	 * and set turn on power at the same time, so set the voltage first. -	 */ -	if (host->quirks & SDHCI_QUIRK_NO_SIMULT_VDD_AND_POWER)  		sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); -	pwr |= SDHCI_POWER_ON; +		if (host->quirks2 & SDHCI_QUIRK2_CARD_ON_NEEDS_BUS_ON) +			sdhci_runtime_pm_bus_on(host); -	sdhci_writeb(host, pwr, SDHCI_POWER_CONTROL); +		/* +		 * Some controllers need an extra 10ms delay of 10ms before +		 * they can apply clock after applying power +		 */ +		if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER) +			mdelay(10); +	} -	/* -	 * Some controllers need an extra 10ms delay of 10ms before they -	 * can apply clock after applying power -	 */ -	if (host->quirks & SDHCI_QUIRK_DELAY_AFTER_POWER) -		mdelay(10); +	if (host->vmmc) { +		spin_unlock_irq(&host->lock); +		mmc_regulator_set_ocr(host->mmc, host->vmmc, vdd); +		spin_lock_irq(&host->lock); +	}  }  /*****************************************************************************\ @@ -1115,11 +1300,14 @@ static void sdhci_set_power(struct sdhci_host *host, unsigned short power)  static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)  {  	struct sdhci_host *host; -	bool present; +	int present;  	unsigned long flags; +	u32 tuning_opcode;  	host = mmc_priv(mmc); +	sdhci_runtime_pm_get(host); +  	spin_lock_irqsave(&host->lock, flags);  	WARN_ON(host->mrq != NULL); @@ -1127,7 +1315,12 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)  #ifndef SDHCI_USE_LEDS_CLASS  	sdhci_activate_led(host);  #endif -	if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) { + +	/* +	 * Ensure we don't send the STOP for non-SET_BLOCK_COUNTED +	 * requests if Auto-CMD12 is enabled. +	 */ +	if (!mrq->sbc && (host->flags & SDHCI_AUTO_CMD12)) {  		if (mrq->stop) {  			mrq->data->stop = NULL;  			mrq->stop = NULL; @@ -1136,35 +1329,126 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq)  	host->mrq = mrq; -	/* If polling, assume that the card is always present. */ -	if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) -		present = true; -	else -		present = sdhci_readl(host, SDHCI_PRESENT_STATE) & -				SDHCI_CARD_PRESENT; +	/* +	 * Firstly check card presence from cd-gpio.  The return could +	 * be one of the following possibilities: +	 *     negative: cd-gpio is not available +	 *     zero: cd-gpio is used, and card is removed +	 *     one: cd-gpio is used, and card is present +	 */ +	present = mmc_gpio_get_cd(host->mmc); +	if (present < 0) { +		/* If polling, assume that the card is always present. */ +		if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) +			present = 1; +		else +			present = sdhci_readl(host, SDHCI_PRESENT_STATE) & +					SDHCI_CARD_PRESENT; +	}  	if (!present || host->flags & SDHCI_DEVICE_DEAD) {  		host->mrq->cmd->error = -ENOMEDIUM;  		tasklet_schedule(&host->finish_tasklet); -	} else -		sdhci_send_command(host, mrq->cmd); +	} else { +		u32 present_state; + +		present_state = sdhci_readl(host, SDHCI_PRESENT_STATE); +		/* +		 * Check if the re-tuning timer has already expired and there +		 * is no on-going data transfer. If so, we need to execute +		 * tuning procedure before sending command. +		 */ +		if ((host->flags & SDHCI_NEEDS_RETUNING) && +		    !(present_state & (SDHCI_DOING_WRITE | SDHCI_DOING_READ))) { +			if (mmc->card) { +				/* eMMC uses cmd21 but sd and sdio use cmd19 */ +				tuning_opcode = +					mmc->card->type == MMC_TYPE_MMC ? +					MMC_SEND_TUNING_BLOCK_HS200 : +					MMC_SEND_TUNING_BLOCK; + +				/* Here we need to set the host->mrq to NULL, +				 * in case the pending finish_tasklet +				 * finishes it incorrectly. +				 */ +				host->mrq = NULL; + +				spin_unlock_irqrestore(&host->lock, flags); +				sdhci_execute_tuning(mmc, tuning_opcode); +				spin_lock_irqsave(&host->lock, flags); + +				/* Restore original mmc_request structure */ +				host->mrq = mrq; +			} +		} + +		if (mrq->sbc && !(host->flags & SDHCI_AUTO_CMD23)) +			sdhci_send_command(host, mrq->sbc); +		else +			sdhci_send_command(host, mrq->cmd); +	}  	mmiowb();  	spin_unlock_irqrestore(&host->lock, flags);  } -static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) +void sdhci_set_bus_width(struct sdhci_host *host, int width)  { -	struct sdhci_host *host; -	unsigned long flags;  	u8 ctrl; -	host = mmc_priv(mmc); +	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); +	if (width == MMC_BUS_WIDTH_8) { +		ctrl &= ~SDHCI_CTRL_4BITBUS; +		if (host->version >= SDHCI_SPEC_300) +			ctrl |= SDHCI_CTRL_8BITBUS; +	} else { +		if (host->version >= SDHCI_SPEC_300) +			ctrl &= ~SDHCI_CTRL_8BITBUS; +		if (width == MMC_BUS_WIDTH_4) +			ctrl |= SDHCI_CTRL_4BITBUS; +		else +			ctrl &= ~SDHCI_CTRL_4BITBUS; +	} +	sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); +} +EXPORT_SYMBOL_GPL(sdhci_set_bus_width); + +void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing) +{ +	u16 ctrl_2; + +	ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); +	/* Select Bus Speed Mode for host */ +	ctrl_2 &= ~SDHCI_CTRL_UHS_MASK; +	if ((timing == MMC_TIMING_MMC_HS200) || +	    (timing == MMC_TIMING_UHS_SDR104)) +		ctrl_2 |= SDHCI_CTRL_UHS_SDR104; +	else if (timing == MMC_TIMING_UHS_SDR12) +		ctrl_2 |= SDHCI_CTRL_UHS_SDR12; +	else if (timing == MMC_TIMING_UHS_SDR25) +		ctrl_2 |= SDHCI_CTRL_UHS_SDR25; +	else if (timing == MMC_TIMING_UHS_SDR50) +		ctrl_2 |= SDHCI_CTRL_UHS_SDR50; +	else if ((timing == MMC_TIMING_UHS_DDR50) || +		 (timing == MMC_TIMING_MMC_DDR52)) +		ctrl_2 |= SDHCI_CTRL_UHS_DDR50; +	sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); +} +EXPORT_SYMBOL_GPL(sdhci_set_uhs_signaling); + +static void sdhci_do_set_ios(struct sdhci_host *host, struct mmc_ios *ios) +{ +	unsigned long flags; +	u8 ctrl;  	spin_lock_irqsave(&host->lock, flags); -	if (host->flags & SDHCI_DEVICE_DEAD) -		goto out; +	if (host->flags & SDHCI_DEVICE_DEAD) { +		spin_unlock_irqrestore(&host->lock, flags); +		if (host->vmmc && ios->power_mode == MMC_POWER_OFF) +			mmc_regulator_set_ocr(host->mmc, host->vmmc, 0); +		return; +	}  	/*  	 * Reset the chip on each power off. @@ -1175,27 +1459,24 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  		sdhci_reinit(host);  	} -	sdhci_set_clock(host, ios->clock); +	if (host->version >= SDHCI_SPEC_300 && +		(ios->power_mode == MMC_POWER_UP) && +		!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) +		sdhci_enable_preset_value(host, false); -	if (ios->power_mode == MMC_POWER_OFF) -		sdhci_set_power(host, -1); -	else -		sdhci_set_power(host, ios->vdd); +	if (!ios->clock || ios->clock != host->clock) { +		host->ops->set_clock(host, ios->clock); +		host->clock = ios->clock; +	} + +	sdhci_set_power(host, ios->power_mode, ios->vdd);  	if (host->ops->platform_send_init_74_clocks)  		host->ops->platform_send_init_74_clocks(host, ios->power_mode); -	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); +	host->ops->set_bus_width(host, ios->bus_width); -	if (ios->bus_width == MMC_BUS_WIDTH_8) -		ctrl |= SDHCI_CTRL_8BITBUS; -	else -		ctrl &= ~SDHCI_CTRL_8BITBUS; - -	if (ios->bus_width == MMC_BUS_WIDTH_4) -		ctrl |= SDHCI_CTRL_4BITBUS; -	else -		ctrl &= ~SDHCI_CTRL_4BITBUS; +	ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);  	if ((ios->timing == MMC_TIMING_SD_HS ||  	     ios->timing == MMC_TIMING_MMC_HS) @@ -1204,7 +1485,78 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	else  		ctrl &= ~SDHCI_CTRL_HISPD; -	sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); +	if (host->version >= SDHCI_SPEC_300) { +		u16 clk, ctrl_2; + +		/* In case of UHS-I modes, set High Speed Enable */ +		if ((ios->timing == MMC_TIMING_MMC_HS200) || +		    (ios->timing == MMC_TIMING_MMC_DDR52) || +		    (ios->timing == MMC_TIMING_UHS_SDR50) || +		    (ios->timing == MMC_TIMING_UHS_SDR104) || +		    (ios->timing == MMC_TIMING_UHS_DDR50) || +		    (ios->timing == MMC_TIMING_UHS_SDR25)) +			ctrl |= SDHCI_CTRL_HISPD; + +		if (!host->preset_enabled) { +			sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); +			/* +			 * We only need to set Driver Strength if the +			 * preset value enable is not set. +			 */ +			ctrl_2 = sdhci_readw(host, SDHCI_HOST_CONTROL2); +			ctrl_2 &= ~SDHCI_CTRL_DRV_TYPE_MASK; +			if (ios->drv_type == MMC_SET_DRIVER_TYPE_A) +				ctrl_2 |= SDHCI_CTRL_DRV_TYPE_A; +			else if (ios->drv_type == MMC_SET_DRIVER_TYPE_C) +				ctrl_2 |= SDHCI_CTRL_DRV_TYPE_C; + +			sdhci_writew(host, ctrl_2, SDHCI_HOST_CONTROL2); +		} else { +			/* +			 * According to SDHC Spec v3.00, if the Preset Value +			 * Enable in the Host Control 2 register is set, we +			 * need to reset SD Clock Enable before changing High +			 * Speed Enable to avoid generating clock gliches. +			 */ + +			/* Reset SD Clock Enable */ +			clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); +			clk &= ~SDHCI_CLOCK_CARD_EN; +			sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + +			sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL); + +			/* Re-enable SD Clock */ +			host->ops->set_clock(host, host->clock); +		} + + +		/* Reset SD Clock Enable */ +		clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL); +		clk &= ~SDHCI_CLOCK_CARD_EN; +		sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); + +		host->ops->set_uhs_signaling(host, ios->timing); +		host->timing = ios->timing; + +		if (!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN) && +				((ios->timing == MMC_TIMING_UHS_SDR12) || +				 (ios->timing == MMC_TIMING_UHS_SDR25) || +				 (ios->timing == MMC_TIMING_UHS_SDR50) || +				 (ios->timing == MMC_TIMING_UHS_SDR104) || +				 (ios->timing == MMC_TIMING_UHS_DDR50))) { +			u16 preset; + +			sdhci_enable_preset_value(host, true); +			preset = sdhci_get_preset_value(host); +			ios->drv_type = (preset & SDHCI_PRESET_DRV_MASK) +				>> SDHCI_PRESET_DRV_SHIFT; +		} + +		/* Re-enable SD Clock */ +		host->ops->set_clock(host, host->clock); +	} else +		sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);  	/*  	 * Some (ENE) controllers go apeshit on some ios operation, @@ -1212,21 +1564,57 @@ static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)  	 * it on each ios seems to solve the problem.  	 */  	if(host->quirks & SDHCI_QUIRK_RESET_CMD_DATA_ON_IOS) -		sdhci_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); +		sdhci_do_reset(host, SDHCI_RESET_CMD | SDHCI_RESET_DATA); -out:  	mmiowb();  	spin_unlock_irqrestore(&host->lock, flags);  } -static int sdhci_get_ro(struct mmc_host *mmc) +static void sdhci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) +{ +	struct sdhci_host *host = mmc_priv(mmc); + +	sdhci_runtime_pm_get(host); +	sdhci_do_set_ios(host, ios); +	sdhci_runtime_pm_put(host); +} + +static int sdhci_do_get_cd(struct sdhci_host *host) +{ +	int gpio_cd = mmc_gpio_get_cd(host->mmc); + +	if (host->flags & SDHCI_DEVICE_DEAD) +		return 0; + +	/* If polling/nonremovable, assume that the card is always present. */ +	if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) || +	    (host->mmc->caps & MMC_CAP_NONREMOVABLE)) +		return 1; + +	/* Try slot gpio detect */ +	if (!IS_ERR_VALUE(gpio_cd)) +		return !!gpio_cd; + +	/* Host native card detect */ +	return !!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT); +} + +static int sdhci_get_cd(struct mmc_host *mmc) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	int ret; + +	sdhci_runtime_pm_get(host); +	ret = sdhci_do_get_cd(host); +	sdhci_runtime_pm_put(host); +	return ret; +} + +static int sdhci_check_ro(struct sdhci_host *host)  { -	struct sdhci_host *host;  	unsigned long flags;  	int is_readonly; -	host = mmc_priv(mmc); -  	spin_lock_irqsave(&host->lock, flags);  	if (host->flags & SDHCI_DEVICE_DEAD) @@ -1244,70 +1632,464 @@ static int sdhci_get_ro(struct mmc_host *mmc)  		!is_readonly : is_readonly;  } +#define SAMPLE_COUNT	5 + +static int sdhci_do_get_ro(struct sdhci_host *host) +{ +	int i, ro_count; + +	if (!(host->quirks & SDHCI_QUIRK_UNSTABLE_RO_DETECT)) +		return sdhci_check_ro(host); + +	ro_count = 0; +	for (i = 0; i < SAMPLE_COUNT; i++) { +		if (sdhci_check_ro(host)) { +			if (++ro_count > SAMPLE_COUNT / 2) +				return 1; +		} +		msleep(30); +	} +	return 0; +} + +static void sdhci_hw_reset(struct mmc_host *mmc) +{ +	struct sdhci_host *host = mmc_priv(mmc); + +	if (host->ops && host->ops->hw_reset) +		host->ops->hw_reset(host); +} + +static int sdhci_get_ro(struct mmc_host *mmc) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	int ret; + +	sdhci_runtime_pm_get(host); +	ret = sdhci_do_get_ro(host); +	sdhci_runtime_pm_put(host); +	return ret; +} + +static void sdhci_enable_sdio_irq_nolock(struct sdhci_host *host, int enable) +{ +	if (!(host->flags & SDHCI_DEVICE_DEAD)) { +		if (enable) +			host->ier |= SDHCI_INT_CARD_INT; +		else +			host->ier &= ~SDHCI_INT_CARD_INT; + +		sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +		sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); +		mmiowb(); +	} +} +  static void sdhci_enable_sdio_irq(struct mmc_host *mmc, int enable)  { -	struct sdhci_host *host; +	struct sdhci_host *host = mmc_priv(mmc);  	unsigned long flags; -	host = mmc_priv(mmc); +	sdhci_runtime_pm_get(host);  	spin_lock_irqsave(&host->lock, flags); - -	if (host->flags & SDHCI_DEVICE_DEAD) -		goto out; -  	if (enable) -		sdhci_unmask_irqs(host, SDHCI_INT_CARD_INT); +		host->flags |= SDHCI_SDIO_IRQ_ENABLED;  	else -		sdhci_mask_irqs(host, SDHCI_INT_CARD_INT); -out: -	mmiowb(); +		host->flags &= ~SDHCI_SDIO_IRQ_ENABLED; +	sdhci_enable_sdio_irq_nolock(host, enable);  	spin_unlock_irqrestore(&host->lock, flags); + +	sdhci_runtime_pm_put(host);  } -static const struct mmc_host_ops sdhci_ops = { -	.request	= sdhci_request, -	.set_ios	= sdhci_set_ios, -	.get_ro		= sdhci_get_ro, -	.enable_sdio_irq = sdhci_enable_sdio_irq, -}; +static int sdhci_do_start_signal_voltage_switch(struct sdhci_host *host, +						struct mmc_ios *ios) +{ +	u16 ctrl; +	int ret; -/*****************************************************************************\ - *                                                                           * - * Tasklets                                                                  * - *                                                                           * -\*****************************************************************************/ +	/* +	 * Signal Voltage Switching is only applicable for Host Controllers +	 * v3.00 and above. +	 */ +	if (host->version < SDHCI_SPEC_300) +		return 0; -static void sdhci_tasklet_card(unsigned long param) -{ -	struct sdhci_host *host; -	unsigned long flags; +	ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); -	host = (struct sdhci_host*)param; +	switch (ios->signal_voltage) { +	case MMC_SIGNAL_VOLTAGE_330: +		/* Set 1.8V Signal Enable in the Host Control2 register to 0 */ +		ctrl &= ~SDHCI_CTRL_VDD_180; +		sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); -	spin_lock_irqsave(&host->lock, flags); +		if (host->vqmmc) { +			ret = regulator_set_voltage(host->vqmmc, 2700000, 3600000); +			if (ret) { +				pr_warning("%s: Switching to 3.3V signalling voltage " +						" failed\n", mmc_hostname(host->mmc)); +				return -EIO; +			} +		} +		/* Wait for 5ms */ +		usleep_range(5000, 5500); -	if (!(sdhci_readl(host, SDHCI_PRESENT_STATE) & SDHCI_CARD_PRESENT)) { -		if (host->mrq) { -			printk(KERN_ERR "%s: Card removed during transfer!\n", +		/* 3.3V regulator output should be stable within 5 ms */ +		ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); +		if (!(ctrl & SDHCI_CTRL_VDD_180)) +			return 0; + +		pr_warning("%s: 3.3V regulator output did not became stable\n",  				mmc_hostname(host->mmc)); -			printk(KERN_ERR "%s: Resetting controller.\n", + +		return -EAGAIN; +	case MMC_SIGNAL_VOLTAGE_180: +		if (host->vqmmc) { +			ret = regulator_set_voltage(host->vqmmc, +					1700000, 1950000); +			if (ret) { +				pr_warning("%s: Switching to 1.8V signalling voltage " +						" failed\n", mmc_hostname(host->mmc)); +				return -EIO; +			} +		} + +		/* +		 * Enable 1.8V Signal Enable in the Host Control2 +		 * register +		 */ +		ctrl |= SDHCI_CTRL_VDD_180; +		sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); + +		/* Wait for 5ms */ +		usleep_range(5000, 5500); + +		/* 1.8V regulator output should be stable within 5 ms */ +		ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); +		if (ctrl & SDHCI_CTRL_VDD_180) +			return 0; + +		pr_warning("%s: 1.8V regulator output did not became stable\n",  				mmc_hostname(host->mmc)); -			sdhci_reset(host, SDHCI_RESET_CMD); -			sdhci_reset(host, SDHCI_RESET_DATA); +		return -EAGAIN; +	case MMC_SIGNAL_VOLTAGE_120: +		if (host->vqmmc) { +			ret = regulator_set_voltage(host->vqmmc, 1100000, 1300000); +			if (ret) { +				pr_warning("%s: Switching to 1.2V signalling voltage " +						" failed\n", mmc_hostname(host->mmc)); +				return -EIO; +			} +		} +		return 0; +	default: +		/* No signal voltage switch required */ +		return 0; +	} +} -			host->mrq->cmd->error = -ENOMEDIUM; -			tasklet_schedule(&host->finish_tasklet); +static int sdhci_start_signal_voltage_switch(struct mmc_host *mmc, +	struct mmc_ios *ios) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	int err; + +	if (host->version < SDHCI_SPEC_300) +		return 0; +	sdhci_runtime_pm_get(host); +	err = sdhci_do_start_signal_voltage_switch(host, ios); +	sdhci_runtime_pm_put(host); +	return err; +} + +static int sdhci_card_busy(struct mmc_host *mmc) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	u32 present_state; + +	sdhci_runtime_pm_get(host); +	/* Check whether DAT[3:0] is 0000 */ +	present_state = sdhci_readl(host, SDHCI_PRESENT_STATE); +	sdhci_runtime_pm_put(host); + +	return !(present_state & SDHCI_DATA_LVL_MASK); +} + +static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	u16 ctrl; +	int tuning_loop_counter = MAX_TUNING_LOOP; +	int err = 0; +	unsigned long flags; + +	sdhci_runtime_pm_get(host); +	spin_lock_irqsave(&host->lock, flags); + +	/* +	 * The Host Controller needs tuning only in case of SDR104 mode +	 * and for SDR50 mode when Use Tuning for SDR50 is set in the +	 * Capabilities register. +	 * If the Host Controller supports the HS200 mode then the +	 * tuning function has to be executed. +	 */ +	switch (host->timing) { +	case MMC_TIMING_MMC_HS200: +	case MMC_TIMING_UHS_SDR104: +		break; + +	case MMC_TIMING_UHS_SDR50: +		if (host->flags & SDHCI_SDR50_NEEDS_TUNING || +		    host->flags & SDHCI_SDR104_NEEDS_TUNING) +			break; +		/* FALLTHROUGH */ + +	default: +		spin_unlock_irqrestore(&host->lock, flags); +		sdhci_runtime_pm_put(host); +		return 0; +	} + +	if (host->ops->platform_execute_tuning) { +		spin_unlock_irqrestore(&host->lock, flags); +		err = host->ops->platform_execute_tuning(host, opcode); +		sdhci_runtime_pm_put(host); +		return err; +	} + +	ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); +	ctrl |= SDHCI_CTRL_EXEC_TUNING; +	sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); + +	/* +	 * As per the Host Controller spec v3.00, tuning command +	 * generates Buffer Read Ready interrupt, so enable that. +	 * +	 * Note: The spec clearly says that when tuning sequence +	 * is being performed, the controller does not generate +	 * interrupts other than Buffer Read Ready interrupt. But +	 * to make sure we don't hit a controller bug, we _only_ +	 * enable Buffer Read Ready interrupt here. +	 */ +	sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_INT_ENABLE); +	sdhci_writel(host, SDHCI_INT_DATA_AVAIL, SDHCI_SIGNAL_ENABLE); + +	/* +	 * Issue CMD19 repeatedly till Execute Tuning is set to 0 or the number +	 * of loops reaches 40 times or a timeout of 150ms occurs. +	 */ +	do { +		struct mmc_command cmd = {0}; +		struct mmc_request mrq = {NULL}; + +		cmd.opcode = opcode; +		cmd.arg = 0; +		cmd.flags = MMC_RSP_R1 | MMC_CMD_ADTC; +		cmd.retries = 0; +		cmd.data = NULL; +		cmd.error = 0; + +		if (tuning_loop_counter-- == 0) +			break; + +		mrq.cmd = &cmd; +		host->mrq = &mrq; + +		/* +		 * In response to CMD19, the card sends 64 bytes of tuning +		 * block to the Host Controller. So we set the block size +		 * to 64 here. +		 */ +		if (cmd.opcode == MMC_SEND_TUNING_BLOCK_HS200) { +			if (mmc->ios.bus_width == MMC_BUS_WIDTH_8) +				sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 128), +					     SDHCI_BLOCK_SIZE); +			else if (mmc->ios.bus_width == MMC_BUS_WIDTH_4) +				sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 64), +					     SDHCI_BLOCK_SIZE); +		} else { +			sdhci_writew(host, SDHCI_MAKE_BLKSZ(7, 64), +				     SDHCI_BLOCK_SIZE);  		} + +		/* +		 * The tuning block is sent by the card to the host controller. +		 * So we set the TRNS_READ bit in the Transfer Mode register. +		 * This also takes care of setting DMA Enable and Multi Block +		 * Select in the same register to 0. +		 */ +		sdhci_writew(host, SDHCI_TRNS_READ, SDHCI_TRANSFER_MODE); + +		sdhci_send_command(host, &cmd); + +		host->cmd = NULL; +		host->mrq = NULL; + +		spin_unlock_irqrestore(&host->lock, flags); +		/* Wait for Buffer Read Ready interrupt */ +		wait_event_interruptible_timeout(host->buf_ready_int, +					(host->tuning_done == 1), +					msecs_to_jiffies(50)); +		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"); +			ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); +			ctrl &= ~SDHCI_CTRL_TUNED_CLK; +			ctrl &= ~SDHCI_CTRL_EXEC_TUNING; +			sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); + +			err = -EIO; +			goto out; +		} + +		host->tuning_done = 0; + +		ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); + +		/* eMMC spec does not require a delay between tuning cycles */ +		if (opcode == MMC_SEND_TUNING_BLOCK) +			mdelay(1); +	} while (ctrl & SDHCI_CTRL_EXEC_TUNING); + +	/* +	 * The Host Driver has exhausted the maximum number of loops allowed, +	 * so use fixed sampling frequency. +	 */ +	if (tuning_loop_counter < 0) { +		ctrl &= ~SDHCI_CTRL_TUNED_CLK; +		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"); +		err = -EIO; +	} + +out: +	/* +	 * If this is the very first time we are here, we start the retuning +	 * timer. Since only during the first time, SDHCI_NEEDS_RETUNING +	 * flag won't be set, we check this condition before actually starting +	 * the timer. +	 */ +	if (!(host->flags & SDHCI_NEEDS_RETUNING) && host->tuning_count && +	    (host->tuning_mode == SDHCI_TUNING_MODE_1)) { +		host->flags |= SDHCI_USING_RETUNING_TIMER; +		mod_timer(&host->tuning_timer, jiffies + +			host->tuning_count * HZ); +		/* Tuning mode 1 limits the maximum data length to 4MB */ +		mmc->max_blk_count = (4 * 1024 * 1024) / mmc->max_blk_size; +	} else if (host->flags & SDHCI_USING_RETUNING_TIMER) { +		host->flags &= ~SDHCI_NEEDS_RETUNING; +		/* Reload the new initial value for timer */ +		mod_timer(&host->tuning_timer, jiffies + +			  host->tuning_count * HZ);  	} +	/* +	 * In case tuning fails, host controllers which support re-tuning can +	 * try tuning again at a later time, when the re-tuning timer expires. +	 * So for these controllers, we return 0. Since there might be other +	 * controllers who do not have this capability, we return error for +	 * them. SDHCI_USING_RETUNING_TIMER means the host is currently using +	 * a retuning timer to do the retuning for the card. +	 */ +	if (err && (host->flags & SDHCI_USING_RETUNING_TIMER)) +		err = 0; + +	sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +	sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE);  	spin_unlock_irqrestore(&host->lock, flags); +	sdhci_runtime_pm_put(host); + +	return err; +} + + +static void sdhci_enable_preset_value(struct sdhci_host *host, bool enable) +{ +	/* Host Controller v3.00 defines preset value registers */ +	if (host->version < SDHCI_SPEC_300) +		return; + +	/* +	 * We only enable or disable Preset Value if they are not already +	 * enabled or disabled respectively. Otherwise, we bail out. +	 */ +	if (host->preset_enabled != enable) { +		u16 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); + +		if (enable) +			ctrl |= SDHCI_CTRL_PRESET_VAL_ENABLE; +		else +			ctrl &= ~SDHCI_CTRL_PRESET_VAL_ENABLE; + +		sdhci_writew(host, ctrl, SDHCI_HOST_CONTROL2); -	mmc_detect_change(host->mmc, msecs_to_jiffies(200)); +		if (enable) +			host->flags |= SDHCI_PV_ENABLED; +		else +			host->flags &= ~SDHCI_PV_ENABLED; + +		host->preset_enabled = enable; +	}  } +static void sdhci_card_event(struct mmc_host *mmc) +{ +	struct sdhci_host *host = mmc_priv(mmc); +	unsigned long flags; + +	/* First check if client has provided their own card event */ +	if (host->ops->card_event) +		host->ops->card_event(host); + +	spin_lock_irqsave(&host->lock, flags); + +	/* Check host->mrq first in case we are runtime suspended */ +	if (host->mrq && !sdhci_do_get_cd(host)) { +		pr_err("%s: Card removed during transfer!\n", +			mmc_hostname(host->mmc)); +		pr_err("%s: Resetting controller.\n", +			mmc_hostname(host->mmc)); + +		sdhci_do_reset(host, SDHCI_RESET_CMD); +		sdhci_do_reset(host, SDHCI_RESET_DATA); + +		host->mrq->cmd->error = -ENOMEDIUM; +		tasklet_schedule(&host->finish_tasklet); +	} + +	spin_unlock_irqrestore(&host->lock, flags); +} + +static const struct mmc_host_ops sdhci_ops = { +	.request	= sdhci_request, +	.set_ios	= sdhci_set_ios, +	.get_cd		= sdhci_get_cd, +	.get_ro		= sdhci_get_ro, +	.hw_reset	= sdhci_hw_reset, +	.enable_sdio_irq = sdhci_enable_sdio_irq, +	.start_signal_voltage_switch	= sdhci_start_signal_voltage_switch, +	.execute_tuning			= sdhci_execute_tuning, +	.card_event			= sdhci_card_event, +	.card_busy	= sdhci_card_busy, +}; + +/*****************************************************************************\ + *                                                                           * + * Tasklets                                                                  * + *                                                                           * +\*****************************************************************************/ +  static void sdhci_tasklet_finish(unsigned long param)  {  	struct sdhci_host *host; @@ -1318,6 +2100,15 @@ static void sdhci_tasklet_finish(unsigned long param)  	spin_lock_irqsave(&host->lock, flags); +        /* +         * If this tasklet gets rescheduled while running, it will +         * be run again afterwards but without any active request. +         */ +	if (!host->mrq) { +		spin_unlock_irqrestore(&host->lock, flags); +		return; +	} +  	del_timer(&host->timer);  	mrq = host->mrq; @@ -1327,25 +2118,20 @@ static void sdhci_tasklet_finish(unsigned long param)  	 * upon error conditions.  	 */  	if (!(host->flags & SDHCI_DEVICE_DEAD) && -		(mrq->cmd->error || +	    ((mrq->cmd && mrq->cmd->error) ||  		 (mrq->data && (mrq->data->error ||  		  (mrq->data->stop && mrq->data->stop->error))) ||  		   (host->quirks & SDHCI_QUIRK_RESET_AFTER_REQUEST))) {  		/* Some controllers need this kick or reset won't work here */ -		if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) { -			unsigned int clock; - +		if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET)  			/* This is to force an update */ -			clock = host->clock; -			host->clock = 0; -			sdhci_set_clock(host, clock); -		} +			host->ops->set_clock(host, host->clock);  		/* Spec says we should do both at the same time, but Ricoh  		   controllers do not like that. */ -		sdhci_reset(host, SDHCI_RESET_CMD); -		sdhci_reset(host, SDHCI_RESET_DATA); +		sdhci_do_reset(host, SDHCI_RESET_CMD); +		sdhci_do_reset(host, SDHCI_RESET_DATA);  	}  	host->mrq = NULL; @@ -1360,6 +2146,7 @@ static void sdhci_tasklet_finish(unsigned long param)  	spin_unlock_irqrestore(&host->lock, flags);  	mmc_request_done(host->mmc, mrq); +	sdhci_runtime_pm_put(host);  }  static void sdhci_timeout_timer(unsigned long data) @@ -1372,7 +2159,7 @@ static void sdhci_timeout_timer(unsigned long data)  	spin_lock_irqsave(&host->lock, flags);  	if (host->mrq) { -		printk(KERN_ERR "%s: Timeout waiting for hardware " +		pr_err("%s: Timeout waiting for hardware "  			"interrupt.\n", mmc_hostname(host->mmc));  		sdhci_dumpregs(host); @@ -1393,6 +2180,20 @@ static void sdhci_timeout_timer(unsigned long data)  	spin_unlock_irqrestore(&host->lock, flags);  } +static void sdhci_tuning_timer(unsigned long data) +{ +	struct sdhci_host *host; +	unsigned long flags; + +	host = (struct sdhci_host *)data; + +	spin_lock_irqsave(&host->lock, flags); + +	host->flags |= SDHCI_NEEDS_RETUNING; + +	spin_unlock_irqrestore(&host->lock, flags); +} +  /*****************************************************************************\   *                                                                           *   * Interrupt handling                                                        * @@ -1404,7 +2205,7 @@ static void sdhci_cmd_irq(struct sdhci_host *host, u32 intmask)  	BUG_ON(intmask == 0);  	if (!host->cmd) { -		printk(KERN_ERR "%s: Got command interrupt 0x%08x even " +		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); @@ -1479,8 +2280,20 @@ static void sdhci_show_adma_error(struct sdhci_host *host) { }  static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)  { +	u32 command;  	BUG_ON(intmask == 0); +	/* CMD19 generates _only_ Buffer Read Ready interrupt */ +	if (intmask & SDHCI_INT_DATA_AVAIL) { +		command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)); +		if (command == MMC_SEND_TUNING_BLOCK || +		    command == MMC_SEND_TUNING_BLOCK_HS200) { +			host->tuning_done = 1; +			wake_up(&host->buf_ready_int); +			return; +		} +	} +  	if (!host->data) {  		/*  		 * The "data complete" interrupt is also used to @@ -1494,7 +2307,7 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)  			}  		} -		printk(KERN_ERR "%s: Got data interrupt 0x%08x even " +		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); @@ -1504,12 +2317,18 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)  	if (intmask & SDHCI_INT_DATA_TIMEOUT)  		host->data->error = -ETIMEDOUT; -	else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT)) +	else if (intmask & SDHCI_INT_DATA_END_BIT) +		host->data->error = -EILSEQ; +	else if ((intmask & SDHCI_INT_DATA_CRC) && +		SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)) +			!= MMC_BUS_TEST_R)  		host->data->error = -EILSEQ;  	else if (intmask & SDHCI_INT_ADMA_ERROR) { -		printk(KERN_ERR "%s: ADMA error\n", mmc_hostname(host->mmc)); +		pr_err("%s: ADMA error\n", mmc_hostname(host->mmc));  		sdhci_show_adma_error(host);  		host->data->error = -EIO; +		if (host->ops->adma_workaround) +			host->ops->adma_workaround(host, intmask);  	}  	if (host->data->error) @@ -1522,10 +2341,28 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)  		 * We currently don't do anything fancy with DMA  		 * boundaries, but as we can't disable the feature  		 * we need to at least restart the transfer. +		 * +		 * According to the spec sdhci_readl(host, SDHCI_DMA_ADDRESS) +		 * should return a valid address to continue from, but as +		 * some controllers are faulty, don't trust them.  		 */ -		if (intmask & SDHCI_INT_DMA_END) -			sdhci_writel(host, sdhci_readl(host, SDHCI_DMA_ADDRESS), -				SDHCI_DMA_ADDRESS); +		if (intmask & SDHCI_INT_DMA_END) { +			u32 dmastart, dmanow; +			dmastart = sg_dma_address(host->data->sg); +			dmanow = dmastart + host->data->bytes_xfered; +			/* +			 * Force update to the next DMA block boundary. +			 */ +			dmanow = (dmanow & +				~(SDHCI_DEFAULT_BOUNDARY_SIZE - 1)) + +				SDHCI_DEFAULT_BOUNDARY_SIZE; +			host->data->bytes_xfered = dmanow - dmastart; +			DBG("%s: DMA base 0x%08x, transferred 0x%06x bytes," +				" next 0x%08x\n", +				mmc_hostname(host->mmc), dmastart, +				host->data->bytes_xfered, dmanow); +			sdhci_writel(host, dmanow, SDHCI_DMA_ADDRESS); +		}  		if (intmask & SDHCI_INT_DATA_END) {  			if (host->cmd) { @@ -1544,81 +2381,132 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)  static irqreturn_t sdhci_irq(int irq, void *dev_id)  { -	irqreturn_t result; -	struct sdhci_host* host = dev_id; -	u32 intmask; -	int cardint = 0; +	irqreturn_t result = IRQ_NONE; +	struct sdhci_host *host = dev_id; +	u32 intmask, mask, unexpected = 0; +	int max_loops = 16;  	spin_lock(&host->lock); -	intmask = sdhci_readl(host, SDHCI_INT_STATUS); +	if (host->runtime_suspended && !sdhci_sdio_irq_enabled(host)) { +		spin_unlock(&host->lock); +		return IRQ_NONE; +	} +	intmask = sdhci_readl(host, SDHCI_INT_STATUS);  	if (!intmask || intmask == 0xffffffff) {  		result = IRQ_NONE;  		goto out;  	} -	DBG("*** %s got interrupt: 0x%08x\n", -		mmc_hostname(host->mmc), intmask); +	do { +		/* Clear selected interrupts. */ +		mask = intmask & (SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK | +				  SDHCI_INT_BUS_POWER); +		sdhci_writel(host, mask, SDHCI_INT_STATUS); -	if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { -		sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT | -			SDHCI_INT_CARD_REMOVE), SDHCI_INT_STATUS); -		tasklet_schedule(&host->card_tasklet); -	} +		DBG("*** %s got interrupt: 0x%08x\n", +			mmc_hostname(host->mmc), intmask); -	intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); +		if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { +			u32 present = sdhci_readl(host, SDHCI_PRESENT_STATE) & +				      SDHCI_CARD_PRESENT; -	if (intmask & SDHCI_INT_CMD_MASK) { -		sdhci_writel(host, intmask & SDHCI_INT_CMD_MASK, -			SDHCI_INT_STATUS); -		sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK); -	} +			/* +			 * There is a observation on i.mx esdhc.  INSERT +			 * bit will be immediately set again when it gets +			 * cleared, if a card is inserted.  We have to mask +			 * the irq to prevent interrupt storm which will +			 * freeze the system.  And the REMOVE gets the +			 * same situation. +			 * +			 * More testing are needed here to ensure it works +			 * for other platforms though. +			 */ +			host->ier &= ~(SDHCI_INT_CARD_INSERT | +				       SDHCI_INT_CARD_REMOVE); +			host->ier |= present ? SDHCI_INT_CARD_REMOVE : +					       SDHCI_INT_CARD_INSERT; +			sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +			sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); + +			sdhci_writel(host, intmask & (SDHCI_INT_CARD_INSERT | +				     SDHCI_INT_CARD_REMOVE), SDHCI_INT_STATUS); + +			host->thread_isr |= intmask & (SDHCI_INT_CARD_INSERT | +						       SDHCI_INT_CARD_REMOVE); +			result = IRQ_WAKE_THREAD; +		} -	if (intmask & SDHCI_INT_DATA_MASK) { -		sdhci_writel(host, intmask & SDHCI_INT_DATA_MASK, -			SDHCI_INT_STATUS); -		sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK); -	} +		if (intmask & SDHCI_INT_CMD_MASK) +			sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK); -	intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK); +		if (intmask & SDHCI_INT_DATA_MASK) +			sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK); -	intmask &= ~SDHCI_INT_ERROR; +		if (intmask & SDHCI_INT_BUS_POWER) +			pr_err("%s: Card is consuming too much power!\n", +				mmc_hostname(host->mmc)); -	if (intmask & SDHCI_INT_BUS_POWER) { -		printk(KERN_ERR "%s: Card is consuming too much power!\n", -			mmc_hostname(host->mmc)); -		sdhci_writel(host, SDHCI_INT_BUS_POWER, SDHCI_INT_STATUS); -	} +		if (intmask & SDHCI_INT_CARD_INT) { +			sdhci_enable_sdio_irq_nolock(host, false); +			host->thread_isr |= SDHCI_INT_CARD_INT; +			result = IRQ_WAKE_THREAD; +		} -	intmask &= ~SDHCI_INT_BUS_POWER; +		intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE | +			     SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK | +			     SDHCI_INT_ERROR | SDHCI_INT_BUS_POWER | +			     SDHCI_INT_CARD_INT); -	if (intmask & SDHCI_INT_CARD_INT) -		cardint = 1; +		if (intmask) { +			unexpected |= intmask; +			sdhci_writel(host, intmask, SDHCI_INT_STATUS); +		} -	intmask &= ~SDHCI_INT_CARD_INT; +		if (result == IRQ_NONE) +			result = IRQ_HANDLED; -	if (intmask) { -		printk(KERN_ERR "%s: Unexpected interrupt 0x%08x.\n", -			mmc_hostname(host->mmc), intmask); -		sdhci_dumpregs(host); +		intmask = sdhci_readl(host, SDHCI_INT_STATUS); +	} while (intmask && --max_loops); +out: +	spin_unlock(&host->lock); -		sdhci_writel(host, intmask, SDHCI_INT_STATUS); +	if (unexpected) { +		pr_err("%s: Unexpected interrupt 0x%08x.\n", +			   mmc_hostname(host->mmc), unexpected); +		sdhci_dumpregs(host);  	} -	result = IRQ_HANDLED; +	return result; +} -	mmiowb(); -out: -	spin_unlock(&host->lock); +static irqreturn_t sdhci_thread_irq(int irq, void *dev_id) +{ +	struct sdhci_host *host = dev_id; +	unsigned long flags; +	u32 isr; -	/* -	 * We have to delay this as it calls back into the driver. -	 */ -	if (cardint) -		mmc_signal_sdio_irq(host->mmc); +	spin_lock_irqsave(&host->lock, flags); +	isr = host->thread_isr; +	host->thread_isr = 0; +	spin_unlock_irqrestore(&host->lock, flags); -	return result; +	if (isr & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { +		sdhci_card_event(host->mmc); +		mmc_detect_change(host->mmc, msecs_to_jiffies(200)); +	} + +	if (isr & SDHCI_INT_CARD_INT) { +		sdio_run_irqs(host->mmc); + +		spin_lock_irqsave(&host->lock, flags); +		if (host->flags & SDHCI_SDIO_IRQ_ENABLED) +			sdhci_enable_sdio_irq_nolock(host, true); +		spin_unlock_irqrestore(&host->lock, flags); +	} + +	return isr ? IRQ_HANDLED : IRQ_NONE;  }  /*****************************************************************************\ @@ -1628,60 +2516,204 @@ out:  \*****************************************************************************/  #ifdef CONFIG_PM - -int sdhci_suspend_host(struct sdhci_host *host, pm_message_t state) +void sdhci_enable_irq_wakeups(struct sdhci_host *host)  { -	int ret; +	u8 val; +	u8 mask = SDHCI_WAKE_ON_INSERT | SDHCI_WAKE_ON_REMOVE +			| SDHCI_WAKE_ON_INT; -	sdhci_disable_card_detection(host); +	val = sdhci_readb(host, SDHCI_WAKE_UP_CONTROL); +	val |= mask ; +	/* Avoid fake wake up */ +	if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) +		val &= ~(SDHCI_WAKE_ON_INSERT | SDHCI_WAKE_ON_REMOVE); +	sdhci_writeb(host, val, SDHCI_WAKE_UP_CONTROL); +} +EXPORT_SYMBOL_GPL(sdhci_enable_irq_wakeups); -	ret = mmc_suspend_host(host->mmc); -	if (ret) -		return ret; +void sdhci_disable_irq_wakeups(struct sdhci_host *host) +{ +	u8 val; +	u8 mask = SDHCI_WAKE_ON_INSERT | SDHCI_WAKE_ON_REMOVE +			| SDHCI_WAKE_ON_INT; -	free_irq(host->irq, host); +	val = sdhci_readb(host, SDHCI_WAKE_UP_CONTROL); +	val &= ~mask; +	sdhci_writeb(host, val, SDHCI_WAKE_UP_CONTROL); +} +EXPORT_SYMBOL_GPL(sdhci_disable_irq_wakeups); -	if (host->vmmc) -		ret = regulator_disable(host->vmmc); +int sdhci_suspend_host(struct sdhci_host *host) +{ +	sdhci_disable_card_detection(host); -	return ret; +	/* Disable tuning since we are suspending */ +	if (host->flags & SDHCI_USING_RETUNING_TIMER) { +		del_timer_sync(&host->tuning_timer); +		host->flags &= ~SDHCI_NEEDS_RETUNING; +	} + +	if (!device_may_wakeup(mmc_dev(host->mmc))) { +		host->ier = 0; +		sdhci_writel(host, 0, SDHCI_INT_ENABLE); +		sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE); +		free_irq(host->irq, host); +	} else { +		sdhci_enable_irq_wakeups(host); +		enable_irq_wake(host->irq); +	} +	return 0;  }  EXPORT_SYMBOL_GPL(sdhci_suspend_host);  int sdhci_resume_host(struct sdhci_host *host)  { -	int ret; +	int ret = 0; -	if (host->vmmc) { -		int ret = regulator_enable(host->vmmc); +	if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { +		if (host->ops->enable_dma) +			host->ops->enable_dma(host); +	} + +	if (!device_may_wakeup(mmc_dev(host->mmc))) { +		ret = request_threaded_irq(host->irq, sdhci_irq, +					   sdhci_thread_irq, IRQF_SHARED, +					   mmc_hostname(host->mmc), host);  		if (ret)  			return ret; +	} else { +		sdhci_disable_irq_wakeups(host); +		disable_irq_wake(host->irq);  	} +	if ((host->mmc->pm_flags & MMC_PM_KEEP_POWER) && +	    (host->quirks2 & SDHCI_QUIRK2_HOST_OFF_CARD_ON)) { +		/* Card keeps power but host controller does not */ +		sdhci_init(host, 0); +		host->pwr = 0; +		host->clock = 0; +		sdhci_do_set_ios(host, &host->mmc->ios); +	} else { +		sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER)); +		mmiowb(); +	} -	if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) { +	sdhci_enable_card_detection(host); + +	/* Set the re-tuning expiration flag */ +	if (host->flags & SDHCI_USING_RETUNING_TIMER) +		host->flags |= SDHCI_NEEDS_RETUNING; + +	return ret; +} + +EXPORT_SYMBOL_GPL(sdhci_resume_host); +#endif /* CONFIG_PM */ + +#ifdef CONFIG_PM_RUNTIME + +static int sdhci_runtime_pm_get(struct sdhci_host *host) +{ +	return pm_runtime_get_sync(host->mmc->parent); +} + +static int sdhci_runtime_pm_put(struct sdhci_host *host) +{ +	pm_runtime_mark_last_busy(host->mmc->parent); +	return pm_runtime_put_autosuspend(host->mmc->parent); +} + +static void sdhci_runtime_pm_bus_on(struct sdhci_host *host) +{ +	if (host->runtime_suspended || host->bus_on) +		return; +	host->bus_on = true; +	pm_runtime_get_noresume(host->mmc->parent); +} + +static void sdhci_runtime_pm_bus_off(struct sdhci_host *host) +{ +	if (host->runtime_suspended || !host->bus_on) +		return; +	host->bus_on = false; +	pm_runtime_put_noidle(host->mmc->parent); +} + +int sdhci_runtime_suspend_host(struct sdhci_host *host) +{ +	unsigned long flags; +	int ret = 0; + +	/* Disable tuning since we are suspending */ +	if (host->flags & SDHCI_USING_RETUNING_TIMER) { +		del_timer_sync(&host->tuning_timer); +		host->flags &= ~SDHCI_NEEDS_RETUNING; +	} + +	spin_lock_irqsave(&host->lock, flags); +	host->ier &= SDHCI_INT_CARD_INT; +	sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); +	sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); +	spin_unlock_irqrestore(&host->lock, flags); + +	synchronize_hardirq(host->irq); + +	spin_lock_irqsave(&host->lock, flags); +	host->runtime_suspended = true; +	spin_unlock_irqrestore(&host->lock, flags); + +	return ret; +} +EXPORT_SYMBOL_GPL(sdhci_runtime_suspend_host); + +int sdhci_runtime_resume_host(struct sdhci_host *host) +{ +	unsigned long flags; +	int ret = 0, host_flags = host->flags; + +	if (host_flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {  		if (host->ops->enable_dma)  			host->ops->enable_dma(host);  	} -	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED, -			  mmc_hostname(host->mmc), host); -	if (ret) -		return ret; +	sdhci_init(host, 0); -	sdhci_init(host, (host->mmc->pm_flags & MMC_PM_KEEP_POWER)); -	mmiowb(); +	/* Force clock and power re-program */ +	host->pwr = 0; +	host->clock = 0; +	sdhci_do_set_ios(host, &host->mmc->ios); + +	sdhci_do_start_signal_voltage_switch(host, &host->mmc->ios); +	if ((host_flags & SDHCI_PV_ENABLED) && +		!(host->quirks2 & SDHCI_QUIRK2_PRESET_VALUE_BROKEN)) { +		spin_lock_irqsave(&host->lock, flags); +		sdhci_enable_preset_value(host, true); +		spin_unlock_irqrestore(&host->lock, flags); +	} + +	/* Set the re-tuning expiration flag */ +	if (host->flags & SDHCI_USING_RETUNING_TIMER) +		host->flags |= SDHCI_NEEDS_RETUNING; + +	spin_lock_irqsave(&host->lock, flags); + +	host->runtime_suspended = false; + +	/* Enable SDIO IRQ */ +	if (host->flags & SDHCI_SDIO_IRQ_ENABLED) +		sdhci_enable_sdio_irq_nolock(host, true); -	ret = mmc_resume_host(host->mmc); +	/* Enable Card Detection */  	sdhci_enable_card_detection(host); +	spin_unlock_irqrestore(&host->lock, flags); +  	return ret;  } +EXPORT_SYMBOL_GPL(sdhci_runtime_resume_host); -EXPORT_SYMBOL_GPL(sdhci_resume_host); - -#endif /* CONFIG_PM */ +#endif  /*****************************************************************************\   *                                                                           * @@ -1712,7 +2744,9 @@ EXPORT_SYMBOL_GPL(sdhci_alloc_host);  int sdhci_add_host(struct sdhci_host *host)  {  	struct mmc_host *mmc; -	unsigned int caps; +	u32 caps[2] = {0, 0}; +	u32 max_current_caps; +	unsigned int ocr_avail;  	int ret;  	WARN_ON(host == NULL); @@ -1723,24 +2757,31 @@ int sdhci_add_host(struct sdhci_host *host)  	if (debug_quirks)  		host->quirks = debug_quirks; +	if (debug_quirks2) +		host->quirks2 = debug_quirks2; -	sdhci_reset(host, SDHCI_RESET_ALL); +	sdhci_do_reset(host, SDHCI_RESET_ALL);  	host->version = sdhci_readw(host, SDHCI_HOST_VERSION);  	host->version = (host->version & SDHCI_SPEC_VER_MASK)  				>> SDHCI_SPEC_VER_SHIFT;  	if (host->version > SDHCI_SPEC_300) { -		printk(KERN_ERR "%s: Unknown controller version (%d). " +		pr_err("%s: Unknown controller version (%d). "  			"You may experience problems.\n", mmc_hostname(mmc),  			host->version);  	} -	caps = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps : +	caps[0] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? host->caps :  		sdhci_readl(host, SDHCI_CAPABILITIES); +	if (host->version >= SDHCI_SPEC_300) +		caps[1] = (host->quirks & SDHCI_QUIRK_MISSING_CAPS) ? +			host->caps1 : +			sdhci_readl(host, SDHCI_CAPABILITIES_1); +  	if (host->quirks & SDHCI_QUIRK_FORCE_DMA)  		host->flags |= SDHCI_USE_SDMA; -	else if (!(caps & SDHCI_CAN_DO_SDMA)) +	else if (!(caps[0] & SDHCI_CAN_DO_SDMA))  		DBG("Controller doesn't have SDMA capability\n");  	else  		host->flags |= SDHCI_USE_SDMA; @@ -1751,7 +2792,8 @@ int sdhci_add_host(struct sdhci_host *host)  		host->flags &= ~SDHCI_USE_SDMA;  	} -	if ((host->version >= SDHCI_SPEC_200) && (caps & SDHCI_CAN_DO_ADMA2)) +	if ((host->version >= SDHCI_SPEC_200) && +		(caps[0] & SDHCI_CAN_DO_ADMA2))  		host->flags |= SDHCI_USE_ADMA;  	if ((host->quirks & SDHCI_QUIRK_BROKEN_ADMA) && @@ -1763,7 +2805,7 @@ int sdhci_add_host(struct sdhci_host *host)  	if (host->flags & (SDHCI_USE_SDMA | SDHCI_USE_ADMA)) {  		if (host->ops->enable_dma) {  			if (host->ops->enable_dma(host)) { -				printk(KERN_WARNING "%s: No suitable DMA " +				pr_warning("%s: No suitable DMA "  					"available. Falling back to PIO.\n",  					mmc_hostname(mmc));  				host->flags &= @@ -1778,15 +2820,29 @@ int sdhci_add_host(struct sdhci_host *host)  		 * (128) and potentially one alignment transfer for  		 * each of those entries.  		 */ -		host->adma_desc = kmalloc((128 * 2 + 1) * 4, GFP_KERNEL); +		host->adma_desc = dma_alloc_coherent(mmc_dev(host->mmc), +						     ADMA_SIZE, &host->adma_addr, +						     GFP_KERNEL);  		host->align_buffer = kmalloc(128 * 4, GFP_KERNEL);  		if (!host->adma_desc || !host->align_buffer) { -			kfree(host->adma_desc); +			dma_free_coherent(mmc_dev(host->mmc), ADMA_SIZE, +					  host->adma_desc, host->adma_addr);  			kfree(host->align_buffer); -			printk(KERN_WARNING "%s: Unable to allocate ADMA " +			pr_warning("%s: Unable to allocate ADMA "  				"buffers. Falling back to standard DMA.\n",  				mmc_hostname(mmc));  			host->flags &= ~SDHCI_USE_ADMA; +			host->adma_desc = NULL; +			host->align_buffer = NULL; +		} else if (host->adma_addr & 3) { +			pr_warning("%s: unable to allocate aligned ADMA descriptor\n", +				   mmc_hostname(mmc)); +			host->flags &= ~SDHCI_USE_ADMA; +			dma_free_coherent(mmc_dev(host->mmc), ADMA_SIZE, +					  host->adma_desc, host->adma_addr); +			kfree(host->align_buffer); +			host->adma_desc = NULL; +			host->align_buffer = NULL;  		}  	} @@ -1801,73 +2857,285 @@ int sdhci_add_host(struct sdhci_host *host)  	}  	if (host->version >= SDHCI_SPEC_300) -		host->max_clk = (caps & SDHCI_CLOCK_V3_BASE_MASK) +		host->max_clk = (caps[0] & SDHCI_CLOCK_V3_BASE_MASK)  			>> SDHCI_CLOCK_BASE_SHIFT;  	else -		host->max_clk = (caps & SDHCI_CLOCK_BASE_MASK) +		host->max_clk = (caps[0] & SDHCI_CLOCK_BASE_MASK)  			>> SDHCI_CLOCK_BASE_SHIFT;  	host->max_clk *= 1000000;  	if (host->max_clk == 0 || host->quirks &  			SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN) {  		if (!host->ops->get_max_clock) { -			printk(KERN_ERR -			       "%s: Hardware doesn't specify base clock " +			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);  	} +	/* +	 * In case of Host Controller v3.00, find out whether clock +	 * multiplier is supported. +	 */ +	host->clk_mul = (caps[1] & SDHCI_CLOCK_MUL_MASK) >> +			SDHCI_CLOCK_MUL_SHIFT; + +	/* +	 * In case the value in Clock Multiplier is 0, then programmable +	 * clock mode is not supported, otherwise the actual clock +	 * multiplier is one more than the value of Clock Multiplier +	 * in the Capabilities Register. +	 */ +	if (host->clk_mul) +		host->clk_mul += 1; + +	/* +	 * Set host parameters. +	 */ +	mmc->ops = &sdhci_ops; +	mmc->f_max = host->max_clk; +	if (host->ops->get_min_clock) +		mmc->f_min = host->ops->get_min_clock(host); +	else if (host->version >= SDHCI_SPEC_300) { +		if (host->clk_mul) { +			mmc->f_min = (host->max_clk * host->clk_mul) / 1024; +			mmc->f_max = host->max_clk * host->clk_mul; +		} else +			mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; +	} else +		mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; +  	host->timeout_clk = -		(caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT; +		(caps[0] & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT;  	if (host->timeout_clk == 0) {  		if (host->ops->get_timeout_clock) {  			host->timeout_clk = host->ops->get_timeout_clock(host);  		} else if (!(host->quirks &  				SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK)) { -			printk(KERN_ERR -			       "%s: Hardware doesn't specify timeout clock " +			pr_err("%s: Hardware doesn't specify timeout clock "  			       "frequency.\n", mmc_hostname(mmc));  			return -ENODEV;  		}  	} -	if (caps & SDHCI_TIMEOUT_CLK_UNIT) +	if (caps[0] & SDHCI_TIMEOUT_CLK_UNIT)  		host->timeout_clk *= 1000; +	if (host->quirks & SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK) +		host->timeout_clk = mmc->f_max / 1000; + +	mmc->max_busy_timeout = (1 << 27) / host->timeout_clk; + +	mmc->caps |= MMC_CAP_SDIO_IRQ | MMC_CAP_ERASE | MMC_CAP_CMD23; +	mmc->caps2 |= MMC_CAP2_SDIO_IRQ_NOTHREAD; + +	if (host->quirks & SDHCI_QUIRK_MULTIBLOCK_READ_ACMD12) +		host->flags |= SDHCI_AUTO_CMD12; + +	/* Auto-CMD23 stuff only works in ADMA or PIO. */ +	if ((host->version >= SDHCI_SPEC_300) && +	    ((host->flags & SDHCI_USE_ADMA) || +	     !(host->flags & SDHCI_USE_SDMA))) { +		host->flags |= SDHCI_AUTO_CMD23; +		DBG("%s: Auto-CMD23 available\n", mmc_hostname(mmc)); +	} else { +		DBG("%s: Auto-CMD23 unavailable\n", mmc_hostname(mmc)); +	} +  	/* -	 * Set host parameters. +	 * A controller may support 8-bit width, but the board itself +	 * might not have the pins brought out.  Boards that support +	 * 8-bit width must set "mmc->caps |= MMC_CAP_8_BIT_DATA;" in +	 * their platform code before calling sdhci_add_host(), and we +	 * won't assume 8-bit width for hosts without that CAP.  	 */ -	mmc->ops = &sdhci_ops; -	if (host->ops->get_min_clock) -		mmc->f_min = host->ops->get_min_clock(host); -	else if (host->version >= SDHCI_SPEC_300) -		mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; -	else -		mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_200; -	mmc->f_max = host->max_clk; -	mmc->caps |= MMC_CAP_SDIO_IRQ; -  	if (!(host->quirks & SDHCI_QUIRK_FORCE_1_BIT_DATA)) -		mmc->caps |= MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA; +		mmc->caps |= MMC_CAP_4_BIT_DATA; -	if (caps & SDHCI_CAN_DO_HISPD) +	if (host->quirks2 & SDHCI_QUIRK2_HOST_NO_CMD23) +		mmc->caps &= ~MMC_CAP_CMD23; + +	if (caps[0] & SDHCI_CAN_DO_HISPD)  		mmc->caps |= MMC_CAP_SD_HIGHSPEED | MMC_CAP_MMC_HIGHSPEED;  	if ((host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) && -	    mmc_card_is_removable(mmc)) +	    !(host->mmc->caps & MMC_CAP_NONREMOVABLE))  		mmc->caps |= MMC_CAP_NEEDS_POLL; -	mmc->ocr_avail = 0; -	if (caps & SDHCI_CAN_VDD_330) -		mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34; -	if (caps & SDHCI_CAN_VDD_300) -		mmc->ocr_avail |= MMC_VDD_29_30|MMC_VDD_30_31; -	if (caps & SDHCI_CAN_VDD_180) -		mmc->ocr_avail |= MMC_VDD_165_195; +	/* If vqmmc regulator and no 1.8V signalling, then there's no UHS */ +	host->vqmmc = regulator_get_optional(mmc_dev(mmc), "vqmmc"); +	if (IS_ERR_OR_NULL(host->vqmmc)) { +		if (PTR_ERR(host->vqmmc) < 0) { +			pr_info("%s: no vqmmc regulator found\n", +				mmc_hostname(mmc)); +			host->vqmmc = NULL; +		} +	} else { +		ret = regulator_enable(host->vqmmc); +		if (!regulator_is_supported_voltage(host->vqmmc, 1700000, +			1950000)) +			caps[1] &= ~(SDHCI_SUPPORT_SDR104 | +					SDHCI_SUPPORT_SDR50 | +					SDHCI_SUPPORT_DDR50); +		if (ret) { +			pr_warn("%s: Failed to enable vqmmc regulator: %d\n", +				mmc_hostname(mmc), ret); +			host->vqmmc = NULL; +		} +	} + +	if (host->quirks2 & SDHCI_QUIRK2_NO_1_8_V) +		caps[1] &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 | +		       SDHCI_SUPPORT_DDR50); + +	/* Any UHS-I mode in caps implies SDR12 and SDR25 support. */ +	if (caps[1] & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 | +		       SDHCI_SUPPORT_DDR50)) +		mmc->caps |= MMC_CAP_UHS_SDR12 | MMC_CAP_UHS_SDR25; + +	/* SDR104 supports also implies SDR50 support */ +	if (caps[1] & SDHCI_SUPPORT_SDR104) { +		mmc->caps |= MMC_CAP_UHS_SDR104 | MMC_CAP_UHS_SDR50; +		/* SD3.0: SDR104 is supported so (for eMMC) the caps2 +		 * field can be promoted to support HS200. +		 */ +		if (!(host->quirks2 & SDHCI_QUIRK2_BROKEN_HS200)) +			mmc->caps2 |= MMC_CAP2_HS200; +	} else if (caps[1] & SDHCI_SUPPORT_SDR50) +		mmc->caps |= MMC_CAP_UHS_SDR50; + +	if ((caps[1] & SDHCI_SUPPORT_DDR50) && +		!(host->quirks2 & SDHCI_QUIRK2_BROKEN_DDR50)) +		mmc->caps |= MMC_CAP_UHS_DDR50; + +	/* Does the host need tuning for SDR50? */ +	if (caps[1] & SDHCI_USE_SDR50_TUNING) +		host->flags |= SDHCI_SDR50_NEEDS_TUNING; + +	/* Does the host need tuning for SDR104 / HS200? */ +	if (mmc->caps2 & MMC_CAP2_HS200) +		host->flags |= SDHCI_SDR104_NEEDS_TUNING; + +	/* Driver Type(s) (A, C, D) supported by the host */ +	if (caps[1] & SDHCI_DRIVER_TYPE_A) +		mmc->caps |= MMC_CAP_DRIVER_TYPE_A; +	if (caps[1] & SDHCI_DRIVER_TYPE_C) +		mmc->caps |= MMC_CAP_DRIVER_TYPE_C; +	if (caps[1] & SDHCI_DRIVER_TYPE_D) +		mmc->caps |= MMC_CAP_DRIVER_TYPE_D; + +	/* Initial value for re-tuning timer count */ +	host->tuning_count = (caps[1] & SDHCI_RETUNING_TIMER_COUNT_MASK) >> +			      SDHCI_RETUNING_TIMER_COUNT_SHIFT; + +	/* +	 * In case Re-tuning Timer is not disabled, the actual value of +	 * re-tuning timer will be 2 ^ (n - 1). +	 */ +	if (host->tuning_count) +		host->tuning_count = 1 << (host->tuning_count - 1); + +	/* Re-tuning mode supported by the Host Controller */ +	host->tuning_mode = (caps[1] & SDHCI_RETUNING_MODE_MASK) >> +			     SDHCI_RETUNING_MODE_SHIFT; + +	ocr_avail = 0; + +	host->vmmc = regulator_get_optional(mmc_dev(mmc), "vmmc"); +	if (IS_ERR_OR_NULL(host->vmmc)) { +		if (PTR_ERR(host->vmmc) < 0) { +			pr_info("%s: no vmmc regulator found\n", +				mmc_hostname(mmc)); +			host->vmmc = NULL; +		} +	} + +#ifdef CONFIG_REGULATOR +	/* +	 * Voltage range check makes sense only if regulator reports +	 * any voltage value. +	 */ +	if (host->vmmc && regulator_get_voltage(host->vmmc) > 0) { +		ret = regulator_is_supported_voltage(host->vmmc, 2700000, +			3600000); +		if ((ret <= 0) || (!(caps[0] & SDHCI_CAN_VDD_330))) +			caps[0] &= ~SDHCI_CAN_VDD_330; +		if ((ret <= 0) || (!(caps[0] & SDHCI_CAN_VDD_300))) +			caps[0] &= ~SDHCI_CAN_VDD_300; +		ret = regulator_is_supported_voltage(host->vmmc, 1700000, +			1950000); +		if ((ret <= 0) || (!(caps[0] & SDHCI_CAN_VDD_180))) +			caps[0] &= ~SDHCI_CAN_VDD_180; +	} +#endif /* CONFIG_REGULATOR */ + +	/* +	 * According to SD Host Controller spec v3.00, if the Host System +	 * can afford more than 150mA, Host Driver should set XPC to 1. Also +	 * the value is meaningful only if Voltage Support in the Capabilities +	 * register is set. The actual current value is 4 times the register +	 * value. +	 */ +	max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT); +	if (!max_current_caps && host->vmmc) { +		u32 curr = regulator_get_current_limit(host->vmmc); +		if (curr > 0) { + +			/* convert to SDHCI_MAX_CURRENT format */ +			curr = curr/1000;  /* convert to mA */ +			curr = curr/SDHCI_MAX_CURRENT_MULTIPLIER; + +			curr = min_t(u32, curr, SDHCI_MAX_CURRENT_LIMIT); +			max_current_caps = +				(curr << SDHCI_MAX_CURRENT_330_SHIFT) | +				(curr << SDHCI_MAX_CURRENT_300_SHIFT) | +				(curr << SDHCI_MAX_CURRENT_180_SHIFT); +		} +	} + +	if (caps[0] & SDHCI_CAN_VDD_330) { +		ocr_avail |= MMC_VDD_32_33 | MMC_VDD_33_34; + +		mmc->max_current_330 = ((max_current_caps & +				   SDHCI_MAX_CURRENT_330_MASK) >> +				   SDHCI_MAX_CURRENT_330_SHIFT) * +				   SDHCI_MAX_CURRENT_MULTIPLIER; +	} +	if (caps[0] & SDHCI_CAN_VDD_300) { +		ocr_avail |= MMC_VDD_29_30 | MMC_VDD_30_31; + +		mmc->max_current_300 = ((max_current_caps & +				   SDHCI_MAX_CURRENT_300_MASK) >> +				   SDHCI_MAX_CURRENT_300_SHIFT) * +				   SDHCI_MAX_CURRENT_MULTIPLIER; +	} +	if (caps[0] & SDHCI_CAN_VDD_180) { +		ocr_avail |= MMC_VDD_165_195; + +		mmc->max_current_180 = ((max_current_caps & +				   SDHCI_MAX_CURRENT_180_MASK) >> +				   SDHCI_MAX_CURRENT_180_SHIFT) * +				   SDHCI_MAX_CURRENT_MULTIPLIER; +	} + +	if (host->ocr_mask) +		ocr_avail = host->ocr_mask; + +	mmc->ocr_avail = ocr_avail; +	mmc->ocr_avail_sdio = ocr_avail; +	if (host->ocr_avail_sdio) +		mmc->ocr_avail_sdio &= host->ocr_avail_sdio; +	mmc->ocr_avail_sd = ocr_avail; +	if (host->ocr_avail_sd) +		mmc->ocr_avail_sd &= host->ocr_avail_sd; +	else /* normal SD controllers don't support 1.8V */ +		mmc->ocr_avail_sd &= ~MMC_VDD_165_195; +	mmc->ocr_avail_mmc = ocr_avail; +	if (host->ocr_avail_mmc) +		mmc->ocr_avail_mmc &= host->ocr_avail_mmc;  	if (mmc->ocr_avail == 0) { -		printk(KERN_ERR "%s: Hardware doesn't report any " +		pr_err("%s: Hardware doesn't report any "  			"support voltages.\n", mmc_hostname(mmc));  		return -ENODEV;  	} @@ -1896,10 +3164,14 @@ int sdhci_add_host(struct sdhci_host *host)  	 * of bytes. When doing hardware scatter/gather, each entry cannot  	 * be larger than 64 KiB though.  	 */ -	if (host->flags & SDHCI_USE_ADMA) -		mmc->max_seg_size = 65536; -	else +	if (host->flags & SDHCI_USE_ADMA) { +		if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) +			mmc->max_seg_size = 65535; +		else +			mmc->max_seg_size = 65536; +	} else {  		mmc->max_seg_size = mmc->max_req_size; +	}  	/*  	 * Maximum block size. This varies from controller to controller and @@ -1908,10 +3180,10 @@ int sdhci_add_host(struct sdhci_host *host)  	if (host->quirks & SDHCI_QUIRK_FORCE_BLK_SZ_2048) {  		mmc->max_blk_size = 2;  	} else { -		mmc->max_blk_size = (caps & SDHCI_MAX_BLOCK_MASK) >> +		mmc->max_blk_size = (caps[0] & SDHCI_MAX_BLOCK_MASK) >>  				SDHCI_MAX_BLOCK_SHIFT;  		if (mmc->max_blk_size >= 3) { -			printk(KERN_WARNING "%s: Invalid maximum block size, " +			pr_warning("%s: Invalid maximum block size, "  				"assuming 512 bytes\n", mmc_hostname(mmc));  			mmc->max_blk_size = 0;  		} @@ -1927,28 +3199,30 @@ int sdhci_add_host(struct sdhci_host *host)  	/*  	 * Init tasklets.  	 */ -	tasklet_init(&host->card_tasklet, -		sdhci_tasklet_card, (unsigned long)host);  	tasklet_init(&host->finish_tasklet,  		sdhci_tasklet_finish, (unsigned long)host);  	setup_timer(&host->timer, sdhci_timeout_timer, (unsigned long)host); -	ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED, -		mmc_hostname(mmc), host); -	if (ret) -		goto untasklet; +	if (host->version >= SDHCI_SPEC_300) { +		init_waitqueue_head(&host->buf_ready_int); -	host->vmmc = regulator_get(mmc_dev(mmc), "vmmc"); -	if (IS_ERR(host->vmmc)) { -		printk(KERN_INFO "%s: no vmmc regulator found\n", mmc_hostname(mmc)); -		host->vmmc = NULL; -	} else { -		regulator_enable(host->vmmc); +		/* Initialize re-tuning timer */ +		init_timer(&host->tuning_timer); +		host->tuning_timer.data = (unsigned long)host; +		host->tuning_timer.function = sdhci_tuning_timer;  	}  	sdhci_init(host, 0); +	ret = request_threaded_irq(host->irq, sdhci_irq, sdhci_thread_irq, +				   IRQF_SHARED,	mmc_hostname(mmc), host); +	if (ret) { +		pr_err("%s: Failed to request IRQ %d: %d\n", +		       mmc_hostname(mmc), host->irq, ret); +		goto untasklet; +	} +  #ifdef CONFIG_MMC_DEBUG  	sdhci_dumpregs(host);  #endif @@ -1962,15 +3236,18 @@ int sdhci_add_host(struct sdhci_host *host)  	host->led.brightness_set = sdhci_led_control;  	ret = led_classdev_register(mmc_dev(mmc), &host->led); -	if (ret) +	if (ret) { +		pr_err("%s: Failed to register LED device: %d\n", +		       mmc_hostname(mmc), ret);  		goto reset; +	}  #endif  	mmiowb();  	mmc_add_host(mmc); -	printk(KERN_INFO "%s: SDHCI controller on %s [%s] using %s\n", +	pr_info("%s: SDHCI controller on %s [%s] using %s\n",  		mmc_hostname(mmc), host->hw_name, dev_name(mmc_dev(mmc)),  		(host->flags & SDHCI_USE_ADMA) ? "ADMA" :  		(host->flags & SDHCI_USE_SDMA) ? "DMA" : "PIO"); @@ -1981,11 +3258,12 @@ int sdhci_add_host(struct sdhci_host *host)  #ifdef SDHCI_USE_LEDS_CLASS  reset: -	sdhci_reset(host, SDHCI_RESET_ALL); +	sdhci_do_reset(host, SDHCI_RESET_ALL); +	sdhci_writel(host, 0, SDHCI_INT_ENABLE); +	sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE);  	free_irq(host->irq, host);  #endif  untasklet: -	tasklet_kill(&host->card_tasklet);  	tasklet_kill(&host->finish_tasklet);  	return ret; @@ -2003,7 +3281,7 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)  		host->flags |= SDHCI_DEVICE_DEAD;  		if (host->mrq) { -			printk(KERN_ERR "%s: Controller removed during " +			pr_err("%s: Controller removed during "  				" transfer!\n", mmc_hostname(host->mmc));  			host->mrq->cmd->error = -ENOMEDIUM; @@ -2022,13 +3300,14 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)  #endif  	if (!dead) -		sdhci_reset(host, SDHCI_RESET_ALL); +		sdhci_do_reset(host, SDHCI_RESET_ALL); +	sdhci_writel(host, 0, SDHCI_INT_ENABLE); +	sdhci_writel(host, 0, SDHCI_SIGNAL_ENABLE);  	free_irq(host->irq, host);  	del_timer_sync(&host->timer); -	tasklet_kill(&host->card_tasklet);  	tasklet_kill(&host->finish_tasklet);  	if (host->vmmc) { @@ -2036,7 +3315,14 @@ void sdhci_remove_host(struct sdhci_host *host, int dead)  		regulator_put(host->vmmc);  	} -	kfree(host->adma_desc); +	if (host->vqmmc) { +		regulator_disable(host->vqmmc); +		regulator_put(host->vqmmc); +	} + +	if (host->adma_desc) +		dma_free_coherent(mmc_dev(host->mmc), ADMA_SIZE, +				  host->adma_desc, host->adma_addr);  	kfree(host->align_buffer);  	host->adma_desc = NULL; @@ -2060,9 +3346,9 @@ EXPORT_SYMBOL_GPL(sdhci_free_host);  static int __init sdhci_drv_init(void)  { -	printk(KERN_INFO DRIVER_NAME +	pr_info(DRIVER_NAME  		": Secure Digital Host Controller Interface driver\n"); -	printk(KERN_INFO DRIVER_NAME ": Copyright(c) Pierre Ossman\n"); +	pr_info(DRIVER_NAME ": Copyright(c) Pierre Ossman\n");  	return 0;  } @@ -2075,9 +3361,11 @@ module_init(sdhci_drv_init);  module_exit(sdhci_drv_exit);  module_param(debug_quirks, uint, 0444); +module_param(debug_quirks2, uint, 0444);  MODULE_AUTHOR("Pierre Ossman <pierre@ossman.eu>");  MODULE_DESCRIPTION("Secure Digital Host Controller Interface core driver");  MODULE_LICENSE("GPL");  MODULE_PARM_DESC(debug_quirks, "Force certain quirks."); +MODULE_PARM_DESC(debug_quirks2, "Force certain other quirks.");  | 
