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