aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mmc/wbsd.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/wbsd.c')
-rw-r--r--drivers/mmc/wbsd.c416
1 files changed, 208 insertions, 208 deletions
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c
index e11e55dc8924..46e5f9a17a23 100644
--- a/drivers/mmc/wbsd.c
+++ b/drivers/mmc/wbsd.c
@@ -93,7 +93,7 @@ static int dma = 2;
93static inline void wbsd_unlock_config(struct wbsd_host* host) 93static inline void wbsd_unlock_config(struct wbsd_host* host)
94{ 94{
95 BUG_ON(host->config == 0); 95 BUG_ON(host->config == 0);
96 96
97 outb(host->unlock_code, host->config); 97 outb(host->unlock_code, host->config);
98 outb(host->unlock_code, host->config); 98 outb(host->unlock_code, host->config);
99} 99}
@@ -101,14 +101,14 @@ static inline void wbsd_unlock_config(struct wbsd_host* host)
101static inline void wbsd_lock_config(struct wbsd_host* host) 101static inline void wbsd_lock_config(struct wbsd_host* host)
102{ 102{
103 BUG_ON(host->config == 0); 103 BUG_ON(host->config == 0);
104 104
105 outb(LOCK_CODE, host->config); 105 outb(LOCK_CODE, host->config);
106} 106}
107 107
108static inline void wbsd_write_config(struct wbsd_host* host, u8 reg, u8 value) 108static inline void wbsd_write_config(struct wbsd_host* host, u8 reg, u8 value)
109{ 109{
110 BUG_ON(host->config == 0); 110 BUG_ON(host->config == 0);
111 111
112 outb(reg, host->config); 112 outb(reg, host->config);
113 outb(value, host->config + 1); 113 outb(value, host->config + 1);
114} 114}
@@ -116,7 +116,7 @@ static inline void wbsd_write_config(struct wbsd_host* host, u8 reg, u8 value)
116static inline u8 wbsd_read_config(struct wbsd_host* host, u8 reg) 116static inline u8 wbsd_read_config(struct wbsd_host* host, u8 reg)
117{ 117{
118 BUG_ON(host->config == 0); 118 BUG_ON(host->config == 0);
119 119
120 outb(reg, host->config); 120 outb(reg, host->config);
121 return inb(host->config + 1); 121 return inb(host->config + 1);
122} 122}
@@ -140,21 +140,21 @@ static inline u8 wbsd_read_index(struct wbsd_host* host, u8 index)
140static void wbsd_init_device(struct wbsd_host* host) 140static void wbsd_init_device(struct wbsd_host* host)
141{ 141{
142 u8 setup, ier; 142 u8 setup, ier;
143 143
144 /* 144 /*
145 * Reset chip (SD/MMC part) and fifo. 145 * Reset chip (SD/MMC part) and fifo.
146 */ 146 */
147 setup = wbsd_read_index(host, WBSD_IDX_SETUP); 147 setup = wbsd_read_index(host, WBSD_IDX_SETUP);
148 setup |= WBSD_FIFO_RESET | WBSD_SOFT_RESET; 148 setup |= WBSD_FIFO_RESET | WBSD_SOFT_RESET;
149 wbsd_write_index(host, WBSD_IDX_SETUP, setup); 149 wbsd_write_index(host, WBSD_IDX_SETUP, setup);
150 150
151 /* 151 /*
152 * Set DAT3 to input 152 * Set DAT3 to input
153 */ 153 */
154 setup &= ~WBSD_DAT3_H; 154 setup &= ~WBSD_DAT3_H;
155 wbsd_write_index(host, WBSD_IDX_SETUP, setup); 155 wbsd_write_index(host, WBSD_IDX_SETUP, setup);
156 host->flags &= ~WBSD_FIGNORE_DETECT; 156 host->flags &= ~WBSD_FIGNORE_DETECT;
157 157
158 /* 158 /*
159 * Read back default clock. 159 * Read back default clock.
160 */ 160 */
@@ -164,12 +164,12 @@ static void wbsd_init_device(struct wbsd_host* host)
164 * Power down port. 164 * Power down port.
165 */ 165 */
166 outb(WBSD_POWER_N, host->base + WBSD_CSR); 166 outb(WBSD_POWER_N, host->base + WBSD_CSR);
167 167
168 /* 168 /*
169 * Set maximum timeout. 169 * Set maximum timeout.
170 */ 170 */
171 wbsd_write_index(host, WBSD_IDX_TAAC, 0x7F); 171 wbsd_write_index(host, WBSD_IDX_TAAC, 0x7F);
172 172
173 /* 173 /*
174 * Test for card presence 174 * Test for card presence
175 */ 175 */
@@ -177,7 +177,7 @@ static void wbsd_init_device(struct wbsd_host* host)
177 host->flags |= WBSD_FCARD_PRESENT; 177 host->flags |= WBSD_FCARD_PRESENT;
178 else 178 else
179 host->flags &= ~WBSD_FCARD_PRESENT; 179 host->flags &= ~WBSD_FCARD_PRESENT;
180 180
181 /* 181 /*
182 * Enable interesting interrupts. 182 * Enable interesting interrupts.
183 */ 183 */
@@ -200,9 +200,9 @@ static void wbsd_init_device(struct wbsd_host* host)
200static void wbsd_reset(struct wbsd_host* host) 200static void wbsd_reset(struct wbsd_host* host)
201{ 201{
202 u8 setup; 202 u8 setup;
203 203
204 printk(KERN_ERR DRIVER_NAME ": Resetting chip\n"); 204 printk(KERN_ERR DRIVER_NAME ": Resetting chip\n");
205 205
206 /* 206 /*
207 * Soft reset of chip (SD/MMC part). 207 * Soft reset of chip (SD/MMC part).
208 */ 208 */
@@ -214,9 +214,9 @@ static void wbsd_reset(struct wbsd_host* host)
214static void wbsd_request_end(struct wbsd_host* host, struct mmc_request* mrq) 214static void wbsd_request_end(struct wbsd_host* host, struct mmc_request* mrq)
215{ 215{
216 unsigned long dmaflags; 216 unsigned long dmaflags;
217 217
218 DBGF("Ending request, cmd (%x)\n", mrq->cmd->opcode); 218 DBGF("Ending request, cmd (%x)\n", mrq->cmd->opcode);
219 219
220 if (host->dma >= 0) 220 if (host->dma >= 0)
221 { 221 {
222 /* 222 /*
@@ -232,7 +232,7 @@ static void wbsd_request_end(struct wbsd_host* host, struct mmc_request* mrq)
232 */ 232 */
233 wbsd_write_index(host, WBSD_IDX_DMA, 0); 233 wbsd_write_index(host, WBSD_IDX_DMA, 0);
234 } 234 }
235 235
236 host->mrq = NULL; 236 host->mrq = NULL;
237 237
238 /* 238 /*
@@ -275,7 +275,7 @@ static inline int wbsd_next_sg(struct wbsd_host* host)
275 host->offset = 0; 275 host->offset = 0;
276 host->remain = host->cur_sg->length; 276 host->remain = host->cur_sg->length;
277 } 277 }
278 278
279 return host->num_sg; 279 return host->num_sg;
280} 280}
281 281
@@ -297,12 +297,12 @@ static inline void wbsd_sg_to_dma(struct wbsd_host* host, struct mmc_data* data)
297 struct scatterlist* sg; 297 struct scatterlist* sg;
298 char* dmabuf = host->dma_buffer; 298 char* dmabuf = host->dma_buffer;
299 char* sgbuf; 299 char* sgbuf;
300 300
301 size = host->size; 301 size = host->size;
302 302
303 sg = data->sg; 303 sg = data->sg;
304 len = data->sg_len; 304 len = data->sg_len;
305 305
306 /* 306 /*
307 * Just loop through all entries. Size might not 307 * Just loop through all entries. Size might not
308 * be the entire list though so make sure that 308 * be the entire list though so make sure that
@@ -317,23 +317,23 @@ static inline void wbsd_sg_to_dma(struct wbsd_host* host, struct mmc_data* data)
317 memcpy(dmabuf, sgbuf, sg[i].length); 317 memcpy(dmabuf, sgbuf, sg[i].length);
318 kunmap_atomic(sgbuf, KM_BIO_SRC_IRQ); 318 kunmap_atomic(sgbuf, KM_BIO_SRC_IRQ);
319 dmabuf += sg[i].length; 319 dmabuf += sg[i].length;
320 320
321 if (size < sg[i].length) 321 if (size < sg[i].length)
322 size = 0; 322 size = 0;
323 else 323 else
324 size -= sg[i].length; 324 size -= sg[i].length;
325 325
326 if (size == 0) 326 if (size == 0)
327 break; 327 break;
328 } 328 }
329 329
330 /* 330 /*
331 * Check that we didn't get a request to transfer 331 * Check that we didn't get a request to transfer
332 * more data than can fit into the SG list. 332 * more data than can fit into the SG list.
333 */ 333 */
334 334
335 BUG_ON(size != 0); 335 BUG_ON(size != 0);
336 336
337 host->size -= size; 337 host->size -= size;
338} 338}
339 339
@@ -343,12 +343,12 @@ static inline void wbsd_dma_to_sg(struct wbsd_host* host, struct mmc_data* data)
343 struct scatterlist* sg; 343 struct scatterlist* sg;
344 char* dmabuf = host->dma_buffer; 344 char* dmabuf = host->dma_buffer;
345 char* sgbuf; 345 char* sgbuf;
346 346
347 size = host->size; 347 size = host->size;
348 348
349 sg = data->sg; 349 sg = data->sg;
350 len = data->sg_len; 350 len = data->sg_len;
351 351
352 /* 352 /*
353 * Just loop through all entries. Size might not 353 * Just loop through all entries. Size might not
354 * be the entire list though so make sure that 354 * be the entire list though so make sure that
@@ -363,30 +363,30 @@ static inline void wbsd_dma_to_sg(struct wbsd_host* host, struct mmc_data* data)
363 memcpy(sgbuf, dmabuf, sg[i].length); 363 memcpy(sgbuf, dmabuf, sg[i].length);
364 kunmap_atomic(sgbuf, KM_BIO_SRC_IRQ); 364 kunmap_atomic(sgbuf, KM_BIO_SRC_IRQ);
365 dmabuf += sg[i].length; 365 dmabuf += sg[i].length;
366 366
367 if (size < sg[i].length) 367 if (size < sg[i].length)
368 size = 0; 368 size = 0;
369 else 369 else
370 size -= sg[i].length; 370 size -= sg[i].length;
371 371
372 if (size == 0) 372 if (size == 0)
373 break; 373 break;
374 } 374 }
375 375
376 /* 376 /*
377 * Check that we didn't get a request to transfer 377 * Check that we didn't get a request to transfer
378 * more data than can fit into the SG list. 378 * more data than can fit into the SG list.
379 */ 379 */
380 380
381 BUG_ON(size != 0); 381 BUG_ON(size != 0);
382 382
383 host->size -= size; 383 host->size -= size;
384} 384}
385 385
386/* 386/*
387 * Command handling 387 * Command handling
388 */ 388 */
389 389
390static inline void wbsd_get_short_reply(struct wbsd_host* host, 390static inline void wbsd_get_short_reply(struct wbsd_host* host,
391 struct mmc_command* cmd) 391 struct mmc_command* cmd)
392{ 392{
@@ -398,7 +398,7 @@ static inline void wbsd_get_short_reply(struct wbsd_host* host,
398 cmd->error = MMC_ERR_INVALID; 398 cmd->error = MMC_ERR_INVALID;
399 return; 399 return;
400 } 400 }
401 401
402 cmd->resp[0] = 402 cmd->resp[0] =
403 wbsd_read_index(host, WBSD_IDX_RESP12) << 24; 403 wbsd_read_index(host, WBSD_IDX_RESP12) << 24;
404 cmd->resp[0] |= 404 cmd->resp[0] |=
@@ -415,7 +415,7 @@ static inline void wbsd_get_long_reply(struct wbsd_host* host,
415 struct mmc_command* cmd) 415 struct mmc_command* cmd)
416{ 416{
417 int i; 417 int i;
418 418
419 /* 419 /*
420 * Correct response type? 420 * Correct response type?
421 */ 421 */
@@ -424,7 +424,7 @@ static inline void wbsd_get_long_reply(struct wbsd_host* host,
424 cmd->error = MMC_ERR_INVALID; 424 cmd->error = MMC_ERR_INVALID;
425 return; 425 return;
426 } 426 }
427 427
428 for (i = 0;i < 4;i++) 428 for (i = 0;i < 4;i++)
429 { 429 {
430 cmd->resp[i] = 430 cmd->resp[i] =
@@ -442,7 +442,7 @@ static void wbsd_send_command(struct wbsd_host* host, struct mmc_command* cmd)
442{ 442{
443 int i; 443 int i;
444 u8 status, isr; 444 u8 status, isr;
445 445
446 DBGF("Sending cmd (%x)\n", cmd->opcode); 446 DBGF("Sending cmd (%x)\n", cmd->opcode);
447 447
448 /* 448 /*
@@ -451,16 +451,16 @@ static void wbsd_send_command(struct wbsd_host* host, struct mmc_command* cmd)
451 * transfer. 451 * transfer.
452 */ 452 */
453 host->isr = 0; 453 host->isr = 0;
454 454
455 /* 455 /*
456 * Send the command (CRC calculated by host). 456 * Send the command (CRC calculated by host).
457 */ 457 */
458 outb(cmd->opcode, host->base + WBSD_CMDR); 458 outb(cmd->opcode, host->base + WBSD_CMDR);
459 for (i = 3;i >= 0;i--) 459 for (i = 3;i >= 0;i--)
460 outb((cmd->arg >> (i * 8)) & 0xff, host->base + WBSD_CMDR); 460 outb((cmd->arg >> (i * 8)) & 0xff, host->base + WBSD_CMDR);
461 461
462 cmd->error = MMC_ERR_NONE; 462 cmd->error = MMC_ERR_NONE;
463 463
464 /* 464 /*
465 * Wait for the request to complete. 465 * Wait for the request to complete.
466 */ 466 */
@@ -477,7 +477,7 @@ static void wbsd_send_command(struct wbsd_host* host, struct mmc_command* cmd)
477 * Read back status. 477 * Read back status.
478 */ 478 */
479 isr = host->isr; 479 isr = host->isr;
480 480
481 /* Card removed? */ 481 /* Card removed? */
482 if (isr & WBSD_INT_CARD) 482 if (isr & WBSD_INT_CARD)
483 cmd->error = MMC_ERR_TIMEOUT; 483 cmd->error = MMC_ERR_TIMEOUT;
@@ -509,13 +509,13 @@ static void wbsd_empty_fifo(struct wbsd_host* host)
509 struct mmc_data* data = host->mrq->cmd->data; 509 struct mmc_data* data = host->mrq->cmd->data;
510 char* buffer; 510 char* buffer;
511 int i, fsr, fifo; 511 int i, fsr, fifo;
512 512
513 /* 513 /*
514 * Handle excessive data. 514 * Handle excessive data.
515 */ 515 */
516 if (data->bytes_xfered == host->size) 516 if (data->bytes_xfered == host->size)
517 return; 517 return;
518 518
519 buffer = wbsd_kmap_sg(host) + host->offset; 519 buffer = wbsd_kmap_sg(host) + host->offset;
520 520
521 /* 521 /*
@@ -527,14 +527,14 @@ static void wbsd_empty_fifo(struct wbsd_host* host)
527 /* 527 /*
528 * The size field in the FSR is broken so we have to 528 * The size field in the FSR is broken so we have to
529 * do some guessing. 529 * do some guessing.
530 */ 530 */
531 if (fsr & WBSD_FIFO_FULL) 531 if (fsr & WBSD_FIFO_FULL)
532 fifo = 16; 532 fifo = 16;
533 else if (fsr & WBSD_FIFO_FUTHRE) 533 else if (fsr & WBSD_FIFO_FUTHRE)
534 fifo = 8; 534 fifo = 8;
535 else 535 else
536 fifo = 1; 536 fifo = 1;
537 537
538 for (i = 0;i < fifo;i++) 538 for (i = 0;i < fifo;i++)
539 { 539 {
540 *buffer = inb(host->base + WBSD_DFR); 540 *buffer = inb(host->base + WBSD_DFR);
@@ -543,23 +543,23 @@ static void wbsd_empty_fifo(struct wbsd_host* host)
543 host->remain--; 543 host->remain--;
544 544
545 data->bytes_xfered++; 545 data->bytes_xfered++;
546 546
547 /* 547 /*
548 * Transfer done? 548 * Transfer done?
549 */ 549 */
550 if (data->bytes_xfered == host->size) 550 if (data->bytes_xfered == host->size)
551 { 551 {
552 wbsd_kunmap_sg(host); 552 wbsd_kunmap_sg(host);
553 return; 553 return;
554 } 554 }
555 555
556 /* 556 /*
557 * End of scatter list entry? 557 * End of scatter list entry?
558 */ 558 */
559 if (host->remain == 0) 559 if (host->remain == 0)
560 { 560 {
561 wbsd_kunmap_sg(host); 561 wbsd_kunmap_sg(host);
562 562
563 /* 563 /*
564 * Get next entry. Check if last. 564 * Get next entry. Check if last.
565 */ 565 */
@@ -572,17 +572,17 @@ static void wbsd_empty_fifo(struct wbsd_host* host)
572 * into the scatter list. 572 * into the scatter list.
573 */ 573 */
574 BUG_ON(1); 574 BUG_ON(1);
575 575
576 host->size = data->bytes_xfered; 576 host->size = data->bytes_xfered;
577 577
578 return; 578 return;
579 } 579 }
580 580
581 buffer = wbsd_kmap_sg(host); 581 buffer = wbsd_kmap_sg(host);
582 } 582 }
583 } 583 }
584 } 584 }
585 585
586 wbsd_kunmap_sg(host); 586 wbsd_kunmap_sg(host);
587 587
588 /* 588 /*
@@ -599,7 +599,7 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
599 struct mmc_data* data = host->mrq->cmd->data; 599 struct mmc_data* data = host->mrq->cmd->data;
600 char* buffer; 600 char* buffer;
601 int i, fsr, fifo; 601 int i, fsr, fifo;
602 602
603 /* 603 /*
604 * Check that we aren't being called after the 604 * Check that we aren't being called after the
605 * entire buffer has been transfered. 605 * entire buffer has been transfered.
@@ -618,7 +618,7 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
618 /* 618 /*
619 * The size field in the FSR is broken so we have to 619 * The size field in the FSR is broken so we have to
620 * do some guessing. 620 * do some guessing.
621 */ 621 */
622 if (fsr & WBSD_FIFO_EMPTY) 622 if (fsr & WBSD_FIFO_EMPTY)
623 fifo = 0; 623 fifo = 0;
624 else if (fsr & WBSD_FIFO_EMTHRE) 624 else if (fsr & WBSD_FIFO_EMTHRE)
@@ -632,9 +632,9 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
632 buffer++; 632 buffer++;
633 host->offset++; 633 host->offset++;
634 host->remain--; 634 host->remain--;
635 635
636 data->bytes_xfered++; 636 data->bytes_xfered++;
637 637
638 /* 638 /*
639 * Transfer done? 639 * Transfer done?
640 */ 640 */
@@ -650,7 +650,7 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
650 if (host->remain == 0) 650 if (host->remain == 0)
651 { 651 {
652 wbsd_kunmap_sg(host); 652 wbsd_kunmap_sg(host);
653 653
654 /* 654 /*
655 * Get next entry. Check if last. 655 * Get next entry. Check if last.
656 */ 656 */
@@ -663,19 +663,19 @@ static void wbsd_fill_fifo(struct wbsd_host* host)
663 * into the scatter list. 663 * into the scatter list.
664 */ 664 */
665 BUG_ON(1); 665 BUG_ON(1);
666 666
667 host->size = data->bytes_xfered; 667 host->size = data->bytes_xfered;
668 668
669 return; 669 return;
670 } 670 }
671 671
672 buffer = wbsd_kmap_sg(host); 672 buffer = wbsd_kmap_sg(host);
673 } 673 }
674 } 674 }
675 } 675 }
676 676
677 wbsd_kunmap_sg(host); 677 wbsd_kunmap_sg(host);
678 678
679 /* 679 /*
680 * The controller stops sending interrupts for 680 * The controller stops sending interrupts for
681 * 'FIFO empty' under certain conditions. So we 681 * 'FIFO empty' under certain conditions. So we
@@ -694,7 +694,7 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
694 1 << data->blksz_bits, data->blocks, data->flags); 694 1 << data->blksz_bits, data->blocks, data->flags);
695 DBGF("tsac %d ms nsac %d clk\n", 695 DBGF("tsac %d ms nsac %d clk\n",
696 data->timeout_ns / 1000000, data->timeout_clks); 696 data->timeout_ns / 1000000, data->timeout_clks);
697 697
698 /* 698 /*
699 * Calculate size. 699 * Calculate size.
700 */ 700 */
@@ -708,12 +708,12 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
708 wbsd_write_index(host, WBSD_IDX_TAAC, 127); 708 wbsd_write_index(host, WBSD_IDX_TAAC, 127);
709 else 709 else
710 wbsd_write_index(host, WBSD_IDX_TAAC, data->timeout_ns/1000000); 710 wbsd_write_index(host, WBSD_IDX_TAAC, data->timeout_ns/1000000);
711 711
712 if (data->timeout_clks > 255) 712 if (data->timeout_clks > 255)
713 wbsd_write_index(host, WBSD_IDX_NSAC, 255); 713 wbsd_write_index(host, WBSD_IDX_NSAC, 255);
714 else 714 else
715 wbsd_write_index(host, WBSD_IDX_NSAC, data->timeout_clks); 715 wbsd_write_index(host, WBSD_IDX_NSAC, data->timeout_clks);
716 716
717 /* 717 /*
718 * Inform the chip of how large blocks will be 718 * Inform the chip of how large blocks will be
719 * sent. It needs this to determine when to 719 * sent. It needs this to determine when to
@@ -732,7 +732,7 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
732 else if (host->bus_width == MMC_BUS_WIDTH_4) 732 else if (host->bus_width == MMC_BUS_WIDTH_4)
733 { 733 {
734 blksize = (1 << data->blksz_bits) + 2 * 4; 734 blksize = (1 << data->blksz_bits) + 2 * 4;
735 735
736 wbsd_write_index(host, WBSD_IDX_PBSMSB, ((blksize >> 4) & 0xF0) 736 wbsd_write_index(host, WBSD_IDX_PBSMSB, ((blksize >> 4) & 0xF0)
737 | WBSD_DATA_WIDTH); 737 | WBSD_DATA_WIDTH);
738 wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF); 738 wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
@@ -751,12 +751,12 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
751 setup = wbsd_read_index(host, WBSD_IDX_SETUP); 751 setup = wbsd_read_index(host, WBSD_IDX_SETUP);
752 setup |= WBSD_FIFO_RESET; 752 setup |= WBSD_FIFO_RESET;
753 wbsd_write_index(host, WBSD_IDX_SETUP, setup); 753 wbsd_write_index(host, WBSD_IDX_SETUP, setup);
754 754
755 /* 755 /*
756 * DMA transfer? 756 * DMA transfer?
757 */ 757 */
758 if (host->dma >= 0) 758 if (host->dma >= 0)
759 { 759 {
760 /* 760 /*
761 * The buffer for DMA is only 64 kB. 761 * The buffer for DMA is only 64 kB.
762 */ 762 */
@@ -766,17 +766,17 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
766 data->error = MMC_ERR_INVALID; 766 data->error = MMC_ERR_INVALID;
767 return; 767 return;
768 } 768 }
769 769
770 /* 770 /*
771 * Transfer data from the SG list to 771 * Transfer data from the SG list to
772 * the DMA buffer. 772 * the DMA buffer.
773 */ 773 */
774 if (data->flags & MMC_DATA_WRITE) 774 if (data->flags & MMC_DATA_WRITE)
775 wbsd_sg_to_dma(host, data); 775 wbsd_sg_to_dma(host, data);
776 776
777 /* 777 /*
778 * Initialise the ISA DMA controller. 778 * Initialise the ISA DMA controller.
779 */ 779 */
780 dmaflags = claim_dma_lock(); 780 dmaflags = claim_dma_lock();
781 disable_dma(host->dma); 781 disable_dma(host->dma);
782 clear_dma_ff(host->dma); 782 clear_dma_ff(host->dma);
@@ -802,17 +802,17 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
802 * output to a minimum. 802 * output to a minimum.
803 */ 803 */
804 host->firsterr = 1; 804 host->firsterr = 1;
805 805
806 /* 806 /*
807 * Initialise the SG list. 807 * Initialise the SG list.
808 */ 808 */
809 wbsd_init_sg(host, data); 809 wbsd_init_sg(host, data);
810 810
811 /* 811 /*
812 * Turn off DMA. 812 * Turn off DMA.
813 */ 813 */
814 wbsd_write_index(host, WBSD_IDX_DMA, 0); 814 wbsd_write_index(host, WBSD_IDX_DMA, 0);
815 815
816 /* 816 /*
817 * Set up FIFO threshold levels (and fill 817 * Set up FIFO threshold levels (and fill
818 * buffer if doing a write). 818 * buffer if doing a write).
@@ -828,8 +828,8 @@ static void wbsd_prepare_data(struct wbsd_host* host, struct mmc_data* data)
828 WBSD_FIFOEN_EMPTY | 8); 828 WBSD_FIFOEN_EMPTY | 8);
829 wbsd_fill_fifo(host); 829 wbsd_fill_fifo(host);
830 } 830 }
831 } 831 }
832 832
833 data->error = MMC_ERR_NONE; 833 data->error = MMC_ERR_NONE;
834} 834}
835 835
@@ -838,7 +838,7 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
838 unsigned long dmaflags; 838 unsigned long dmaflags;
839 int count; 839 int count;
840 u8 status; 840 u8 status;
841 841
842 WARN_ON(host->mrq == NULL); 842 WARN_ON(host->mrq == NULL);
843 843
844 /* 844 /*
@@ -855,7 +855,7 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
855 { 855 {
856 status = wbsd_read_index(host, WBSD_IDX_STATUS); 856 status = wbsd_read_index(host, WBSD_IDX_STATUS);
857 } while (status & (WBSD_BLOCK_READ | WBSD_BLOCK_WRITE)); 857 } while (status & (WBSD_BLOCK_READ | WBSD_BLOCK_WRITE));
858 858
859 /* 859 /*
860 * DMA transfer? 860 * DMA transfer?
861 */ 861 */
@@ -865,7 +865,7 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
865 * Disable DMA on the host. 865 * Disable DMA on the host.
866 */ 866 */
867 wbsd_write_index(host, WBSD_IDX_DMA, 0); 867 wbsd_write_index(host, WBSD_IDX_DMA, 0);
868 868
869 /* 869 /*
870 * Turn of ISA DMA controller. 870 * Turn of ISA DMA controller.
871 */ 871 */
@@ -874,7 +874,7 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
874 clear_dma_ff(host->dma); 874 clear_dma_ff(host->dma);
875 count = get_dma_residue(host->dma); 875 count = get_dma_residue(host->dma);
876 release_dma_lock(dmaflags); 876 release_dma_lock(dmaflags);
877 877
878 /* 878 /*
879 * Any leftover data? 879 * Any leftover data?
880 */ 880 */
@@ -882,7 +882,7 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
882 { 882 {
883 printk(KERN_ERR DRIVER_NAME ": Incomplete DMA " 883 printk(KERN_ERR DRIVER_NAME ": Incomplete DMA "
884 "transfer. %d bytes left.\n", count); 884 "transfer. %d bytes left.\n", count);
885 885
886 data->error = MMC_ERR_FAILED; 886 data->error = MMC_ERR_FAILED;
887 } 887 }
888 else 888 else
@@ -893,13 +893,13 @@ static void wbsd_finish_data(struct wbsd_host* host, struct mmc_data* data)
893 */ 893 */
894 if (data->flags & MMC_DATA_READ) 894 if (data->flags & MMC_DATA_READ)
895 wbsd_dma_to_sg(host, data); 895 wbsd_dma_to_sg(host, data);
896 896
897 data->bytes_xfered = host->size; 897 data->bytes_xfered = host->size;
898 } 898 }
899 } 899 }
900 900
901 DBGF("Ending data transfer (%d bytes)\n", data->bytes_xfered); 901 DBGF("Ending data transfer (%d bytes)\n", data->bytes_xfered);
902 902
903 wbsd_request_end(host, host->mrq); 903 wbsd_request_end(host, host->mrq);
904} 904}
905 905
@@ -924,7 +924,7 @@ static void wbsd_request(struct mmc_host* mmc, struct mmc_request* mrq)
924 cmd = mrq->cmd; 924 cmd = mrq->cmd;
925 925
926 host->mrq = mrq; 926 host->mrq = mrq;
927 927
928 /* 928 /*
929 * If there is no card in the slot then 929 * If there is no card in the slot then
930 * timeout immediatly. 930 * timeout immediatly.
@@ -941,18 +941,18 @@ static void wbsd_request(struct mmc_host* mmc, struct mmc_request* mrq)
941 if (cmd->data) 941 if (cmd->data)
942 { 942 {
943 wbsd_prepare_data(host, cmd->data); 943 wbsd_prepare_data(host, cmd->data);
944 944
945 if (cmd->data->error != MMC_ERR_NONE) 945 if (cmd->data->error != MMC_ERR_NONE)
946 goto done; 946 goto done;
947 } 947 }
948 948
949 wbsd_send_command(host, cmd); 949 wbsd_send_command(host, cmd);
950 950
951 /* 951 /*
952 * If this is a data transfer the request 952 * If this is a data transfer the request
953 * will be finished after the data has 953 * will be finished after the data has
954 * transfered. 954 * transfered.
955 */ 955 */
956 if (cmd->data && (cmd->error == MMC_ERR_NONE)) 956 if (cmd->data && (cmd->error == MMC_ERR_NONE))
957 { 957 {
958 /* 958 /*
@@ -965,7 +965,7 @@ static void wbsd_request(struct mmc_host* mmc, struct mmc_request* mrq)
965 965
966 return; 966 return;
967 } 967 }
968 968
969done: 969done:
970 wbsd_request_end(host, mrq); 970 wbsd_request_end(host, mrq);
971 971
@@ -976,7 +976,7 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
976{ 976{
977 struct wbsd_host* host = mmc_priv(mmc); 977 struct wbsd_host* host = mmc_priv(mmc);
978 u8 clk, setup, pwr; 978 u8 clk, setup, pwr;
979 979
980 DBGF("clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n", 980 DBGF("clock %uHz busmode %u powermode %u cs %u Vdd %u width %u\n",
981 ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select, 981 ios->clock, ios->bus_mode, ios->power_mode, ios->chip_select,
982 ios->vdd, ios->bus_width); 982 ios->vdd, ios->bus_width);
@@ -989,7 +989,7 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
989 */ 989 */
990 if (ios->power_mode == MMC_POWER_OFF) 990 if (ios->power_mode == MMC_POWER_OFF)
991 wbsd_init_device(host); 991 wbsd_init_device(host);
992 992
993 if (ios->clock >= 24000000) 993 if (ios->clock >= 24000000)
994 clk = WBSD_CLK_24M; 994 clk = WBSD_CLK_24M;
995 else if (ios->clock >= 16000000) 995 else if (ios->clock >= 16000000)
@@ -1042,7 +1042,7 @@ static void wbsd_set_ios(struct mmc_host* mmc, struct mmc_ios* ios)
1042 mod_timer(&host->ignore_timer, jiffies + HZ/100); 1042 mod_timer(&host->ignore_timer, jiffies + HZ/100);
1043 } 1043 }
1044 wbsd_write_index(host, WBSD_IDX_SETUP, setup); 1044 wbsd_write_index(host, WBSD_IDX_SETUP, setup);
1045 1045
1046 /* 1046 /*
1047 * Store bus width for later. Will be used when 1047 * Store bus width for later. Will be used when
1048 * setting up the data transfer. 1048 * setting up the data transfer.
@@ -1128,7 +1128,7 @@ static inline struct mmc_data* wbsd_get_data(struct wbsd_host* host)
1128 WARN_ON(!host->mrq->cmd->data); 1128 WARN_ON(!host->mrq->cmd->data);
1129 if (!host->mrq->cmd->data) 1129 if (!host->mrq->cmd->data)
1130 return NULL; 1130 return NULL;
1131 1131
1132 return host->mrq->cmd->data; 1132 return host->mrq->cmd->data;
1133} 1133}
1134 1134
@@ -1136,25 +1136,25 @@ static void wbsd_tasklet_card(unsigned long param)
1136{ 1136{
1137 struct wbsd_host* host = (struct wbsd_host*)param; 1137 struct wbsd_host* host = (struct wbsd_host*)param;
1138 u8 csr; 1138 u8 csr;
1139 1139
1140 spin_lock(&host->lock); 1140 spin_lock(&host->lock);
1141 1141
1142 if (host->flags & WBSD_FIGNORE_DETECT) 1142 if (host->flags & WBSD_FIGNORE_DETECT)
1143 { 1143 {
1144 spin_unlock(&host->lock); 1144 spin_unlock(&host->lock);
1145 return; 1145 return;
1146 } 1146 }
1147 1147
1148 csr = inb(host->base + WBSD_CSR); 1148 csr = inb(host->base + WBSD_CSR);
1149 WARN_ON(csr == 0xff); 1149 WARN_ON(csr == 0xff);
1150 1150
1151 if (csr & WBSD_CARDPRESENT) 1151 if (csr & WBSD_CARDPRESENT)
1152 { 1152 {
1153 if (!(host->flags & WBSD_FCARD_PRESENT)) 1153 if (!(host->flags & WBSD_FCARD_PRESENT))
1154 { 1154 {
1155 DBG("Card inserted\n"); 1155 DBG("Card inserted\n");
1156 host->flags |= WBSD_FCARD_PRESENT; 1156 host->flags |= WBSD_FCARD_PRESENT;
1157 1157
1158 spin_unlock(&host->lock); 1158 spin_unlock(&host->lock);
1159 1159
1160 /* 1160 /*
@@ -1170,17 +1170,17 @@ static void wbsd_tasklet_card(unsigned long param)
1170 { 1170 {
1171 DBG("Card removed\n"); 1171 DBG("Card removed\n");
1172 host->flags &= ~WBSD_FCARD_PRESENT; 1172 host->flags &= ~WBSD_FCARD_PRESENT;
1173 1173
1174 if (host->mrq) 1174 if (host->mrq)
1175 { 1175 {
1176 printk(KERN_ERR DRIVER_NAME 1176 printk(KERN_ERR DRIVER_NAME
1177 ": Card removed during transfer!\n"); 1177 ": Card removed during transfer!\n");
1178 wbsd_reset(host); 1178 wbsd_reset(host);
1179 1179
1180 host->mrq->cmd->error = MMC_ERR_FAILED; 1180 host->mrq->cmd->error = MMC_ERR_FAILED;
1181 tasklet_schedule(&host->finish_tasklet); 1181 tasklet_schedule(&host->finish_tasklet);
1182 } 1182 }
1183 1183
1184 /* 1184 /*
1185 * Unlock first since we might get a call back. 1185 * Unlock first since we might get a call back.
1186 */ 1186 */
@@ -1196,12 +1196,12 @@ static void wbsd_tasklet_fifo(unsigned long param)
1196{ 1196{
1197 struct wbsd_host* host = (struct wbsd_host*)param; 1197 struct wbsd_host* host = (struct wbsd_host*)param;
1198 struct mmc_data* data; 1198 struct mmc_data* data;
1199 1199
1200 spin_lock(&host->lock); 1200 spin_lock(&host->lock);
1201 1201
1202 if (!host->mrq) 1202 if (!host->mrq)
1203 goto end; 1203 goto end;
1204 1204
1205 data = wbsd_get_data(host); 1205 data = wbsd_get_data(host);
1206 if (!data) 1206 if (!data)
1207 goto end; 1207 goto end;
@@ -1220,7 +1220,7 @@ static void wbsd_tasklet_fifo(unsigned long param)
1220 tasklet_schedule(&host->finish_tasklet); 1220 tasklet_schedule(&host->finish_tasklet);
1221 } 1221 }
1222 1222
1223end: 1223end:
1224 spin_unlock(&host->lock); 1224 spin_unlock(&host->lock);
1225} 1225}
1226 1226
@@ -1228,23 +1228,23 @@ static void wbsd_tasklet_crc(unsigned long param)
1228{ 1228{
1229 struct wbsd_host* host = (struct wbsd_host*)param; 1229 struct wbsd_host* host = (struct wbsd_host*)param;
1230 struct mmc_data* data; 1230 struct mmc_data* data;
1231 1231
1232 spin_lock(&host->lock); 1232 spin_lock(&host->lock);
1233 1233
1234 if (!host->mrq) 1234 if (!host->mrq)
1235 goto end; 1235 goto end;
1236 1236
1237 data = wbsd_get_data(host); 1237 data = wbsd_get_data(host);
1238 if (!data) 1238 if (!data)
1239 goto end; 1239 goto end;
1240 1240
1241 DBGF("CRC error\n"); 1241 DBGF("CRC error\n");
1242 1242
1243 data->error = MMC_ERR_BADCRC; 1243 data->error = MMC_ERR_BADCRC;
1244 1244
1245 tasklet_schedule(&host->finish_tasklet); 1245 tasklet_schedule(&host->finish_tasklet);
1246 1246
1247end: 1247end:
1248 spin_unlock(&host->lock); 1248 spin_unlock(&host->lock);
1249} 1249}
1250 1250
@@ -1252,23 +1252,23 @@ static void wbsd_tasklet_timeout(unsigned long param)
1252{ 1252{
1253 struct wbsd_host* host = (struct wbsd_host*)param; 1253 struct wbsd_host* host = (struct wbsd_host*)param;
1254 struct mmc_data* data; 1254 struct mmc_data* data;
1255 1255
1256 spin_lock(&host->lock); 1256 spin_lock(&host->lock);
1257 1257
1258 if (!host->mrq) 1258 if (!host->mrq)
1259 goto end; 1259 goto end;
1260 1260
1261 data = wbsd_get_data(host); 1261 data = wbsd_get_data(host);
1262 if (!data) 1262 if (!data)
1263 goto end; 1263 goto end;
1264 1264
1265 DBGF("Timeout\n"); 1265 DBGF("Timeout\n");
1266 1266
1267 data->error = MMC_ERR_TIMEOUT; 1267 data->error = MMC_ERR_TIMEOUT;
1268 1268
1269 tasklet_schedule(&host->finish_tasklet); 1269 tasklet_schedule(&host->finish_tasklet);
1270 1270
1271end: 1271end:
1272 spin_unlock(&host->lock); 1272 spin_unlock(&host->lock);
1273} 1273}
1274 1274
@@ -1276,20 +1276,20 @@ static void wbsd_tasklet_finish(unsigned long param)
1276{ 1276{
1277 struct wbsd_host* host = (struct wbsd_host*)param; 1277 struct wbsd_host* host = (struct wbsd_host*)param;
1278 struct mmc_data* data; 1278 struct mmc_data* data;
1279 1279
1280 spin_lock(&host->lock); 1280 spin_lock(&host->lock);
1281 1281
1282 WARN_ON(!host->mrq); 1282 WARN_ON(!host->mrq);
1283 if (!host->mrq) 1283 if (!host->mrq)
1284 goto end; 1284 goto end;
1285 1285
1286 data = wbsd_get_data(host); 1286 data = wbsd_get_data(host);
1287 if (!data) 1287 if (!data)
1288 goto end; 1288 goto end;
1289 1289
1290 wbsd_finish_data(host, data); 1290 wbsd_finish_data(host, data);
1291 1291
1292end: 1292end:
1293 spin_unlock(&host->lock); 1293 spin_unlock(&host->lock);
1294} 1294}
1295 1295
@@ -1297,7 +1297,7 @@ static void wbsd_tasklet_block(unsigned long param)
1297{ 1297{
1298 struct wbsd_host* host = (struct wbsd_host*)param; 1298 struct wbsd_host* host = (struct wbsd_host*)param;
1299 struct mmc_data* data; 1299 struct mmc_data* data;
1300 1300
1301 spin_lock(&host->lock); 1301 spin_lock(&host->lock);
1302 1302
1303 if ((wbsd_read_index(host, WBSD_IDX_CRCSTATUS) & WBSD_CRC_MASK) != 1303 if ((wbsd_read_index(host, WBSD_IDX_CRCSTATUS) & WBSD_CRC_MASK) !=
@@ -1306,15 +1306,15 @@ static void wbsd_tasklet_block(unsigned long param)
1306 data = wbsd_get_data(host); 1306 data = wbsd_get_data(host);
1307 if (!data) 1307 if (!data)
1308 goto end; 1308 goto end;
1309 1309
1310 DBGF("CRC error\n"); 1310 DBGF("CRC error\n");
1311 1311
1312 data->error = MMC_ERR_BADCRC; 1312 data->error = MMC_ERR_BADCRC;
1313 1313
1314 tasklet_schedule(&host->finish_tasklet); 1314 tasklet_schedule(&host->finish_tasklet);
1315 } 1315 }
1316 1316
1317end: 1317end:
1318 spin_unlock(&host->lock); 1318 spin_unlock(&host->lock);
1319} 1319}
1320 1320
@@ -1326,7 +1326,7 @@ static irqreturn_t wbsd_irq(int irq, void *dev_id, struct pt_regs *regs)
1326{ 1326{
1327 struct wbsd_host* host = dev_id; 1327 struct wbsd_host* host = dev_id;
1328 int isr; 1328 int isr;
1329 1329
1330 isr = inb(host->base + WBSD_ISR); 1330 isr = inb(host->base + WBSD_ISR);
1331 1331
1332 /* 1332 /*
@@ -1334,7 +1334,7 @@ static irqreturn_t wbsd_irq(int irq, void *dev_id, struct pt_regs *regs)
1334 */ 1334 */
1335 if (isr == 0xff || isr == 0x00) 1335 if (isr == 0xff || isr == 0x00)
1336 return IRQ_NONE; 1336 return IRQ_NONE;
1337 1337
1338 host->isr |= isr; 1338 host->isr |= isr;
1339 1339
1340 /* 1340 /*
@@ -1352,7 +1352,7 @@ static irqreturn_t wbsd_irq(int irq, void *dev_id, struct pt_regs *regs)
1352 tasklet_hi_schedule(&host->block_tasklet); 1352 tasklet_hi_schedule(&host->block_tasklet);
1353 if (isr & WBSD_INT_TC) 1353 if (isr & WBSD_INT_TC)
1354 tasklet_schedule(&host->finish_tasklet); 1354 tasklet_schedule(&host->finish_tasklet);
1355 1355
1356 return IRQ_HANDLED; 1356 return IRQ_HANDLED;
1357} 1357}
1358 1358
@@ -1370,14 +1370,14 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
1370{ 1370{
1371 struct mmc_host* mmc; 1371 struct mmc_host* mmc;
1372 struct wbsd_host* host; 1372 struct wbsd_host* host;
1373 1373
1374 /* 1374 /*
1375 * Allocate MMC structure. 1375 * Allocate MMC structure.
1376 */ 1376 */
1377 mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev); 1377 mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev);
1378 if (!mmc) 1378 if (!mmc)
1379 return -ENOMEM; 1379 return -ENOMEM;
1380 1380
1381 host = mmc_priv(mmc); 1381 host = mmc_priv(mmc);
1382 host->mmc = mmc; 1382 host->mmc = mmc;
1383 1383
@@ -1391,37 +1391,37 @@ static int __devinit wbsd_alloc_mmc(struct device* dev)
1391 mmc->f_max = 24000000; 1391 mmc->f_max = 24000000;
1392 mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34; 1392 mmc->ocr_avail = MMC_VDD_32_33|MMC_VDD_33_34;
1393 mmc->caps = MMC_CAP_4_BIT_DATA; 1393 mmc->caps = MMC_CAP_4_BIT_DATA;
1394 1394
1395 spin_lock_init(&host->lock); 1395 spin_lock_init(&host->lock);
1396 1396
1397 /* 1397 /*
1398 * Set up timers 1398 * Set up timers
1399 */ 1399 */
1400 init_timer(&host->ignore_timer); 1400 init_timer(&host->ignore_timer);
1401 host->ignore_timer.data = (unsigned long)host; 1401 host->ignore_timer.data = (unsigned long)host;
1402 host->ignore_timer.function = wbsd_reset_ignore; 1402 host->ignore_timer.function = wbsd_reset_ignore;
1403 1403
1404 /* 1404 /*
1405 * Maximum number of segments. Worst case is one sector per segment 1405 * Maximum number of segments. Worst case is one sector per segment
1406 * so this will be 64kB/512. 1406 * so this will be 64kB/512.
1407 */ 1407 */
1408 mmc->max_hw_segs = 128; 1408 mmc->max_hw_segs = 128;
1409 mmc->max_phys_segs = 128; 1409 mmc->max_phys_segs = 128;
1410 1410
1411 /* 1411 /*
1412 * Maximum number of sectors in one transfer. Also limited by 64kB 1412 * Maximum number of sectors in one transfer. Also limited by 64kB
1413 * buffer. 1413 * buffer.
1414 */ 1414 */
1415 mmc->max_sectors = 128; 1415 mmc->max_sectors = 128;
1416 1416
1417 /* 1417 /*
1418 * Maximum segment size. Could be one segment with the maximum number 1418 * Maximum segment size. Could be one segment with the maximum number
1419 * of segments. 1419 * of segments.
1420 */ 1420 */
1421 mmc->max_seg_size = mmc->max_sectors * 512; 1421 mmc->max_seg_size = mmc->max_sectors * 512;
1422 1422
1423 dev_set_drvdata(dev, mmc); 1423 dev_set_drvdata(dev, mmc);
1424 1424
1425 return 0; 1425 return 0;
1426} 1426}
1427 1427
@@ -1429,18 +1429,18 @@ static void __devexit wbsd_free_mmc(struct device* dev)
1429{ 1429{
1430 struct mmc_host* mmc; 1430 struct mmc_host* mmc;
1431 struct wbsd_host* host; 1431 struct wbsd_host* host;
1432 1432
1433 mmc = dev_get_drvdata(dev); 1433 mmc = dev_get_drvdata(dev);
1434 if (!mmc) 1434 if (!mmc)
1435 return; 1435 return;
1436 1436
1437 host = mmc_priv(mmc); 1437 host = mmc_priv(mmc);
1438 BUG_ON(host == NULL); 1438 BUG_ON(host == NULL);
1439 1439
1440 del_timer_sync(&host->ignore_timer); 1440 del_timer_sync(&host->ignore_timer);
1441 1441
1442 mmc_free_host(mmc); 1442 mmc_free_host(mmc);
1443 1443
1444 dev_set_drvdata(dev, NULL); 1444 dev_set_drvdata(dev, NULL);
1445} 1445}
1446 1446
@@ -1452,7 +1452,7 @@ static int __devinit wbsd_scan(struct wbsd_host* host)
1452{ 1452{
1453 int i, j, k; 1453 int i, j, k;
1454 int id; 1454 int id;
1455 1455
1456 /* 1456 /*
1457 * Iterate through all ports, all codes to 1457 * Iterate through all ports, all codes to
1458 * find hardware that is in our known list. 1458 * find hardware that is in our known list.
@@ -1461,32 +1461,32 @@ static int __devinit wbsd_scan(struct wbsd_host* host)
1461 { 1461 {
1462 if (!request_region(config_ports[i], 2, DRIVER_NAME)) 1462 if (!request_region(config_ports[i], 2, DRIVER_NAME))
1463 continue; 1463 continue;
1464 1464
1465 for (j = 0;j < sizeof(unlock_codes)/sizeof(int);j++) 1465 for (j = 0;j < sizeof(unlock_codes)/sizeof(int);j++)
1466 { 1466 {
1467 id = 0xFFFF; 1467 id = 0xFFFF;
1468 1468
1469 outb(unlock_codes[j], config_ports[i]); 1469 outb(unlock_codes[j], config_ports[i]);
1470 outb(unlock_codes[j], config_ports[i]); 1470 outb(unlock_codes[j], config_ports[i]);
1471 1471
1472 outb(WBSD_CONF_ID_HI, config_ports[i]); 1472 outb(WBSD_CONF_ID_HI, config_ports[i]);
1473 id = inb(config_ports[i] + 1) << 8; 1473 id = inb(config_ports[i] + 1) << 8;
1474 1474
1475 outb(WBSD_CONF_ID_LO, config_ports[i]); 1475 outb(WBSD_CONF_ID_LO, config_ports[i]);
1476 id |= inb(config_ports[i] + 1); 1476 id |= inb(config_ports[i] + 1);
1477 1477
1478 for (k = 0;k < sizeof(valid_ids)/sizeof(int);k++) 1478 for (k = 0;k < sizeof(valid_ids)/sizeof(int);k++)
1479 { 1479 {
1480 if (id == valid_ids[k]) 1480 if (id == valid_ids[k])
1481 { 1481 {
1482 host->chip_id = id; 1482 host->chip_id = id;
1483 host->config = config_ports[i]; 1483 host->config = config_ports[i];
1484 host->unlock_code = unlock_codes[i]; 1484 host->unlock_code = unlock_codes[i];
1485 1485
1486 return 0; 1486 return 0;
1487 } 1487 }
1488 } 1488 }
1489 1489
1490 if (id != 0xFFFF) 1490 if (id != 0xFFFF)
1491 { 1491 {
1492 DBG("Unknown hardware (id %x) found at %x\n", 1492 DBG("Unknown hardware (id %x) found at %x\n",
@@ -1495,10 +1495,10 @@ static int __devinit wbsd_scan(struct wbsd_host* host)
1495 1495
1496 outb(LOCK_CODE, config_ports[i]); 1496 outb(LOCK_CODE, config_ports[i]);
1497 } 1497 }
1498 1498
1499 release_region(config_ports[i], 2); 1499 release_region(config_ports[i], 2);
1500 } 1500 }
1501 1501
1502 return -ENODEV; 1502 return -ENODEV;
1503} 1503}
1504 1504
@@ -1510,12 +1510,12 @@ static int __devinit wbsd_request_region(struct wbsd_host* host, int base)
1510{ 1510{
1511 if (io & 0x7) 1511 if (io & 0x7)
1512 return -EINVAL; 1512 return -EINVAL;
1513 1513
1514 if (!request_region(base, 8, DRIVER_NAME)) 1514 if (!request_region(base, 8, DRIVER_NAME))
1515 return -EIO; 1515 return -EIO;
1516 1516
1517 host->base = io; 1517 host->base = io;
1518 1518
1519 return 0; 1519 return 0;
1520} 1520}
1521 1521
@@ -1523,12 +1523,12 @@ static void __devexit wbsd_release_regions(struct wbsd_host* host)
1523{ 1523{
1524 if (host->base) 1524 if (host->base)
1525 release_region(host->base, 8); 1525 release_region(host->base, 8);
1526 1526
1527 host->base = 0; 1527 host->base = 0;
1528 1528
1529 if (host->config) 1529 if (host->config)
1530 release_region(host->config, 2); 1530 release_region(host->config, 2);
1531 1531
1532 host->config = 0; 1532 host->config = 0;
1533} 1533}
1534 1534
@@ -1540,10 +1540,10 @@ static void __devinit wbsd_request_dma(struct wbsd_host* host, int dma)
1540{ 1540{
1541 if (dma < 0) 1541 if (dma < 0)
1542 return; 1542 return;
1543 1543
1544 if (request_dma(dma, DRIVER_NAME)) 1544 if (request_dma(dma, DRIVER_NAME))
1545 goto err; 1545 goto err;
1546 1546
1547 /* 1547 /*
1548 * We need to allocate a special buffer in 1548 * We need to allocate a special buffer in
1549 * order for ISA to be able to DMA to it. 1549 * order for ISA to be able to DMA to it.
@@ -1558,7 +1558,7 @@ static void __devinit wbsd_request_dma(struct wbsd_host* host, int dma)
1558 */ 1558 */
1559 host->dma_addr = dma_map_single(host->mmc->dev, host->dma_buffer, 1559 host->dma_addr = dma_map_single(host->mmc->dev, host->dma_buffer,
1560 WBSD_DMA_SIZE, DMA_BIDIRECTIONAL); 1560 WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1561 1561
1562 /* 1562 /*
1563 * ISA DMA must be aligned on a 64k basis. 1563 * ISA DMA must be aligned on a 64k basis.
1564 */ 1564 */
@@ -1571,19 +1571,19 @@ static void __devinit wbsd_request_dma(struct wbsd_host* host, int dma)
1571 goto kfree; 1571 goto kfree;
1572 1572
1573 host->dma = dma; 1573 host->dma = dma;
1574 1574
1575 return; 1575 return;
1576 1576
1577kfree: 1577kfree:
1578 /* 1578 /*
1579 * If we've gotten here then there is some kind of alignment bug 1579 * If we've gotten here then there is some kind of alignment bug
1580 */ 1580 */
1581 BUG_ON(1); 1581 BUG_ON(1);
1582 1582
1583 dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE, 1583 dma_unmap_single(host->mmc->dev, host->dma_addr, WBSD_DMA_SIZE,
1584 DMA_BIDIRECTIONAL); 1584 DMA_BIDIRECTIONAL);
1585 host->dma_addr = (dma_addr_t)NULL; 1585 host->dma_addr = (dma_addr_t)NULL;
1586 1586
1587 kfree(host->dma_buffer); 1587 kfree(host->dma_buffer);
1588 host->dma_buffer = NULL; 1588 host->dma_buffer = NULL;
1589 1589
@@ -1604,7 +1604,7 @@ static void __devexit wbsd_release_dma(struct wbsd_host* host)
1604 kfree(host->dma_buffer); 1604 kfree(host->dma_buffer);
1605 if (host->dma >= 0) 1605 if (host->dma >= 0)
1606 free_dma(host->dma); 1606 free_dma(host->dma);
1607 1607
1608 host->dma = -1; 1608 host->dma = -1;
1609 host->dma_buffer = NULL; 1609 host->dma_buffer = NULL;
1610 host->dma_addr = (dma_addr_t)NULL; 1610 host->dma_addr = (dma_addr_t)NULL;
@@ -1617,7 +1617,7 @@ static void __devexit wbsd_release_dma(struct wbsd_host* host)
1617static int __devinit wbsd_request_irq(struct wbsd_host* host, int irq) 1617static int __devinit wbsd_request_irq(struct wbsd_host* host, int irq)
1618{ 1618{
1619 int ret; 1619 int ret;
1620 1620
1621 /* 1621 /*
1622 * Allocate interrupt. 1622 * Allocate interrupt.
1623 */ 1623 */
@@ -1625,7 +1625,7 @@ static int __devinit wbsd_request_irq(struct wbsd_host* host, int irq)
1625 ret = request_irq(irq, wbsd_irq, SA_SHIRQ, DRIVER_NAME, host); 1625 ret = request_irq(irq, wbsd_irq, SA_SHIRQ, DRIVER_NAME, host);
1626 if (ret) 1626 if (ret)
1627 return ret; 1627 return ret;
1628 1628
1629 host->irq = irq; 1629 host->irq = irq;
1630 1630
1631 /* 1631 /*
@@ -1637,7 +1637,7 @@ static int __devinit wbsd_request_irq(struct wbsd_host* host, int irq)
1637 tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout, (unsigned long)host); 1637 tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout, (unsigned long)host);
1638 tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, (unsigned long)host); 1638 tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish, (unsigned long)host);
1639 tasklet_init(&host->block_tasklet, wbsd_tasklet_block, (unsigned long)host); 1639 tasklet_init(&host->block_tasklet, wbsd_tasklet_block, (unsigned long)host);
1640 1640
1641 return 0; 1641 return 0;
1642} 1642}
1643 1643
@@ -1647,9 +1647,9 @@ static void __devexit wbsd_release_irq(struct wbsd_host* host)
1647 return; 1647 return;
1648 1648
1649 free_irq(host->irq, host); 1649 free_irq(host->irq, host);
1650 1650
1651 host->irq = 0; 1651 host->irq = 0;
1652 1652
1653 tasklet_kill(&host->card_tasklet); 1653 tasklet_kill(&host->card_tasklet);
1654 tasklet_kill(&host->fifo_tasklet); 1654 tasklet_kill(&host->fifo_tasklet);
1655 tasklet_kill(&host->crc_tasklet); 1655 tasklet_kill(&host->crc_tasklet);
@@ -1666,7 +1666,7 @@ static int __devinit wbsd_request_resources(struct wbsd_host* host,
1666 int base, int irq, int dma) 1666 int base, int irq, int dma)
1667{ 1667{
1668 int ret; 1668 int ret;
1669 1669
1670 /* 1670 /*
1671 * Allocate I/O ports. 1671 * Allocate I/O ports.
1672 */ 1672 */
@@ -1685,7 +1685,7 @@ static int __devinit wbsd_request_resources(struct wbsd_host* host,
1685 * Allocate DMA. 1685 * Allocate DMA.
1686 */ 1686 */
1687 wbsd_request_dma(host, dma); 1687 wbsd_request_dma(host, dma);
1688 1688
1689 return 0; 1689 return 0;
1690} 1690}
1691 1691
@@ -1708,7 +1708,7 @@ static void __devinit wbsd_chip_config(struct wbsd_host* host)
1708{ 1708{
1709 /* 1709 /*
1710 * Reset the chip. 1710 * Reset the chip.
1711 */ 1711 */
1712 wbsd_write_config(host, WBSD_CONF_SWRST, 1); 1712 wbsd_write_config(host, WBSD_CONF_SWRST, 1);
1713 wbsd_write_config(host, WBSD_CONF_SWRST, 0); 1713 wbsd_write_config(host, WBSD_CONF_SWRST, 0);
1714 1714
@@ -1716,23 +1716,23 @@ static void __devinit wbsd_chip_config(struct wbsd_host* host)
1716 * Select SD/MMC function. 1716 * Select SD/MMC function.
1717 */ 1717 */
1718 wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD); 1718 wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1719 1719
1720 /* 1720 /*
1721 * Set up card detection. 1721 * Set up card detection.
1722 */ 1722 */
1723 wbsd_write_config(host, WBSD_CONF_PINS, WBSD_PINS_DETECT_GP11); 1723 wbsd_write_config(host, WBSD_CONF_PINS, WBSD_PINS_DETECT_GP11);
1724 1724
1725 /* 1725 /*
1726 * Configure chip 1726 * Configure chip
1727 */ 1727 */
1728 wbsd_write_config(host, WBSD_CONF_PORT_HI, host->base >> 8); 1728 wbsd_write_config(host, WBSD_CONF_PORT_HI, host->base >> 8);
1729 wbsd_write_config(host, WBSD_CONF_PORT_LO, host->base & 0xff); 1729 wbsd_write_config(host, WBSD_CONF_PORT_LO, host->base & 0xff);
1730 1730
1731 wbsd_write_config(host, WBSD_CONF_IRQ, host->irq); 1731 wbsd_write_config(host, WBSD_CONF_IRQ, host->irq);
1732 1732
1733 if (host->dma >= 0) 1733 if (host->dma >= 0)
1734 wbsd_write_config(host, WBSD_CONF_DRQ, host->dma); 1734 wbsd_write_config(host, WBSD_CONF_DRQ, host->dma);
1735 1735
1736 /* 1736 /*
1737 * Enable and power up chip. 1737 * Enable and power up chip.
1738 */ 1738 */
@@ -1743,26 +1743,26 @@ static void __devinit wbsd_chip_config(struct wbsd_host* host)
1743/* 1743/*
1744 * Check that configured resources are correct. 1744 * Check that configured resources are correct.
1745 */ 1745 */
1746 1746
1747static int __devinit wbsd_chip_validate(struct wbsd_host* host) 1747static int __devinit wbsd_chip_validate(struct wbsd_host* host)
1748{ 1748{
1749 int base, irq, dma; 1749 int base, irq, dma;
1750 1750
1751 /* 1751 /*
1752 * Select SD/MMC function. 1752 * Select SD/MMC function.
1753 */ 1753 */
1754 wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD); 1754 wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1755 1755
1756 /* 1756 /*
1757 * Read configuration. 1757 * Read configuration.
1758 */ 1758 */
1759 base = wbsd_read_config(host, WBSD_CONF_PORT_HI) << 8; 1759 base = wbsd_read_config(host, WBSD_CONF_PORT_HI) << 8;
1760 base |= wbsd_read_config(host, WBSD_CONF_PORT_LO); 1760 base |= wbsd_read_config(host, WBSD_CONF_PORT_LO);
1761 1761
1762 irq = wbsd_read_config(host, WBSD_CONF_IRQ); 1762 irq = wbsd_read_config(host, WBSD_CONF_IRQ);
1763 1763
1764 dma = wbsd_read_config(host, WBSD_CONF_DRQ); 1764 dma = wbsd_read_config(host, WBSD_CONF_DRQ);
1765 1765
1766 /* 1766 /*
1767 * Validate against given configuration. 1767 * Validate against given configuration.
1768 */ 1768 */
@@ -1772,7 +1772,7 @@ static int __devinit wbsd_chip_validate(struct wbsd_host* host)
1772 return 0; 1772 return 0;
1773 if ((dma != host->dma) && (host->dma != -1)) 1773 if ((dma != host->dma) && (host->dma != -1))
1774 return 0; 1774 return 0;
1775 1775
1776 return 1; 1776 return 1;
1777} 1777}
1778 1778
@@ -1788,14 +1788,14 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
1788 struct wbsd_host* host = NULL; 1788 struct wbsd_host* host = NULL;
1789 struct mmc_host* mmc = NULL; 1789 struct mmc_host* mmc = NULL;
1790 int ret; 1790 int ret;
1791 1791
1792 ret = wbsd_alloc_mmc(dev); 1792 ret = wbsd_alloc_mmc(dev);
1793 if (ret) 1793 if (ret)
1794 return ret; 1794 return ret;
1795 1795
1796 mmc = dev_get_drvdata(dev); 1796 mmc = dev_get_drvdata(dev);
1797 host = mmc_priv(mmc); 1797 host = mmc_priv(mmc);
1798 1798
1799 /* 1799 /*
1800 * Scan for hardware. 1800 * Scan for hardware.
1801 */ 1801 */
@@ -1814,7 +1814,7 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
1814 return ret; 1814 return ret;
1815 } 1815 }
1816 } 1816 }
1817 1817
1818 /* 1818 /*
1819 * Request resources. 1819 * Request resources.
1820 */ 1820 */
@@ -1825,7 +1825,7 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
1825 wbsd_free_mmc(dev); 1825 wbsd_free_mmc(dev);
1826 return ret; 1826 return ret;
1827 } 1827 }
1828 1828
1829 /* 1829 /*
1830 * See if chip needs to be configured. 1830 * See if chip needs to be configured.
1831 */ 1831 */
@@ -1842,7 +1842,7 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
1842 } 1842 }
1843 else 1843 else
1844 wbsd_chip_config(host); 1844 wbsd_chip_config(host);
1845 1845
1846 /* 1846 /*
1847 * Power Management stuff. No idea how this works. 1847 * Power Management stuff. No idea how this works.
1848 * Not tested. 1848 * Not tested.
@@ -1860,7 +1860,7 @@ static int __devinit wbsd_init(struct device* dev, int base, int irq, int dma,
1860 * Reset the chip into a known state. 1860 * Reset the chip into a known state.
1861 */ 1861 */
1862 wbsd_init_device(host); 1862 wbsd_init_device(host);
1863 1863
1864 mmc_add_host(mmc); 1864 mmc_add_host(mmc);
1865 1865
1866 printk(KERN_INFO "%s: W83L51xD", mmc_hostname(mmc)); 1866 printk(KERN_INFO "%s: W83L51xD", mmc_hostname(mmc));
@@ -1882,12 +1882,12 @@ static void __devexit wbsd_shutdown(struct device* dev, int pnp)
1882{ 1882{
1883 struct mmc_host* mmc = dev_get_drvdata(dev); 1883 struct mmc_host* mmc = dev_get_drvdata(dev);
1884 struct wbsd_host* host; 1884 struct wbsd_host* host;
1885 1885
1886 if (!mmc) 1886 if (!mmc)
1887 return; 1887 return;
1888 1888
1889 host = mmc_priv(mmc); 1889 host = mmc_priv(mmc);
1890 1890
1891 mmc_remove_host(mmc); 1891 mmc_remove_host(mmc);
1892 1892
1893 if (!pnp) 1893 if (!pnp)
@@ -1900,9 +1900,9 @@ static void __devexit wbsd_shutdown(struct device* dev, int pnp)
1900 wbsd_write_config(host, WBSD_CONF_ENABLE, 0); 1900 wbsd_write_config(host, WBSD_CONF_ENABLE, 0);
1901 wbsd_lock_config(host); 1901 wbsd_lock_config(host);
1902 } 1902 }
1903 1903
1904 wbsd_release_resources(host); 1904 wbsd_release_resources(host);
1905 1905
1906 wbsd_free_mmc(dev); 1906 wbsd_free_mmc(dev);
1907} 1907}
1908 1908
@@ -1932,7 +1932,7 @@ static int __devinit
1932wbsd_pnp_probe(struct pnp_dev * pnpdev, const struct pnp_device_id *dev_id) 1932wbsd_pnp_probe(struct pnp_dev * pnpdev, const struct pnp_device_id *dev_id)
1933{ 1933{
1934 int io, irq, dma; 1934 int io, irq, dma;
1935 1935
1936 /* 1936 /*
1937 * Get resources from PnP layer. 1937 * Get resources from PnP layer.
1938 */ 1938 */
@@ -1942,9 +1942,9 @@ wbsd_pnp_probe(struct pnp_dev * pnpdev, const struct pnp_device_id *dev_id)
1942 dma = pnp_dma(pnpdev, 0); 1942 dma = pnp_dma(pnpdev, 0);
1943 else 1943 else
1944 dma = -1; 1944 dma = -1;
1945 1945
1946 DBGF("PnP resources: port %3x irq %d dma %d\n", io, irq, dma); 1946 DBGF("PnP resources: port %3x irq %d dma %d\n", io, irq, dma);
1947 1947
1948 return wbsd_init(&pnpdev->dev, io, irq, dma, 1); 1948 return wbsd_init(&pnpdev->dev, io, irq, dma, 1);
1949} 1949}
1950 1950
@@ -1985,7 +1985,7 @@ static struct device_driver wbsd_driver = {
1985 .bus = &platform_bus_type, 1985 .bus = &platform_bus_type,
1986 .probe = wbsd_probe, 1986 .probe = wbsd_probe,
1987 .remove = wbsd_remove, 1987 .remove = wbsd_remove,
1988 1988
1989 .suspend = wbsd_suspend, 1989 .suspend = wbsd_suspend,
1990 .resume = wbsd_resume, 1990 .resume = wbsd_resume,
1991}; 1991};
@@ -2008,7 +2008,7 @@ static struct pnp_driver wbsd_pnp_driver = {
2008static int __init wbsd_drv_init(void) 2008static int __init wbsd_drv_init(void)
2009{ 2009{
2010 int result; 2010 int result;
2011 2011
2012 printk(KERN_INFO DRIVER_NAME 2012 printk(KERN_INFO DRIVER_NAME
2013 ": Winbond W83L51xD SD/MMC card interface driver, " 2013 ": Winbond W83L51xD SD/MMC card interface driver, "
2014 DRIVER_VERSION "\n"); 2014 DRIVER_VERSION "\n");
@@ -2023,8 +2023,8 @@ static int __init wbsd_drv_init(void)
2023 return result; 2023 return result;
2024 } 2024 }
2025 2025
2026#endif /* CONFIG_PNP */ 2026#endif /* CONFIG_PNP */
2027 2027
2028 if (nopnp) 2028 if (nopnp)
2029 { 2029 {
2030 result = driver_register(&wbsd_driver); 2030 result = driver_register(&wbsd_driver);
@@ -2046,13 +2046,13 @@ static void __exit wbsd_drv_exit(void)
2046 2046
2047 if (!nopnp) 2047 if (!nopnp)
2048 pnp_unregister_driver(&wbsd_pnp_driver); 2048 pnp_unregister_driver(&wbsd_pnp_driver);
2049 2049
2050#endif /* CONFIG_PNP */ 2050#endif /* CONFIG_PNP */
2051 2051
2052 if (nopnp) 2052 if (nopnp)
2053 { 2053 {
2054 platform_device_unregister(wbsd_device); 2054 platform_device_unregister(wbsd_device);
2055 2055
2056 driver_unregister(&wbsd_driver); 2056 driver_unregister(&wbsd_driver);
2057 } 2057 }
2058 2058