xref: /netbsd-src/sys/dev/sdmmc/sdmmc.c (revision e61202360d5611414dd6f6115934a96aa1f50b1a)
1 /*	$NetBSD: sdmmc.c,v 1.15 2012/08/04 04:06:00 kiyohara Exp $	*/
2 /*	$OpenBSD: sdmmc.c,v 1.18 2009/01/09 10:58:38 jsg Exp $	*/
3 
4 /*
5  * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /*-
21  * Copyright (C) 2007, 2008, 2009 NONAKA Kimihiro <nonaka@netbsd.org>
22  * All rights reserved.
23  *
24  * Redistribution and use in source and binary forms, with or without
25  * modification, are permitted provided that the following conditions
26  * are met:
27  * 1. Redistributions of source code must retain the above copyright
28  *    notice, this list of conditions and the following disclaimer.
29  * 2. Redistributions in binary form must reproduce the above copyright
30  *    notice, this list of conditions and the following disclaimer in the
31  *    documentation and/or other materials provided with the distribution.
32  *
33  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
34  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
36  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
37  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
38  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
42  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43  */
44 
45 /*
46  * Host controller independent SD/MMC bus driver based on information
47  * from SanDisk SD Card Product Manual Revision 2.2 (SanDisk), SDIO
48  * Simple Specification Version 1.0 (SDIO) and the Linux "mmc" driver.
49  */
50 
51 #include <sys/cdefs.h>
52 __KERNEL_RCSID(0, "$NetBSD: sdmmc.c,v 1.15 2012/08/04 04:06:00 kiyohara Exp $");
53 
54 #ifdef _KERNEL_OPT
55 #include "opt_sdmmc.h"
56 #endif
57 
58 #include <sys/param.h>
59 #include <sys/device.h>
60 #include <sys/kernel.h>
61 #include <sys/kthread.h>
62 #include <sys/malloc.h>
63 #include <sys/proc.h>
64 #include <sys/systm.h>
65 #include <sys/callout.h>
66 
67 #include <machine/vmparam.h>
68 
69 #include <dev/sdmmc/sdmmc_ioreg.h>
70 #include <dev/sdmmc/sdmmcchip.h>
71 #include <dev/sdmmc/sdmmcreg.h>
72 #include <dev/sdmmc/sdmmcvar.h>
73 
74 #ifdef SDMMC_DEBUG
75 int sdmmcdebug = 1;
76 static void sdmmc_dump_command(struct sdmmc_softc *, struct sdmmc_command *);
77 #define DPRINTF(n,s)	do { if ((n) <= sdmmcdebug) printf s; } while (0)
78 #else
79 #define	DPRINTF(n,s)	do {} while (0)
80 #endif
81 
82 #define	DEVNAME(sc)	SDMMCDEVNAME(sc)
83 
84 static int sdmmc_match(device_t, cfdata_t, void *);
85 static void sdmmc_attach(device_t, device_t, void *);
86 static int sdmmc_detach(device_t, int);
87 
88 CFATTACH_DECL_NEW(sdmmc, sizeof(struct sdmmc_softc),
89     sdmmc_match, sdmmc_attach, sdmmc_detach, NULL);
90 
91 static void sdmmc_doattach(device_t);
92 static void sdmmc_task_thread(void *);
93 static void sdmmc_discover_task(void *);
94 static void sdmmc_polling_card(void *);
95 static void sdmmc_card_attach(struct sdmmc_softc *);
96 static void sdmmc_card_detach(struct sdmmc_softc *, int);
97 static int sdmmc_print(void *, const char *);
98 static int sdmmc_enable(struct sdmmc_softc *);
99 static void sdmmc_disable(struct sdmmc_softc *);
100 static int sdmmc_scan(struct sdmmc_softc *);
101 static int sdmmc_init(struct sdmmc_softc *);
102 
103 static int
104 sdmmc_match(device_t parent, cfdata_t cf, void *aux)
105 {
106 	struct sdmmcbus_attach_args *saa = (struct sdmmcbus_attach_args *)aux;
107 
108 	if (strcmp(saa->saa_busname, cf->cf_name) == 0)
109 		return 1;
110 	return 0;
111 }
112 
113 static void
114 sdmmc_attach(device_t parent, device_t self, void *aux)
115 {
116 	struct sdmmc_softc *sc = device_private(self);
117 	struct sdmmcbus_attach_args *saa = (struct sdmmcbus_attach_args *)aux;
118 	int error;
119 
120 	aprint_normal("\n");
121 	aprint_naive("\n");
122 
123 	sc->sc_dev = self;
124 	sc->sc_sct = saa->saa_sct;
125 	sc->sc_spi_sct = saa->saa_spi_sct;
126 	sc->sc_sch = saa->saa_sch;
127 	sc->sc_dmat = saa->saa_dmat;
128 	sc->sc_clkmin = saa->saa_clkmin;
129 	sc->sc_clkmax = saa->saa_clkmax;
130 	sc->sc_busclk = sc->sc_clkmax;
131 	sc->sc_buswidth = 1;
132 	sc->sc_caps = saa->saa_caps;
133 
134 	if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) {
135 		error = bus_dmamap_create(sc->sc_dmat, MAXPHYS, SDMMC_MAXNSEGS,
136 		    MAXPHYS, 0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmap);
137 		if (error) {
138 			aprint_error_dev(sc->sc_dev,
139 			    "couldn't create dma map. (error=%d)\n", error);
140 			return;
141 		}
142 	}
143 
144 	if (ISSET(sc->sc_caps, SMC_CAPS_POLL_CARD_DET)) {
145 		callout_init(&sc->sc_card_detect_ch, 0);
146 		callout_reset(&sc->sc_card_detect_ch, hz,
147 		    sdmmc_polling_card, sc);
148 	}
149 
150 	SIMPLEQ_INIT(&sc->sf_head);
151 	TAILQ_INIT(&sc->sc_tskq);
152 	TAILQ_INIT(&sc->sc_intrq);
153 
154 	sdmmc_init_task(&sc->sc_discover_task, sdmmc_discover_task, sc);
155 	sdmmc_init_task(&sc->sc_intr_task, sdmmc_intr_task, sc);
156 
157 	mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_SDMMC);
158 	mutex_init(&sc->sc_tskq_mtx, MUTEX_DEFAULT, IPL_SDMMC);
159 	mutex_init(&sc->sc_discover_task_mtx, MUTEX_DEFAULT, IPL_SDMMC);
160 	mutex_init(&sc->sc_intr_task_mtx, MUTEX_DEFAULT, IPL_SDMMC);
161 	cv_init(&sc->sc_tskq_cv, "mmctaskq");
162 
163 	if (!pmf_device_register(self, NULL, NULL)) {
164 		aprint_error_dev(self, "couldn't establish power handler\n");
165 	}
166 
167 	SET(sc->sc_flags, SMF_INITED);
168 
169 	/*
170 	 * Create the event thread that will attach and detach cards
171 	 * and perform other lengthy operations.
172 	 */
173 	config_pending_incr();
174 	config_interrupts(self, sdmmc_doattach);
175 }
176 
177 static int
178 sdmmc_detach(device_t self, int flags)
179 {
180 	struct sdmmc_softc *sc = device_private(self);
181 	int error;
182 
183 	mutex_enter(&sc->sc_tskq_mtx);
184 	sc->sc_dying = 1;
185 	cv_signal(&sc->sc_tskq_cv);
186 	while (sc->sc_tskq_lwp != NULL)
187 		cv_wait(&sc->sc_tskq_cv, &sc->sc_tskq_mtx);
188 	mutex_exit(&sc->sc_tskq_mtx);
189 
190 	pmf_device_deregister(self);
191 
192 	error = config_detach_children(self, flags);
193 	if (error)
194 		return error;
195 
196 	if (ISSET(sc->sc_caps, SMC_CAPS_DMA)) {
197 		bus_dmamap_unload(sc->sc_dmat, sc->sc_dmap);
198 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_dmap);
199 	}
200 
201 	return 0;
202 }
203 
204 static void
205 sdmmc_doattach(device_t dev)
206 {
207 	struct sdmmc_softc *sc = device_private(dev);
208 
209 	if (kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL,
210 	    sdmmc_task_thread, sc, &sc->sc_tskq_lwp, "%s", device_xname(dev))) {
211 		aprint_error_dev(dev, "couldn't create task thread\n");
212 	}
213 }
214 
215 void
216 sdmmc_add_task(struct sdmmc_softc *sc, struct sdmmc_task *task)
217 {
218 
219 	mutex_enter(&sc->sc_tskq_mtx);
220 	task->onqueue = 1;
221 	task->sc = sc;
222 	TAILQ_INSERT_TAIL(&sc->sc_tskq, task, next);
223 	cv_broadcast(&sc->sc_tskq_cv);
224 	mutex_exit(&sc->sc_tskq_mtx);
225 }
226 
227 static inline void
228 sdmmc_del_task1(struct sdmmc_softc *sc, struct sdmmc_task *task)
229 {
230 
231 	TAILQ_REMOVE(&sc->sc_tskq, task, next);
232 	task->sc = NULL;
233 	task->onqueue = 0;
234 }
235 
236 void
237 sdmmc_del_task(struct sdmmc_task *task)
238 {
239 	struct sdmmc_softc *sc = (struct sdmmc_softc *)task->sc;
240 
241 	if (sc != NULL) {
242 		mutex_enter(&sc->sc_tskq_mtx);
243 		sdmmc_del_task1(sc, task);
244 		mutex_exit(&sc->sc_tskq_mtx);
245 	}
246 }
247 
248 static void
249 sdmmc_task_thread(void *arg)
250 {
251 	struct sdmmc_softc *sc = (struct sdmmc_softc *)arg;
252 	struct sdmmc_task *task;
253 
254 	sdmmc_discover_task(sc);
255 	config_pending_decr();
256 
257 	mutex_enter(&sc->sc_tskq_mtx);
258 	for (;;) {
259 		task = TAILQ_FIRST(&sc->sc_tskq);
260 		if (task != NULL) {
261 			sdmmc_del_task1(sc, task);
262 			mutex_exit(&sc->sc_tskq_mtx);
263 			(*task->func)(task->arg);
264 			mutex_enter(&sc->sc_tskq_mtx);
265 		} else {
266 			/* Check for the exit condition. */
267 			if (sc->sc_dying)
268 				break;
269 			cv_wait(&sc->sc_tskq_cv, &sc->sc_tskq_mtx);
270 		}
271 	}
272 	/* time to die. */
273 	sc->sc_dying = 0;
274 	if (ISSET(sc->sc_flags, SMF_CARD_PRESENT))
275 		sdmmc_card_detach(sc, DETACH_FORCE);
276 	sc->sc_tskq_lwp = NULL;
277 	cv_broadcast(&sc->sc_tskq_cv);
278 	mutex_exit(&sc->sc_tskq_mtx);
279 	kthread_exit(0);
280 }
281 
282 void
283 sdmmc_needs_discover(device_t dev)
284 {
285 	struct sdmmc_softc *sc = device_private(dev);
286 
287 	if (!ISSET(sc->sc_flags, SMF_INITED))
288 		return;
289 
290 	mutex_enter(&sc->sc_discover_task_mtx);
291 	if (!sdmmc_task_pending(&sc->sc_discover_task))
292 		sdmmc_add_task(sc, &sc->sc_discover_task);
293 	mutex_exit(&sc->sc_discover_task_mtx);
294 }
295 
296 static void
297 sdmmc_discover_task(void *arg)
298 {
299 	struct sdmmc_softc *sc = (struct sdmmc_softc *)arg;
300 
301 	if (sdmmc_chip_card_detect(sc->sc_sct, sc->sc_sch)) {
302 		if (!ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
303 			SET(sc->sc_flags, SMF_CARD_PRESENT);
304 			sdmmc_card_attach(sc);
305 			if (!ISSET(sc->sc_flags, SMF_CARD_ATTACHED))
306 				CLR(sc->sc_flags, SMF_CARD_PRESENT);
307 		}
308 	} else {
309 		if (ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
310 			CLR(sc->sc_flags, SMF_CARD_PRESENT);
311 			sdmmc_card_detach(sc, DETACH_FORCE);
312 		}
313 	}
314 }
315 
316 static void
317 sdmmc_polling_card(void *arg)
318 {
319 	struct sdmmc_softc *sc = (struct sdmmc_softc *)arg;
320 	int card_detect;
321 	int s;
322 
323 	s = splsdmmc();
324 	card_detect = sdmmc_chip_card_detect(sc->sc_sct, sc->sc_sch);
325 	if (card_detect) {
326 		if (!ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
327 			sdmmc_needs_discover(sc->sc_dev);
328 		}
329 	} else {
330 		if (ISSET(sc->sc_flags, SMF_CARD_PRESENT)) {
331 			sdmmc_needs_discover(sc->sc_dev);
332 		}
333 	}
334 	splx(s);
335 
336 	callout_schedule(&sc->sc_card_detect_ch, hz);
337 }
338 
339 /*
340  * Called from process context when a card is present.
341  */
342 static void
343 sdmmc_card_attach(struct sdmmc_softc *sc)
344 {
345 	struct sdmmc_function *sf;
346 	struct sdmmc_attach_args saa;
347 	int error;
348 
349 	DPRINTF(1,("%s: attach card\n", DEVNAME(sc)));
350 
351 	CLR(sc->sc_flags, SMF_CARD_ATTACHED);
352 
353 	/*
354 	 * Power up the card (or card stack).
355 	 */
356 	error = sdmmc_enable(sc);
357 	if (error) {
358 		if (!ISSET(sc->sc_caps, SMC_CAPS_POLL_CARD_DET)) {
359 			aprint_error_dev(sc->sc_dev, "couldn't enable card: %d\n", error);
360 		}
361 		goto err;
362 	}
363 
364 	/*
365 	 * Scan for I/O functions and memory cards on the bus,
366 	 * allocating a sdmmc_function structure for each.
367 	 */
368 	error = sdmmc_scan(sc);
369 	if (error) {
370 		aprint_error_dev(sc->sc_dev, "no functions\n");
371 		goto err;
372 	}
373 
374 	/*
375 	 * Initialize the I/O functions and memory cards.
376 	 */
377 	error = sdmmc_init(sc);
378 	if (error) {
379 		aprint_error_dev(sc->sc_dev, "init failed\n");
380 		goto err;
381 	}
382 
383 	SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
384 		if (ISSET(sc->sc_flags, SMF_IO_MODE) && sf->number < 1)
385 			continue;
386 
387 		memset(&saa, 0, sizeof saa);
388 		saa.manufacturer = sf->cis.manufacturer;
389 		saa.product = sf->cis.product;
390 		saa.interface = sf->interface;
391 		saa.sf = sf;
392 
393 		sf->child =
394 		    config_found_ia(sc->sc_dev, "sdmmc", &saa, sdmmc_print);
395 	}
396 
397 	SET(sc->sc_flags, SMF_CARD_ATTACHED);
398 	return;
399 
400 err:
401 	sdmmc_card_detach(sc, DETACH_FORCE);
402 }
403 
404 /*
405  * Called from process context with DETACH_* flags from <sys/device.h>
406  * when cards are gone.
407  */
408 static void
409 sdmmc_card_detach(struct sdmmc_softc *sc, int flags)
410 {
411 	struct sdmmc_function *sf, *sfnext;
412 
413 	DPRINTF(1,("%s: detach card\n", DEVNAME(sc)));
414 
415 	if (ISSET(sc->sc_flags, SMF_CARD_ATTACHED)) {
416 		SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
417 			if (sf->child != NULL) {
418 				config_detach(sf->child, DETACH_FORCE);
419 				sf->child = NULL;
420 			}
421 		}
422 
423 		KASSERT(TAILQ_EMPTY(&sc->sc_intrq));
424 
425 		CLR(sc->sc_flags, SMF_CARD_ATTACHED);
426 	}
427 
428 	/* Power down. */
429 	sdmmc_disable(sc);
430 
431 	/* Free all sdmmc_function structures. */
432 	for (sf = SIMPLEQ_FIRST(&sc->sf_head); sf != NULL; sf = sfnext) {
433 		sfnext = SIMPLEQ_NEXT(sf, sf_list);
434 		sdmmc_function_free(sf);
435 	}
436 	SIMPLEQ_INIT(&sc->sf_head);
437 	sc->sc_function_count = 0;
438 	sc->sc_fn0 = NULL;
439 }
440 
441 static int
442 sdmmc_print(void *aux, const char *pnp)
443 {
444 	struct sdmmc_attach_args *sa = aux;
445 	struct sdmmc_function *sf = sa->sf;
446 	struct sdmmc_cis *cis = &sf->sc->sc_fn0->cis;
447 	int i, x;
448 
449 	if (pnp) {
450 		if (sf->number == 0)
451 			return QUIET;
452 
453 		for (i = 0; i < 4 && cis->cis1_info[i]; i++)
454 			printf("%s%s", i ? ", " : "\"", cis->cis1_info[i]);
455 		if (i != 0)
456 			printf("\"");
457 
458 		if ((cis->manufacturer != SDMMC_VENDOR_INVALID &&
459 		    cis->product != SDMMC_PRODUCT_INVALID) ||
460 		    sa->interface != SD_IO_SFIC_NO_STANDARD) {
461 			x = !!(cis->manufacturer != SDMMC_VENDOR_INVALID);
462 			x += !!(cis->product != SDMMC_PRODUCT_INVALID);
463 			x += !!(sa->interface != SD_IO_SFIC_NO_STANDARD);
464 			printf("%s(", i ? " " : "");
465 			if (cis->manufacturer != SDMMC_VENDOR_INVALID)
466 				printf("manufacturer 0x%x%s",
467 				    cis->manufacturer, (--x == 0) ?  "" : ", ");
468 			if (cis->product != SDMMC_PRODUCT_INVALID)
469 				printf("product 0x%x%s",
470 				    cis->product, (--x == 0) ?  "" : ", ");
471 			if (sa->interface != SD_IO_SFIC_NO_STANDARD)
472 				printf("standard function interface code 0x%x",
473 				    sf->interface);
474 			printf(")");
475 		}
476 		printf("%sat %s", i ? " " : "", pnp);
477 	}
478 	if (sf->number > 0)
479 		printf(" function %d", sf->number);
480 
481 	if (!pnp) {
482 		for (i = 0; i < 3 && cis->cis1_info[i]; i++)
483 			printf("%s%s", i ? ", " : " \"", cis->cis1_info[i]);
484 		if (i != 0)
485 			printf("\"");
486 	}
487 	return UNCONF;
488 }
489 
490 static int
491 sdmmc_enable(struct sdmmc_softc *sc)
492 {
493 	int error;
494 
495 	/*
496 	 * Calculate the equivalent of the card OCR from the host
497 	 * capabilities and select the maximum supported bus voltage.
498 	 */
499 	error = sdmmc_chip_bus_power(sc->sc_sct, sc->sc_sch,
500 	    sdmmc_chip_host_ocr(sc->sc_sct, sc->sc_sch));
501 	if (error) {
502 		aprint_error_dev(sc->sc_dev, "couldn't supply bus power\n");
503 		goto out;
504 	}
505 
506 	/*
507 	 * Select the minimum clock frequency.
508 	 */
509 	error = sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, SDMMC_SDCLK_400K);
510 	if (error) {
511 		aprint_error_dev(sc->sc_dev, "couldn't supply clock\n");
512 		goto out;
513 	}
514 
515 	/* XXX wait for card to power up */
516 	sdmmc_delay(100000);
517 
518 	if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
519 		/* Initialize SD I/O card function(s). */
520 		error = sdmmc_io_enable(sc);
521 		if (error)
522 			goto out;
523 	}
524 
525 	/* Initialize SD/MMC memory card(s). */
526 	if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) ||
527 	    ISSET(sc->sc_flags, SMF_MEM_MODE))
528 		error = sdmmc_mem_enable(sc);
529 
530 out:
531 	if (error)
532 		sdmmc_disable(sc);
533 	return error;
534 }
535 
536 static void
537 sdmmc_disable(struct sdmmc_softc *sc)
538 {
539 	/* XXX complete commands if card is still present. */
540 
541 	if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
542 		/* Make sure no card is still selected. */
543 		(void)sdmmc_select_card(sc, NULL);
544 	}
545 
546 	/* Turn off bus power and clock. */
547 	(void)sdmmc_chip_bus_width(sc->sc_sct, sc->sc_sch, 1);
548 	(void)sdmmc_chip_bus_clock(sc->sc_sct, sc->sc_sch, SDMMC_SDCLK_OFF);
549 	(void)sdmmc_chip_bus_power(sc->sc_sct, sc->sc_sch, 0);
550 	sc->sc_busclk = sc->sc_clkmax;
551 }
552 
553 /*
554  * Set the lowest bus voltage supported by the card and the host.
555  */
556 int
557 sdmmc_set_bus_power(struct sdmmc_softc *sc, uint32_t host_ocr,
558     uint32_t card_ocr)
559 {
560 	uint32_t bit;
561 
562 	/* Mask off unsupported voltage levels and select the lowest. */
563 	DPRINTF(1,("%s: host_ocr=%x ", DEVNAME(sc), host_ocr));
564 	host_ocr &= card_ocr;
565 	for (bit = 4; bit < 23; bit++) {
566 		if (ISSET(host_ocr, (1 << bit))) {
567 			host_ocr &= (3 << bit);
568 			break;
569 		}
570 	}
571 	DPRINTF(1,("card_ocr=%x new_ocr=%x\n", card_ocr, host_ocr));
572 
573 	if (host_ocr == 0 ||
574 	    sdmmc_chip_bus_power(sc->sc_sct, sc->sc_sch, host_ocr) != 0)
575 		return 1;
576 	return 0;
577 }
578 
579 struct sdmmc_function *
580 sdmmc_function_alloc(struct sdmmc_softc *sc)
581 {
582 	struct sdmmc_function *sf;
583 
584 	sf = malloc(sizeof *sf, M_DEVBUF, M_WAITOK|M_ZERO);
585 	if (sf == NULL) {
586 		aprint_error_dev(sc->sc_dev,
587 		    "couldn't alloc memory (sdmmc function)\n");
588 		return NULL;
589 	}
590 
591 	sf->sc = sc;
592 	sf->number = -1;
593 	sf->cis.manufacturer = SDMMC_VENDOR_INVALID;
594 	sf->cis.product = SDMMC_PRODUCT_INVALID;
595 	sf->cis.function = SDMMC_FUNCTION_INVALID;
596 	sf->width = 1;
597 
598 	if (ISSET(sc->sc_flags, SMF_MEM_MODE) &&
599 	    ISSET(sc->sc_caps, SMC_CAPS_DMA) &&
600 	    !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) {
601 		bus_dma_segment_t ds;
602 		int rseg, error;
603 
604 		error = bus_dmamap_create(sc->sc_dmat, SDMMC_SECTOR_SIZE, 1,
605 		    SDMMC_SECTOR_SIZE, 0, BUS_DMA_WAITOK, &sf->bbuf_dmap);
606 		if (error)
607 			goto fail1;
608 		error = bus_dmamem_alloc(sc->sc_dmat, SDMMC_SECTOR_SIZE,
609 		    PAGE_SIZE, 0, &ds, 1, &rseg, BUS_DMA_WAITOK);
610 		if (error)
611 			goto fail2;
612 		error = bus_dmamem_map(sc->sc_dmat, &ds, 1, SDMMC_SECTOR_SIZE,
613 		    &sf->bbuf, BUS_DMA_WAITOK);
614 		if (error)
615 			goto fail3;
616 		error = bus_dmamap_load(sc->sc_dmat, sf->bbuf_dmap,
617 		    sf->bbuf, SDMMC_SECTOR_SIZE, NULL,
618 		    BUS_DMA_WAITOK|BUS_DMA_READ|BUS_DMA_WRITE);
619 		if (!error)
620 			goto out;
621 
622 		bus_dmamem_unmap(sc->sc_dmat, sf->bbuf, SDMMC_SECTOR_SIZE);
623 fail3:
624 		bus_dmamem_free(sc->sc_dmat, &ds, 1);
625 fail2:
626 		bus_dmamap_destroy(sc->sc_dmat, sf->bbuf_dmap);
627 fail1:
628 		free(sf, M_DEVBUF);
629 		sf = NULL;
630 	}
631 out:
632 
633 	return sf;
634 }
635 
636 void
637 sdmmc_function_free(struct sdmmc_function *sf)
638 {
639 	struct sdmmc_softc *sc = sf->sc;
640 
641 	if (ISSET(sc->sc_flags, SMF_MEM_MODE) &&
642 	    ISSET(sc->sc_caps, SMC_CAPS_DMA) &&
643 	    !ISSET(sc->sc_caps, SMC_CAPS_MULTI_SEG_DMA)) {
644 		bus_dmamap_unload(sc->sc_dmat, sf->bbuf_dmap);
645 		bus_dmamem_unmap(sc->sc_dmat, sf->bbuf, SDMMC_SECTOR_SIZE);
646 		bus_dmamem_free(sc->sc_dmat,
647 		    sf->bbuf_dmap->dm_segs, sf->bbuf_dmap->dm_nsegs);
648 		bus_dmamap_destroy(sc->sc_dmat, sf->bbuf_dmap);
649 	}
650 
651 	free(sf, M_DEVBUF);
652 }
653 
654 /*
655  * Scan for I/O functions and memory cards on the bus, allocating a
656  * sdmmc_function structure for each.
657  */
658 static int
659 sdmmc_scan(struct sdmmc_softc *sc)
660 {
661 
662 	if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
663 		/* Scan for I/O functions. */
664 		if (ISSET(sc->sc_flags, SMF_IO_MODE))
665 			sdmmc_io_scan(sc);
666 	}
667 
668 	/* Scan for memory cards on the bus. */
669 	if (ISSET(sc->sc_flags, SMF_MEM_MODE))
670 		sdmmc_mem_scan(sc);
671 
672 	/* There should be at least one function now. */
673 	if (SIMPLEQ_EMPTY(&sc->sf_head)) {
674 		aprint_error_dev(sc->sc_dev, "couldn't identify card\n");
675 		return 1;
676 	}
677 	return 0;
678 }
679 
680 /*
681  * Initialize all the distinguished functions of the card, be it I/O
682  * or memory functions.
683  */
684 static int
685 sdmmc_init(struct sdmmc_softc *sc)
686 {
687 	struct sdmmc_function *sf;
688 
689 	/* Initialize all identified card functions. */
690 	SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
691 		if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
692 			if (ISSET(sc->sc_flags, SMF_IO_MODE) &&
693 			    sdmmc_io_init(sc, sf) != 0) {
694 				aprint_error_dev(sc->sc_dev,
695 				    "i/o init failed\n");
696 			}
697 		}
698 
699 		if (ISSET(sc->sc_flags, SMF_MEM_MODE) &&
700 		    sdmmc_mem_init(sc, sf) != 0) {
701 			aprint_error_dev(sc->sc_dev, "mem init failed\n");
702 		}
703 	}
704 
705 	/* Any good functions left after initialization? */
706 	SIMPLEQ_FOREACH(sf, &sc->sf_head, sf_list) {
707 		if (!ISSET(sf->flags, SFF_ERROR))
708 			return 0;
709 	}
710 
711 	/* No, we should probably power down the card. */
712 	return 1;
713 }
714 
715 void
716 sdmmc_delay(u_int usecs)
717 {
718 
719 	delay(usecs);
720 }
721 
722 int
723 sdmmc_app_command(struct sdmmc_softc *sc, struct sdmmc_function *sf, struct sdmmc_command *cmd)
724 {
725 	struct sdmmc_command acmd;
726 	int error;
727 
728 	DPRINTF(1,("sdmmc_app_command: start\n"));
729 
730 	/* Don't lock */
731 
732 	memset(&acmd, 0, sizeof(acmd));
733 	acmd.c_opcode = MMC_APP_CMD;
734 	if (sf != NULL) {
735 		acmd.c_arg = sf->rca << 16;
736 		acmd.c_flags = SCF_CMD_AC | SCF_RSP_R1 | SCF_RSP_SPI_R1;
737 	} else {
738 		acmd.c_arg = 0;
739 		acmd.c_flags = SCF_CMD_BCR | SCF_RSP_R1 | SCF_RSP_SPI_R1;
740 	}
741 
742 	error = sdmmc_mmc_command(sc, &acmd);
743 	if (error == 0) {
744 		if (!ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE) &&
745 		    !ISSET(MMC_R1(acmd.c_resp), MMC_R1_APP_CMD)) {
746 			/* Card does not support application commands. */
747 			error = ENODEV;
748 		} else {
749 			error = sdmmc_mmc_command(sc, cmd);
750 		}
751 	}
752 	DPRINTF(1,("sdmmc_app_command: done (error=%d)\n", error));
753 	return error;
754 }
755 
756 /*
757  * Execute MMC command and data transfers.  All interactions with the
758  * host controller to complete the command happen in the context of
759  * the current process.
760  */
761 int
762 sdmmc_mmc_command(struct sdmmc_softc *sc, struct sdmmc_command *cmd)
763 {
764 	int error;
765 
766 	DPRINTF(1,("sdmmc_mmc_command: cmd=%d, arg=%#x, flags=%#x\n",
767 	    cmd->c_opcode, cmd->c_arg, cmd->c_flags));
768 
769 	/* Don't lock */
770 
771 #if defined(DIAGNOSTIC) || defined(SDMMC_DEBUG)
772 	if (cmd->c_data && !ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE)) {
773 		if (sc->sc_card == NULL)
774 			panic("%s: deselected card\n", DEVNAME(sc));
775 	}
776 #endif
777 
778 	sdmmc_chip_exec_command(sc->sc_sct, sc->sc_sch, cmd);
779 
780 #ifdef SDMMC_DEBUG
781 	sdmmc_dump_command(sc, cmd);
782 #endif
783 
784 	error = cmd->c_error;
785 
786 	DPRINTF(1,("sdmmc_mmc_command: error=%d\n", error));
787 
788 	return error;
789 }
790 
791 /*
792  * Send the "GO IDLE STATE" command.
793  */
794 void
795 sdmmc_go_idle_state(struct sdmmc_softc *sc)
796 {
797 	struct sdmmc_command cmd;
798 
799 	DPRINTF(1,("sdmmc_go_idle_state\n"));
800 
801 	/* Don't lock */
802 
803 	memset(&cmd, 0, sizeof(cmd));
804 	cmd.c_opcode = MMC_GO_IDLE_STATE;
805 	cmd.c_flags = SCF_CMD_BC | SCF_RSP_R0 | SCF_RSP_SPI_R1;
806 
807 	(void)sdmmc_mmc_command(sc, &cmd);
808 }
809 
810 /*
811  * Retrieve (SD) or set (MMC) the relative card address (RCA).
812  */
813 int
814 sdmmc_set_relative_addr(struct sdmmc_softc *sc, struct sdmmc_function *sf)
815 {
816 	struct sdmmc_command cmd;
817 	int error;
818 
819 	/* Don't lock */
820 
821 	if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE))
822 		return EIO;
823 
824 	memset(&cmd, 0, sizeof(cmd));
825 	if (ISSET(sc->sc_flags, SMF_SD_MODE)) {
826 		cmd.c_opcode = SD_SEND_RELATIVE_ADDR;
827 		cmd.c_flags = SCF_CMD_BCR | SCF_RSP_R6;
828 	} else {
829 		cmd.c_opcode = MMC_SET_RELATIVE_ADDR;
830 		cmd.c_arg = MMC_ARG_RCA(sf->rca);
831 		cmd.c_flags = SCF_CMD_AC | SCF_RSP_R1;
832 	}
833 	error = sdmmc_mmc_command(sc, &cmd);
834 	if (error)
835 		return error;
836 
837 	if (ISSET(sc->sc_flags, SMF_SD_MODE))
838 		sf->rca = SD_R6_RCA(cmd.c_resp);
839 
840 	return 0;
841 }
842 
843 int
844 sdmmc_select_card(struct sdmmc_softc *sc, struct sdmmc_function *sf)
845 {
846 	struct sdmmc_command cmd;
847 	int error;
848 
849 	/* Don't lock */
850 
851 	if (ISSET(sc->sc_caps, SMC_CAPS_SPI_MODE))
852 		return EIO;
853 
854 	if (sc->sc_card == sf
855 	 || (sf && sc->sc_card && sc->sc_card->rca == sf->rca)) {
856 		sc->sc_card = sf;
857 		return 0;
858 	}
859 
860 	memset(&cmd, 0, sizeof(cmd));
861 	cmd.c_opcode = MMC_SELECT_CARD;
862 	cmd.c_arg = (sf == NULL) ? 0 : MMC_ARG_RCA(sf->rca);
863 	cmd.c_flags = SCF_CMD_AC | ((sf == NULL) ? SCF_RSP_R0 : SCF_RSP_R1);
864 	error = sdmmc_mmc_command(sc, &cmd);
865 	if (error == 0 || sf == NULL)
866 		sc->sc_card = sf;
867 
868 	return error;
869 }
870 
871 #ifdef SDMMC_DEBUG
872 static void
873 sdmmc_dump_command(struct sdmmc_softc *sc, struct sdmmc_command *cmd)
874 {
875 	int i;
876 
877 	DPRINTF(1,("%s: cmd %u arg=%#x data=%p dlen=%d flags=%#x (error %d)\n",
878 	    DEVNAME(sc), cmd->c_opcode, cmd->c_arg, cmd->c_data,
879 	    cmd->c_datalen, cmd->c_flags, cmd->c_error));
880 
881 	if (cmd->c_error || sdmmcdebug < 1)
882 		return;
883 
884 	aprint_normal_dev(sc->sc_dev, "resp=");
885 	if (ISSET(cmd->c_flags, SCF_RSP_136))
886 		for (i = 0; i < sizeof cmd->c_resp; i++)
887 			aprint_normal("%02x ", ((uint8_t *)cmd->c_resp)[i]);
888 	else if (ISSET(cmd->c_flags, SCF_RSP_PRESENT))
889 		for (i = 0; i < 4; i++)
890 			aprint_normal("%02x ", ((uint8_t *)cmd->c_resp)[i]);
891 	else
892 		aprint_normal("none");
893 	aprint_normal("\n");
894 }
895 
896 void
897 sdmmc_dump_data(const char *title, void *ptr, size_t size)
898 {
899 	char buf[16];
900 	uint8_t *p = ptr;
901 	int i, j;
902 
903 	printf("sdmmc_dump_data: %s\n", title ? title : "");
904 	printf("--------+--------------------------------------------------+------------------+\n");
905 	printf("offset  | +0 +1 +2 +3 +4 +5 +6 +7  +8 +9 +a +b +c +d +e +f | data             |\n");
906 	printf("--------+--------------------------------------------------+------------------+\n");
907 	for (i = 0; i < (int)size; i++) {
908 		if ((i % 16) == 0) {
909 			printf("%08x| ", i);
910 		} else if ((i % 16) == 8) {
911 			printf(" ");
912 		}
913 
914 		printf("%02x ", p[i]);
915 		buf[i % 16] = p[i];
916 
917 		if ((i % 16) == 15) {
918 			printf("| ");
919 			for (j = 0; j < 16; j++) {
920 				if (buf[j] >= 0x20 && buf[j] <= 0x7e) {
921 					printf("%c", buf[j]);
922 				} else {
923 					printf(".");
924 				}
925 			}
926 			printf(" |\n");
927 		}
928 	}
929 	if ((i % 16) != 0) {
930 		j = (i % 16);
931 		for (; j < 16; j++) {
932 			printf("   ");
933 			if ((j % 16) == 8) {
934 				printf(" ");
935 			}
936 		}
937 
938 		printf("| ");
939 		for (j = 0; j < (i % 16); j++) {
940 			if (buf[j] >= 0x20 && buf[j] <= 0x7e) {
941 				printf("%c", buf[j]);
942 			} else {
943 				printf(".");
944 			}
945 		}
946 		for (; j < 16; j++) {
947 			printf(" ");
948 		}
949 		printf(" |\n");
950 	}
951 	printf("--------+--------------------------------------------------+------------------+\n");
952 }
953 #endif
954