1 /* 2 * linux/drivers/mmc/core/sdio_io.c 3 * 4 * Copyright 2007-2008 Pierre Ossman 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or (at 9 * your option) any later version. 10 */ 11 12 #include <linux/mmc/host.h> 13 #include <linux/mmc/card.h> 14 #include <linux/mmc/sdio.h> 15 #include <linux/mmc/sdio_func.h> 16 17 #include "sdio_ops.h" 18 19 /** 20 * sdio_claim_host - exclusively claim a bus for a certain SDIO function 21 * @func: SDIO function that will be accessed 22 * 23 * Claim a bus for a set of operations. The SDIO function given 24 * is used to figure out which bus is relevant. 25 */ 26 void sdio_claim_host(struct sdio_func *func) 27 { 28 BUG_ON(!func); 29 BUG_ON(!func->card); 30 31 mmc_claim_host(func->card->host); 32 } 33 EXPORT_SYMBOL_GPL(sdio_claim_host); 34 35 /** 36 * sdio_release_host - release a bus for a certain SDIO function 37 * @func: SDIO function that was accessed 38 * 39 * Release a bus, allowing others to claim the bus for their 40 * operations. 41 */ 42 void sdio_release_host(struct sdio_func *func) 43 { 44 BUG_ON(!func); 45 BUG_ON(!func->card); 46 47 mmc_release_host(func->card->host); 48 } 49 EXPORT_SYMBOL_GPL(sdio_release_host); 50 51 /** 52 * sdio_enable_func - enables a SDIO function for usage 53 * @func: SDIO function to enable 54 * 55 * Powers up and activates a SDIO function so that register 56 * access is possible. 57 */ 58 int sdio_enable_func(struct sdio_func *func) 59 { 60 int ret; 61 unsigned char reg; 62 unsigned long timeout; 63 64 BUG_ON(!func); 65 BUG_ON(!func->card); 66 67 pr_debug("SDIO: Enabling device %s...\n", sdio_func_id(func)); 68 69 ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, ®); 70 if (ret) 71 goto err; 72 73 reg |= 1 << func->num; 74 75 ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL); 76 if (ret) 77 goto err; 78 79 timeout = jiffies + msecs_to_jiffies(func->enable_timeout); 80 81 while (1) { 82 ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IORx, 0, ®); 83 if (ret) 84 goto err; 85 if (reg & (1 << func->num)) 86 break; 87 ret = -ETIME; 88 if (time_after(jiffies, timeout)) 89 goto err; 90 } 91 92 pr_debug("SDIO: Enabled device %s\n", sdio_func_id(func)); 93 94 return 0; 95 96 err: 97 pr_debug("SDIO: Failed to enable device %s\n", sdio_func_id(func)); 98 return ret; 99 } 100 EXPORT_SYMBOL_GPL(sdio_enable_func); 101 102 /** 103 * sdio_disable_func - disable a SDIO function 104 * @func: SDIO function to disable 105 * 106 * Powers down and deactivates a SDIO function. Register access 107 * to this function will fail until the function is reenabled. 108 */ 109 int sdio_disable_func(struct sdio_func *func) 110 { 111 int ret; 112 unsigned char reg; 113 114 BUG_ON(!func); 115 BUG_ON(!func->card); 116 117 pr_debug("SDIO: Disabling device %s...\n", sdio_func_id(func)); 118 119 ret = mmc_io_rw_direct(func->card, 0, 0, SDIO_CCCR_IOEx, 0, ®); 120 if (ret) 121 goto err; 122 123 reg &= ~(1 << func->num); 124 125 ret = mmc_io_rw_direct(func->card, 1, 0, SDIO_CCCR_IOEx, reg, NULL); 126 if (ret) 127 goto err; 128 129 pr_debug("SDIO: Disabled device %s\n", sdio_func_id(func)); 130 131 return 0; 132 133 err: 134 pr_debug("SDIO: Failed to disable device %s\n", sdio_func_id(func)); 135 return -EIO; 136 } 137 EXPORT_SYMBOL_GPL(sdio_disable_func); 138 139 /** 140 * sdio_set_block_size - set the block size of an SDIO function 141 * @func: SDIO function to change 142 * @blksz: new block size or 0 to use the default. 143 * 144 * The default block size is the largest supported by both the function 145 * and the host, with a maximum of 512 to ensure that arbitrarily sized 146 * data transfer use the optimal (least) number of commands. 147 * 148 * A driver may call this to override the default block size set by the 149 * core. This can be used to set a block size greater than the maximum 150 * that reported by the card; it is the driver's responsibility to ensure 151 * it uses a value that the card supports. 152 * 153 * Returns 0 on success, -EINVAL if the host does not support the 154 * requested block size, or -EIO (etc.) if one of the resultant FBR block 155 * size register writes failed. 156 * 157 */ 158 int sdio_set_block_size(struct sdio_func *func, unsigned blksz) 159 { 160 int ret; 161 162 if (blksz > func->card->host->max_blk_size) 163 return -EINVAL; 164 165 if (blksz == 0) { 166 blksz = min(func->max_blksize, func->card->host->max_blk_size); 167 blksz = min(blksz, 512u); 168 } 169 170 ret = mmc_io_rw_direct(func->card, 1, 0, 171 SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE, 172 blksz & 0xff, NULL); 173 if (ret) 174 return ret; 175 ret = mmc_io_rw_direct(func->card, 1, 0, 176 SDIO_FBR_BASE(func->num) + SDIO_FBR_BLKSIZE + 1, 177 (blksz >> 8) & 0xff, NULL); 178 if (ret) 179 return ret; 180 func->cur_blksize = blksz; 181 return 0; 182 } 183 EXPORT_SYMBOL_GPL(sdio_set_block_size); 184 185 /* 186 * Calculate the maximum byte mode transfer size 187 */ 188 static inline unsigned int sdio_max_byte_size(struct sdio_func *func) 189 { 190 unsigned mval = min(func->card->host->max_seg_size, 191 func->card->host->max_blk_size); 192 193 if (mmc_blksz_for_byte_mode(func->card)) 194 mval = min(mval, func->cur_blksize); 195 else 196 mval = min(mval, func->max_blksize); 197 198 return min(mval, 512u); /* maximum size for byte mode */ 199 } 200 201 /** 202 * sdio_align_size - pads a transfer size to a more optimal value 203 * @func: SDIO function 204 * @sz: original transfer size 205 * 206 * Pads the original data size with a number of extra bytes in 207 * order to avoid controller bugs and/or performance hits 208 * (e.g. some controllers revert to PIO for certain sizes). 209 * 210 * If possible, it will also adjust the size so that it can be 211 * handled in just a single request. 212 * 213 * Returns the improved size, which might be unmodified. 214 */ 215 unsigned int sdio_align_size(struct sdio_func *func, unsigned int sz) 216 { 217 unsigned int orig_sz; 218 unsigned int blk_sz, byte_sz; 219 unsigned chunk_sz; 220 221 orig_sz = sz; 222 223 /* 224 * Do a first check with the controller, in case it 225 * wants to increase the size up to a point where it 226 * might need more than one block. 227 */ 228 sz = mmc_align_data_size(func->card, sz); 229 230 /* 231 * If we can still do this with just a byte transfer, then 232 * we're done. 233 */ 234 if (sz <= sdio_max_byte_size(func)) 235 return sz; 236 237 if (func->card->cccr.multi_block) { 238 /* 239 * Check if the transfer is already block aligned 240 */ 241 if ((sz % func->cur_blksize) == 0) 242 return sz; 243 244 /* 245 * Realign it so that it can be done with one request, 246 * and recheck if the controller still likes it. 247 */ 248 blk_sz = ((sz + func->cur_blksize - 1) / 249 func->cur_blksize) * func->cur_blksize; 250 blk_sz = mmc_align_data_size(func->card, blk_sz); 251 252 /* 253 * This value is only good if it is still just 254 * one request. 255 */ 256 if ((blk_sz % func->cur_blksize) == 0) 257 return blk_sz; 258 259 /* 260 * We failed to do one request, but at least try to 261 * pad the remainder properly. 262 */ 263 byte_sz = mmc_align_data_size(func->card, 264 sz % func->cur_blksize); 265 if (byte_sz <= sdio_max_byte_size(func)) { 266 blk_sz = sz / func->cur_blksize; 267 return blk_sz * func->cur_blksize + byte_sz; 268 } 269 } else { 270 /* 271 * We need multiple requests, so first check that the 272 * controller can handle the chunk size; 273 */ 274 chunk_sz = mmc_align_data_size(func->card, 275 sdio_max_byte_size(func)); 276 if (chunk_sz == sdio_max_byte_size(func)) { 277 /* 278 * Fix up the size of the remainder (if any) 279 */ 280 byte_sz = orig_sz % chunk_sz; 281 if (byte_sz) { 282 byte_sz = mmc_align_data_size(func->card, 283 byte_sz); 284 } 285 286 return (orig_sz / chunk_sz) * chunk_sz + byte_sz; 287 } 288 } 289 290 /* 291 * The controller is simply incapable of transferring the size 292 * we want in decent manner, so just return the original size. 293 */ 294 return orig_sz; 295 } 296 EXPORT_SYMBOL_GPL(sdio_align_size); 297 298 /* Split an arbitrarily sized data transfer into several 299 * IO_RW_EXTENDED commands. */ 300 static int sdio_io_rw_ext_helper(struct sdio_func *func, int write, 301 unsigned addr, int incr_addr, u8 *buf, unsigned size) 302 { 303 unsigned remainder = size; 304 unsigned max_blocks; 305 int ret; 306 307 /* Do the bulk of the transfer using block mode (if supported). */ 308 if (func->card->cccr.multi_block && (size > sdio_max_byte_size(func))) { 309 /* Blocks per command is limited by host count, host transfer 310 * size (we only use a single sg entry) and the maximum for 311 * IO_RW_EXTENDED of 511 blocks. */ 312 max_blocks = min(func->card->host->max_blk_count, 313 func->card->host->max_seg_size / func->cur_blksize); 314 max_blocks = min(max_blocks, 511u); 315 316 while (remainder > func->cur_blksize) { 317 unsigned blocks; 318 319 blocks = remainder / func->cur_blksize; 320 if (blocks > max_blocks) 321 blocks = max_blocks; 322 size = blocks * func->cur_blksize; 323 324 ret = mmc_io_rw_extended(func->card, write, 325 func->num, addr, incr_addr, buf, 326 blocks, func->cur_blksize); 327 if (ret) 328 return ret; 329 330 remainder -= size; 331 buf += size; 332 if (incr_addr) 333 addr += size; 334 } 335 } 336 337 /* Write the remainder using byte mode. */ 338 while (remainder > 0) { 339 size = min(remainder, sdio_max_byte_size(func)); 340 341 ret = mmc_io_rw_extended(func->card, write, func->num, addr, 342 incr_addr, buf, 1, size); 343 if (ret) 344 return ret; 345 346 remainder -= size; 347 buf += size; 348 if (incr_addr) 349 addr += size; 350 } 351 return 0; 352 } 353 354 /** 355 * sdio_readb - read a single byte from a SDIO function 356 * @func: SDIO function to access 357 * @addr: address to read 358 * @err_ret: optional status value from transfer 359 * 360 * Reads a single byte from the address space of a given SDIO 361 * function. If there is a problem reading the address, 0xff 362 * is returned and @err_ret will contain the error code. 363 */ 364 u8 sdio_readb(struct sdio_func *func, unsigned int addr, int *err_ret) 365 { 366 int ret; 367 u8 val; 368 369 BUG_ON(!func); 370 371 if (err_ret) 372 *err_ret = 0; 373 374 ret = mmc_io_rw_direct(func->card, 0, func->num, addr, 0, &val); 375 if (ret) { 376 if (err_ret) 377 *err_ret = ret; 378 return 0xFF; 379 } 380 381 return val; 382 } 383 EXPORT_SYMBOL_GPL(sdio_readb); 384 385 /** 386 * sdio_writeb - write a single byte to a SDIO function 387 * @func: SDIO function to access 388 * @b: byte to write 389 * @addr: address to write to 390 * @err_ret: optional status value from transfer 391 * 392 * Writes a single byte to the address space of a given SDIO 393 * function. @err_ret will contain the status of the actual 394 * transfer. 395 */ 396 void sdio_writeb(struct sdio_func *func, u8 b, unsigned int addr, int *err_ret) 397 { 398 int ret; 399 400 BUG_ON(!func); 401 402 ret = mmc_io_rw_direct(func->card, 1, func->num, addr, b, NULL); 403 if (err_ret) 404 *err_ret = ret; 405 } 406 EXPORT_SYMBOL_GPL(sdio_writeb); 407 408 /** 409 * sdio_writeb_readb - write and read a byte from SDIO function 410 * @func: SDIO function to access 411 * @write_byte: byte to write 412 * @addr: address to write to 413 * @err_ret: optional status value from transfer 414 * 415 * Performs a RAW (Read after Write) operation as defined by SDIO spec - 416 * single byte is written to address space of a given SDIO function and 417 * response is read back from the same address, both using single request. 418 * If there is a problem with the operation, 0xff is returned and 419 * @err_ret will contain the error code. 420 */ 421 u8 sdio_writeb_readb(struct sdio_func *func, u8 write_byte, 422 unsigned int addr, int *err_ret) 423 { 424 int ret; 425 u8 val; 426 427 ret = mmc_io_rw_direct(func->card, 1, func->num, addr, 428 write_byte, &val); 429 if (err_ret) 430 *err_ret = ret; 431 if (ret) 432 val = 0xff; 433 434 return val; 435 } 436 EXPORT_SYMBOL_GPL(sdio_writeb_readb); 437 438 /** 439 * sdio_memcpy_fromio - read a chunk of memory from a SDIO function 440 * @func: SDIO function to access 441 * @dst: buffer to store the data 442 * @addr: address to begin reading from 443 * @count: number of bytes to read 444 * 445 * Reads from the address space of a given SDIO function. Return 446 * value indicates if the transfer succeeded or not. 447 */ 448 int sdio_memcpy_fromio(struct sdio_func *func, void *dst, 449 unsigned int addr, int count) 450 { 451 return sdio_io_rw_ext_helper(func, 0, addr, 1, dst, count); 452 } 453 EXPORT_SYMBOL_GPL(sdio_memcpy_fromio); 454 455 /** 456 * sdio_memcpy_toio - write a chunk of memory to a SDIO function 457 * @func: SDIO function to access 458 * @addr: address to start writing to 459 * @src: buffer that contains the data to write 460 * @count: number of bytes to write 461 * 462 * Writes to the address space of a given SDIO function. Return 463 * value indicates if the transfer succeeded or not. 464 */ 465 int sdio_memcpy_toio(struct sdio_func *func, unsigned int addr, 466 void *src, int count) 467 { 468 return sdio_io_rw_ext_helper(func, 1, addr, 1, src, count); 469 } 470 EXPORT_SYMBOL_GPL(sdio_memcpy_toio); 471 472 /** 473 * sdio_readsb - read from a FIFO on a SDIO function 474 * @func: SDIO function to access 475 * @dst: buffer to store the data 476 * @addr: address of (single byte) FIFO 477 * @count: number of bytes to read 478 * 479 * Reads from the specified FIFO of a given SDIO function. Return 480 * value indicates if the transfer succeeded or not. 481 */ 482 int sdio_readsb(struct sdio_func *func, void *dst, unsigned int addr, 483 int count) 484 { 485 return sdio_io_rw_ext_helper(func, 0, addr, 0, dst, count); 486 } 487 EXPORT_SYMBOL_GPL(sdio_readsb); 488 489 /** 490 * sdio_writesb - write to a FIFO of a SDIO function 491 * @func: SDIO function to access 492 * @addr: address of (single byte) FIFO 493 * @src: buffer that contains the data to write 494 * @count: number of bytes to write 495 * 496 * Writes to the specified FIFO of a given SDIO function. Return 497 * value indicates if the transfer succeeded or not. 498 */ 499 int sdio_writesb(struct sdio_func *func, unsigned int addr, void *src, 500 int count) 501 { 502 return sdio_io_rw_ext_helper(func, 1, addr, 0, src, count); 503 } 504 EXPORT_SYMBOL_GPL(sdio_writesb); 505 506 /** 507 * sdio_readw - read a 16 bit integer from a SDIO function 508 * @func: SDIO function to access 509 * @addr: address to read 510 * @err_ret: optional status value from transfer 511 * 512 * Reads a 16 bit integer from the address space of a given SDIO 513 * function. If there is a problem reading the address, 0xffff 514 * is returned and @err_ret will contain the error code. 515 */ 516 u16 sdio_readw(struct sdio_func *func, unsigned int addr, int *err_ret) 517 { 518 int ret; 519 520 if (err_ret) 521 *err_ret = 0; 522 523 ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 2); 524 if (ret) { 525 if (err_ret) 526 *err_ret = ret; 527 return 0xFFFF; 528 } 529 530 return le16_to_cpup((__le16 *)func->tmpbuf); 531 } 532 EXPORT_SYMBOL_GPL(sdio_readw); 533 534 /** 535 * sdio_writew - write a 16 bit integer to a SDIO function 536 * @func: SDIO function to access 537 * @b: integer to write 538 * @addr: address to write to 539 * @err_ret: optional status value from transfer 540 * 541 * Writes a 16 bit integer to the address space of a given SDIO 542 * function. @err_ret will contain the status of the actual 543 * transfer. 544 */ 545 void sdio_writew(struct sdio_func *func, u16 b, unsigned int addr, int *err_ret) 546 { 547 int ret; 548 549 *(__le16 *)func->tmpbuf = cpu_to_le16(b); 550 551 ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 2); 552 if (err_ret) 553 *err_ret = ret; 554 } 555 EXPORT_SYMBOL_GPL(sdio_writew); 556 557 /** 558 * sdio_readl - read a 32 bit integer from a SDIO function 559 * @func: SDIO function to access 560 * @addr: address to read 561 * @err_ret: optional status value from transfer 562 * 563 * Reads a 32 bit integer from the address space of a given SDIO 564 * function. If there is a problem reading the address, 565 * 0xffffffff is returned and @err_ret will contain the error 566 * code. 567 */ 568 u32 sdio_readl(struct sdio_func *func, unsigned int addr, int *err_ret) 569 { 570 int ret; 571 572 if (err_ret) 573 *err_ret = 0; 574 575 ret = sdio_memcpy_fromio(func, func->tmpbuf, addr, 4); 576 if (ret) { 577 if (err_ret) 578 *err_ret = ret; 579 return 0xFFFFFFFF; 580 } 581 582 return le32_to_cpup((__le32 *)func->tmpbuf); 583 } 584 EXPORT_SYMBOL_GPL(sdio_readl); 585 586 /** 587 * sdio_writel - write a 32 bit integer to a SDIO function 588 * @func: SDIO function to access 589 * @b: integer to write 590 * @addr: address to write to 591 * @err_ret: optional status value from transfer 592 * 593 * Writes a 32 bit integer to the address space of a given SDIO 594 * function. @err_ret will contain the status of the actual 595 * transfer. 596 */ 597 void sdio_writel(struct sdio_func *func, u32 b, unsigned int addr, int *err_ret) 598 { 599 int ret; 600 601 *(__le32 *)func->tmpbuf = cpu_to_le32(b); 602 603 ret = sdio_memcpy_toio(func, addr, func->tmpbuf, 4); 604 if (err_ret) 605 *err_ret = ret; 606 } 607 EXPORT_SYMBOL_GPL(sdio_writel); 608 609 /** 610 * sdio_f0_readb - read a single byte from SDIO function 0 611 * @func: an SDIO function of the card 612 * @addr: address to read 613 * @err_ret: optional status value from transfer 614 * 615 * Reads a single byte from the address space of SDIO function 0. 616 * If there is a problem reading the address, 0xff is returned 617 * and @err_ret will contain the error code. 618 */ 619 unsigned char sdio_f0_readb(struct sdio_func *func, unsigned int addr, 620 int *err_ret) 621 { 622 int ret; 623 unsigned char val; 624 625 BUG_ON(!func); 626 627 if (err_ret) 628 *err_ret = 0; 629 630 ret = mmc_io_rw_direct(func->card, 0, 0, addr, 0, &val); 631 if (ret) { 632 if (err_ret) 633 *err_ret = ret; 634 return 0xFF; 635 } 636 637 return val; 638 } 639 EXPORT_SYMBOL_GPL(sdio_f0_readb); 640 641 /** 642 * sdio_f0_writeb - write a single byte to SDIO function 0 643 * @func: an SDIO function of the card 644 * @b: byte to write 645 * @addr: address to write to 646 * @err_ret: optional status value from transfer 647 * 648 * Writes a single byte to the address space of SDIO function 0. 649 * @err_ret will contain the status of the actual transfer. 650 * 651 * Only writes to the vendor specific CCCR registers (0xF0 - 652 * 0xFF) are permiited; @err_ret will be set to -EINVAL for * 653 * writes outside this range. 654 */ 655 void sdio_f0_writeb(struct sdio_func *func, unsigned char b, unsigned int addr, 656 int *err_ret) 657 { 658 int ret; 659 660 BUG_ON(!func); 661 662 if ((addr < 0xF0 || addr > 0xFF) && (!mmc_card_lenient_fn0(func->card))) { 663 if (err_ret) 664 *err_ret = -EINVAL; 665 return; 666 } 667 668 ret = mmc_io_rw_direct(func->card, 1, 0, addr, b, NULL); 669 if (err_ret) 670 *err_ret = ret; 671 } 672 EXPORT_SYMBOL_GPL(sdio_f0_writeb); 673 674 /** 675 * sdio_get_host_pm_caps - get host power management capabilities 676 * @func: SDIO function attached to host 677 * 678 * Returns a capability bitmask corresponding to power management 679 * features supported by the host controller that the card function 680 * might rely upon during a system suspend. The host doesn't need 681 * to be claimed, nor the function active, for this information to be 682 * obtained. 683 */ 684 mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func) 685 { 686 BUG_ON(!func); 687 BUG_ON(!func->card); 688 689 return func->card->host->pm_caps; 690 } 691 EXPORT_SYMBOL_GPL(sdio_get_host_pm_caps); 692 693 /** 694 * sdio_set_host_pm_flags - set wanted host power management capabilities 695 * @func: SDIO function attached to host 696 * 697 * Set a capability bitmask corresponding to wanted host controller 698 * power management features for the upcoming suspend state. 699 * This must be called, if needed, each time the suspend method of 700 * the function driver is called, and must contain only bits that 701 * were returned by sdio_get_host_pm_caps(). 702 * The host doesn't need to be claimed, nor the function active, 703 * for this information to be set. 704 */ 705 int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags) 706 { 707 struct mmc_host *host; 708 709 BUG_ON(!func); 710 BUG_ON(!func->card); 711 712 host = func->card->host; 713 714 if (flags & ~host->pm_caps) 715 return -EINVAL; 716 717 /* function suspend methods are serialized, hence no lock needed */ 718 host->pm_flags |= flags; 719 return 0; 720 } 721 EXPORT_SYMBOL_GPL(sdio_set_host_pm_flags); 722