diff options
Diffstat (limited to 'drivers/mmc/core/sdio_io.c')
-rw-r--r-- | drivers/mmc/core/sdio_io.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/drivers/mmc/core/sdio_io.c b/drivers/mmc/core/sdio_io.c index ecdb77242e..c2bad1195e 100644 --- a/drivers/mmc/core/sdio_io.c +++ b/drivers/mmc/core/sdio_io.c | |||
@@ -141,6 +141,55 @@ err: | |||
141 | EXPORT_SYMBOL_GPL(sdio_disable_func); | 141 | EXPORT_SYMBOL_GPL(sdio_disable_func); |
142 | 142 | ||
143 | /** | 143 | /** |
144 | * sdio_set_block_size - set the block size of an SDIO function | ||
145 | * @func: SDIO function to change | ||
146 | * @blksz: new block size or 0 to use the default. | ||
147 | * | ||
148 | * The default block size is the largest supported by both the function | ||
149 | * and the host, with a maximum of 512 to ensure that arbitrarily sized | ||
150 | * data transfer use the optimal (least) number of commands. | ||
151 | * | ||
152 | * A driver may call this to override the default block size set by the | ||
153 | * core. This can be used to set a block size greater than the maximum | ||
154 | * that reported by the card; it is the driver's responsibility to ensure | ||
155 | * it uses a value that the card supports. | ||
156 | * | ||
157 | * Returns 0 on success, -EINVAL if the host does not support the | ||
158 | * requested block size, or -EIO (etc.) if one of the resultant FBR block | ||
159 | * size register writes failed. | ||
160 | * | ||
161 | */ | ||
162 | int sdio_set_block_size(struct sdio_func *func, unsigned blksz) | ||
163 | { | ||
164 | int ret; | ||
165 | |||
166 | if (blksz > func->card->host->max_blk_size) | ||
167 | return -EINVAL; | ||
168 | |||
169 | if (blksz == 0) { | ||
170 | blksz = min(min( | ||
171 | func->max_blksize, | ||
172 | func->card->host->max_blk_size), | ||
173 | 512u); | ||
174 | } | ||
175 | |||
176 | ret = mmc_io_rw_direct(func->card, 1, 0, | ||
177 | SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE, | ||
178 | blksz & 0xff, NULL); | ||
179 | if (ret) | ||
180 | return ret; | ||
181 | ret = mmc_io_rw_direct(func->card, 1, 0, | ||
182 | SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE + 1, | ||
183 | (blksz >> 8) & 0xff, NULL); | ||
184 | if (ret) | ||
185 | return ret; | ||
186 | func->cur_blksize = blksz; | ||
187 | return 0; | ||
188 | } | ||
189 | |||
190 | EXPORT_SYMBOL_GPL(sdio_set_block_size); | ||
191 | |||
192 | /** | ||
144 | * sdio_readb - read a single byte from a SDIO function | 193 | * sdio_readb - read a single byte from a SDIO function |
145 | * @func: SDIO function to access | 194 | * @func: SDIO function to access |
146 | * @addr: address to read | 195 | * @addr: address to read |