Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-mmc

* 'devel' of master.kernel.org:/home/rmk/linux-2.6-mmc:
[MMC] sdhci: version bump sdhci
[MMC] sdhci: support controller specific quirks
[MMC] sdhci: more DMA capabilities tests
[MMC] sdhci: reset sdhci controller early
[MMC] sdhci: check controller version
[MMC] sdhci: check only relevant inhibit bits
[MMC] sdhci: Test for invalid block size
[MMC] sdhci: Avoid sdhci DMA boundaries
[MMC] Fix sdhci PIO routines
[MMC] sdhci: fix interrupt handling
[MMC] sdhci: correct register order
[MMC] sdhci: proper timeout handling
[MMC] sdhci: fix sdhci reset timeout
[MMC] sdhci: fix timeout loops in sdhci
[MMC] sdhci: support for multiple voltages
[MMC] sdhci: print device id
[MMC] sdhci: check SDHCI base clock

+411 -172
+381 -168
drivers/mmc/sdhci.c
··· 8 8 * published by the Free Software Foundation. 9 9 */ 10 10 11 - /* 12 - * Note that PIO transfer is rather crappy atm. The buffer full/empty 13 - * interrupts aren't reliable so we currently transfer the entire buffer 14 - * directly. Patches to solve the problem are welcome. 15 - */ 16 - 17 11 #include <linux/delay.h> 18 12 #include <linux/highmem.h> 19 13 #include <linux/pci.h> ··· 21 27 #include "sdhci.h" 22 28 23 29 #define DRIVER_NAME "sdhci" 24 - #define DRIVER_VERSION "0.11" 30 + #define DRIVER_VERSION "0.12" 25 31 26 32 #define BUGMAIL "<sdhci-devel@list.drzeus.cx>" 27 33 28 34 #define DBG(f, x...) \ 29 35 pr_debug(DRIVER_NAME " [%s()]: " f, __func__,## x) 36 + 37 + static unsigned int debug_nodma = 0; 38 + static unsigned int debug_forcedma = 0; 39 + static unsigned int debug_quirks = 0; 30 40 31 41 static const struct pci_device_id pci_ids[] __devinitdata = { 32 42 /* handle any SD host controller */ ··· 92 94 93 95 static void sdhci_reset(struct sdhci_host *host, u8 mask) 94 96 { 97 + unsigned long timeout; 98 + 95 99 writeb(mask, host->ioaddr + SDHCI_SOFTWARE_RESET); 96 100 97 - if (mask & SDHCI_RESET_ALL) { 101 + if (mask & SDHCI_RESET_ALL) 98 102 host->clock = 0; 99 103 100 - mdelay(50); 104 + /* Wait max 100 ms */ 105 + timeout = 100; 106 + 107 + /* hw clears the bit when it's done */ 108 + while (readb(host->ioaddr + SDHCI_SOFTWARE_RESET) & mask) { 109 + if (timeout == 0) { 110 + printk(KERN_ERR "%s: Reset 0x%x never completed. " 111 + "Please report this to " BUGMAIL ".\n", 112 + mmc_hostname(host->mmc), (int)mask); 113 + sdhci_dumpregs(host); 114 + return; 115 + } 116 + timeout--; 117 + mdelay(1); 101 118 } 102 119 } 103 120 ··· 122 109 123 110 sdhci_reset(host, SDHCI_RESET_ALL); 124 111 125 - intmask = ~(SDHCI_INT_CARD_INT | SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL); 112 + intmask = SDHCI_INT_BUS_POWER | SDHCI_INT_DATA_END_BIT | 113 + SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_INDEX | 114 + SDHCI_INT_END_BIT | SDHCI_INT_CRC | SDHCI_INT_TIMEOUT | 115 + SDHCI_INT_CARD_REMOVE | SDHCI_INT_CARD_INSERT | 116 + SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | 117 + SDHCI_INT_DMA_END | SDHCI_INT_DATA_END | SDHCI_INT_RESPONSE; 126 118 127 119 writel(intmask, host->ioaddr + SDHCI_INT_ENABLE); 128 120 writel(intmask, host->ioaddr + SDHCI_SIGNAL_ENABLE); 129 - 130 - /* This is unknown magic. */ 131 - writeb(0xE, host->ioaddr + SDHCI_TIMEOUT_CONTROL); 132 121 } 133 122 134 123 static void sdhci_activate_led(struct sdhci_host *host) ··· 187 172 return host->num_sg; 188 173 } 189 174 190 - static void sdhci_transfer_pio(struct sdhci_host *host) 175 + static void sdhci_read_block_pio(struct sdhci_host *host) 191 176 { 177 + int blksize, chunk_remain; 178 + u32 data; 192 179 char *buffer; 193 - u32 mask; 194 - int bytes, size; 195 - unsigned long max_jiffies; 180 + int size; 196 181 197 - BUG_ON(!host->data); 182 + DBG("PIO reading\n"); 198 183 199 - if (host->num_sg == 0) 200 - return; 201 - 202 - bytes = 0; 203 - if (host->data->flags & MMC_DATA_READ) 204 - mask = SDHCI_DATA_AVAILABLE; 205 - else 206 - mask = SDHCI_SPACE_AVAILABLE; 184 + blksize = host->data->blksz; 185 + chunk_remain = 0; 186 + data = 0; 207 187 208 188 buffer = sdhci_kmap_sg(host) + host->offset; 209 189 210 - /* Transfer shouldn't take more than 5 s */ 211 - max_jiffies = jiffies + HZ * 5; 212 - 213 - while (host->size > 0) { 214 - if (time_after(jiffies, max_jiffies)) { 215 - printk(KERN_ERR "%s: PIO transfer stalled. " 216 - "Please report this to " 217 - BUGMAIL ".\n", mmc_hostname(host->mmc)); 218 - sdhci_dumpregs(host); 219 - 220 - sdhci_kunmap_sg(host); 221 - 222 - host->data->error = MMC_ERR_FAILED; 223 - sdhci_finish_data(host); 224 - return; 190 + while (blksize) { 191 + if (chunk_remain == 0) { 192 + data = readl(host->ioaddr + SDHCI_BUFFER); 193 + chunk_remain = min(blksize, 4); 225 194 } 226 - 227 - if (!(readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask)) 228 - continue; 229 195 230 196 size = min(host->size, host->remain); 197 + size = min(size, chunk_remain); 231 198 232 - if (size >= 4) { 233 - if (host->data->flags & MMC_DATA_READ) 234 - *(u32*)buffer = readl(host->ioaddr + SDHCI_BUFFER); 235 - else 236 - writel(*(u32*)buffer, host->ioaddr + SDHCI_BUFFER); 237 - size = 4; 238 - } else if (size >= 2) { 239 - if (host->data->flags & MMC_DATA_READ) 240 - *(u16*)buffer = readw(host->ioaddr + SDHCI_BUFFER); 241 - else 242 - writew(*(u16*)buffer, host->ioaddr + SDHCI_BUFFER); 243 - size = 2; 244 - } else { 245 - if (host->data->flags & MMC_DATA_READ) 246 - *(u8*)buffer = readb(host->ioaddr + SDHCI_BUFFER); 247 - else 248 - writeb(*(u8*)buffer, host->ioaddr + SDHCI_BUFFER); 249 - size = 1; 250 - } 251 - 252 - buffer += size; 199 + chunk_remain -= size; 200 + blksize -= size; 253 201 host->offset += size; 254 202 host->remain -= size; 255 - 256 - bytes += size; 257 203 host->size -= size; 204 + while (size) { 205 + *buffer = data & 0xFF; 206 + buffer++; 207 + data >>= 8; 208 + size--; 209 + } 258 210 259 211 if (host->remain == 0) { 260 212 sdhci_kunmap_sg(host); 261 213 if (sdhci_next_sg(host) == 0) { 262 - DBG("PIO transfer: %d bytes\n", bytes); 214 + BUG_ON(blksize != 0); 263 215 return; 264 216 } 265 217 buffer = sdhci_kmap_sg(host); ··· 234 252 } 235 253 236 254 sdhci_kunmap_sg(host); 255 + } 237 256 238 - DBG("PIO transfer: %d bytes\n", bytes); 257 + static void sdhci_write_block_pio(struct sdhci_host *host) 258 + { 259 + int blksize, chunk_remain; 260 + u32 data; 261 + char *buffer; 262 + int bytes, size; 263 + 264 + DBG("PIO writing\n"); 265 + 266 + blksize = host->data->blksz; 267 + chunk_remain = 4; 268 + data = 0; 269 + 270 + bytes = 0; 271 + buffer = sdhci_kmap_sg(host) + host->offset; 272 + 273 + while (blksize) { 274 + size = min(host->size, host->remain); 275 + size = min(size, chunk_remain); 276 + 277 + chunk_remain -= size; 278 + blksize -= size; 279 + host->offset += size; 280 + host->remain -= size; 281 + host->size -= size; 282 + while (size) { 283 + data >>= 8; 284 + data |= (u32)*buffer << 24; 285 + buffer++; 286 + size--; 287 + } 288 + 289 + if (chunk_remain == 0) { 290 + writel(data, host->ioaddr + SDHCI_BUFFER); 291 + chunk_remain = min(blksize, 4); 292 + } 293 + 294 + if (host->remain == 0) { 295 + sdhci_kunmap_sg(host); 296 + if (sdhci_next_sg(host) == 0) { 297 + BUG_ON(blksize != 0); 298 + return; 299 + } 300 + buffer = sdhci_kmap_sg(host); 301 + } 302 + } 303 + 304 + sdhci_kunmap_sg(host); 305 + } 306 + 307 + static void sdhci_transfer_pio(struct sdhci_host *host) 308 + { 309 + u32 mask; 310 + 311 + BUG_ON(!host->data); 312 + 313 + if (host->size == 0) 314 + return; 315 + 316 + if (host->data->flags & MMC_DATA_READ) 317 + mask = SDHCI_DATA_AVAILABLE; 318 + else 319 + mask = SDHCI_SPACE_AVAILABLE; 320 + 321 + while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) { 322 + if (host->data->flags & MMC_DATA_READ) 323 + sdhci_read_block_pio(host); 324 + else 325 + sdhci_write_block_pio(host); 326 + 327 + if (host->size == 0) 328 + break; 329 + 330 + BUG_ON(host->num_sg == 0); 331 + } 332 + 333 + DBG("PIO transfer complete.\n"); 239 334 } 240 335 241 336 static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_data *data) 242 337 { 243 - u16 mode; 338 + u8 count; 339 + unsigned target_timeout, current_timeout; 244 340 245 341 WARN_ON(host->data); 246 342 247 - if (data == NULL) { 248 - writew(0, host->ioaddr + SDHCI_TRANSFER_MODE); 343 + if (data == NULL) 249 344 return; 250 - } 251 345 252 346 DBG("blksz %04x blks %04x flags %08x\n", 253 347 data->blksz, data->blocks, data->flags); 254 348 DBG("tsac %d ms nsac %d clk\n", 255 349 data->timeout_ns / 1000000, data->timeout_clks); 256 350 257 - mode = SDHCI_TRNS_BLK_CNT_EN; 258 - if (data->blocks > 1) 259 - mode |= SDHCI_TRNS_MULTI; 260 - if (data->flags & MMC_DATA_READ) 261 - mode |= SDHCI_TRNS_READ; 262 - if (host->flags & SDHCI_USE_DMA) 263 - mode |= SDHCI_TRNS_DMA; 351 + /* Sanity checks */ 352 + BUG_ON(data->blksz * data->blocks > 524288); 353 + BUG_ON(data->blksz > host->max_block); 354 + BUG_ON(data->blocks > 65535); 264 355 265 - writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE); 356 + /* timeout in us */ 357 + target_timeout = data->timeout_ns / 1000 + 358 + data->timeout_clks / host->clock; 266 359 267 - writew(data->blksz, host->ioaddr + SDHCI_BLOCK_SIZE); 268 - writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT); 360 + /* 361 + * Figure out needed cycles. 362 + * We do this in steps in order to fit inside a 32 bit int. 363 + * The first step is the minimum timeout, which will have a 364 + * minimum resolution of 6 bits: 365 + * (1) 2^13*1000 > 2^22, 366 + * (2) host->timeout_clk < 2^16 367 + * => 368 + * (1) / (2) > 2^6 369 + */ 370 + count = 0; 371 + current_timeout = (1 << 13) * 1000 / host->timeout_clk; 372 + while (current_timeout < target_timeout) { 373 + count++; 374 + current_timeout <<= 1; 375 + if (count >= 0xF) 376 + break; 377 + } 378 + 379 + if (count >= 0xF) { 380 + printk(KERN_WARNING "%s: Too large timeout requested!\n", 381 + mmc_hostname(host->mmc)); 382 + count = 0xE; 383 + } 384 + 385 + writeb(count, host->ioaddr + SDHCI_TIMEOUT_CONTROL); 269 386 270 387 if (host->flags & SDHCI_USE_DMA) { 271 388 int count; ··· 383 302 host->offset = 0; 384 303 host->remain = host->cur_sg->length; 385 304 } 305 + 306 + /* We do not handle DMA boundaries, so set it to max (512 KiB) */ 307 + writew(SDHCI_MAKE_BLKSZ(7, data->blksz), 308 + host->ioaddr + SDHCI_BLOCK_SIZE); 309 + writew(data->blocks, host->ioaddr + SDHCI_BLOCK_COUNT); 310 + } 311 + 312 + static void sdhci_set_transfer_mode(struct sdhci_host *host, 313 + struct mmc_data *data) 314 + { 315 + u16 mode; 316 + 317 + WARN_ON(host->data); 318 + 319 + if (data == NULL) 320 + return; 321 + 322 + mode = SDHCI_TRNS_BLK_CNT_EN; 323 + if (data->blocks > 1) 324 + mode |= SDHCI_TRNS_MULTI; 325 + if (data->flags & MMC_DATA_READ) 326 + mode |= SDHCI_TRNS_READ; 327 + if (host->flags & SDHCI_USE_DMA) 328 + mode |= SDHCI_TRNS_DMA; 329 + 330 + writew(mode, host->ioaddr + SDHCI_TRANSFER_MODE); 386 331 } 387 332 388 333 static void sdhci_finish_data(struct sdhci_host *host) 389 334 { 390 335 struct mmc_data *data; 391 - u32 intmask; 392 336 u16 blocks; 393 337 394 338 BUG_ON(!host->data); ··· 424 318 if (host->flags & SDHCI_USE_DMA) { 425 319 pci_unmap_sg(host->chip->pdev, data->sg, data->sg_len, 426 320 (data->flags & MMC_DATA_READ)?PCI_DMA_FROMDEVICE:PCI_DMA_TODEVICE); 427 - } else { 428 - intmask = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE); 429 - intmask &= ~(SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL); 430 - writel(intmask, host->ioaddr + SDHCI_SIGNAL_ENABLE); 431 - 432 - intmask = readl(host->ioaddr + SDHCI_INT_ENABLE); 433 - intmask &= ~(SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL); 434 - writel(intmask, host->ioaddr + SDHCI_INT_ENABLE); 435 321 } 436 322 437 323 /* ··· 469 371 static void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) 470 372 { 471 373 int flags; 472 - u32 present; 473 - unsigned long max_jiffies; 374 + u32 mask; 375 + unsigned long timeout; 474 376 475 377 WARN_ON(host->cmd); 476 378 477 379 DBG("Sending cmd (%x)\n", cmd->opcode); 478 380 479 381 /* Wait max 10 ms */ 480 - max_jiffies = jiffies + (HZ + 99)/100; 481 - do { 482 - if (time_after(jiffies, max_jiffies)) { 382 + timeout = 10; 383 + 384 + mask = SDHCI_CMD_INHIBIT; 385 + if ((cmd->data != NULL) || (cmd->flags & MMC_RSP_BUSY)) 386 + mask |= SDHCI_DATA_INHIBIT; 387 + 388 + /* We shouldn't wait for data inihibit for stop commands, even 389 + though they might use busy signaling */ 390 + if (host->mrq->data && (cmd == host->mrq->data->stop)) 391 + mask &= ~SDHCI_DATA_INHIBIT; 392 + 393 + while (readl(host->ioaddr + SDHCI_PRESENT_STATE) & mask) { 394 + if (timeout == 0) { 483 395 printk(KERN_ERR "%s: Controller never released " 484 - "inhibit bits. Please report this to " 396 + "inhibit bit(s). Please report this to " 485 397 BUGMAIL ".\n", mmc_hostname(host->mmc)); 486 398 sdhci_dumpregs(host); 487 399 cmd->error = MMC_ERR_FAILED; 488 400 tasklet_schedule(&host->finish_tasklet); 489 401 return; 490 402 } 491 - present = readl(host->ioaddr + SDHCI_PRESENT_STATE); 492 - } while (present & (SDHCI_CMD_INHIBIT | SDHCI_DATA_INHIBIT)); 403 + timeout--; 404 + mdelay(1); 405 + } 493 406 494 407 mod_timer(&host->timer, jiffies + 10 * HZ); 495 408 ··· 509 400 sdhci_prepare_data(host, cmd->data); 510 401 511 402 writel(cmd->arg, host->ioaddr + SDHCI_ARGUMENT); 403 + 404 + sdhci_set_transfer_mode(host, cmd->data); 512 405 513 406 if ((cmd->flags & MMC_RSP_136) && (cmd->flags & MMC_RSP_BUSY)) { 514 407 printk(KERN_ERR "%s: Unsupported response type! " ··· 567 456 568 457 DBG("Ending cmd (%x)\n", host->cmd->opcode); 569 458 570 - if (host->cmd->data) { 571 - u32 intmask; 572 - 459 + if (host->cmd->data) 573 460 host->data = host->cmd->data; 574 - 575 - if (!(host->flags & SDHCI_USE_DMA)) { 576 - /* 577 - * Don't enable the interrupts until now to make sure we 578 - * get stable handling of the FIFO. 579 - */ 580 - intmask = readl(host->ioaddr + SDHCI_INT_ENABLE); 581 - intmask |= SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL; 582 - writel(intmask, host->ioaddr + SDHCI_INT_ENABLE); 583 - 584 - intmask = readl(host->ioaddr + SDHCI_SIGNAL_ENABLE); 585 - intmask |= SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL; 586 - writel(intmask, host->ioaddr + SDHCI_SIGNAL_ENABLE); 587 - 588 - /* 589 - * The buffer interrupts are to unreliable so we 590 - * start the transfer immediatly. 591 - */ 592 - sdhci_transfer_pio(host); 593 - } 594 - } else 461 + else 595 462 tasklet_schedule(&host->finish_tasklet); 596 463 597 464 host->cmd = NULL; ··· 579 490 { 580 491 int div; 581 492 u16 clk; 582 - unsigned long max_jiffies; 493 + unsigned long timeout; 583 494 584 495 if (clock == host->clock) 585 496 return; ··· 600 511 writew(clk, host->ioaddr + SDHCI_CLOCK_CONTROL); 601 512 602 513 /* Wait max 10 ms */ 603 - max_jiffies = jiffies + (HZ + 99)/100; 604 - do { 605 - if (time_after(jiffies, max_jiffies)) { 514 + timeout = 10; 515 + while (!((clk = readw(host->ioaddr + SDHCI_CLOCK_CONTROL)) 516 + & SDHCI_CLOCK_INT_STABLE)) { 517 + if (timeout == 0) { 606 518 printk(KERN_ERR "%s: Internal clock never stabilised. " 607 519 "Please report this to " BUGMAIL ".\n", 608 520 mmc_hostname(host->mmc)); 609 521 sdhci_dumpregs(host); 610 522 return; 611 523 } 612 - clk = readw(host->ioaddr + SDHCI_CLOCK_CONTROL); 613 - } while (!(clk & SDHCI_CLOCK_INT_STABLE)); 524 + timeout--; 525 + mdelay(1); 526 + } 614 527 615 528 clk |= SDHCI_CLOCK_CARD_EN; 616 529 writew(clk, host->ioaddr + SDHCI_CLOCK_CONTROL); 617 530 618 531 out: 619 532 host->clock = clock; 533 + } 534 + 535 + static void sdhci_set_power(struct sdhci_host *host, unsigned short power) 536 + { 537 + u8 pwr; 538 + 539 + if (host->power == power) 540 + return; 541 + 542 + writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); 543 + 544 + if (power == (unsigned short)-1) 545 + goto out; 546 + 547 + pwr = SDHCI_POWER_ON; 548 + 549 + switch (power) { 550 + case MMC_VDD_170: 551 + case MMC_VDD_180: 552 + case MMC_VDD_190: 553 + pwr |= SDHCI_POWER_180; 554 + break; 555 + case MMC_VDD_290: 556 + case MMC_VDD_300: 557 + case MMC_VDD_310: 558 + pwr |= SDHCI_POWER_300; 559 + break; 560 + case MMC_VDD_320: 561 + case MMC_VDD_330: 562 + case MMC_VDD_340: 563 + pwr |= SDHCI_POWER_330; 564 + break; 565 + default: 566 + BUG(); 567 + } 568 + 569 + writeb(pwr, host->ioaddr + SDHCI_POWER_CONTROL); 570 + 571 + out: 572 + host->power = power; 620 573 } 621 574 622 575 /*****************************************************************************\ ··· 707 576 */ 708 577 if (ios->power_mode == MMC_POWER_OFF) { 709 578 writel(0, host->ioaddr + SDHCI_SIGNAL_ENABLE); 710 - spin_unlock_irqrestore(&host->lock, flags); 711 579 sdhci_init(host); 712 - spin_lock_irqsave(&host->lock, flags); 713 580 } 714 581 715 582 sdhci_set_clock(host, ios->clock); 716 583 717 584 if (ios->power_mode == MMC_POWER_OFF) 718 - writeb(0, host->ioaddr + SDHCI_POWER_CONTROL); 585 + sdhci_set_power(host, -1); 719 586 else 720 - writeb(0xFF, host->ioaddr + SDHCI_POWER_CONTROL); 587 + sdhci_set_power(host, ios->vdd); 721 588 722 589 ctrl = readb(host->ioaddr + SDHCI_HOST_CONTROL); 723 590 if (ios->bus_width == MMC_BUS_WIDTH_4) ··· 922 793 if (host->data->error != MMC_ERR_NONE) 923 794 sdhci_finish_data(host); 924 795 else { 925 - if (intmask & (SDHCI_INT_BUF_FULL | SDHCI_INT_BUF_EMPTY)) 796 + if (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL)) 926 797 sdhci_transfer_pio(host); 927 798 928 799 if (intmask & SDHCI_INT_DATA_END) ··· 947 818 948 819 DBG("*** %s got interrupt: 0x%08x\n", host->slot_descr, intmask); 949 820 950 - if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) 821 + if (intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE)) { 822 + writel(intmask & (SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE), 823 + host->ioaddr + SDHCI_INT_STATUS); 951 824 tasklet_schedule(&host->card_tasklet); 825 + } 826 + 827 + intmask &= ~(SDHCI_INT_CARD_INSERT | SDHCI_INT_CARD_REMOVE); 952 828 953 829 if (intmask & SDHCI_INT_CMD_MASK) { 954 - sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK); 955 - 956 830 writel(intmask & SDHCI_INT_CMD_MASK, 957 831 host->ioaddr + SDHCI_INT_STATUS); 832 + sdhci_cmd_irq(host, intmask & SDHCI_INT_CMD_MASK); 958 833 } 959 834 960 835 if (intmask & SDHCI_INT_DATA_MASK) { 961 - sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK); 962 - 963 836 writel(intmask & SDHCI_INT_DATA_MASK, 964 837 host->ioaddr + SDHCI_INT_STATUS); 838 + sdhci_data_irq(host, intmask & SDHCI_INT_DATA_MASK); 965 839 } 966 840 967 841 intmask &= ~(SDHCI_INT_CMD_MASK | SDHCI_INT_DATA_MASK); 968 842 969 - if (intmask & SDHCI_INT_CARD_INT) { 970 - printk(KERN_ERR "%s: Unexpected card interrupt. Please " 971 - "report this to " BUGMAIL ".\n", 972 - mmc_hostname(host->mmc)); 973 - sdhci_dumpregs(host); 974 - } 975 - 976 843 if (intmask & SDHCI_INT_BUS_POWER) { 977 - printk(KERN_ERR "%s: Unexpected bus power interrupt. Please " 978 - "report this to " BUGMAIL ".\n", 844 + printk(KERN_ERR "%s: Card is consuming too much power!\n", 979 845 mmc_hostname(host->mmc)); 980 - sdhci_dumpregs(host); 846 + writel(SDHCI_INT_BUS_POWER, host->ioaddr + SDHCI_INT_STATUS); 981 847 } 982 848 983 - if (intmask & SDHCI_INT_ACMD12ERR) { 984 - printk(KERN_ERR "%s: Unexpected auto CMD12 error. Please " 849 + intmask &= SDHCI_INT_BUS_POWER; 850 + 851 + if (intmask) { 852 + printk(KERN_ERR "%s: Unexpected interrupt 0x%08x. Please " 985 853 "report this to " BUGMAIL ".\n", 986 - mmc_hostname(host->mmc)); 854 + mmc_hostname(host->mmc), intmask); 987 855 sdhci_dumpregs(host); 988 856 989 - writew(~0, host->ioaddr + SDHCI_ACMD12_ERR); 990 - } 991 - 992 - if (intmask) 993 857 writel(intmask, host->ioaddr + SDHCI_INT_STATUS); 858 + } 994 859 995 860 result = IRQ_HANDLED; 996 861 ··· 1077 954 static int __devinit sdhci_probe_slot(struct pci_dev *pdev, int slot) 1078 955 { 1079 956 int ret; 957 + unsigned int version; 1080 958 struct sdhci_chip *chip; 1081 959 struct mmc_host *mmc; 1082 960 struct sdhci_host *host; ··· 1109 985 return -ENODEV; 1110 986 } 1111 987 988 + if ((pdev->class & 0x0000FF) == PCI_SDHCI_IFVENDOR) { 989 + printk(KERN_ERR DRIVER_NAME ": Vendor specific interface. Aborting.\n"); 990 + return -ENODEV; 991 + } 992 + 993 + if ((pdev->class & 0x0000FF) > PCI_SDHCI_IFVENDOR) { 994 + printk(KERN_ERR DRIVER_NAME ": Unknown interface. Aborting.\n"); 995 + return -ENODEV; 996 + } 997 + 1112 998 mmc = mmc_alloc_host(sizeof(struct sdhci_host), &pdev->dev); 1113 999 if (!mmc) 1114 1000 return -ENOMEM; ··· 1146 1012 goto release; 1147 1013 } 1148 1014 1015 + sdhci_reset(host, SDHCI_RESET_ALL); 1016 + 1017 + version = readw(host->ioaddr + SDHCI_HOST_VERSION); 1018 + version = (version & SDHCI_SPEC_VER_MASK) >> SDHCI_SPEC_VER_SHIFT; 1019 + if (version != 0) { 1020 + printk(KERN_ERR "%s: Unknown controller version (%d). " 1021 + "Cowardly refusing to continue.\n", host->slot_descr, 1022 + version); 1023 + ret = -ENODEV; 1024 + goto unmap; 1025 + } 1026 + 1149 1027 caps = readl(host->ioaddr + SDHCI_CAPABILITIES); 1150 1028 1151 - if ((caps & SDHCI_CAN_DO_DMA) && ((pdev->class & 0x0000FF) == 0x01)) 1029 + if (debug_nodma) 1030 + DBG("DMA forced off\n"); 1031 + else if (debug_forcedma) { 1032 + DBG("DMA forced on\n"); 1033 + host->flags |= SDHCI_USE_DMA; 1034 + } else if ((pdev->class & 0x0000FF) != PCI_SDHCI_IFDMA) 1035 + DBG("Controller doesn't have DMA interface\n"); 1036 + else if (!(caps & SDHCI_CAN_DO_DMA)) 1037 + DBG("Controller doesn't have DMA capability\n"); 1038 + else 1152 1039 host->flags |= SDHCI_USE_DMA; 1153 1040 1154 1041 if (host->flags & SDHCI_USE_DMA) { ··· 1185 1030 else /* XXX: Hack to get MMC layer to avoid highmem */ 1186 1031 pdev->dma_mask = 0; 1187 1032 1188 - host->max_clk = (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; 1033 + host->max_clk = 1034 + (caps & SDHCI_CLOCK_BASE_MASK) >> SDHCI_CLOCK_BASE_SHIFT; 1035 + if (host->max_clk == 0) { 1036 + printk(KERN_ERR "%s: Hardware doesn't specify base clock " 1037 + "frequency.\n", host->slot_descr); 1038 + ret = -ENODEV; 1039 + goto unmap; 1040 + } 1189 1041 host->max_clk *= 1000000; 1042 + 1043 + host->timeout_clk = 1044 + (caps & SDHCI_TIMEOUT_CLK_MASK) >> SDHCI_TIMEOUT_CLK_SHIFT; 1045 + if (host->timeout_clk == 0) { 1046 + printk(KERN_ERR "%s: Hardware doesn't specify timeout clock " 1047 + "frequency.\n", host->slot_descr); 1048 + ret = -ENODEV; 1049 + goto unmap; 1050 + } 1051 + if (caps & SDHCI_TIMEOUT_CLK_UNIT) 1052 + host->timeout_clk *= 1000; 1053 + 1054 + host->max_block = (caps & SDHCI_MAX_BLOCK_MASK) >> SDHCI_MAX_BLOCK_SHIFT; 1055 + if (host->max_block >= 3) { 1056 + printk(KERN_ERR "%s: Invalid maximum block size.\n", 1057 + host->slot_descr); 1058 + ret = -ENODEV; 1059 + goto unmap; 1060 + } 1061 + host->max_block = 512 << host->max_block; 1190 1062 1191 1063 /* 1192 1064 * Set host parameters. ··· 1221 1039 mmc->ops = &sdhci_ops; 1222 1040 mmc->f_min = host->max_clk / 256; 1223 1041 mmc->f_max = host->max_clk; 1224 - mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34; 1225 1042 mmc->caps = MMC_CAP_4_BIT_DATA; 1043 + 1044 + mmc->ocr_avail = 0; 1045 + if (caps & SDHCI_CAN_VDD_330) 1046 + mmc->ocr_avail |= MMC_VDD_32_33|MMC_VDD_33_34; 1047 + else if (caps & SDHCI_CAN_VDD_300) 1048 + mmc->ocr_avail |= MMC_VDD_29_30|MMC_VDD_30_31; 1049 + else if (caps & SDHCI_CAN_VDD_180) 1050 + mmc->ocr_avail |= MMC_VDD_17_18|MMC_VDD_18_19; 1051 + 1052 + if (mmc->ocr_avail == 0) { 1053 + printk(KERN_ERR "%s: Hardware doesn't report any " 1054 + "support voltages.\n", host->slot_descr); 1055 + ret = -ENODEV; 1056 + goto unmap; 1057 + } 1226 1058 1227 1059 spin_lock_init(&host->lock); 1228 1060 ··· 1250 1054 mmc->max_phys_segs = 16; 1251 1055 1252 1056 /* 1253 - * Maximum number of sectors in one transfer. Limited by sector 1254 - * count register. 1057 + * Maximum number of sectors in one transfer. Limited by DMA boundary 1058 + * size (512KiB), which means (512 KiB/512=) 1024 entries. 1255 1059 */ 1256 - mmc->max_sectors = 0x3FFF; 1060 + mmc->max_sectors = 1024; 1257 1061 1258 1062 /* 1259 1063 * Maximum segment size. Could be one segment with the maximum number ··· 1274 1078 ret = request_irq(host->irq, sdhci_irq, IRQF_SHARED, 1275 1079 host->slot_descr, host); 1276 1080 if (ret) 1277 - goto unmap; 1081 + goto untasklet; 1278 1082 1279 1083 sdhci_init(host); 1280 1084 ··· 1293 1097 1294 1098 return 0; 1295 1099 1296 - unmap: 1100 + untasklet: 1297 1101 tasklet_kill(&host->card_tasklet); 1298 1102 tasklet_kill(&host->finish_tasklet); 1299 - 1103 + unmap: 1300 1104 iounmap(host->ioaddr); 1301 1105 release: 1302 1106 pci_release_region(pdev, host->bar); ··· 1340 1144 const struct pci_device_id *ent) 1341 1145 { 1342 1146 int ret, i; 1343 - u8 slots; 1147 + u8 slots, rev; 1344 1148 struct sdhci_chip *chip; 1345 1149 1346 1150 BUG_ON(pdev == NULL); 1347 1151 BUG_ON(ent == NULL); 1348 1152 1349 - DBG("found at %s\n", pci_name(pdev)); 1153 + pci_read_config_byte(pdev, PCI_CLASS_REVISION, &rev); 1154 + 1155 + printk(KERN_INFO DRIVER_NAME 1156 + ": SDHCI controller found at %s [%04x:%04x] (rev %x)\n", 1157 + pci_name(pdev), (int)pdev->vendor, (int)pdev->device, 1158 + (int)rev); 1350 1159 1351 1160 ret = pci_read_config_byte(pdev, PCI_SLOT_INFO, &slots); 1352 1161 if (ret) ··· 1374 1173 } 1375 1174 1376 1175 chip->pdev = pdev; 1176 + chip->quirks = ent->driver_data; 1177 + 1178 + if (debug_quirks) 1179 + chip->quirks = debug_quirks; 1377 1180 1378 1181 chip->num_slots = slots; 1379 1182 pci_set_drvdata(pdev, chip); ··· 1456 1251 module_init(sdhci_drv_init); 1457 1252 module_exit(sdhci_drv_exit); 1458 1253 1254 + module_param(debug_nodma, uint, 0444); 1255 + module_param(debug_forcedma, uint, 0444); 1256 + module_param(debug_quirks, uint, 0444); 1257 + 1459 1258 MODULE_AUTHOR("Pierre Ossman <drzeus@drzeus.cx>"); 1460 1259 MODULE_DESCRIPTION("Secure Digital Host Controller Interface driver"); 1461 1260 MODULE_VERSION(DRIVER_VERSION); 1462 1261 MODULE_LICENSE("GPL"); 1262 + 1263 + MODULE_PARM_DESC(debug_nodma, "Forcefully disable DMA transfers. (default 0)"); 1264 + MODULE_PARM_DESC(debug_forcedma, "Forcefully enable DMA transfers. (default 0)"); 1265 + MODULE_PARM_DESC(debug_quirks, "Force certain quirks.");
+30 -4
drivers/mmc/sdhci.h
··· 12 12 * PCI registers 13 13 */ 14 14 15 + #define PCI_SDHCI_IFPIO 0x00 16 + #define PCI_SDHCI_IFDMA 0x01 17 + #define PCI_SDHCI_IFVENDOR 0x02 18 + 15 19 #define PCI_SLOT_INFO 0x40 /* 8 bits */ 16 20 #define PCI_SLOT_INFO_SLOTS(x) ((x >> 4) & 7) 17 21 #define PCI_SLOT_INFO_FIRST_BAR_MASK 0x07 ··· 27 23 #define SDHCI_DMA_ADDRESS 0x00 28 24 29 25 #define SDHCI_BLOCK_SIZE 0x04 26 + #define SDHCI_MAKE_BLKSZ(dma, blksz) (((dma & 0x7) << 12) | (blksz & 0xFFF)) 30 27 31 28 #define SDHCI_BLOCK_COUNT 0x06 32 29 ··· 72 67 #define SDHCI_CTRL_4BITBUS 0x02 73 68 74 69 #define SDHCI_POWER_CONTROL 0x29 70 + #define SDHCI_POWER_ON 0x01 71 + #define SDHCI_POWER_180 0x0A 72 + #define SDHCI_POWER_300 0x0C 73 + #define SDHCI_POWER_330 0x0E 75 74 76 75 #define SDHCI_BLOCK_GAP_CONTROL 0x2A 77 76 ··· 100 91 #define SDHCI_INT_RESPONSE 0x00000001 101 92 #define SDHCI_INT_DATA_END 0x00000002 102 93 #define SDHCI_INT_DMA_END 0x00000008 103 - #define SDHCI_INT_BUF_EMPTY 0x00000010 104 - #define SDHCI_INT_BUF_FULL 0x00000020 94 + #define SDHCI_INT_SPACE_AVAIL 0x00000010 95 + #define SDHCI_INT_DATA_AVAIL 0x00000020 105 96 #define SDHCI_INT_CARD_INSERT 0x00000040 106 97 #define SDHCI_INT_CARD_REMOVE 0x00000080 107 98 #define SDHCI_INT_CARD_INT 0x00000100 ··· 121 112 #define SDHCI_INT_CMD_MASK (SDHCI_INT_RESPONSE | SDHCI_INT_TIMEOUT | \ 122 113 SDHCI_INT_CRC | SDHCI_INT_END_BIT | SDHCI_INT_INDEX) 123 114 #define SDHCI_INT_DATA_MASK (SDHCI_INT_DATA_END | SDHCI_INT_DMA_END | \ 124 - SDHCI_INT_BUF_EMPTY | SDHCI_INT_BUF_FULL | \ 115 + SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | \ 125 116 SDHCI_INT_DATA_TIMEOUT | SDHCI_INT_DATA_CRC | \ 126 117 SDHCI_INT_DATA_END_BIT) 127 118 ··· 130 121 /* 3E-3F reserved */ 131 122 132 123 #define SDHCI_CAPABILITIES 0x40 133 - #define SDHCI_CAN_DO_DMA 0x00400000 124 + #define SDHCI_TIMEOUT_CLK_MASK 0x0000003F 125 + #define SDHCI_TIMEOUT_CLK_SHIFT 0 126 + #define SDHCI_TIMEOUT_CLK_UNIT 0x00000080 134 127 #define SDHCI_CLOCK_BASE_MASK 0x00003F00 135 128 #define SDHCI_CLOCK_BASE_SHIFT 8 129 + #define SDHCI_MAX_BLOCK_MASK 0x00030000 130 + #define SDHCI_MAX_BLOCK_SHIFT 16 131 + #define SDHCI_CAN_DO_DMA 0x00400000 132 + #define SDHCI_CAN_VDD_330 0x01000000 133 + #define SDHCI_CAN_VDD_300 0x02000000 134 + #define SDHCI_CAN_VDD_180 0x04000000 136 135 137 136 /* 44-47 reserved for more caps */ 138 137 ··· 153 136 #define SDHCI_SLOT_INT_STATUS 0xFC 154 137 155 138 #define SDHCI_HOST_VERSION 0xFE 139 + #define SDHCI_VENDOR_VER_MASK 0xFF00 140 + #define SDHCI_VENDOR_VER_SHIFT 8 141 + #define SDHCI_SPEC_VER_MASK 0x00FF 142 + #define SDHCI_SPEC_VER_SHIFT 0 156 143 157 144 struct sdhci_chip; 158 145 ··· 170 149 #define SDHCI_USE_DMA (1<<0) 171 150 172 151 unsigned int max_clk; /* Max possible freq (MHz) */ 152 + unsigned int timeout_clk; /* Timeout freq (KHz) */ 153 + unsigned int max_block; /* Max block size (bytes) */ 173 154 174 155 unsigned int clock; /* Current clock (MHz) */ 156 + unsigned short power; /* Current voltage */ 175 157 176 158 struct mmc_request *mrq; /* Current request */ 177 159 struct mmc_command *cmd; /* Current command */ ··· 203 179 204 180 struct sdhci_chip { 205 181 struct pci_dev *pdev; 182 + 183 + unsigned long quirks; 206 184 207 185 int num_slots; /* Slots on controller */ 208 186 struct sdhci_host *hosts[0]; /* Pointers to hosts */