brintos

brintos / linux-shallow public Read only

0
0
Text · 21.2 KiB · b774bf5 Raw
815 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 *  linux/drivers/mmc/core/sdio_io.c4 *5 *  Copyright 2007-2008 Pierre Ossman6 */7 8#include <linux/export.h>9#include <linux/kernel.h>10#include <linux/mmc/host.h>11#include <linux/mmc/card.h>12#include <linux/mmc/sdio.h>13#include <linux/mmc/sdio_func.h>14 15#include "sdio_ops.h"16#include "core.h"17#include "card.h"18#include "host.h"19 20/**21 *	sdio_claim_host - exclusively claim a bus for a certain SDIO function22 *	@func: SDIO function that will be accessed23 *24 *	Claim a bus for a set of operations. The SDIO function given25 *	is used to figure out which bus is relevant.26 */27void sdio_claim_host(struct sdio_func *func)28{29	if (WARN_ON(!func))30		return;31 32	mmc_claim_host(func->card->host);33}34EXPORT_SYMBOL_GPL(sdio_claim_host);35 36/**37 *	sdio_release_host - release a bus for a certain SDIO function38 *	@func: SDIO function that was accessed39 *40 *	Release a bus, allowing others to claim the bus for their41 *	operations.42 */43void sdio_release_host(struct sdio_func *func)44{45	if (WARN_ON(!func))46		return;47 48	mmc_release_host(func->card->host);49}50EXPORT_SYMBOL_GPL(sdio_release_host);51 52/**53 *	sdio_enable_func - enables a SDIO function for usage54 *	@func: SDIO function to enable55 *56 *	Powers up and activates a SDIO function so that register57 *	access is possible.58 */59int sdio_enable_func(struct sdio_func *func)60{61	int ret;62	unsigned char reg;63	unsigned long timeout;64 65	if (!func)66		return -EINVAL;67 68	pr_debug("SDIO: Enabling device %s...\n", sdio_func_id(func));69 70	ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, &reg);71	if (ret)72		goto err;73 74	reg |= 1 << func->num;75 76	ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL);77	if (ret)78		goto err;79 80	timeout = jiffies + msecs_to_jiffies(func->enable_timeout);81 82	while (1) {83		ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IORx, 0, &reg);84		if (ret)85			goto err;86		if (reg & (1 << func->num))87			break;88		ret = -ETIME;89		if (time_after(jiffies, timeout))90			goto err;91	}92 93	pr_debug("SDIO: Enabled device %s\n", sdio_func_id(func));94 95	return 0;96 97err:98	pr_debug("SDIO: Failed to enable device %s\n", sdio_func_id(func));99	return ret;100}101EXPORT_SYMBOL_GPL(sdio_enable_func);102 103/**104 *	sdio_disable_func - disable a SDIO function105 *	@func: SDIO function to disable106 *107 *	Powers down and deactivates a SDIO function. Register access108 *	to this function will fail until the function is reenabled.109 */110int sdio_disable_func(struct sdio_func *func)111{112	int ret;113	unsigned char reg;114 115	if (!func)116		return -EINVAL;117 118	pr_debug("SDIO: Disabling device %s...\n", sdio_func_id(func));119 120	ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, &reg);121	if (ret)122		goto err;123 124	reg &= ~(1 << func->num);125 126	ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL);127	if (ret)128		goto err;129 130	pr_debug("SDIO: Disabled device %s\n", sdio_func_id(func));131 132	return 0;133 134err:135	pr_debug("SDIO: Failed to disable device %s\n", sdio_func_id(func));136	return ret;137}138EXPORT_SYMBOL_GPL(sdio_disable_func);139 140/**141 *	sdio_set_block_size - set the block size of an SDIO function142 *	@func: SDIO function to change143 *	@blksz: new block size or 0 to use the default.144 *145 *	The default block size is the largest supported by both the function146 *	and the host, with a maximum of 512 to ensure that arbitrarily sized147 *	data transfer use the optimal (least) number of commands.148 *149 *	A driver may call this to override the default block size set by the150 *	core. This can be used to set a block size greater than the maximum151 *	that reported by the card; it is the driver's responsibility to ensure152 *	it uses a value that the card supports.153 *154 *	Returns 0 on success, -EINVAL if the host does not support the155 *	requested block size, or -EIO (etc.) if one of the resultant FBR block156 *	size register writes failed.157 *158 */159int sdio_set_block_size(struct sdio_func *func, unsigned blksz)160{161	int ret;162 163	if (blksz > func->card->host->max_blk_size)164		return -EINVAL;165 166	if (blksz == 0) {167		blksz = min(func->max_blksize, func->card->host->max_blk_size);168		blksz = min(blksz, 512u);169	}170 171	ret = mmc_io_rw_direct(func->card, 1, 0,172		SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE,173		blksz & 0xff, NULL);174	if (ret)175		return ret;176	ret = mmc_io_rw_direct(func->card, 1, 0,177		SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE + 1,178		(blksz >> 8) & 0xff, NULL);179	if (ret)180		return ret;181	func->cur_blksize = blksz;182	return 0;183}184EXPORT_SYMBOL_GPL(sdio_set_block_size);185 186/*187 * Calculate the maximum byte mode transfer size188 */189static inline unsigned int sdio_max_byte_size(struct sdio_func *func)190{191	unsigned mval =	func->card->host->max_blk_size;192 193	if (mmc_blksz_for_byte_mode(func->card))194		mval = min(mval, func->cur_blksize);195	else196		mval = min(mval, func->max_blksize);197 198	if (mmc_card_broken_byte_mode_512(func->card))199		return min(mval, 511u);200 201	return min(mval, 512u); /* maximum size for byte mode */202}203 204/*205 * This is legacy code, which needs to be re-worked some day. Basically we need206 * to take into account the properties of the host, as to enable the SDIO func207 * driver layer to allocate optimal buffers.208 */209static inline unsigned int _sdio_align_size(unsigned int sz)210{211	/*212	 * FIXME: We don't have a system for the controller to tell213	 * the core about its problems yet, so for now we just 32-bit214	 * align the size.215	 */216	return ALIGN(sz, 4);217}218 219/**220 *	sdio_align_size - pads a transfer size to a more optimal value221 *	@func: SDIO function222 *	@sz: original transfer size223 *224 *	Pads the original data size with a number of extra bytes in225 *	order to avoid controller bugs and/or performance hits226 *	(e.g. some controllers revert to PIO for certain sizes).227 *228 *	If possible, it will also adjust the size so that it can be229 *	handled in just a single request.230 *231 *	Returns the improved size, which might be unmodified.232 */233unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz)234{235	unsigned int orig_sz;236	unsigned int blk_sz, byte_sz;237	unsigned chunk_sz;238 239	orig_sz = sz;240 241	/*242	 * Do a first check with the controller, in case it243	 * wants to increase the size up to a point where it244	 * might need more than one block.245	 */246	sz = _sdio_align_size(sz);247 248	/*249	 * If we can still do this with just a byte transfer, then250	 * we're done.251	 */252	if (sz <= sdio_max_byte_size(func))253		return sz;254 255	if (func->card->cccr.multi_block) {256		/*257		 * Check if the transfer is already block aligned258		 */259		if ((sz % func->cur_blksize) == 0)260			return sz;261 262		/*263		 * Realign it so that it can be done with one request,264		 * and recheck if the controller still likes it.265		 */266		blk_sz = ((sz + func->cur_blksize - 1) /267			func->cur_blksize) * func->cur_blksize;268		blk_sz = _sdio_align_size(blk_sz);269 270		/*271		 * This value is only good if it is still just272		 * one request.273		 */274		if ((blk_sz % func->cur_blksize) == 0)275			return blk_sz;276 277		/*278		 * We failed to do one request, but at least try to279		 * pad the remainder properly.280		 */281		byte_sz = _sdio_align_size(sz % func->cur_blksize);282		if (byte_sz <= sdio_max_byte_size(func)) {283			blk_sz = sz / func->cur_blksize;284			return blk_sz * func->cur_blksize + byte_sz;285		}286	} else {287		/*288		 * We need multiple requests, so first check that the289		 * controller can handle the chunk size;290		 */291		chunk_sz = _sdio_align_size(sdio_max_byte_size(func));292		if (chunk_sz == sdio_max_byte_size(func)) {293			/*294			 * Fix up the size of the remainder (if any)295			 */296			byte_sz = orig_sz % chunk_sz;297			if (byte_sz) {298				byte_sz = _sdio_align_size(byte_sz);299			}300 301			return (orig_sz / chunk_sz) * chunk_sz + byte_sz;302		}303	}304 305	/*306	 * The controller is simply incapable of transferring the size307	 * we want in decent manner, so just return the original size.308	 */309	return orig_sz;310}311EXPORT_SYMBOL_GPL(sdio_align_size);312 313/* Split an arbitrarily sized data transfer into several314 * IO_RW_EXTENDED commands. */315static int sdio_io_rw_ext_helper(struct sdio_func *func, int write,316	unsigned addr, int incr_addr, u8 *buf, unsigned size)317{318	unsigned remainder = size;319	unsigned max_blocks;320	int ret;321 322	if (!func || (func->num > 7))323		return -EINVAL;324 325	/* Do the bulk of the transfer using block mode (if supported). */326	if (func->card->cccr.multi_block && (size > sdio_max_byte_size(func))) {327		/* Blocks per command is limited by host count, host transfer328		 * size and the maximum for IO_RW_EXTENDED of 511 blocks. */329		max_blocks = min(func->card->host->max_blk_count, 511u);330 331		while (remainder >= func->cur_blksize) {332			unsigned blocks;333 334			blocks = remainder / func->cur_blksize;335			if (blocks > max_blocks)336				blocks = max_blocks;337			size = blocks * func->cur_blksize;338 339			ret = mmc_io_rw_extended(func->card, write,340				func->num, addr, incr_addr, buf,341				blocks, func->cur_blksize);342			if (ret)343				return ret;344 345			remainder -= size;346			buf += size;347			if (incr_addr)348				addr += size;349		}350	}351 352	/* Write the remainder using byte mode. */353	while (remainder > 0) {354		size = min(remainder, sdio_max_byte_size(func));355 356		/* Indicate byte mode by setting "blocks" = 0 */357		ret = mmc_io_rw_extended(func->card, write, func->num, addr,358			 incr_addr, buf, 0, size);359		if (ret)360			return ret;361 362		remainder -= size;363		buf += size;364		if (incr_addr)365			addr += size;366	}367	return 0;368}369 370/**371 *	sdio_readb - read a single byte from a SDIO function372 *	@func: SDIO function to access373 *	@addr: address to read374 *	@err_ret: optional status value from transfer375 *376 *	Reads a single byte from the address space of a given SDIO377 *	function. If there is a problem reading the address, 0xff378 *	is returned and @err_ret will contain the error code.379 */380u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret)381{382	int ret;383	u8 val;384 385	if (!func) {386		if (err_ret)387			*err_ret = -EINVAL;388		return 0xFF;389	}390 391	ret = mmc_io_rw_direct(func->card, 0, func->num, addr, 0, &val);392	if (err_ret)393		*err_ret = ret;394	if (ret)395		return 0xFF;396 397	return val;398}399EXPORT_SYMBOL_GPL(sdio_readb);400 401/**402 *	sdio_writeb - write a single byte to a SDIO function403 *	@func: SDIO function to access404 *	@b: byte to write405 *	@addr: address to write to406 *	@err_ret: optional status value from transfer407 *408 *	Writes a single byte to the address space of a given SDIO409 *	function. @err_ret will contain the status of the actual410 *	transfer.411 */412void sdio_writeb(struct sdio_func *func, u8 b, unsigned int addr, int *err_ret)413{414	int ret;415 416	if (!func) {417		if (err_ret)418			*err_ret = -EINVAL;419		return;420	}421 422	ret = mmc_io_rw_direct(func->card, 1, func->num, addr, b, NULL);423	if (err_ret)424		*err_ret = ret;425}426EXPORT_SYMBOL_GPL(sdio_writeb);427 428/**429 *	sdio_writeb_readb - write and read a byte from SDIO function430 *	@func: SDIO function to access431 *	@write_byte: byte to write432 *	@addr: address to write to433 *	@err_ret: optional status value from transfer434 *435 *	Performs a RAW (Read after Write) operation as defined by SDIO spec -436 *	single byte is written to address space of a given SDIO function and437 *	response is read back from the same address, both using single request.438 *	If there is a problem with the operation, 0xff is returned and439 *	@err_ret will contain the error code.440 */441u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte,442	unsigned int addr, int *err_ret)443{444	int ret;445	u8 val;446 447	ret = mmc_io_rw_direct(func->card, 1, func->num, addr,448			write_byte, &val);449	if (err_ret)450		*err_ret = ret;451	if (ret)452		return 0xff;453 454	return val;455}456EXPORT_SYMBOL_GPL(sdio_writeb_readb);457 458/**459 *	sdio_memcpy_fromio - read a chunk of memory from a SDIO function460 *	@func: SDIO function to access461 *	@dst: buffer to store the data462 *	@addr: address to begin reading from463 *	@count: number of bytes to read464 *465 *	Reads from the address space of a given SDIO function. Return466 *	value indicates if the transfer succeeded or not.467 */468int sdio_memcpy_fromio(struct sdio_func *func, void *dst,469	unsigned int addr, int count)470{471	return sdio_io_rw_ext_helper(func, 0, addr, 1, dst, count);472}473EXPORT_SYMBOL_GPL(sdio_memcpy_fromio);474 475/**476 *	sdio_memcpy_toio - write a chunk of memory to a SDIO function477 *	@func: SDIO function to access478 *	@addr: address to start writing to479 *	@src: buffer that contains the data to write480 *	@count: number of bytes to write481 *482 *	Writes to the address space of a given SDIO function. Return483 *	value indicates if the transfer succeeded or not.484 */485int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr,486	void *src, int count)487{488	return sdio_io_rw_ext_helper(func, 1, addr, 1, src, count);489}490EXPORT_SYMBOL_GPL(sdio_memcpy_toio);491 492/**493 *	sdio_readsb - read from a FIFO on a SDIO function494 *	@func: SDIO function to access495 *	@dst: buffer to store the data496 *	@addr: address of (single byte) FIFO497 *	@count: number of bytes to read498 *499 *	Reads from the specified FIFO of a given SDIO function. Return500 *	value indicates if the transfer succeeded or not.501 */502int sdio_readsb(struct sdio_func *func, void *dst, unsigned int addr,503	int count)504{505	return sdio_io_rw_ext_helper(func, 0, addr, 0, dst, count);506}507EXPORT_SYMBOL_GPL(sdio_readsb);508 509/**510 *	sdio_writesb - write to a FIFO of a SDIO function511 *	@func: SDIO function to access512 *	@addr: address of (single byte) FIFO513 *	@src: buffer that contains the data to write514 *	@count: number of bytes to write515 *516 *	Writes to the specified FIFO of a given SDIO function. Return517 *	value indicates if the transfer succeeded or not.518 */519int sdio_writesb(struct sdio_func *func, unsigned int addr, void *src,520	int count)521{522	return sdio_io_rw_ext_helper(func, 1, addr, 0, src, count);523}524EXPORT_SYMBOL_GPL(sdio_writesb);525 526/**527 *	sdio_readw - read a 16 bit integer from a SDIO function528 *	@func: SDIO function to access529 *	@addr: address to read530 *	@err_ret: optional status value from transfer531 *532 *	Reads a 16 bit integer from the address space of a given SDIO533 *	function. If there is a problem reading the address, 0xffff534 *	is returned and @err_ret will contain the error code.535 */536u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret)537{538	int ret;539 540	ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 2);541	if (err_ret)542		*err_ret = ret;543	if (ret)544		return 0xFFFF;545 546	return le16_to_cpup((__le16 *)func->tmpbuf);547}548EXPORT_SYMBOL_GPL(sdio_readw);549 550/**551 *	sdio_writew - write a 16 bit integer to a SDIO function552 *	@func: SDIO function to access553 *	@b: integer to write554 *	@addr: address to write to555 *	@err_ret: optional status value from transfer556 *557 *	Writes a 16 bit integer to the address space of a given SDIO558 *	function. @err_ret will contain the status of the actual559 *	transfer.560 */561void sdio_writew(struct sdio_func *func, u16 b, unsigned int addr, int *err_ret)562{563	int ret;564 565	*(__le16 *)func->tmpbuf = cpu_to_le16(b);566 567	ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 2);568	if (err_ret)569		*err_ret = ret;570}571EXPORT_SYMBOL_GPL(sdio_writew);572 573/**574 *	sdio_readl - read a 32 bit integer from a SDIO function575 *	@func: SDIO function to access576 *	@addr: address to read577 *	@err_ret: optional status value from transfer578 *579 *	Reads a 32 bit integer from the address space of a given SDIO580 *	function. If there is a problem reading the address,581 *	0xffffffff is returned and @err_ret will contain the error582 *	code.583 */584u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret)585{586	int ret;587 588	ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 4);589	if (err_ret)590		*err_ret = ret;591	if (ret)592		return 0xFFFFFFFF;593 594	return le32_to_cpup((__le32 *)func->tmpbuf);595}596EXPORT_SYMBOL_GPL(sdio_readl);597 598/**599 *	sdio_writel - write a 32 bit integer to a SDIO function600 *	@func: SDIO function to access601 *	@b: integer to write602 *	@addr: address to write to603 *	@err_ret: optional status value from transfer604 *605 *	Writes a 32 bit integer to the address space of a given SDIO606 *	function. @err_ret will contain the status of the actual607 *	transfer.608 */609void sdio_writel(struct sdio_func *func, u32 b, unsigned int addr, int *err_ret)610{611	int ret;612 613	*(__le32 *)func->tmpbuf = cpu_to_le32(b);614 615	ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 4);616	if (err_ret)617		*err_ret = ret;618}619EXPORT_SYMBOL_GPL(sdio_writel);620 621/**622 *	sdio_f0_readb - read a single byte from SDIO function 0623 *	@func: an SDIO function of the card624 *	@addr: address to read625 *	@err_ret: optional status value from transfer626 *627 *	Reads a single byte from the address space of SDIO function 0.628 *	If there is a problem reading the address, 0xff is returned629 *	and @err_ret will contain the error code.630 */631unsigned char sdio_f0_readb(struct sdio_func *func, unsigned int addr,632	int *err_ret)633{634	int ret;635	unsigned char val;636 637	if (!func) {638		if (err_ret)639			*err_ret = -EINVAL;640		return 0xFF;641	}642 643	ret = mmc_io_rw_direct(func->card, 0, 0, addr, 0, &val);644	if (err_ret)645		*err_ret = ret;646	if (ret)647		return 0xFF;648 649	return val;650}651EXPORT_SYMBOL_GPL(sdio_f0_readb);652 653/**654 *	sdio_f0_writeb - write a single byte to SDIO function 0655 *	@func: an SDIO function of the card656 *	@b: byte to write657 *	@addr: address to write to658 *	@err_ret: optional status value from transfer659 *660 *	Writes a single byte to the address space of SDIO function 0.661 *	@err_ret will contain the status of the actual transfer.662 *663 *	Only writes to the vendor specific CCCR registers (0xF0 -664 *	0xFF) are permiited; @err_ret will be set to -EINVAL for *665 *	writes outside this range.666 */667void sdio_f0_writeb(struct sdio_func *func, unsigned char b, unsigned int addr,668	int *err_ret)669{670	int ret;671 672	if (!func) {673		if (err_ret)674			*err_ret = -EINVAL;675		return;676	}677 678	if ((addr < 0xF0 || addr > 0xFF) && (!mmc_card_lenient_fn0(func->card))) {679		if (err_ret)680			*err_ret = -EINVAL;681		return;682	}683 684	ret = mmc_io_rw_direct(func->card, 1, 0, addr, b, NULL);685	if (err_ret)686		*err_ret = ret;687}688EXPORT_SYMBOL_GPL(sdio_f0_writeb);689 690/**691 *	sdio_get_host_pm_caps - get host power management capabilities692 *	@func: SDIO function attached to host693 *694 *	Returns a capability bitmask corresponding to power management695 *	features supported by the host controller that the card function696 *	might rely upon during a system suspend.  The host doesn't need697 *	to be claimed, nor the function active, for this information to be698 *	obtained.699 */700mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func)701{702	if (!func)703		return 0;704 705	return func->card->host->pm_caps;706}707EXPORT_SYMBOL_GPL(sdio_get_host_pm_caps);708 709/**710 *	sdio_set_host_pm_flags - set wanted host power management capabilities711 *	@func: SDIO function attached to host712 *	@flags: Power Management flags to set713 *714 *	Set a capability bitmask corresponding to wanted host controller715 *	power management features for the upcoming suspend state.716 *	This must be called, if needed, each time the suspend method of717 *	the function driver is called, and must contain only bits that718 *	were returned by sdio_get_host_pm_caps().719 *	The host doesn't need to be claimed, nor the function active,720 *	for this information to be set.721 */722int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags)723{724	struct mmc_host *host;725 726	if (!func)727		return -EINVAL;728 729	host = func->card->host;730 731	if (flags & ~host->pm_caps)732		return -EINVAL;733 734	/* function suspend methods are serialized, hence no lock needed */735	host->pm_flags |= flags;736	return 0;737}738EXPORT_SYMBOL_GPL(sdio_set_host_pm_flags);739 740/**741 *	sdio_retune_crc_disable - temporarily disable retuning on CRC errors742 *	@func: SDIO function attached to host743 *744 *	If the SDIO card is known to be in a state where it might produce745 *	CRC errors on the bus in response to commands (like if we know it is746 *	transitioning between power states), an SDIO function driver can747 *	call this function to temporarily disable the SD/MMC core behavior of748 *	triggering an automatic retuning.749 *750 *	This function should be called while the host is claimed and the host751 *	should remain claimed until sdio_retune_crc_enable() is called.752 *	Specifically, the expected sequence of calls is:753 *	- sdio_claim_host()754 *	- sdio_retune_crc_disable()755 *	- some number of calls like sdio_writeb() and sdio_readb()756 *	- sdio_retune_crc_enable()757 *	- sdio_release_host()758 */759void sdio_retune_crc_disable(struct sdio_func *func)760{761	func->card->host->retune_crc_disable = true;762}763EXPORT_SYMBOL_GPL(sdio_retune_crc_disable);764 765/**766 *	sdio_retune_crc_enable - re-enable retuning on CRC errors767 *	@func: SDIO function attached to host768 *769 *	This is the complement to sdio_retune_crc_disable().770 */771void sdio_retune_crc_enable(struct sdio_func *func)772{773	func->card->host->retune_crc_disable = false;774}775EXPORT_SYMBOL_GPL(sdio_retune_crc_enable);776 777/**778 *	sdio_retune_hold_now - start deferring retuning requests till release779 *	@func: SDIO function attached to host780 *781 *	This function can be called if it's currently a bad time to do782 *	a retune of the SDIO card.  Retune requests made during this time783 *	will be held and we'll actually do the retune sometime after the784 *	release.785 *786 *	This function could be useful if an SDIO card is in a power state787 *	where it can respond to a small subset of commands that doesn't788 *	include the retuning command.  Care should be taken when using789 *	this function since (presumably) the retuning request we might be790 *	deferring was made for a good reason.791 *792 *	This function should be called while the host is claimed.793 */794void sdio_retune_hold_now(struct sdio_func *func)795{796	mmc_retune_hold_now(func->card->host);797}798EXPORT_SYMBOL_GPL(sdio_retune_hold_now);799 800/**801 *	sdio_retune_release - signal that it's OK to retune now802 *	@func: SDIO function attached to host803 *804 *	This is the complement to sdio_retune_hold_now().  Calling this805 *	function won't make a retune happen right away but will allow806 *	them to be scheduled normally.807 *808 *	This function should be called while the host is claimed.809 */810void sdio_retune_release(struct sdio_func *func)811{812	mmc_retune_release(func->card->host);813}814EXPORT_SYMBOL_GPL(sdio_retune_release);815