xref: /linux/drivers/mmc/host/wbsd.c (revision 6fdcba32711044c35c0e1b094cbd8f3f0b4472c9)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  *  linux/drivers/mmc/host/wbsd.c - Winbond W83L51xD SD/MMC driver
4  *
5  *  Copyright (C) 2004-2007 Pierre Ossman, All Rights Reserved.
6  *
7  * Warning!
8  *
9  * Changes to the FIFO system should be done with extreme care since
10  * the hardware is full of bugs related to the FIFO. Known issues are:
11  *
12  * - FIFO size field in FSR is always zero.
13  *
14  * - FIFO interrupts tend not to work as they should. Interrupts are
15  *   triggered only for full/empty events, not for threshold values.
16  *
17  * - On APIC systems the FIFO empty interrupt is sometimes lost.
18  */
19 
20 #include <linux/module.h>
21 #include <linux/moduleparam.h>
22 #include <linux/init.h>
23 #include <linux/ioport.h>
24 #include <linux/platform_device.h>
25 #include <linux/interrupt.h>
26 #include <linux/dma-mapping.h>
27 #include <linux/delay.h>
28 #include <linux/pnp.h>
29 #include <linux/highmem.h>
30 #include <linux/mmc/host.h>
31 #include <linux/scatterlist.h>
32 #include <linux/slab.h>
33 
34 #include <asm/io.h>
35 #include <asm/dma.h>
36 
37 #include "wbsd.h"
38 
39 #define DRIVER_NAME "wbsd"
40 
41 #define DBG(x...) \
42 	pr_debug(DRIVER_NAME ": " x)
43 #define DBGF(f, x...) \
44 	pr_debug(DRIVER_NAME " [%s()]: " f, __func__ , ##x)
45 
46 /*
47  * Device resources
48  */
49 
50 #ifdef CONFIG_PNP
51 
52 static const struct pnp_device_id pnp_dev_table[] = {
53 	{ "WEC0517", 0 },
54 	{ "WEC0518", 0 },
55 	{ "", 0 },
56 };
57 
58 MODULE_DEVICE_TABLE(pnp, pnp_dev_table);
59 
60 #endif /* CONFIG_PNP */
61 
62 static const int config_ports[] = { 0x2E, 0x4E };
63 static const int unlock_codes[] = { 0x83, 0x87 };
64 
65 static const int valid_ids[] = {
66 	0x7112,
67 };
68 
69 #ifdef CONFIG_PNP
70 static unsigned int param_nopnp = 0;
71 #else
72 static const unsigned int param_nopnp = 1;
73 #endif
74 static unsigned int param_io = 0x248;
75 static unsigned int param_irq = 6;
76 static int param_dma = 2;
77 
78 /*
79  * Basic functions
80  */
81 
82 static inline void wbsd_unlock_config(struct wbsd_host *host)
83 {
84 	BUG_ON(host->config == 0);
85 
86 	outb(host->unlock_code, host->config);
87 	outb(host->unlock_code, host->config);
88 }
89 
90 static inline void wbsd_lock_config(struct wbsd_host *host)
91 {
92 	BUG_ON(host->config == 0);
93 
94 	outb(LOCK_CODE, host->config);
95 }
96 
97 static inline void wbsd_write_config(struct wbsd_host *host, u8 reg, u8 value)
98 {
99 	BUG_ON(host->config == 0);
100 
101 	outb(reg, host->config);
102 	outb(value, host->config + 1);
103 }
104 
105 static inline u8 wbsd_read_config(struct wbsd_host *host, u8 reg)
106 {
107 	BUG_ON(host->config == 0);
108 
109 	outb(reg, host->config);
110 	return inb(host->config + 1);
111 }
112 
113 static inline void wbsd_write_index(struct wbsd_host *host, u8 index, u8 value)
114 {
115 	outb(index, host->base + WBSD_IDXR);
116 	outb(value, host->base + WBSD_DATAR);
117 }
118 
119 static inline u8 wbsd_read_index(struct wbsd_host *host, u8 index)
120 {
121 	outb(index, host->base + WBSD_IDXR);
122 	return inb(host->base + WBSD_DATAR);
123 }
124 
125 /*
126  * Common routines
127  */
128 
129 static void wbsd_init_device(struct wbsd_host *host)
130 {
131 	u8 setup, ier;
132 
133 	/*
134 	 * Reset chip (SD/MMC part) and fifo.
135 	 */
136 	setup = wbsd_read_index(host, WBSD_IDX_SETUP);
137 	setup |= WBSD_FIFO_RESET | WBSD_SOFT_RESET;
138 	wbsd_write_index(host, WBSD_IDX_SETUP, setup);
139 
140 	/*
141 	 * Set DAT3 to input
142 	 */
143 	setup &= ~WBSD_DAT3_H;
144 	wbsd_write_index(host, WBSD_IDX_SETUP, setup);
145 	host->flags &= ~WBSD_FIGNORE_DETECT;
146 
147 	/*
148 	 * Read back default clock.
149 	 */
150 	host->clk = wbsd_read_index(host, WBSD_IDX_CLK);
151 
152 	/*
153 	 * Power down port.
154 	 */
155 	outb(WBSD_POWER_N, host->base + WBSD_CSR);
156 
157 	/*
158 	 * Set maximum timeout.
159 	 */
160 	wbsd_write_index(host, WBSD_IDX_TAAC, 0x7F);
161 
162 	/*
163 	 * Test for card presence
164 	 */
165 	if (inb(host->base + WBSD_CSR) & WBSD_CARDPRESENT)
166 		host->flags |= WBSD_FCARD_PRESENT;
167 	else
168 		host->flags &= ~WBSD_FCARD_PRESENT;
169 
170 	/*
171 	 * Enable interesting interrupts.
172 	 */
173 	ier = 0;
174 	ier |= WBSD_EINT_CARD;
175 	ier |= WBSD_EINT_FIFO_THRE;
176 	ier |= WBSD_EINT_CRC;
177 	ier |= WBSD_EINT_TIMEOUT;
178 	ier |= WBSD_EINT_TC;
179 
180 	outb(ier, host->base + WBSD_EIR);
181 
182 	/*
183 	 * Clear interrupts.
184 	 */
185 	inb(host->base + WBSD_ISR);
186 }
187 
188 static void wbsd_reset(struct wbsd_host *host)
189 {
190 	u8 setup;
191 
192 	pr_err("%s: Resetting chip\n", mmc_hostname(host->mmc));
193 
194 	/*
195 	 * Soft reset of chip (SD/MMC part).
196 	 */
197 	setup = wbsd_read_index(host, WBSD_IDX_SETUP);
198 	setup |= WBSD_SOFT_RESET;
199 	wbsd_write_index(host, WBSD_IDX_SETUP, setup);
200 }
201 
202 static void wbsd_request_end(struct wbsd_host *host, struct mmc_request *mrq)
203 {
204 	unsigned long dmaflags;
205 
206 	if (host->dma >= 0) {
207 		/*
208 		 * Release ISA DMA controller.
209 		 */
210 		dmaflags = claim_dma_lock();
211 		disable_dma(host->dma);
212 		clear_dma_ff(host->dma);
213 		release_dma_lock(dmaflags);
214 
215 		/*
216 		 * Disable DMA on host.
217 		 */
218 		wbsd_write_index(host, WBSD_IDX_DMA, 0);
219 	}
220 
221 	host->mrq = NULL;
222 
223 	/*
224 	 * MMC layer might call back into the driver so first unlock.
225 	 */
226 	spin_unlock(&host->lock);
227 	mmc_request_done(host->mmc, mrq);
228 	spin_lock(&host->lock);
229 }
230 
231 /*
232  * Scatter/gather functions
233  */
234 
235 static inline void wbsd_init_sg(struct wbsd_host *host, struct mmc_data *data)
236 {
237 	/*
238 	 * Get info. about SG list from data structure.
239 	 */
240 	host->cur_sg = data->sg;
241 	host->num_sg = data->sg_len;
242 
243 	host->offset = 0;
244 	host->remain = host->cur_sg->length;
245 }
246 
247 static inline int wbsd_next_sg(struct wbsd_host *host)
248 {
249 	/*
250 	 * Skip to next SG entry.
251 	 */
252 	host->cur_sg++;
253 	host->num_sg--;
254 
255 	/*
256 	 * Any entries left?
257 	 */
258 	if (host->num_sg > 0) {
259 		host->offset = 0;
260 		host->remain = host->cur_sg->length;
261 	}
262 
263 	return host->num_sg;
264 }
265 
266 static inline char *wbsd_map_sg(struct wbsd_host *host)
267 {
268 	return kmap_atomic(sg_page(host->cur_sg)) + host->cur_sg->offset;
269 }
270 
271 static inline void wbsd_sg_to_dma(struct wbsd_host *host, struct mmc_data *data)
272 {
273 	size_t len = 0;
274 	int i;
275 
276 	for (i = 0; i < data->sg_len; i++)
277 		len += data->sg[i].length;
278 	sg_copy_to_buffer(data->sg, data->sg_len, host->dma_buffer, len);
279 }
280 
281 static inline void wbsd_dma_to_sg(struct wbsd_host *host, struct mmc_data *data)
282 {
283 	size_t len = 0;
284 	int i;
285 
286 	for (i = 0; i < data->sg_len; i++)
287 		len += data->sg[i].length;
288 	sg_copy_from_buffer(data->sg, data->sg_len, host->dma_buffer, len);
289 }
290 
291 /*
292  * Command handling
293  */
294 
295 static inline void wbsd_get_short_reply(struct wbsd_host *host,
296 					struct mmc_command *cmd)
297 {
298 	/*
299 	 * Correct response type?
300 	 */
301 	if (wbsd_read_index(host, WBSD_IDX_RSPLEN) != WBSD_RSP_SHORT) {
302 		cmd->error = -EILSEQ;
303 		return;
304 	}
305 
306 	cmd->resp[0]  = wbsd_read_index(host, WBSD_IDX_RESP12) << 24;
307 	cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP13) << 16;
308 	cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP14) << 8;
309 	cmd->resp[0] |= wbsd_read_index(host, WBSD_IDX_RESP15) << 0;
310 	cmd->resp[1]  = wbsd_read_index(host, WBSD_IDX_RESP16) << 24;
311 }
312 
313 static inline void wbsd_get_long_reply(struct wbsd_host *host,
314 	struct mmc_command *cmd)
315 {
316 	int i;
317 
318 	/*
319 	 * Correct response type?
320 	 */
321 	if (wbsd_read_index(host, WBSD_IDX_RSPLEN) != WBSD_RSP_LONG) {
322 		cmd->error = -EILSEQ;
323 		return;
324 	}
325 
326 	for (i = 0; i < 4; i++) {
327 		cmd->resp[i] =
328 			wbsd_read_index(host, WBSD_IDX_RESP1 + i * 4) << 24;
329 		cmd->resp[i] |=
330 			wbsd_read_index(host, WBSD_IDX_RESP2 + i * 4) << 16;
331 		cmd->resp[i] |=
332 			wbsd_read_index(host, WBSD_IDX_RESP3 + i * 4) << 8;
333 		cmd->resp[i] |=
334 			wbsd_read_index(host, WBSD_IDX_RESP4 + i * 4) << 0;
335 	}
336 }
337 
338 static void wbsd_send_command(struct wbsd_host *host, struct mmc_command *cmd)
339 {
340 	int i;
341 	u8 status, isr;
342 
343 	/*
344 	 * Clear accumulated ISR. The interrupt routine
345 	 * will fill this one with events that occur during
346 	 * transfer.
347 	 */
348 	host->isr = 0;
349 
350 	/*
351 	 * Send the command (CRC calculated by host).
352 	 */
353 	outb(cmd->opcode, host->base + WBSD_CMDR);
354 	for (i = 3; i >= 0; i--)
355 		outb((cmd->arg >> (i * 8)) & 0xff, host->base + WBSD_CMDR);
356 
357 	cmd->error = 0;
358 
359 	/*
360 	 * Wait for the request to complete.
361 	 */
362 	do {
363 		status = wbsd_read_index(host, WBSD_IDX_STATUS);
364 	} while (status & WBSD_CARDTRAFFIC);
365 
366 	/*
367 	 * Do we expect a reply?
368 	 */
369 	if (cmd->flags & MMC_RSP_PRESENT) {
370 		/*
371 		 * Read back status.
372 		 */
373 		isr = host->isr;
374 
375 		/* Card removed? */
376 		if (isr & WBSD_INT_CARD)
377 			cmd->error = -ENOMEDIUM;
378 		/* Timeout? */
379 		else if (isr & WBSD_INT_TIMEOUT)
380 			cmd->error = -ETIMEDOUT;
381 		/* CRC? */
382 		else if ((cmd->flags & MMC_RSP_CRC) && (isr & WBSD_INT_CRC))
383 			cmd->error = -EILSEQ;
384 		/* All ok */
385 		else {
386 			if (cmd->flags & MMC_RSP_136)
387 				wbsd_get_long_reply(host, cmd);
388 			else
389 				wbsd_get_short_reply(host, cmd);
390 		}
391 	}
392 }
393 
394 /*
395  * Data functions
396  */
397 
398 static void wbsd_empty_fifo(struct wbsd_host *host)
399 {
400 	struct mmc_data *data = host->mrq->cmd->data;
401 	char *buffer;
402 	int i, idx, fsr, fifo;
403 
404 	/*
405 	 * Handle excessive data.
406 	 */
407 	if (host->num_sg == 0)
408 		return;
409 
410 	buffer = wbsd_map_sg(host) + host->offset;
411 	idx = 0;
412 
413 	/*
414 	 * Drain the fifo. This has a tendency to loop longer
415 	 * than the FIFO length (usually one block).
416 	 */
417 	while (!((fsr = inb(host->base + WBSD_FSR)) & WBSD_FIFO_EMPTY)) {
418 		/*
419 		 * The size field in the FSR is broken so we have to
420 		 * do some guessing.
421 		 */
422 		if (fsr & WBSD_FIFO_FULL)
423 			fifo = 16;
424 		else if (fsr & WBSD_FIFO_FUTHRE)
425 			fifo = 8;
426 		else
427 			fifo = 1;
428 
429 		for (i = 0; i < fifo; i++) {
430 			buffer[idx++] = inb(host->base + WBSD_DFR);
431 			host->offset++;
432 			host->remain--;
433 
434 			data->bytes_xfered++;
435 
436 			/*
437 			 * End of scatter list entry?
438 			 */
439 			if (host->remain == 0) {
440 				kunmap_atomic(buffer);
441 				/*
442 				 * Get next entry. Check if last.
443 				 */
444 				if (!wbsd_next_sg(host))
445 					return;
446 
447 				buffer = wbsd_map_sg(host);
448 				idx = 0;
449 			}
450 		}
451 	}
452 	kunmap_atomic(buffer);
453 
454 	/*
455 	 * This is a very dirty hack to solve a
456 	 * hardware problem. The chip doesn't trigger
457 	 * FIFO threshold interrupts properly.
458 	 */
459 	if ((data->blocks * data->blksz - data->bytes_xfered) < 16)
460 		tasklet_schedule(&host->fifo_tasklet);
461 }
462 
463 static void wbsd_fill_fifo(struct wbsd_host *host)
464 {
465 	struct mmc_data *data = host->mrq->cmd->data;
466 	char *buffer;
467 	int i, idx, fsr, fifo;
468 
469 	/*
470 	 * Check that we aren't being called after the
471 	 * entire buffer has been transferred.
472 	 */
473 	if (host->num_sg == 0)
474 		return;
475 
476 	buffer = wbsd_map_sg(host) + host->offset;
477 	idx = 0;
478 
479 	/*
480 	 * Fill the fifo. This has a tendency to loop longer
481 	 * than the FIFO length (usually one block).
482 	 */
483 	while (!((fsr = inb(host->base + WBSD_FSR)) & WBSD_FIFO_FULL)) {
484 		/*
485 		 * The size field in the FSR is broken so we have to
486 		 * do some guessing.
487 		 */
488 		if (fsr & WBSD_FIFO_EMPTY)
489 			fifo = 0;
490 		else if (fsr & WBSD_FIFO_EMTHRE)
491 			fifo = 8;
492 		else
493 			fifo = 15;
494 
495 		for (i = 16; i > fifo; i--) {
496 			outb(buffer[idx], host->base + WBSD_DFR);
497 			host->offset++;
498 			host->remain--;
499 
500 			data->bytes_xfered++;
501 
502 			/*
503 			 * End of scatter list entry?
504 			 */
505 			if (host->remain == 0) {
506 				kunmap_atomic(buffer);
507 				/*
508 				 * Get next entry. Check if last.
509 				 */
510 				if (!wbsd_next_sg(host))
511 					return;
512 
513 				buffer = wbsd_map_sg(host);
514 				idx = 0;
515 			}
516 		}
517 	}
518 	kunmap_atomic(buffer);
519 
520 	/*
521 	 * The controller stops sending interrupts for
522 	 * 'FIFO empty' under certain conditions. So we
523 	 * need to be a bit more pro-active.
524 	 */
525 	tasklet_schedule(&host->fifo_tasklet);
526 }
527 
528 static void wbsd_prepare_data(struct wbsd_host *host, struct mmc_data *data)
529 {
530 	u16 blksize;
531 	u8 setup;
532 	unsigned long dmaflags;
533 	unsigned int size;
534 
535 	/*
536 	 * Calculate size.
537 	 */
538 	size = data->blocks * data->blksz;
539 
540 	/*
541 	 * Check timeout values for overflow.
542 	 * (Yes, some cards cause this value to overflow).
543 	 */
544 	if (data->timeout_ns > 127000000)
545 		wbsd_write_index(host, WBSD_IDX_TAAC, 127);
546 	else {
547 		wbsd_write_index(host, WBSD_IDX_TAAC,
548 			data->timeout_ns / 1000000);
549 	}
550 
551 	if (data->timeout_clks > 255)
552 		wbsd_write_index(host, WBSD_IDX_NSAC, 255);
553 	else
554 		wbsd_write_index(host, WBSD_IDX_NSAC, data->timeout_clks);
555 
556 	/*
557 	 * Inform the chip of how large blocks will be
558 	 * sent. It needs this to determine when to
559 	 * calculate CRC.
560 	 *
561 	 * Space for CRC must be included in the size.
562 	 * Two bytes are needed for each data line.
563 	 */
564 	if (host->bus_width == MMC_BUS_WIDTH_1) {
565 		blksize = data->blksz + 2;
566 
567 		wbsd_write_index(host, WBSD_IDX_PBSMSB, (blksize >> 4) & 0xF0);
568 		wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
569 	} else if (host->bus_width == MMC_BUS_WIDTH_4) {
570 		blksize = data->blksz + 2 * 4;
571 
572 		wbsd_write_index(host, WBSD_IDX_PBSMSB,
573 			((blksize >> 4) & 0xF0) | WBSD_DATA_WIDTH);
574 		wbsd_write_index(host, WBSD_IDX_PBSLSB, blksize & 0xFF);
575 	} else {
576 		data->error = -EINVAL;
577 		return;
578 	}
579 
580 	/*
581 	 * Clear the FIFO. This is needed even for DMA
582 	 * transfers since the chip still uses the FIFO
583 	 * internally.
584 	 */
585 	setup = wbsd_read_index(host, WBSD_IDX_SETUP);
586 	setup |= WBSD_FIFO_RESET;
587 	wbsd_write_index(host, WBSD_IDX_SETUP, setup);
588 
589 	/*
590 	 * DMA transfer?
591 	 */
592 	if (host->dma >= 0) {
593 		/*
594 		 * The buffer for DMA is only 64 kB.
595 		 */
596 		BUG_ON(size > 0x10000);
597 		if (size > 0x10000) {
598 			data->error = -EINVAL;
599 			return;
600 		}
601 
602 		/*
603 		 * Transfer data from the SG list to
604 		 * the DMA buffer.
605 		 */
606 		if (data->flags & MMC_DATA_WRITE)
607 			wbsd_sg_to_dma(host, data);
608 
609 		/*
610 		 * Initialise the ISA DMA controller.
611 		 */
612 		dmaflags = claim_dma_lock();
613 		disable_dma(host->dma);
614 		clear_dma_ff(host->dma);
615 		if (data->flags & MMC_DATA_READ)
616 			set_dma_mode(host->dma, DMA_MODE_READ & ~0x40);
617 		else
618 			set_dma_mode(host->dma, DMA_MODE_WRITE & ~0x40);
619 		set_dma_addr(host->dma, host->dma_addr);
620 		set_dma_count(host->dma, size);
621 
622 		enable_dma(host->dma);
623 		release_dma_lock(dmaflags);
624 
625 		/*
626 		 * Enable DMA on the host.
627 		 */
628 		wbsd_write_index(host, WBSD_IDX_DMA, WBSD_DMA_ENABLE);
629 	} else {
630 		/*
631 		 * This flag is used to keep printk
632 		 * output to a minimum.
633 		 */
634 		host->firsterr = 1;
635 
636 		/*
637 		 * Initialise the SG list.
638 		 */
639 		wbsd_init_sg(host, data);
640 
641 		/*
642 		 * Turn off DMA.
643 		 */
644 		wbsd_write_index(host, WBSD_IDX_DMA, 0);
645 
646 		/*
647 		 * Set up FIFO threshold levels (and fill
648 		 * buffer if doing a write).
649 		 */
650 		if (data->flags & MMC_DATA_READ) {
651 			wbsd_write_index(host, WBSD_IDX_FIFOEN,
652 				WBSD_FIFOEN_FULL | 8);
653 		} else {
654 			wbsd_write_index(host, WBSD_IDX_FIFOEN,
655 				WBSD_FIFOEN_EMPTY | 8);
656 			wbsd_fill_fifo(host);
657 		}
658 	}
659 
660 	data->error = 0;
661 }
662 
663 static void wbsd_finish_data(struct wbsd_host *host, struct mmc_data *data)
664 {
665 	unsigned long dmaflags;
666 	int count;
667 	u8 status;
668 
669 	WARN_ON(host->mrq == NULL);
670 
671 	/*
672 	 * Send a stop command if needed.
673 	 */
674 	if (data->stop)
675 		wbsd_send_command(host, data->stop);
676 
677 	/*
678 	 * Wait for the controller to leave data
679 	 * transfer state.
680 	 */
681 	do {
682 		status = wbsd_read_index(host, WBSD_IDX_STATUS);
683 	} while (status & (WBSD_BLOCK_READ | WBSD_BLOCK_WRITE));
684 
685 	/*
686 	 * DMA transfer?
687 	 */
688 	if (host->dma >= 0) {
689 		/*
690 		 * Disable DMA on the host.
691 		 */
692 		wbsd_write_index(host, WBSD_IDX_DMA, 0);
693 
694 		/*
695 		 * Turn of ISA DMA controller.
696 		 */
697 		dmaflags = claim_dma_lock();
698 		disable_dma(host->dma);
699 		clear_dma_ff(host->dma);
700 		count = get_dma_residue(host->dma);
701 		release_dma_lock(dmaflags);
702 
703 		data->bytes_xfered = host->mrq->data->blocks *
704 			host->mrq->data->blksz - count;
705 		data->bytes_xfered -= data->bytes_xfered % data->blksz;
706 
707 		/*
708 		 * Any leftover data?
709 		 */
710 		if (count) {
711 			pr_err("%s: Incomplete DMA transfer. "
712 				"%d bytes left.\n",
713 				mmc_hostname(host->mmc), count);
714 
715 			if (!data->error)
716 				data->error = -EIO;
717 		} else {
718 			/*
719 			 * Transfer data from DMA buffer to
720 			 * SG list.
721 			 */
722 			if (data->flags & MMC_DATA_READ)
723 				wbsd_dma_to_sg(host, data);
724 		}
725 
726 		if (data->error) {
727 			if (data->bytes_xfered)
728 				data->bytes_xfered -= data->blksz;
729 		}
730 	}
731 
732 	wbsd_request_end(host, host->mrq);
733 }
734 
735 /*****************************************************************************\
736  *                                                                           *
737  * MMC layer callbacks                                                       *
738  *                                                                           *
739 \*****************************************************************************/
740 
741 static void wbsd_request(struct mmc_host *mmc, struct mmc_request *mrq)
742 {
743 	struct wbsd_host *host = mmc_priv(mmc);
744 	struct mmc_command *cmd;
745 
746 	/*
747 	 * Disable tasklets to avoid a deadlock.
748 	 */
749 	spin_lock_bh(&host->lock);
750 
751 	BUG_ON(host->mrq != NULL);
752 
753 	cmd = mrq->cmd;
754 
755 	host->mrq = mrq;
756 
757 	/*
758 	 * Check that there is actually a card in the slot.
759 	 */
760 	if (!(host->flags & WBSD_FCARD_PRESENT)) {
761 		cmd->error = -ENOMEDIUM;
762 		goto done;
763 	}
764 
765 	if (cmd->data) {
766 		/*
767 		 * The hardware is so delightfully stupid that it has a list
768 		 * of "data" commands. If a command isn't on this list, it'll
769 		 * just go back to the idle state and won't send any data
770 		 * interrupts.
771 		 */
772 		switch (cmd->opcode) {
773 		case 11:
774 		case 17:
775 		case 18:
776 		case 20:
777 		case 24:
778 		case 25:
779 		case 26:
780 		case 27:
781 		case 30:
782 		case 42:
783 		case 56:
784 			break;
785 
786 		/* ACMDs. We don't keep track of state, so we just treat them
787 		 * like any other command. */
788 		case 51:
789 			break;
790 
791 		default:
792 			pr_warn("%s: Data command %d is not supported by this controller\n",
793 				mmc_hostname(host->mmc), cmd->opcode);
794 			cmd->error = -EINVAL;
795 
796 			goto done;
797 		}
798 	}
799 
800 	/*
801 	 * Does the request include data?
802 	 */
803 	if (cmd->data) {
804 		wbsd_prepare_data(host, cmd->data);
805 
806 		if (cmd->data->error)
807 			goto done;
808 	}
809 
810 	wbsd_send_command(host, cmd);
811 
812 	/*
813 	 * If this is a data transfer the request
814 	 * will be finished after the data has
815 	 * transferred.
816 	 */
817 	if (cmd->data && !cmd->error) {
818 		/*
819 		 * Dirty fix for hardware bug.
820 		 */
821 		if (host->dma == -1)
822 			tasklet_schedule(&host->fifo_tasklet);
823 
824 		spin_unlock_bh(&host->lock);
825 
826 		return;
827 	}
828 
829 done:
830 	wbsd_request_end(host, mrq);
831 
832 	spin_unlock_bh(&host->lock);
833 }
834 
835 static void wbsd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
836 {
837 	struct wbsd_host *host = mmc_priv(mmc);
838 	u8 clk, setup, pwr;
839 
840 	spin_lock_bh(&host->lock);
841 
842 	/*
843 	 * Reset the chip on each power off.
844 	 * Should clear out any weird states.
845 	 */
846 	if (ios->power_mode == MMC_POWER_OFF)
847 		wbsd_init_device(host);
848 
849 	if (ios->clock >= 24000000)
850 		clk = WBSD_CLK_24M;
851 	else if (ios->clock >= 16000000)
852 		clk = WBSD_CLK_16M;
853 	else if (ios->clock >= 12000000)
854 		clk = WBSD_CLK_12M;
855 	else
856 		clk = WBSD_CLK_375K;
857 
858 	/*
859 	 * Only write to the clock register when
860 	 * there is an actual change.
861 	 */
862 	if (clk != host->clk) {
863 		wbsd_write_index(host, WBSD_IDX_CLK, clk);
864 		host->clk = clk;
865 	}
866 
867 	/*
868 	 * Power up card.
869 	 */
870 	if (ios->power_mode != MMC_POWER_OFF) {
871 		pwr = inb(host->base + WBSD_CSR);
872 		pwr &= ~WBSD_POWER_N;
873 		outb(pwr, host->base + WBSD_CSR);
874 	}
875 
876 	/*
877 	 * MMC cards need to have pin 1 high during init.
878 	 * It wreaks havoc with the card detection though so
879 	 * that needs to be disabled.
880 	 */
881 	setup = wbsd_read_index(host, WBSD_IDX_SETUP);
882 	if (ios->chip_select == MMC_CS_HIGH) {
883 		BUG_ON(ios->bus_width != MMC_BUS_WIDTH_1);
884 		setup |= WBSD_DAT3_H;
885 		host->flags |= WBSD_FIGNORE_DETECT;
886 	} else {
887 		if (setup & WBSD_DAT3_H) {
888 			setup &= ~WBSD_DAT3_H;
889 
890 			/*
891 			 * We cannot resume card detection immediately
892 			 * because of capacitance and delays in the chip.
893 			 */
894 			mod_timer(&host->ignore_timer, jiffies + HZ / 100);
895 		}
896 	}
897 	wbsd_write_index(host, WBSD_IDX_SETUP, setup);
898 
899 	/*
900 	 * Store bus width for later. Will be used when
901 	 * setting up the data transfer.
902 	 */
903 	host->bus_width = ios->bus_width;
904 
905 	spin_unlock_bh(&host->lock);
906 }
907 
908 static int wbsd_get_ro(struct mmc_host *mmc)
909 {
910 	struct wbsd_host *host = mmc_priv(mmc);
911 	u8 csr;
912 
913 	spin_lock_bh(&host->lock);
914 
915 	csr = inb(host->base + WBSD_CSR);
916 	csr |= WBSD_MSLED;
917 	outb(csr, host->base + WBSD_CSR);
918 
919 	mdelay(1);
920 
921 	csr = inb(host->base + WBSD_CSR);
922 	csr &= ~WBSD_MSLED;
923 	outb(csr, host->base + WBSD_CSR);
924 
925 	spin_unlock_bh(&host->lock);
926 
927 	return !!(csr & WBSD_WRPT);
928 }
929 
930 static const struct mmc_host_ops wbsd_ops = {
931 	.request	= wbsd_request,
932 	.set_ios	= wbsd_set_ios,
933 	.get_ro		= wbsd_get_ro,
934 };
935 
936 /*****************************************************************************\
937  *                                                                           *
938  * Interrupt handling                                                        *
939  *                                                                           *
940 \*****************************************************************************/
941 
942 /*
943  * Helper function to reset detection ignore
944  */
945 
946 static void wbsd_reset_ignore(struct timer_list *t)
947 {
948 	struct wbsd_host *host = from_timer(host, t, ignore_timer);
949 
950 	BUG_ON(host == NULL);
951 
952 	DBG("Resetting card detection ignore\n");
953 
954 	spin_lock_bh(&host->lock);
955 
956 	host->flags &= ~WBSD_FIGNORE_DETECT;
957 
958 	/*
959 	 * Card status might have changed during the
960 	 * blackout.
961 	 */
962 	tasklet_schedule(&host->card_tasklet);
963 
964 	spin_unlock_bh(&host->lock);
965 }
966 
967 /*
968  * Tasklets
969  */
970 
971 static inline struct mmc_data *wbsd_get_data(struct wbsd_host *host)
972 {
973 	WARN_ON(!host->mrq);
974 	if (!host->mrq)
975 		return NULL;
976 
977 	WARN_ON(!host->mrq->cmd);
978 	if (!host->mrq->cmd)
979 		return NULL;
980 
981 	WARN_ON(!host->mrq->cmd->data);
982 	if (!host->mrq->cmd->data)
983 		return NULL;
984 
985 	return host->mrq->cmd->data;
986 }
987 
988 static void wbsd_tasklet_card(unsigned long param)
989 {
990 	struct wbsd_host *host = (struct wbsd_host *)param;
991 	u8 csr;
992 	int delay = -1;
993 
994 	spin_lock(&host->lock);
995 
996 	if (host->flags & WBSD_FIGNORE_DETECT) {
997 		spin_unlock(&host->lock);
998 		return;
999 	}
1000 
1001 	csr = inb(host->base + WBSD_CSR);
1002 	WARN_ON(csr == 0xff);
1003 
1004 	if (csr & WBSD_CARDPRESENT) {
1005 		if (!(host->flags & WBSD_FCARD_PRESENT)) {
1006 			DBG("Card inserted\n");
1007 			host->flags |= WBSD_FCARD_PRESENT;
1008 
1009 			delay = 500;
1010 		}
1011 	} else if (host->flags & WBSD_FCARD_PRESENT) {
1012 		DBG("Card removed\n");
1013 		host->flags &= ~WBSD_FCARD_PRESENT;
1014 
1015 		if (host->mrq) {
1016 			pr_err("%s: Card removed during transfer!\n",
1017 				mmc_hostname(host->mmc));
1018 			wbsd_reset(host);
1019 
1020 			host->mrq->cmd->error = -ENOMEDIUM;
1021 			tasklet_schedule(&host->finish_tasklet);
1022 		}
1023 
1024 		delay = 0;
1025 	}
1026 
1027 	/*
1028 	 * Unlock first since we might get a call back.
1029 	 */
1030 
1031 	spin_unlock(&host->lock);
1032 
1033 	if (delay != -1)
1034 		mmc_detect_change(host->mmc, msecs_to_jiffies(delay));
1035 }
1036 
1037 static void wbsd_tasklet_fifo(unsigned long param)
1038 {
1039 	struct wbsd_host *host = (struct wbsd_host *)param;
1040 	struct mmc_data *data;
1041 
1042 	spin_lock(&host->lock);
1043 
1044 	if (!host->mrq)
1045 		goto end;
1046 
1047 	data = wbsd_get_data(host);
1048 	if (!data)
1049 		goto end;
1050 
1051 	if (data->flags & MMC_DATA_WRITE)
1052 		wbsd_fill_fifo(host);
1053 	else
1054 		wbsd_empty_fifo(host);
1055 
1056 	/*
1057 	 * Done?
1058 	 */
1059 	if (host->num_sg == 0) {
1060 		wbsd_write_index(host, WBSD_IDX_FIFOEN, 0);
1061 		tasklet_schedule(&host->finish_tasklet);
1062 	}
1063 
1064 end:
1065 	spin_unlock(&host->lock);
1066 }
1067 
1068 static void wbsd_tasklet_crc(unsigned long param)
1069 {
1070 	struct wbsd_host *host = (struct wbsd_host *)param;
1071 	struct mmc_data *data;
1072 
1073 	spin_lock(&host->lock);
1074 
1075 	if (!host->mrq)
1076 		goto end;
1077 
1078 	data = wbsd_get_data(host);
1079 	if (!data)
1080 		goto end;
1081 
1082 	DBGF("CRC error\n");
1083 
1084 	data->error = -EILSEQ;
1085 
1086 	tasklet_schedule(&host->finish_tasklet);
1087 
1088 end:
1089 	spin_unlock(&host->lock);
1090 }
1091 
1092 static void wbsd_tasklet_timeout(unsigned long param)
1093 {
1094 	struct wbsd_host *host = (struct wbsd_host *)param;
1095 	struct mmc_data *data;
1096 
1097 	spin_lock(&host->lock);
1098 
1099 	if (!host->mrq)
1100 		goto end;
1101 
1102 	data = wbsd_get_data(host);
1103 	if (!data)
1104 		goto end;
1105 
1106 	DBGF("Timeout\n");
1107 
1108 	data->error = -ETIMEDOUT;
1109 
1110 	tasklet_schedule(&host->finish_tasklet);
1111 
1112 end:
1113 	spin_unlock(&host->lock);
1114 }
1115 
1116 static void wbsd_tasklet_finish(unsigned long param)
1117 {
1118 	struct wbsd_host *host = (struct wbsd_host *)param;
1119 	struct mmc_data *data;
1120 
1121 	spin_lock(&host->lock);
1122 
1123 	WARN_ON(!host->mrq);
1124 	if (!host->mrq)
1125 		goto end;
1126 
1127 	data = wbsd_get_data(host);
1128 	if (!data)
1129 		goto end;
1130 
1131 	wbsd_finish_data(host, data);
1132 
1133 end:
1134 	spin_unlock(&host->lock);
1135 }
1136 
1137 /*
1138  * Interrupt handling
1139  */
1140 
1141 static irqreturn_t wbsd_irq(int irq, void *dev_id)
1142 {
1143 	struct wbsd_host *host = dev_id;
1144 	int isr;
1145 
1146 	isr = inb(host->base + WBSD_ISR);
1147 
1148 	/*
1149 	 * Was it actually our hardware that caused the interrupt?
1150 	 */
1151 	if (isr == 0xff || isr == 0x00)
1152 		return IRQ_NONE;
1153 
1154 	host->isr |= isr;
1155 
1156 	/*
1157 	 * Schedule tasklets as needed.
1158 	 */
1159 	if (isr & WBSD_INT_CARD)
1160 		tasklet_schedule(&host->card_tasklet);
1161 	if (isr & WBSD_INT_FIFO_THRE)
1162 		tasklet_schedule(&host->fifo_tasklet);
1163 	if (isr & WBSD_INT_CRC)
1164 		tasklet_hi_schedule(&host->crc_tasklet);
1165 	if (isr & WBSD_INT_TIMEOUT)
1166 		tasklet_hi_schedule(&host->timeout_tasklet);
1167 	if (isr & WBSD_INT_TC)
1168 		tasklet_schedule(&host->finish_tasklet);
1169 
1170 	return IRQ_HANDLED;
1171 }
1172 
1173 /*****************************************************************************\
1174  *                                                                           *
1175  * Device initialisation and shutdown                                        *
1176  *                                                                           *
1177 \*****************************************************************************/
1178 
1179 /*
1180  * Allocate/free MMC structure.
1181  */
1182 
1183 static int wbsd_alloc_mmc(struct device *dev)
1184 {
1185 	struct mmc_host *mmc;
1186 	struct wbsd_host *host;
1187 
1188 	/*
1189 	 * Allocate MMC structure.
1190 	 */
1191 	mmc = mmc_alloc_host(sizeof(struct wbsd_host), dev);
1192 	if (!mmc)
1193 		return -ENOMEM;
1194 
1195 	host = mmc_priv(mmc);
1196 	host->mmc = mmc;
1197 
1198 	host->dma = -1;
1199 
1200 	/*
1201 	 * Set host parameters.
1202 	 */
1203 	mmc->ops = &wbsd_ops;
1204 	mmc->f_min = 375000;
1205 	mmc->f_max = 24000000;
1206 	mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
1207 	mmc->caps = MMC_CAP_4_BIT_DATA;
1208 
1209 	spin_lock_init(&host->lock);
1210 
1211 	/*
1212 	 * Set up timers
1213 	 */
1214 	timer_setup(&host->ignore_timer, wbsd_reset_ignore, 0);
1215 
1216 	/*
1217 	 * Maximum number of segments. Worst case is one sector per segment
1218 	 * so this will be 64kB/512.
1219 	 */
1220 	mmc->max_segs = 128;
1221 
1222 	/*
1223 	 * Maximum request size. Also limited by 64KiB buffer.
1224 	 */
1225 	mmc->max_req_size = 65536;
1226 
1227 	/*
1228 	 * Maximum segment size. Could be one segment with the maximum number
1229 	 * of bytes.
1230 	 */
1231 	mmc->max_seg_size = mmc->max_req_size;
1232 
1233 	/*
1234 	 * Maximum block size. We have 12 bits (= 4095) but have to subtract
1235 	 * space for CRC. So the maximum is 4095 - 4*2 = 4087.
1236 	 */
1237 	mmc->max_blk_size = 4087;
1238 
1239 	/*
1240 	 * Maximum block count. There is no real limit so the maximum
1241 	 * request size will be the only restriction.
1242 	 */
1243 	mmc->max_blk_count = mmc->max_req_size;
1244 
1245 	dev_set_drvdata(dev, mmc);
1246 
1247 	return 0;
1248 }
1249 
1250 static void wbsd_free_mmc(struct device *dev)
1251 {
1252 	struct mmc_host *mmc;
1253 	struct wbsd_host *host;
1254 
1255 	mmc = dev_get_drvdata(dev);
1256 	if (!mmc)
1257 		return;
1258 
1259 	host = mmc_priv(mmc);
1260 	BUG_ON(host == NULL);
1261 
1262 	del_timer_sync(&host->ignore_timer);
1263 
1264 	mmc_free_host(mmc);
1265 
1266 	dev_set_drvdata(dev, NULL);
1267 }
1268 
1269 /*
1270  * Scan for known chip id:s
1271  */
1272 
1273 static int wbsd_scan(struct wbsd_host *host)
1274 {
1275 	int i, j, k;
1276 	int id;
1277 
1278 	/*
1279 	 * Iterate through all ports, all codes to
1280 	 * find hardware that is in our known list.
1281 	 */
1282 	for (i = 0; i < ARRAY_SIZE(config_ports); i++) {
1283 		if (!request_region(config_ports[i], 2, DRIVER_NAME))
1284 			continue;
1285 
1286 		for (j = 0; j < ARRAY_SIZE(unlock_codes); j++) {
1287 			id = 0xFFFF;
1288 
1289 			host->config = config_ports[i];
1290 			host->unlock_code = unlock_codes[j];
1291 
1292 			wbsd_unlock_config(host);
1293 
1294 			outb(WBSD_CONF_ID_HI, config_ports[i]);
1295 			id = inb(config_ports[i] + 1) << 8;
1296 
1297 			outb(WBSD_CONF_ID_LO, config_ports[i]);
1298 			id |= inb(config_ports[i] + 1);
1299 
1300 			wbsd_lock_config(host);
1301 
1302 			for (k = 0; k < ARRAY_SIZE(valid_ids); k++) {
1303 				if (id == valid_ids[k]) {
1304 					host->chip_id = id;
1305 
1306 					return 0;
1307 				}
1308 			}
1309 
1310 			if (id != 0xFFFF) {
1311 				DBG("Unknown hardware (id %x) found at %x\n",
1312 					id, config_ports[i]);
1313 			}
1314 		}
1315 
1316 		release_region(config_ports[i], 2);
1317 	}
1318 
1319 	host->config = 0;
1320 	host->unlock_code = 0;
1321 
1322 	return -ENODEV;
1323 }
1324 
1325 /*
1326  * Allocate/free io port ranges
1327  */
1328 
1329 static int wbsd_request_region(struct wbsd_host *host, int base)
1330 {
1331 	if (base & 0x7)
1332 		return -EINVAL;
1333 
1334 	if (!request_region(base, 8, DRIVER_NAME))
1335 		return -EIO;
1336 
1337 	host->base = base;
1338 
1339 	return 0;
1340 }
1341 
1342 static void wbsd_release_regions(struct wbsd_host *host)
1343 {
1344 	if (host->base)
1345 		release_region(host->base, 8);
1346 
1347 	host->base = 0;
1348 
1349 	if (host->config)
1350 		release_region(host->config, 2);
1351 
1352 	host->config = 0;
1353 }
1354 
1355 /*
1356  * Allocate/free DMA port and buffer
1357  */
1358 
1359 static void wbsd_request_dma(struct wbsd_host *host, int dma)
1360 {
1361 	if (dma < 0)
1362 		return;
1363 
1364 	if (request_dma(dma, DRIVER_NAME))
1365 		goto err;
1366 
1367 	/*
1368 	 * We need to allocate a special buffer in
1369 	 * order for ISA to be able to DMA to it.
1370 	 */
1371 	host->dma_buffer = kmalloc(WBSD_DMA_SIZE,
1372 		GFP_NOIO | GFP_DMA | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
1373 	if (!host->dma_buffer)
1374 		goto free;
1375 
1376 	/*
1377 	 * Translate the address to a physical address.
1378 	 */
1379 	host->dma_addr = dma_map_single(mmc_dev(host->mmc), host->dma_buffer,
1380 		WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1381 	if (dma_mapping_error(mmc_dev(host->mmc), host->dma_addr))
1382 		goto kfree;
1383 
1384 	/*
1385 	 * ISA DMA must be aligned on a 64k basis.
1386 	 */
1387 	if ((host->dma_addr & 0xffff) != 0)
1388 		goto unmap;
1389 	/*
1390 	 * ISA cannot access memory above 16 MB.
1391 	 */
1392 	else if (host->dma_addr >= 0x1000000)
1393 		goto unmap;
1394 
1395 	host->dma = dma;
1396 
1397 	return;
1398 
1399 unmap:
1400 	/*
1401 	 * If we've gotten here then there is some kind of alignment bug
1402 	 */
1403 	BUG_ON(1);
1404 
1405 	dma_unmap_single(mmc_dev(host->mmc), host->dma_addr,
1406 		WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1407 	host->dma_addr = 0;
1408 
1409 kfree:
1410 	kfree(host->dma_buffer);
1411 	host->dma_buffer = NULL;
1412 
1413 free:
1414 	free_dma(dma);
1415 
1416 err:
1417 	pr_warn(DRIVER_NAME ": Unable to allocate DMA %d - falling back on FIFO\n",
1418 		dma);
1419 }
1420 
1421 static void wbsd_release_dma(struct wbsd_host *host)
1422 {
1423 	/*
1424 	 * host->dma_addr is valid here iff host->dma_buffer is not NULL.
1425 	 */
1426 	if (host->dma_buffer) {
1427 		dma_unmap_single(mmc_dev(host->mmc), host->dma_addr,
1428 			WBSD_DMA_SIZE, DMA_BIDIRECTIONAL);
1429 		kfree(host->dma_buffer);
1430 	}
1431 	if (host->dma >= 0)
1432 		free_dma(host->dma);
1433 
1434 	host->dma = -1;
1435 	host->dma_buffer = NULL;
1436 	host->dma_addr = 0;
1437 }
1438 
1439 /*
1440  * Allocate/free IRQ.
1441  */
1442 
1443 static int wbsd_request_irq(struct wbsd_host *host, int irq)
1444 {
1445 	int ret;
1446 
1447 	/*
1448 	 * Set up tasklets. Must be done before requesting interrupt.
1449 	 */
1450 	tasklet_init(&host->card_tasklet, wbsd_tasklet_card,
1451 			(unsigned long)host);
1452 	tasklet_init(&host->fifo_tasklet, wbsd_tasklet_fifo,
1453 			(unsigned long)host);
1454 	tasklet_init(&host->crc_tasklet, wbsd_tasklet_crc,
1455 			(unsigned long)host);
1456 	tasklet_init(&host->timeout_tasklet, wbsd_tasklet_timeout,
1457 			(unsigned long)host);
1458 	tasklet_init(&host->finish_tasklet, wbsd_tasklet_finish,
1459 			(unsigned long)host);
1460 
1461 	/*
1462 	 * Allocate interrupt.
1463 	 */
1464 	ret = request_irq(irq, wbsd_irq, IRQF_SHARED, DRIVER_NAME, host);
1465 	if (ret)
1466 		return ret;
1467 
1468 	host->irq = irq;
1469 
1470 	return 0;
1471 }
1472 
1473 static void  wbsd_release_irq(struct wbsd_host *host)
1474 {
1475 	if (!host->irq)
1476 		return;
1477 
1478 	free_irq(host->irq, host);
1479 
1480 	host->irq = 0;
1481 
1482 	tasklet_kill(&host->card_tasklet);
1483 	tasklet_kill(&host->fifo_tasklet);
1484 	tasklet_kill(&host->crc_tasklet);
1485 	tasklet_kill(&host->timeout_tasklet);
1486 	tasklet_kill(&host->finish_tasklet);
1487 }
1488 
1489 /*
1490  * Allocate all resources for the host.
1491  */
1492 
1493 static int wbsd_request_resources(struct wbsd_host *host,
1494 	int base, int irq, int dma)
1495 {
1496 	int ret;
1497 
1498 	/*
1499 	 * Allocate I/O ports.
1500 	 */
1501 	ret = wbsd_request_region(host, base);
1502 	if (ret)
1503 		return ret;
1504 
1505 	/*
1506 	 * Allocate interrupt.
1507 	 */
1508 	ret = wbsd_request_irq(host, irq);
1509 	if (ret)
1510 		return ret;
1511 
1512 	/*
1513 	 * Allocate DMA.
1514 	 */
1515 	wbsd_request_dma(host, dma);
1516 
1517 	return 0;
1518 }
1519 
1520 /*
1521  * Release all resources for the host.
1522  */
1523 
1524 static void wbsd_release_resources(struct wbsd_host *host)
1525 {
1526 	wbsd_release_dma(host);
1527 	wbsd_release_irq(host);
1528 	wbsd_release_regions(host);
1529 }
1530 
1531 /*
1532  * Configure the resources the chip should use.
1533  */
1534 
1535 static void wbsd_chip_config(struct wbsd_host *host)
1536 {
1537 	wbsd_unlock_config(host);
1538 
1539 	/*
1540 	 * Reset the chip.
1541 	 */
1542 	wbsd_write_config(host, WBSD_CONF_SWRST, 1);
1543 	wbsd_write_config(host, WBSD_CONF_SWRST, 0);
1544 
1545 	/*
1546 	 * Select SD/MMC function.
1547 	 */
1548 	wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1549 
1550 	/*
1551 	 * Set up card detection.
1552 	 */
1553 	wbsd_write_config(host, WBSD_CONF_PINS, WBSD_PINS_DETECT_GP11);
1554 
1555 	/*
1556 	 * Configure chip
1557 	 */
1558 	wbsd_write_config(host, WBSD_CONF_PORT_HI, host->base >> 8);
1559 	wbsd_write_config(host, WBSD_CONF_PORT_LO, host->base & 0xff);
1560 
1561 	wbsd_write_config(host, WBSD_CONF_IRQ, host->irq);
1562 
1563 	if (host->dma >= 0)
1564 		wbsd_write_config(host, WBSD_CONF_DRQ, host->dma);
1565 
1566 	/*
1567 	 * Enable and power up chip.
1568 	 */
1569 	wbsd_write_config(host, WBSD_CONF_ENABLE, 1);
1570 	wbsd_write_config(host, WBSD_CONF_POWER, 0x20);
1571 
1572 	wbsd_lock_config(host);
1573 }
1574 
1575 /*
1576  * Check that configured resources are correct.
1577  */
1578 
1579 static int wbsd_chip_validate(struct wbsd_host *host)
1580 {
1581 	int base, irq, dma;
1582 
1583 	wbsd_unlock_config(host);
1584 
1585 	/*
1586 	 * Select SD/MMC function.
1587 	 */
1588 	wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1589 
1590 	/*
1591 	 * Read configuration.
1592 	 */
1593 	base = wbsd_read_config(host, WBSD_CONF_PORT_HI) << 8;
1594 	base |= wbsd_read_config(host, WBSD_CONF_PORT_LO);
1595 
1596 	irq = wbsd_read_config(host, WBSD_CONF_IRQ);
1597 
1598 	dma = wbsd_read_config(host, WBSD_CONF_DRQ);
1599 
1600 	wbsd_lock_config(host);
1601 
1602 	/*
1603 	 * Validate against given configuration.
1604 	 */
1605 	if (base != host->base)
1606 		return 0;
1607 	if (irq != host->irq)
1608 		return 0;
1609 	if ((dma != host->dma) && (host->dma != -1))
1610 		return 0;
1611 
1612 	return 1;
1613 }
1614 
1615 /*
1616  * Powers down the SD function
1617  */
1618 
1619 static void wbsd_chip_poweroff(struct wbsd_host *host)
1620 {
1621 	wbsd_unlock_config(host);
1622 
1623 	wbsd_write_config(host, WBSD_CONF_DEVICE, DEVICE_SD);
1624 	wbsd_write_config(host, WBSD_CONF_ENABLE, 0);
1625 
1626 	wbsd_lock_config(host);
1627 }
1628 
1629 /*****************************************************************************\
1630  *                                                                           *
1631  * Devices setup and shutdown                                                *
1632  *                                                                           *
1633 \*****************************************************************************/
1634 
1635 static int wbsd_init(struct device *dev, int base, int irq, int dma,
1636 	int pnp)
1637 {
1638 	struct wbsd_host *host = NULL;
1639 	struct mmc_host *mmc = NULL;
1640 	int ret;
1641 
1642 	ret = wbsd_alloc_mmc(dev);
1643 	if (ret)
1644 		return ret;
1645 
1646 	mmc = dev_get_drvdata(dev);
1647 	host = mmc_priv(mmc);
1648 
1649 	/*
1650 	 * Scan for hardware.
1651 	 */
1652 	ret = wbsd_scan(host);
1653 	if (ret) {
1654 		if (pnp && (ret == -ENODEV)) {
1655 			pr_warn(DRIVER_NAME ": Unable to confirm device presence - you may experience lock-ups\n");
1656 		} else {
1657 			wbsd_free_mmc(dev);
1658 			return ret;
1659 		}
1660 	}
1661 
1662 	/*
1663 	 * Request resources.
1664 	 */
1665 	ret = wbsd_request_resources(host, base, irq, dma);
1666 	if (ret) {
1667 		wbsd_release_resources(host);
1668 		wbsd_free_mmc(dev);
1669 		return ret;
1670 	}
1671 
1672 	/*
1673 	 * See if chip needs to be configured.
1674 	 */
1675 	if (pnp) {
1676 		if ((host->config != 0) && !wbsd_chip_validate(host)) {
1677 			pr_warn(DRIVER_NAME ": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n");
1678 			wbsd_chip_config(host);
1679 		}
1680 	} else
1681 		wbsd_chip_config(host);
1682 
1683 	/*
1684 	 * Power Management stuff. No idea how this works.
1685 	 * Not tested.
1686 	 */
1687 #ifdef CONFIG_PM
1688 	if (host->config) {
1689 		wbsd_unlock_config(host);
1690 		wbsd_write_config(host, WBSD_CONF_PME, 0xA0);
1691 		wbsd_lock_config(host);
1692 	}
1693 #endif
1694 	/*
1695 	 * Allow device to initialise itself properly.
1696 	 */
1697 	mdelay(5);
1698 
1699 	/*
1700 	 * Reset the chip into a known state.
1701 	 */
1702 	wbsd_init_device(host);
1703 
1704 	mmc_add_host(mmc);
1705 
1706 	pr_info("%s: W83L51xD", mmc_hostname(mmc));
1707 	if (host->chip_id != 0)
1708 		printk(" id %x", (int)host->chip_id);
1709 	printk(" at 0x%x irq %d", (int)host->base, (int)host->irq);
1710 	if (host->dma >= 0)
1711 		printk(" dma %d", (int)host->dma);
1712 	else
1713 		printk(" FIFO");
1714 	if (pnp)
1715 		printk(" PnP");
1716 	printk("\n");
1717 
1718 	return 0;
1719 }
1720 
1721 static void wbsd_shutdown(struct device *dev, int pnp)
1722 {
1723 	struct mmc_host *mmc = dev_get_drvdata(dev);
1724 	struct wbsd_host *host;
1725 
1726 	if (!mmc)
1727 		return;
1728 
1729 	host = mmc_priv(mmc);
1730 
1731 	mmc_remove_host(mmc);
1732 
1733 	/*
1734 	 * Power down the SD/MMC function.
1735 	 */
1736 	if (!pnp)
1737 		wbsd_chip_poweroff(host);
1738 
1739 	wbsd_release_resources(host);
1740 
1741 	wbsd_free_mmc(dev);
1742 }
1743 
1744 /*
1745  * Non-PnP
1746  */
1747 
1748 static int wbsd_probe(struct platform_device *dev)
1749 {
1750 	/* Use the module parameters for resources */
1751 	return wbsd_init(&dev->dev, param_io, param_irq, param_dma, 0);
1752 }
1753 
1754 static int wbsd_remove(struct platform_device *dev)
1755 {
1756 	wbsd_shutdown(&dev->dev, 0);
1757 
1758 	return 0;
1759 }
1760 
1761 /*
1762  * PnP
1763  */
1764 
1765 #ifdef CONFIG_PNP
1766 
1767 static int
1768 wbsd_pnp_probe(struct pnp_dev *pnpdev, const struct pnp_device_id *dev_id)
1769 {
1770 	int io, irq, dma;
1771 
1772 	/*
1773 	 * Get resources from PnP layer.
1774 	 */
1775 	io = pnp_port_start(pnpdev, 0);
1776 	irq = pnp_irq(pnpdev, 0);
1777 	if (pnp_dma_valid(pnpdev, 0))
1778 		dma = pnp_dma(pnpdev, 0);
1779 	else
1780 		dma = -1;
1781 
1782 	DBGF("PnP resources: port %3x irq %d dma %d\n", io, irq, dma);
1783 
1784 	return wbsd_init(&pnpdev->dev, io, irq, dma, 1);
1785 }
1786 
1787 static void wbsd_pnp_remove(struct pnp_dev *dev)
1788 {
1789 	wbsd_shutdown(&dev->dev, 1);
1790 }
1791 
1792 #endif /* CONFIG_PNP */
1793 
1794 /*
1795  * Power management
1796  */
1797 
1798 #ifdef CONFIG_PM
1799 
1800 static int wbsd_platform_suspend(struct platform_device *dev,
1801 				 pm_message_t state)
1802 {
1803 	struct mmc_host *mmc = platform_get_drvdata(dev);
1804 	struct wbsd_host *host;
1805 
1806 	if (mmc == NULL)
1807 		return 0;
1808 
1809 	DBGF("Suspending...\n");
1810 
1811 	host = mmc_priv(mmc);
1812 
1813 	wbsd_chip_poweroff(host);
1814 	return 0;
1815 }
1816 
1817 static int wbsd_platform_resume(struct platform_device *dev)
1818 {
1819 	struct mmc_host *mmc = platform_get_drvdata(dev);
1820 	struct wbsd_host *host;
1821 
1822 	if (mmc == NULL)
1823 		return 0;
1824 
1825 	DBGF("Resuming...\n");
1826 
1827 	host = mmc_priv(mmc);
1828 
1829 	wbsd_chip_config(host);
1830 
1831 	/*
1832 	 * Allow device to initialise itself properly.
1833 	 */
1834 	mdelay(5);
1835 
1836 	wbsd_init_device(host);
1837 	return 0;
1838 }
1839 
1840 #ifdef CONFIG_PNP
1841 
1842 static int wbsd_pnp_suspend(struct pnp_dev *pnp_dev, pm_message_t state)
1843 {
1844 	struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
1845 
1846 	if (mmc == NULL)
1847 		return 0;
1848 
1849 	DBGF("Suspending...\n");
1850 	return 0;
1851 }
1852 
1853 static int wbsd_pnp_resume(struct pnp_dev *pnp_dev)
1854 {
1855 	struct mmc_host *mmc = dev_get_drvdata(&pnp_dev->dev);
1856 	struct wbsd_host *host;
1857 
1858 	if (mmc == NULL)
1859 		return 0;
1860 
1861 	DBGF("Resuming...\n");
1862 
1863 	host = mmc_priv(mmc);
1864 
1865 	/*
1866 	 * See if chip needs to be configured.
1867 	 */
1868 	if (host->config != 0) {
1869 		if (!wbsd_chip_validate(host)) {
1870 			pr_warn(DRIVER_NAME ": PnP active but chip not configured! You probably have a buggy BIOS. Configuring chip manually.\n");
1871 			wbsd_chip_config(host);
1872 		}
1873 	}
1874 
1875 	/*
1876 	 * Allow device to initialise itself properly.
1877 	 */
1878 	mdelay(5);
1879 
1880 	wbsd_init_device(host);
1881 	return 0;
1882 }
1883 
1884 #endif /* CONFIG_PNP */
1885 
1886 #else /* CONFIG_PM */
1887 
1888 #define wbsd_platform_suspend NULL
1889 #define wbsd_platform_resume NULL
1890 
1891 #define wbsd_pnp_suspend NULL
1892 #define wbsd_pnp_resume NULL
1893 
1894 #endif /* CONFIG_PM */
1895 
1896 static struct platform_device *wbsd_device;
1897 
1898 static struct platform_driver wbsd_driver = {
1899 	.probe		= wbsd_probe,
1900 	.remove		= wbsd_remove,
1901 
1902 	.suspend	= wbsd_platform_suspend,
1903 	.resume		= wbsd_platform_resume,
1904 	.driver		= {
1905 		.name	= DRIVER_NAME,
1906 	},
1907 };
1908 
1909 #ifdef CONFIG_PNP
1910 
1911 static struct pnp_driver wbsd_pnp_driver = {
1912 	.name		= DRIVER_NAME,
1913 	.id_table	= pnp_dev_table,
1914 	.probe		= wbsd_pnp_probe,
1915 	.remove		= wbsd_pnp_remove,
1916 
1917 	.suspend	= wbsd_pnp_suspend,
1918 	.resume		= wbsd_pnp_resume,
1919 };
1920 
1921 #endif /* CONFIG_PNP */
1922 
1923 /*
1924  * Module loading/unloading
1925  */
1926 
1927 static int __init wbsd_drv_init(void)
1928 {
1929 	int result;
1930 
1931 	pr_info(DRIVER_NAME
1932 		": Winbond W83L51xD SD/MMC card interface driver\n");
1933 	pr_info(DRIVER_NAME ": Copyright(c) Pierre Ossman\n");
1934 
1935 #ifdef CONFIG_PNP
1936 
1937 	if (!param_nopnp) {
1938 		result = pnp_register_driver(&wbsd_pnp_driver);
1939 		if (result < 0)
1940 			return result;
1941 	}
1942 #endif /* CONFIG_PNP */
1943 
1944 	if (param_nopnp) {
1945 		result = platform_driver_register(&wbsd_driver);
1946 		if (result < 0)
1947 			return result;
1948 
1949 		wbsd_device = platform_device_alloc(DRIVER_NAME, -1);
1950 		if (!wbsd_device) {
1951 			platform_driver_unregister(&wbsd_driver);
1952 			return -ENOMEM;
1953 		}
1954 
1955 		result = platform_device_add(wbsd_device);
1956 		if (result) {
1957 			platform_device_put(wbsd_device);
1958 			platform_driver_unregister(&wbsd_driver);
1959 			return result;
1960 		}
1961 	}
1962 
1963 	return 0;
1964 }
1965 
1966 static void __exit wbsd_drv_exit(void)
1967 {
1968 #ifdef CONFIG_PNP
1969 
1970 	if (!param_nopnp)
1971 		pnp_unregister_driver(&wbsd_pnp_driver);
1972 
1973 #endif /* CONFIG_PNP */
1974 
1975 	if (param_nopnp) {
1976 		platform_device_unregister(wbsd_device);
1977 
1978 		platform_driver_unregister(&wbsd_driver);
1979 	}
1980 
1981 	DBG("unloaded\n");
1982 }
1983 
1984 module_init(wbsd_drv_init);
1985 module_exit(wbsd_drv_exit);
1986 #ifdef CONFIG_PNP
1987 module_param_hw_named(nopnp, param_nopnp, uint, other, 0444);
1988 #endif
1989 module_param_hw_named(io, param_io, uint, ioport, 0444);
1990 module_param_hw_named(irq, param_irq, uint, irq, 0444);
1991 module_param_hw_named(dma, param_dma, int, dma, 0444);
1992 
1993 MODULE_LICENSE("GPL");
1994 MODULE_AUTHOR("Pierre Ossman <pierre@ossman.eu>");
1995 MODULE_DESCRIPTION("Winbond W83L51xD SD/MMC card interface driver");
1996 
1997 #ifdef CONFIG_PNP
1998 MODULE_PARM_DESC(nopnp, "Scan for device instead of relying on PNP. (default 0)");
1999 #endif
2000 MODULE_PARM_DESC(io, "I/O base to allocate. Must be 8 byte aligned. (default 0x248)");
2001 MODULE_PARM_DESC(irq, "IRQ to allocate. (default 6)");
2002 MODULE_PARM_DESC(dma, "DMA channel to allocate. -1 for no DMA. (default 2)");
2003