diff options
Diffstat (limited to 'drivers/mmc/core')
| -rw-r--r-- | drivers/mmc/core/block.c | 42 | ||||
| -rw-r--r-- | drivers/mmc/core/core.c | 1 | ||||
| -rw-r--r-- | drivers/mmc/core/pwrseq_emmc.c | 1 | ||||
| -rw-r--r-- | drivers/mmc/core/pwrseq_sd8787.c | 1 | ||||
| -rw-r--r-- | drivers/mmc/core/pwrseq_simple.c | 1 | ||||
| -rw-r--r-- | drivers/mmc/core/queue.c | 20 | ||||
| -rw-r--r-- | drivers/mmc/core/queue.h | 3 | ||||
| -rw-r--r-- | drivers/mmc/core/sdio_bus.c | 10 | ||||
| -rw-r--r-- | drivers/mmc/core/sdio_uart.c | 1 | 
9 files changed, 42 insertions, 38 deletions
| diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c index 367509b5b646..2c9963248fcb 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -2466,8 +2466,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,  	struct mmc_blk_data *md;  	int devidx, ret;  	char cap_str[10]; -	bool cache_enabled = false; -	bool fua_enabled = false; +	unsigned int features = 0;  	devidx = ida_alloc_max(&mmc_blk_ida, max_devices - 1, GFP_KERNEL);  	if (devidx < 0) { @@ -2499,7 +2498,24 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,  	 */  	md->read_only = mmc_blk_readonly(card); -	md->disk = mmc_init_queue(&md->queue, card); +	if (mmc_host_cmd23(card->host)) { +		if ((mmc_card_mmc(card) && +		     card->csd.mmca_vsn >= CSD_SPEC_VER_3) || +		    (mmc_card_sd(card) && +		     card->scr.cmds & SD_SCR_CMD23_SUPPORT)) +			md->flags |= MMC_BLK_CMD23; +	} + +	if (md->flags & MMC_BLK_CMD23 && +	    ((card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN) || +	     card->ext_csd.rel_sectors)) { +		md->flags |= MMC_BLK_REL_WR; +		features |= (BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA); +	} else if (mmc_cache_enabled(card->host)) { +		features |= BLK_FEAT_WRITE_CACHE; +	} + +	md->disk = mmc_init_queue(&md->queue, card, features);  	if (IS_ERR(md->disk)) {  		ret = PTR_ERR(md->disk);  		goto err_kfree; @@ -2539,26 +2555,6 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,  	set_capacity(md->disk, size); -	if (mmc_host_cmd23(card->host)) { -		if ((mmc_card_mmc(card) && -		     card->csd.mmca_vsn >= CSD_SPEC_VER_3) || -		    (mmc_card_sd(card) && -		     card->scr.cmds & SD_SCR_CMD23_SUPPORT)) -			md->flags |= MMC_BLK_CMD23; -	} - -	if (md->flags & MMC_BLK_CMD23 && -	    ((card->ext_csd.rel_param & EXT_CSD_WR_REL_PARAM_EN) || -	     card->ext_csd.rel_sectors)) { -		md->flags |= MMC_BLK_REL_WR; -		fua_enabled = true; -		cache_enabled = true; -	} -	if (mmc_cache_enabled(card->host)) -		cache_enabled  = true; - -	blk_queue_write_cache(md->queue.queue, cache_enabled, fua_enabled); -  	string_get_size((u64)size, 512, STRING_UNITS_2,  			cap_str, sizeof(cap_str));  	pr_info("%s: %s %s %s%s\n", diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index a8c17b4cd737..d6c819dd68ed 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -2362,4 +2362,5 @@ static void __exit mmc_exit(void)  subsys_initcall(mmc_init);  module_exit(mmc_exit); +MODULE_DESCRIPTION("MMC core driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/mmc/core/pwrseq_emmc.c b/drivers/mmc/core/pwrseq_emmc.c index 3b6d69cefb4e..96fa4c508900 100644 --- a/drivers/mmc/core/pwrseq_emmc.c +++ b/drivers/mmc/core/pwrseq_emmc.c @@ -115,4 +115,5 @@ static struct platform_driver mmc_pwrseq_emmc_driver = {  };  module_platform_driver(mmc_pwrseq_emmc_driver); +MODULE_DESCRIPTION("Hardware reset support for eMMC");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/core/pwrseq_sd8787.c b/drivers/mmc/core/pwrseq_sd8787.c index 0c5808fc3206..f24bbd68e251 100644 --- a/drivers/mmc/core/pwrseq_sd8787.c +++ b/drivers/mmc/core/pwrseq_sd8787.c @@ -130,4 +130,5 @@ static struct platform_driver mmc_pwrseq_sd8787_driver = {  };  module_platform_driver(mmc_pwrseq_sd8787_driver); +MODULE_DESCRIPTION("Power sequence support for Marvell SD8787 BT + Wifi chip");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/core/pwrseq_simple.c b/drivers/mmc/core/pwrseq_simple.c index df9588503ad0..154a8921ae75 100644 --- a/drivers/mmc/core/pwrseq_simple.c +++ b/drivers/mmc/core/pwrseq_simple.c @@ -159,4 +159,5 @@ static struct platform_driver mmc_pwrseq_simple_driver = {  };  module_platform_driver(mmc_pwrseq_simple_driver); +MODULE_DESCRIPTION("Simple power sequence management for MMC");  MODULE_LICENSE("GPL v2"); diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index 241cdc2b2a2a..d0b3ca8a11f0 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -344,10 +344,12 @@ static const struct blk_mq_ops mmc_mq_ops = {  };  static struct gendisk *mmc_alloc_disk(struct mmc_queue *mq, -		struct mmc_card *card) +		struct mmc_card *card, unsigned int features)  {  	struct mmc_host *host = card->host; -	struct queue_limits lim = { }; +	struct queue_limits lim = { +		.features		= features, +	};  	struct gendisk *disk;  	if (mmc_can_erase(card)) @@ -376,18 +378,16 @@ static struct gendisk *mmc_alloc_disk(struct mmc_queue *mq,  		lim.max_segments = host->max_segs;  	} +	if (mmc_host_is_spi(host) && host->use_spi_crc) +		lim.features |= BLK_FEAT_STABLE_WRITES; +  	disk = blk_mq_alloc_disk(&mq->tag_set, &lim, mq);  	if (IS_ERR(disk))  		return disk;  	mq->queue = disk->queue; -	if (mmc_host_is_spi(host) && host->use_spi_crc) -		blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, mq->queue);  	blk_queue_rq_timeout(mq->queue, 60 * HZ); -	blk_queue_flag_set(QUEUE_FLAG_NONROT, mq->queue); -	blk_queue_flag_clear(QUEUE_FLAG_ADD_RANDOM, mq->queue); -  	dma_set_max_seg_size(mmc_dev(host), queue_max_segment_size(mq->queue));  	INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler); @@ -413,10 +413,12 @@ static inline bool mmc_merge_capable(struct mmc_host *host)   * mmc_init_queue - initialise a queue structure.   * @mq: mmc queue   * @card: mmc card to attach this queue + * @features: block layer features (BLK_FEAT_*)   *   * Initialise a MMC card request queue.   */ -struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card) +struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, +		unsigned int features)  {  	struct mmc_host *host = card->host;  	struct gendisk *disk; @@ -460,7 +462,7 @@ struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card)  		return ERR_PTR(ret); -	disk = mmc_alloc_disk(mq, card); +	disk = mmc_alloc_disk(mq, card, features);  	if (IS_ERR(disk))  		blk_mq_free_tag_set(&mq->tag_set);  	return disk; diff --git a/drivers/mmc/core/queue.h b/drivers/mmc/core/queue.h index 9ade3bcbb714..1498840a4ea0 100644 --- a/drivers/mmc/core/queue.h +++ b/drivers/mmc/core/queue.h @@ -94,7 +94,8 @@ struct mmc_queue {  	struct work_struct	complete_work;  }; -struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card); +struct gendisk *mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, +		unsigned int features);  extern void mmc_cleanup_queue(struct mmc_queue *);  extern void mmc_queue_suspend(struct mmc_queue *);  extern void mmc_queue_resume(struct mmc_queue *); diff --git a/drivers/mmc/core/sdio_bus.c b/drivers/mmc/core/sdio_bus.c index c5fdfe2325f8..b66b637e2d57 100644 --- a/drivers/mmc/core/sdio_bus.c +++ b/drivers/mmc/core/sdio_bus.c @@ -26,7 +26,7 @@  #include "sdio_cis.h"  #include "sdio_bus.h" -#define to_sdio_driver(d)	container_of(d, struct sdio_driver, drv) +#define to_sdio_driver(d)	container_of_const(d, struct sdio_driver, drv)  /* show configuration fields */  #define sdio_config_attr(field, format_string, args...)			\ @@ -91,7 +91,7 @@ static const struct sdio_device_id *sdio_match_one(struct sdio_func *func,  }  static const struct sdio_device_id *sdio_match_device(struct sdio_func *func, -	struct sdio_driver *sdrv) +	const struct sdio_driver *sdrv)  {  	const struct sdio_device_id *ids; @@ -108,10 +108,10 @@ static const struct sdio_device_id *sdio_match_device(struct sdio_func *func,  	return NULL;  } -static int sdio_bus_match(struct device *dev, struct device_driver *drv) +static int sdio_bus_match(struct device *dev, const struct device_driver *drv)  {  	struct sdio_func *func = dev_to_sdio_func(dev); -	struct sdio_driver *sdrv = to_sdio_driver(drv); +	const struct sdio_driver *sdrv = to_sdio_driver(drv);  	if (sdio_match_device(func, sdrv))  		return 1; @@ -129,7 +129,7 @@ sdio_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)  			"SDIO_CLASS=%02X", func->class))  		return -ENOMEM; -	if (add_uevent_var(env,  +	if (add_uevent_var(env,  			"SDIO_ID=%04X:%04X", func->vendor, func->device))  		return -ENOMEM; diff --git a/drivers/mmc/core/sdio_uart.c b/drivers/mmc/core/sdio_uart.c index 575ebbce378e..6b7471dba3bf 100644 --- a/drivers/mmc/core/sdio_uart.c +++ b/drivers/mmc/core/sdio_uart.c @@ -1162,4 +1162,5 @@ module_init(sdio_uart_init);  module_exit(sdio_uart_exit);  MODULE_AUTHOR("Nicolas Pitre"); +MODULE_DESCRIPTION("SDIO UART/GPS driver");  MODULE_LICENSE("GPL"); |