mmc: start removing enable / disable API
Most parts of the enable / disable API are no longer used and can be removed. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Tested-by: Venkatraman S <svenkatr@ti.com> Tested-by: Jaehoon Chung <jh80.chung@samsung.com> Signed-off-by: Chris Ball <cjb@laptop.org>
This commit is contained in:
		
					parent
					
						
							
								4b1a61705a
							
						
					
				
			
			
				commit
				
					
						907d2e7cc7
					
				
			
		
					 9 changed files with 27 additions and 242 deletions
				
			
		| 
						 | 
					@ -109,7 +109,7 @@ static struct s3c_sdhci_platdata nuri_hsmmc0_data __initdata = {
 | 
				
			||||||
	.max_width		= 8,
 | 
						.max_width		= 8,
 | 
				
			||||||
	.host_caps		= (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
 | 
						.host_caps		= (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
 | 
				
			||||||
				MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
									MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
				
			||||||
				MMC_CAP_DISABLE | MMC_CAP_ERASE),
 | 
									MMC_CAP_ERASE),
 | 
				
			||||||
	.cd_type		= S3C_SDHCI_CD_PERMANENT,
 | 
						.cd_type		= S3C_SDHCI_CD_PERMANENT,
 | 
				
			||||||
	.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,
 | 
						.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -148,8 +148,7 @@ static struct platform_device emmc_fixed_voltage = {
 | 
				
			||||||
static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
 | 
					static struct s3c_sdhci_platdata nuri_hsmmc2_data __initdata = {
 | 
				
			||||||
	.max_width		= 4,
 | 
						.max_width		= 4,
 | 
				
			||||||
	.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
						.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
				
			||||||
				MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
									MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
 | 
				
			||||||
				MMC_CAP_DISABLE,
 | 
					 | 
				
			||||||
	.ext_cd_gpio		= EXYNOS4_GPX3(3),	/* XEINT_27 */
 | 
						.ext_cd_gpio		= EXYNOS4_GPX3(3),	/* XEINT_27 */
 | 
				
			||||||
	.ext_cd_gpio_invert	= 1,
 | 
						.ext_cd_gpio_invert	= 1,
 | 
				
			||||||
	.cd_type		= S3C_SDHCI_CD_GPIO,
 | 
						.cd_type		= S3C_SDHCI_CD_GPIO,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -736,8 +736,7 @@ static struct platform_device universal_gpio_keys = {
 | 
				
			||||||
static struct s3c_sdhci_platdata universal_hsmmc0_data __initdata = {
 | 
					static struct s3c_sdhci_platdata universal_hsmmc0_data __initdata = {
 | 
				
			||||||
	.max_width		= 8,
 | 
						.max_width		= 8,
 | 
				
			||||||
	.host_caps		= (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
 | 
						.host_caps		= (MMC_CAP_8_BIT_DATA | MMC_CAP_4_BIT_DATA |
 | 
				
			||||||
				MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
									MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
 | 
				
			||||||
				MMC_CAP_DISABLE),
 | 
					 | 
				
			||||||
	.cd_type		= S3C_SDHCI_CD_PERMANENT,
 | 
						.cd_type		= S3C_SDHCI_CD_PERMANENT,
 | 
				
			||||||
	.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,
 | 
						.clk_type		= S3C_SDHCI_CLK_DIV_EXTERNAL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -775,8 +774,7 @@ static struct platform_device mmc0_fixed_voltage = {
 | 
				
			||||||
static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = {
 | 
					static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = {
 | 
				
			||||||
	.max_width		= 4,
 | 
						.max_width		= 4,
 | 
				
			||||||
	.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
						.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
				
			||||||
				MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
									MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
 | 
				
			||||||
				MMC_CAP_DISABLE,
 | 
					 | 
				
			||||||
	.ext_cd_gpio		= EXYNOS4_GPX3(4),      /* XEINT_28 */
 | 
						.ext_cd_gpio		= EXYNOS4_GPX3(4),      /* XEINT_28 */
 | 
				
			||||||
	.ext_cd_gpio_invert	= 1,
 | 
						.ext_cd_gpio_invert	= 1,
 | 
				
			||||||
	.cd_type		= S3C_SDHCI_CD_GPIO,
 | 
						.cd_type		= S3C_SDHCI_CD_GPIO,
 | 
				
			||||||
| 
						 | 
					@ -787,8 +785,7 @@ static struct s3c_sdhci_platdata universal_hsmmc2_data __initdata = {
 | 
				
			||||||
static struct s3c_sdhci_platdata universal_hsmmc3_data __initdata = {
 | 
					static struct s3c_sdhci_platdata universal_hsmmc3_data __initdata = {
 | 
				
			||||||
	.max_width		= 4,
 | 
						.max_width		= 4,
 | 
				
			||||||
	.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
						.host_caps		= MMC_CAP_4_BIT_DATA |
 | 
				
			||||||
				MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED |
 | 
									MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
 | 
				
			||||||
				MMC_CAP_DISABLE,
 | 
					 | 
				
			||||||
	.cd_type		= S3C_SDHCI_CD_EXTERNAL,
 | 
						.cd_type		= S3C_SDHCI_CD_EXTERNAL,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -604,105 +604,6 @@ unsigned int mmc_align_data_size(struct mmc_card *card, unsigned int sz)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(mmc_align_data_size);
 | 
					EXPORT_SYMBOL(mmc_align_data_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 *	mmc_host_enable - enable a host.
 | 
					 | 
				
			||||||
 *	@host: mmc host to enable
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *	Hosts that support power saving can use the 'enable' and 'disable'
 | 
					 | 
				
			||||||
 *	methods to exit and enter power saving states. For more information
 | 
					 | 
				
			||||||
 *	see comments for struct mmc_host_ops.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int mmc_host_enable(struct mmc_host *host)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!(host->caps & MMC_CAP_DISABLE))
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->en_dis_recurs)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->nesting_cnt++)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cancel_delayed_work_sync(&host->disable);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->enabled)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->ops->enable) {
 | 
					 | 
				
			||||||
		int err;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		host->en_dis_recurs = 1;
 | 
					 | 
				
			||||||
		mmc_host_clk_hold(host);
 | 
					 | 
				
			||||||
		err = host->ops->enable(host);
 | 
					 | 
				
			||||||
		mmc_host_clk_release(host);
 | 
					 | 
				
			||||||
		host->en_dis_recurs = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (err) {
 | 
					 | 
				
			||||||
			pr_debug("%s: enable error %d\n",
 | 
					 | 
				
			||||||
				 mmc_hostname(host), err);
 | 
					 | 
				
			||||||
			return err;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	host->enabled = 1;
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(mmc_host_enable);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int mmc_host_do_disable(struct mmc_host *host, int lazy)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (host->ops->disable) {
 | 
					 | 
				
			||||||
		int err;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		host->en_dis_recurs = 1;
 | 
					 | 
				
			||||||
		mmc_host_clk_hold(host);
 | 
					 | 
				
			||||||
		err = host->ops->disable(host, lazy);
 | 
					 | 
				
			||||||
		mmc_host_clk_release(host);
 | 
					 | 
				
			||||||
		host->en_dis_recurs = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (err < 0) {
 | 
					 | 
				
			||||||
			pr_debug("%s: disable error %d\n",
 | 
					 | 
				
			||||||
				 mmc_hostname(host), err);
 | 
					 | 
				
			||||||
			return err;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if (err > 0) {
 | 
					 | 
				
			||||||
			unsigned long delay = msecs_to_jiffies(err);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			mmc_schedule_delayed_work(&host->disable, delay);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	host->enabled = 0;
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 *	mmc_host_disable - disable a host.
 | 
					 | 
				
			||||||
 *	@host: mmc host to disable
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *	Hosts that support power saving can use the 'enable' and 'disable'
 | 
					 | 
				
			||||||
 *	methods to exit and enter power saving states. For more information
 | 
					 | 
				
			||||||
 *	see comments for struct mmc_host_ops.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int mmc_host_disable(struct mmc_host *host)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	int err;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!(host->caps & MMC_CAP_DISABLE))
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->en_dis_recurs)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (--host->nesting_cnt)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!host->enabled)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	err = mmc_host_do_disable(host, 0);
 | 
					 | 
				
			||||||
	return err;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(mmc_host_disable);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 *	__mmc_claim_host - exclusively claim a host
 | 
					 *	__mmc_claim_host - exclusively claim a host
 | 
				
			||||||
 *	@host: mmc host to claim
 | 
					 *	@host: mmc host to claim
 | 
				
			||||||
| 
						 | 
					@ -741,8 +642,8 @@ int __mmc_claim_host(struct mmc_host *host, atomic_t *abort)
 | 
				
			||||||
		wake_up(&host->wq);
 | 
							wake_up(&host->wq);
 | 
				
			||||||
	spin_unlock_irqrestore(&host->lock, flags);
 | 
						spin_unlock_irqrestore(&host->lock, flags);
 | 
				
			||||||
	remove_wait_queue(&host->wq, &wait);
 | 
						remove_wait_queue(&host->wq, &wait);
 | 
				
			||||||
	if (!stop)
 | 
						if (host->ops->enable && !stop && host->claim_cnt == 1)
 | 
				
			||||||
		mmc_host_enable(host);
 | 
							host->ops->enable(host);
 | 
				
			||||||
	return stop;
 | 
						return stop;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -767,21 +668,28 @@ int mmc_try_claim_host(struct mmc_host *host)
 | 
				
			||||||
		claimed_host = 1;
 | 
							claimed_host = 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	spin_unlock_irqrestore(&host->lock, flags);
 | 
						spin_unlock_irqrestore(&host->lock, flags);
 | 
				
			||||||
 | 
						if (host->ops->enable && claimed_host && host->claim_cnt == 1)
 | 
				
			||||||
 | 
							host->ops->enable(host);
 | 
				
			||||||
	return claimed_host;
 | 
						return claimed_host;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(mmc_try_claim_host);
 | 
					EXPORT_SYMBOL(mmc_try_claim_host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 *	mmc_do_release_host - release a claimed host
 | 
					 *	mmc_release_host - release a host
 | 
				
			||||||
 *	@host: mmc host to release
 | 
					 *	@host: mmc host to release
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *	If you successfully claimed a host, this function will
 | 
					 *	Release a MMC host, allowing others to claim the host
 | 
				
			||||||
 *	release it again.
 | 
					 *	for their operations.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void mmc_do_release_host(struct mmc_host *host)
 | 
					void mmc_release_host(struct mmc_host *host)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						WARN_ON(!host->claimed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (host->ops->disable && host->claim_cnt == 1)
 | 
				
			||||||
 | 
							host->ops->disable(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_lock_irqsave(&host->lock, flags);
 | 
						spin_lock_irqsave(&host->lock, flags);
 | 
				
			||||||
	if (--host->claim_cnt) {
 | 
						if (--host->claim_cnt) {
 | 
				
			||||||
		/* Release for nested claim */
 | 
							/* Release for nested claim */
 | 
				
			||||||
| 
						 | 
					@ -793,67 +701,6 @@ void mmc_do_release_host(struct mmc_host *host)
 | 
				
			||||||
		wake_up(&host->wq);
 | 
							wake_up(&host->wq);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL(mmc_do_release_host);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void mmc_host_deeper_disable(struct work_struct *work)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct mmc_host *host =
 | 
					 | 
				
			||||||
		container_of(work, struct mmc_host, disable.work);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* If the host is claimed then we do not want to disable it anymore */
 | 
					 | 
				
			||||||
	if (!mmc_try_claim_host(host))
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
	mmc_host_do_disable(host, 1);
 | 
					 | 
				
			||||||
	mmc_do_release_host(host);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 *	mmc_host_lazy_disable - lazily disable a host.
 | 
					 | 
				
			||||||
 *	@host: mmc host to disable
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *	Hosts that support power saving can use the 'enable' and 'disable'
 | 
					 | 
				
			||||||
 *	methods to exit and enter power saving states. For more information
 | 
					 | 
				
			||||||
 *	see comments for struct mmc_host_ops.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
int mmc_host_lazy_disable(struct mmc_host *host)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	if (!(host->caps & MMC_CAP_DISABLE))
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->en_dis_recurs)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (--host->nesting_cnt)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!host->enabled)
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (host->disable_delay) {
 | 
					 | 
				
			||||||
		mmc_schedule_delayed_work(&host->disable,
 | 
					 | 
				
			||||||
				msecs_to_jiffies(host->disable_delay));
 | 
					 | 
				
			||||||
		return 0;
 | 
					 | 
				
			||||||
	} else
 | 
					 | 
				
			||||||
		return mmc_host_do_disable(host, 1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(mmc_host_lazy_disable);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 *	mmc_release_host - release a host
 | 
					 | 
				
			||||||
 *	@host: mmc host to release
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 *	Release a MMC host, allowing others to claim the host
 | 
					 | 
				
			||||||
 *	for their operations.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
void mmc_release_host(struct mmc_host *host)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	WARN_ON(!host->claimed);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mmc_host_lazy_disable(host);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mmc_do_release_host(host);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(mmc_release_host);
 | 
					EXPORT_SYMBOL(mmc_release_host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -2227,8 +2074,6 @@ void mmc_stop_host(struct mmc_host *host)
 | 
				
			||||||
	spin_unlock_irqrestore(&host->lock, flags);
 | 
						spin_unlock_irqrestore(&host->lock, flags);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (host->caps & MMC_CAP_DISABLE)
 | 
					 | 
				
			||||||
		cancel_delayed_work(&host->disable);
 | 
					 | 
				
			||||||
	cancel_delayed_work_sync(&host->detect);
 | 
						cancel_delayed_work_sync(&host->detect);
 | 
				
			||||||
	mmc_flush_scheduled_work();
 | 
						mmc_flush_scheduled_work();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2423,13 +2268,11 @@ int mmc_suspend_host(struct mmc_host *host)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int err = 0;
 | 
						int err = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (host->caps & MMC_CAP_DISABLE)
 | 
					 | 
				
			||||||
		cancel_delayed_work(&host->disable);
 | 
					 | 
				
			||||||
	cancel_delayed_work(&host->detect);
 | 
						cancel_delayed_work(&host->detect);
 | 
				
			||||||
	mmc_flush_scheduled_work();
 | 
						mmc_flush_scheduled_work();
 | 
				
			||||||
	if (mmc_try_claim_host(host)) {
 | 
						if (mmc_try_claim_host(host)) {
 | 
				
			||||||
		err = mmc_cache_ctrl(host, 0);
 | 
							err = mmc_cache_ctrl(host, 0);
 | 
				
			||||||
		mmc_do_release_host(host);
 | 
							mmc_release_host(host);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		err = -EBUSY;
 | 
							err = -EBUSY;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -2450,7 +2293,7 @@ int mmc_suspend_host(struct mmc_host *host)
 | 
				
			||||||
			if (host->bus_ops->suspend) {
 | 
								if (host->bus_ops->suspend) {
 | 
				
			||||||
				err = host->bus_ops->suspend(host);
 | 
									err = host->bus_ops->suspend(host);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			mmc_do_release_host(host);
 | 
								mmc_release_host(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (err == -ENOSYS || !host->bus_ops->resume) {
 | 
								if (err == -ENOSYS || !host->bus_ops->resume) {
 | 
				
			||||||
				/*
 | 
									/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -330,7 +330,6 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev)
 | 
				
			||||||
	spin_lock_init(&host->lock);
 | 
						spin_lock_init(&host->lock);
 | 
				
			||||||
	init_waitqueue_head(&host->wq);
 | 
						init_waitqueue_head(&host->wq);
 | 
				
			||||||
	INIT_DELAYED_WORK(&host->detect, mmc_rescan);
 | 
						INIT_DELAYED_WORK(&host->detect, mmc_rescan);
 | 
				
			||||||
	INIT_DELAYED_WORK_DEFERRABLE(&host->disable, mmc_host_deeper_disable);
 | 
					 | 
				
			||||||
#ifdef CONFIG_PM
 | 
					#ifdef CONFIG_PM
 | 
				
			||||||
	host->pm_notify.notifier_call = mmc_pm_notify;
 | 
						host->pm_notify.notifier_call = mmc_pm_notify;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mmc_register_host_class(void);
 | 
					int mmc_register_host_class(void);
 | 
				
			||||||
void mmc_unregister_host_class(void);
 | 
					void mmc_unregister_host_class(void);
 | 
				
			||||||
void mmc_host_deeper_disable(struct work_struct *work);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1418,17 +1418,14 @@ static int davinci_mmcsd_suspend(struct device *dev)
 | 
				
			||||||
	struct mmc_davinci_host *host = platform_get_drvdata(pdev);
 | 
						struct mmc_davinci_host *host = platform_get_drvdata(pdev);
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mmc_host_enable(host->mmc);
 | 
					 | 
				
			||||||
	ret = mmc_suspend_host(host->mmc);
 | 
						ret = mmc_suspend_host(host->mmc);
 | 
				
			||||||
	if (!ret) {
 | 
						if (!ret) {
 | 
				
			||||||
		writel(0, host->base + DAVINCI_MMCIM);
 | 
							writel(0, host->base + DAVINCI_MMCIM);
 | 
				
			||||||
		mmc_davinci_reset_ctrl(host, 1);
 | 
							mmc_davinci_reset_ctrl(host, 1);
 | 
				
			||||||
		mmc_host_disable(host->mmc);
 | 
					 | 
				
			||||||
		clk_disable(host->clk);
 | 
							clk_disable(host->clk);
 | 
				
			||||||
		host->suspended = 1;
 | 
							host->suspended = 1;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		host->suspended = 0;
 | 
							host->suspended = 0;
 | 
				
			||||||
		mmc_host_disable(host->mmc);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
| 
						 | 
					@ -1444,7 +1441,6 @@ static int davinci_mmcsd_resume(struct device *dev)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_enable(host->clk);
 | 
						clk_enable(host->clk);
 | 
				
			||||||
	mmc_host_enable(host->mmc);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mmc_davinci_reset_ctrl(host, 0);
 | 
						mmc_davinci_reset_ctrl(host, 0);
 | 
				
			||||||
	ret = mmc_resume_host(host->mmc);
 | 
						ret = mmc_resume_host(host->mmc);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,7 +167,6 @@ struct omap_hsmmc_host {
 | 
				
			||||||
	int			got_dbclk;
 | 
						int			got_dbclk;
 | 
				
			||||||
	int			response_busy;
 | 
						int			response_busy;
 | 
				
			||||||
	int			context_loss;
 | 
						int			context_loss;
 | 
				
			||||||
	int			dpm_state;
 | 
					 | 
				
			||||||
	int			vdd;
 | 
						int			vdd;
 | 
				
			||||||
	int			protect_card;
 | 
						int			protect_card;
 | 
				
			||||||
	int			reqs_blocked;
 | 
						int			reqs_blocked;
 | 
				
			||||||
| 
						 | 
					@ -1619,7 +1618,7 @@ static int omap_hsmmc_enable_fclk(struct mmc_host *mmc)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int omap_hsmmc_disable_fclk(struct mmc_host *mmc, int lazy)
 | 
					static int omap_hsmmc_disable_fclk(struct mmc_host *mmc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct omap_hsmmc_host *host = mmc_priv(mmc);
 | 
						struct omap_hsmmc_host *host = mmc_priv(mmc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1653,15 +1652,8 @@ static int omap_hsmmc_regs_show(struct seq_file *s, void *data)
 | 
				
			||||||
	if (host->pdata->get_context_loss_count)
 | 
						if (host->pdata->get_context_loss_count)
 | 
				
			||||||
		context_loss = host->pdata->get_context_loss_count(host->dev);
 | 
							context_loss = host->pdata->get_context_loss_count(host->dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	seq_printf(s, "mmc%d:\n"
 | 
						seq_printf(s, "mmc%d:\n ctx_loss:\t%d:%d\n\nregs:\n",
 | 
				
			||||||
			" enabled:\t%d\n"
 | 
								mmc->index, host->context_loss, context_loss);
 | 
				
			||||||
			" dpm_state:\t%d\n"
 | 
					 | 
				
			||||||
			" nesting_cnt:\t%d\n"
 | 
					 | 
				
			||||||
			" ctx_loss:\t%d:%d\n"
 | 
					 | 
				
			||||||
			"\nregs:\n",
 | 
					 | 
				
			||||||
			mmc->index, mmc->enabled ? 1 : 0,
 | 
					 | 
				
			||||||
			host->dpm_state, mmc->nesting_cnt,
 | 
					 | 
				
			||||||
			host->context_loss, context_loss);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (host->suspended) {
 | 
						if (host->suspended) {
 | 
				
			||||||
		seq_printf(s, "host suspended, can't read registers\n");
 | 
							seq_printf(s, "host suspended, can't read registers\n");
 | 
				
			||||||
| 
						 | 
					@ -1800,7 +1792,6 @@ static int __init omap_hsmmc_probe(struct platform_device *pdev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	omap_hsmmc_context_save(host);
 | 
						omap_hsmmc_context_save(host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mmc->caps |= MMC_CAP_DISABLE;
 | 
					 | 
				
			||||||
	if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) {
 | 
						if (host->pdata->controller_flags & OMAP_HSMMC_BROKEN_MULTIBLOCK_READ) {
 | 
				
			||||||
		dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n");
 | 
							dev_info(&pdev->dev, "multiblock reads disabled due to 35xx erratum 2.1.1.128; MMC read performance may suffer\n");
 | 
				
			||||||
		mmc->caps2 |= MMC_CAP2_NO_MULTI_READ;
 | 
							mmc->caps2 |= MMC_CAP2_NO_MULTI_READ;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -175,7 +175,6 @@ extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
 | 
					extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
 | 
				
			||||||
extern void mmc_release_host(struct mmc_host *host);
 | 
					extern void mmc_release_host(struct mmc_host *host);
 | 
				
			||||||
extern void mmc_do_release_host(struct mmc_host *host);
 | 
					 | 
				
			||||||
extern int mmc_try_claim_host(struct mmc_host *host);
 | 
					extern int mmc_try_claim_host(struct mmc_host *host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int mmc_flush_cache(struct mmc_card *);
 | 
					extern int mmc_flush_cache(struct mmc_card *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -80,34 +80,11 @@ struct mmc_ios {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct mmc_host_ops {
 | 
					struct mmc_host_ops {
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Hosts that support power saving can use the 'enable' and 'disable'
 | 
						 * 'enable' is called when the host is claimed and 'disable' is called
 | 
				
			||||||
	 * methods to exit and enter power saving states. 'enable' is called
 | 
						 * when the host is released. 'enable' and 'disable' are deprecated.
 | 
				
			||||||
	 * when the host is claimed and 'disable' is called (or scheduled with
 | 
					 | 
				
			||||||
	 * a delay) when the host is released. The 'disable' is scheduled if
 | 
					 | 
				
			||||||
	 * the disable delay set by 'mmc_set_disable_delay()' is non-zero,
 | 
					 | 
				
			||||||
	 * otherwise 'disable' is called immediately. 'disable' may be
 | 
					 | 
				
			||||||
	 * scheduled repeatedly, to permit ever greater power saving at the
 | 
					 | 
				
			||||||
	 * expense of ever greater latency to re-enable. Rescheduling is
 | 
					 | 
				
			||||||
	 * determined by the return value of the 'disable' method. A positive
 | 
					 | 
				
			||||||
	 * value gives the delay in milliseconds.
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * In the case where a host function (like set_ios) may be called
 | 
					 | 
				
			||||||
	 * with or without the host claimed, enabling and disabling can be
 | 
					 | 
				
			||||||
	 * done directly and will nest correctly. Call 'mmc_host_enable()' and
 | 
					 | 
				
			||||||
	 * 'mmc_host_lazy_disable()' for this purpose, but note that these
 | 
					 | 
				
			||||||
	 * functions must be paired.
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * Alternatively, 'mmc_host_enable()' may be paired with
 | 
					 | 
				
			||||||
	 * 'mmc_host_disable()' which calls 'disable' immediately.  In this
 | 
					 | 
				
			||||||
	 * case the 'disable' method will be called with 'lazy' set to 0.
 | 
					 | 
				
			||||||
	 * This is mainly useful for error paths.
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * Because lazy disable may be called from a work queue, the 'disable'
 | 
					 | 
				
			||||||
	 * method must claim the host when 'lazy' != 0, which will work
 | 
					 | 
				
			||||||
	 * correctly because recursion is detected and handled.
 | 
					 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	int (*enable)(struct mmc_host *host);
 | 
						int (*enable)(struct mmc_host *host);
 | 
				
			||||||
	int (*disable)(struct mmc_host *host, int lazy);
 | 
						int (*disable)(struct mmc_host *host);
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * It is optional for the host to implement pre_req and post_req in
 | 
						 * It is optional for the host to implement pre_req and post_req in
 | 
				
			||||||
	 * order to support double buffering of requests (prepare one
 | 
						 * order to support double buffering of requests (prepare one
 | 
				
			||||||
| 
						 | 
					@ -218,7 +195,7 @@ struct mmc_host {
 | 
				
			||||||
#define MMC_CAP_SPI		(1 << 4)	/* Talks only SPI protocols */
 | 
					#define MMC_CAP_SPI		(1 << 4)	/* Talks only SPI protocols */
 | 
				
			||||||
#define MMC_CAP_NEEDS_POLL	(1 << 5)	/* Needs polling for card-detection */
 | 
					#define MMC_CAP_NEEDS_POLL	(1 << 5)	/* Needs polling for card-detection */
 | 
				
			||||||
#define MMC_CAP_8_BIT_DATA	(1 << 6)	/* Can the host do 8 bit transfers */
 | 
					#define MMC_CAP_8_BIT_DATA	(1 << 6)	/* Can the host do 8 bit transfers */
 | 
				
			||||||
#define MMC_CAP_DISABLE		(1 << 7)	/* Can the host be disabled */
 | 
					
 | 
				
			||||||
#define MMC_CAP_NONREMOVABLE	(1 << 8)	/* Nonremovable e.g. eMMC */
 | 
					#define MMC_CAP_NONREMOVABLE	(1 << 8)	/* Nonremovable e.g. eMMC */
 | 
				
			||||||
#define MMC_CAP_WAIT_WHILE_BUSY	(1 << 9)	/* Waits while card is busy */
 | 
					#define MMC_CAP_WAIT_WHILE_BUSY	(1 << 9)	/* Waits while card is busy */
 | 
				
			||||||
#define MMC_CAP_ERASE		(1 << 10)	/* Allow erase/trim commands */
 | 
					#define MMC_CAP_ERASE		(1 << 10)	/* Allow erase/trim commands */
 | 
				
			||||||
| 
						 | 
					@ -301,13 +278,7 @@ struct mmc_host {
 | 
				
			||||||
	unsigned int		removed:1;	/* host is being removed */
 | 
						unsigned int		removed:1;	/* host is being removed */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Only used with MMC_CAP_DISABLE */
 | 
					 | 
				
			||||||
	int			enabled;	/* host is enabled */
 | 
					 | 
				
			||||||
	int			rescan_disable;	/* disable card detection */
 | 
						int			rescan_disable;	/* disable card detection */
 | 
				
			||||||
	int			nesting_cnt;	/* "enable" nesting count */
 | 
					 | 
				
			||||||
	int			en_dis_recurs;	/* detect recursion */
 | 
					 | 
				
			||||||
	unsigned int		disable_delay;	/* disable delay in msecs */
 | 
					 | 
				
			||||||
	struct delayed_work	disable;	/* disabling work */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct mmc_card		*card;		/* device attached to this host */
 | 
						struct mmc_card		*card;		/* device attached to this host */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -407,17 +378,8 @@ int mmc_card_awake(struct mmc_host *host);
 | 
				
			||||||
int mmc_card_sleep(struct mmc_host *host);
 | 
					int mmc_card_sleep(struct mmc_host *host);
 | 
				
			||||||
int mmc_card_can_sleep(struct mmc_host *host);
 | 
					int mmc_card_can_sleep(struct mmc_host *host);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int mmc_host_enable(struct mmc_host *host);
 | 
					 | 
				
			||||||
int mmc_host_disable(struct mmc_host *host);
 | 
					 | 
				
			||||||
int mmc_host_lazy_disable(struct mmc_host *host);
 | 
					 | 
				
			||||||
int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
 | 
					int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void mmc_set_disable_delay(struct mmc_host *host,
 | 
					 | 
				
			||||||
					 unsigned int disable_delay)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	host->disable_delay = disable_delay;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Module parameter */
 | 
					/* Module parameter */
 | 
				
			||||||
extern bool mmc_assume_removable;
 | 
					extern bool mmc_assume_removable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue