xref: /freebsd/sys/arm/allwinner/aw_mmc.c (revision 77013d11e6483b970af25e13c9b892075742f7e5)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2018 Emmanuel Vadot <manu@FreeBSD.org>
5  * Copyright (c) 2013 Alexander Fedorov
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  */
29 
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
32 
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/bus.h>
36 #include <sys/kernel.h>
37 #include <sys/lock.h>
38 #include <sys/malloc.h>
39 #include <sys/module.h>
40 #include <sys/mutex.h>
41 #include <sys/resource.h>
42 #include <sys/rman.h>
43 #include <sys/sysctl.h>
44 #include <sys/queue.h>
45 #include <sys/taskqueue.h>
46 
47 #include <machine/bus.h>
48 
49 #include <dev/ofw/ofw_bus.h>
50 #include <dev/ofw/ofw_bus_subr.h>
51 
52 #include <dev/mmc/bridge.h>
53 #include <dev/mmc/mmcbrvar.h>
54 #include <dev/mmc/mmc_fdt_helpers.h>
55 
56 #include <arm/allwinner/aw_mmc.h>
57 #include <dev/extres/clk/clk.h>
58 #include <dev/extres/hwreset/hwreset.h>
59 #include <dev/extres/regulator/regulator.h>
60 
61 #include "opt_mmccam.h"
62 
63 #ifdef MMCCAM
64 #include <cam/cam.h>
65 #include <cam/cam_ccb.h>
66 #include <cam/cam_debug.h>
67 #include <cam/cam_sim.h>
68 #include <cam/cam_xpt_sim.h>
69 #include <cam/mmc/mmc_sim.h>
70 
71 #include "mmc_sim_if.h"
72 #endif
73 
74 #include "mmc_pwrseq_if.h"
75 
76 #define	AW_MMC_MEMRES		0
77 #define	AW_MMC_IRQRES		1
78 #define	AW_MMC_RESSZ		2
79 #define	AW_MMC_DMA_SEGS		(PAGE_SIZE / sizeof(struct aw_mmc_dma_desc))
80 #define	AW_MMC_DMA_DESC_SIZE	(sizeof(struct aw_mmc_dma_desc) * AW_MMC_DMA_SEGS)
81 #define	AW_MMC_DMA_FTRGLEVEL	0x20070008
82 
83 #define	AW_MMC_RESET_RETRY	1000
84 
85 #define	CARD_ID_FREQUENCY	400000
86 
87 struct aw_mmc_conf {
88 	uint32_t	dma_xferlen;
89 	bool		mask_data0;
90 	bool		can_calibrate;
91 	bool		new_timing;
92 };
93 
94 static const struct aw_mmc_conf a10_mmc_conf = {
95 	.dma_xferlen = 0x2000,
96 };
97 
98 static const struct aw_mmc_conf a13_mmc_conf = {
99 	.dma_xferlen = 0x10000,
100 };
101 
102 static const struct aw_mmc_conf a64_mmc_conf = {
103 	.dma_xferlen = 0x10000,
104 	.mask_data0 = true,
105 	.can_calibrate = true,
106 	.new_timing = true,
107 };
108 
109 static const struct aw_mmc_conf a64_emmc_conf = {
110 	.dma_xferlen = 0x2000,
111 	.can_calibrate = true,
112 };
113 
114 static struct ofw_compat_data compat_data[] = {
115 	{"allwinner,sun4i-a10-mmc", (uintptr_t)&a10_mmc_conf},
116 	{"allwinner,sun5i-a13-mmc", (uintptr_t)&a13_mmc_conf},
117 	{"allwinner,sun7i-a20-mmc", (uintptr_t)&a13_mmc_conf},
118 	{"allwinner,sun50i-a64-mmc", (uintptr_t)&a64_mmc_conf},
119 	{"allwinner,sun50i-a64-emmc", (uintptr_t)&a64_emmc_conf},
120 	{NULL,             0}
121 };
122 
123 struct aw_mmc_softc {
124 	device_t		aw_dev;
125 	clk_t			aw_clk_ahb;
126 	clk_t			aw_clk_mmc;
127 	hwreset_t		aw_rst_ahb;
128 	int			aw_bus_busy;
129 	int			aw_resid;
130 	int			aw_timeout;
131 	struct callout		aw_timeoutc;
132 	struct mmc_host		aw_host;
133 	struct mmc_fdt_helper	mmc_helper;
134 #ifdef MMCCAM
135 	union ccb *		ccb;
136 	struct mmc_sim		mmc_sim;
137 #else
138 	struct mmc_request *	aw_req;
139 #endif
140 	struct mtx		aw_mtx;
141 	struct resource *	aw_res[AW_MMC_RESSZ];
142 	struct aw_mmc_conf *	aw_mmc_conf;
143 	uint32_t		aw_intr;
144 	uint32_t		aw_intr_wait;
145 	void *			aw_intrhand;
146 	unsigned int		aw_clock;
147 	device_t		child;
148 
149 	/* Fields required for DMA access. */
150 	bus_addr_t	  	aw_dma_desc_phys;
151 	bus_dmamap_t		aw_dma_map;
152 	bus_dma_tag_t 		aw_dma_tag;
153 	void * 			aw_dma_desc;
154 	bus_dmamap_t		aw_dma_buf_map;
155 	bus_dma_tag_t		aw_dma_buf_tag;
156 	int			aw_dma_map_err;
157 };
158 
159 static struct resource_spec aw_mmc_res_spec[] = {
160 	{ SYS_RES_MEMORY,	0,	RF_ACTIVE },
161 	{ SYS_RES_IRQ,		0,	RF_ACTIVE | RF_SHAREABLE },
162 	{ -1,			0,	0 }
163 };
164 
165 static int aw_mmc_probe(device_t);
166 static int aw_mmc_attach(device_t);
167 static int aw_mmc_detach(device_t);
168 static int aw_mmc_setup_dma(struct aw_mmc_softc *);
169 static void aw_mmc_teardown_dma(struct aw_mmc_softc *sc);
170 static int aw_mmc_reset(struct aw_mmc_softc *);
171 static int aw_mmc_init(struct aw_mmc_softc *);
172 static void aw_mmc_intr(void *);
173 static int aw_mmc_update_clock(struct aw_mmc_softc *, uint32_t);
174 static void aw_mmc_helper_cd_handler(device_t, bool);
175 
176 static void aw_mmc_print_error(uint32_t);
177 static int aw_mmc_update_ios(device_t, device_t);
178 static int aw_mmc_request(device_t, device_t, struct mmc_request *);
179 
180 #ifndef MMCCAM
181 static int aw_mmc_get_ro(device_t, device_t);
182 static int aw_mmc_acquire_host(device_t, device_t);
183 static int aw_mmc_release_host(device_t, device_t);
184 #endif
185 
186 #define	AW_MMC_LOCK(_sc)	mtx_lock(&(_sc)->aw_mtx)
187 #define	AW_MMC_UNLOCK(_sc)	mtx_unlock(&(_sc)->aw_mtx)
188 #define	AW_MMC_READ_4(_sc, _reg)					\
189 	bus_read_4((_sc)->aw_res[AW_MMC_MEMRES], _reg)
190 #define	AW_MMC_WRITE_4(_sc, _reg, _value)				\
191 	bus_write_4((_sc)->aw_res[AW_MMC_MEMRES], _reg, _value)
192 
193 SYSCTL_NODE(_hw, OID_AUTO, aw_mmc, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
194     "aw_mmc driver");
195 
196 static int aw_mmc_debug = 0;
197 SYSCTL_INT(_hw_aw_mmc, OID_AUTO, debug, CTLFLAG_RWTUN, &aw_mmc_debug, 0,
198     "Debug level bit0=card changes bit1=ios changes, bit2=interrupts, bit3=commands");
199 #define	AW_MMC_DEBUG_CARD	0x1
200 #define	AW_MMC_DEBUG_IOS	0x2
201 #define	AW_MMC_DEBUG_INT	0x4
202 #define	AW_MMC_DEBUG_CMD	0x8
203 
204 #ifdef MMCCAM
205 static int
206 aw_mmc_get_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts)
207 {
208 	struct aw_mmc_softc *sc;
209 
210 	sc = device_get_softc(dev);
211 
212 	cts->host_ocr = sc->aw_host.host_ocr;
213 	cts->host_f_min = sc->aw_host.f_min;
214 	cts->host_f_max = sc->aw_host.f_max;
215 	cts->host_caps = sc->aw_host.caps;
216 	cts->host_max_data = (sc->aw_mmc_conf->dma_xferlen *
217 	    AW_MMC_DMA_SEGS) / MMC_SECTOR_SIZE;
218 	memcpy(&cts->ios, &sc->aw_host.ios, sizeof(struct mmc_ios));
219 
220 	return (0);
221 }
222 
223 static int
224 aw_mmc_set_tran_settings(device_t dev, struct ccb_trans_settings_mmc *cts)
225 {
226 	struct aw_mmc_softc *sc;
227 	struct mmc_ios *ios;
228 	struct mmc_ios *new_ios;
229 
230 	sc = device_get_softc(dev);
231 	ios = &sc->aw_host.ios;
232 	new_ios = &cts->ios;
233 
234 	/* Update only requested fields */
235 	if (cts->ios_valid & MMC_CLK) {
236 		ios->clock = new_ios->clock;
237 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
238 			device_printf(sc->aw_dev, "Clock => %d\n", ios->clock);
239 	}
240 	if (cts->ios_valid & MMC_VDD) {
241 		ios->vdd = new_ios->vdd;
242 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
243 			device_printf(sc->aw_dev, "VDD => %d\n", ios->vdd);
244 	}
245 	if (cts->ios_valid & MMC_CS) {
246 		ios->chip_select = new_ios->chip_select;
247 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
248 			device_printf(sc->aw_dev, "CS => %d\n", ios->chip_select);
249 	}
250 	if (cts->ios_valid & MMC_BW) {
251 		ios->bus_width = new_ios->bus_width;
252 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
253 			device_printf(sc->aw_dev, "Bus width => %d\n", ios->bus_width);
254 	}
255 	if (cts->ios_valid & MMC_PM) {
256 		ios->power_mode = new_ios->power_mode;
257 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
258 			device_printf(sc->aw_dev, "Power mode => %d\n", ios->power_mode);
259 	}
260 	if (cts->ios_valid & MMC_BT) {
261 		ios->timing = new_ios->timing;
262 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
263 			device_printf(sc->aw_dev, "Timing => %d\n", ios->timing);
264 	}
265 	if (cts->ios_valid & MMC_BM) {
266 		ios->bus_mode = new_ios->bus_mode;
267 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_IOS))
268 			device_printf(sc->aw_dev, "Bus mode => %d\n", ios->bus_mode);
269 	}
270 
271 	return (aw_mmc_update_ios(sc->aw_dev, NULL));
272 }
273 
274 static int
275 aw_mmc_cam_request(device_t dev, union ccb *ccb)
276 {
277 	struct aw_mmc_softc *sc;
278 	struct ccb_mmcio *mmcio;
279 
280 	sc = device_get_softc(dev);
281 	mmcio = &ccb->mmcio;
282 
283 	AW_MMC_LOCK(sc);
284 
285 	if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CMD)) {
286 		device_printf(sc->aw_dev, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n",
287 			    mmcio->cmd.opcode, mmcio->cmd.arg, mmcio->cmd.flags,
288 			    mmcio->cmd.data != NULL ? (unsigned int) mmcio->cmd.data->len : 0,
289 			    mmcio->cmd.data != NULL ? mmcio->cmd.data->flags: 0);
290 	}
291 	if (mmcio->cmd.data != NULL) {
292 		if (mmcio->cmd.data->len == 0 || mmcio->cmd.data->flags == 0)
293 			panic("data->len = %d, data->flags = %d -- something is b0rked",
294 			      (int)mmcio->cmd.data->len, mmcio->cmd.data->flags);
295 	}
296 	if (sc->ccb != NULL) {
297 		device_printf(sc->aw_dev, "Controller still has an active command\n");
298 		return (EBUSY);
299 	}
300 	sc->ccb = ccb;
301 	/* aw_mmc_request locks again */
302 	AW_MMC_UNLOCK(sc);
303 	aw_mmc_request(sc->aw_dev, NULL, NULL);
304 
305 	return (0);
306 }
307 #endif /* MMCCAM */
308 
309 static void
310 aw_mmc_helper_cd_handler(device_t dev, bool present)
311 {
312 	struct aw_mmc_softc *sc;
313 
314 	sc = device_get_softc(dev);
315 #ifdef MMCCAM
316 	mmc_cam_sim_discover(&sc->mmc_sim);
317 #else
318 	AW_MMC_LOCK(sc);
319 	if (present) {
320 		if (sc->child == NULL) {
321 			if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
322 				device_printf(sc->aw_dev, "Card inserted\n");
323 
324 			sc->child = device_add_child(sc->aw_dev, "mmc", -1);
325 			AW_MMC_UNLOCK(sc);
326 			if (sc->child) {
327 				device_set_ivars(sc->child, sc);
328 				(void)device_probe_and_attach(sc->child);
329 			}
330 		} else
331 			AW_MMC_UNLOCK(sc);
332 	} else {
333 		/* Card isn't present, detach if necessary */
334 		if (sc->child != NULL) {
335 			if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
336 				device_printf(sc->aw_dev, "Card removed\n");
337 
338 			AW_MMC_UNLOCK(sc);
339 			device_delete_child(sc->aw_dev, sc->child);
340 			sc->child = NULL;
341 		} else
342 			AW_MMC_UNLOCK(sc);
343 	}
344 #endif /* MMCCAM */
345 }
346 
347 static int
348 aw_mmc_probe(device_t dev)
349 {
350 
351 	if (!ofw_bus_status_okay(dev))
352 		return (ENXIO);
353 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
354 		return (ENXIO);
355 
356 	device_set_desc(dev, "Allwinner Integrated MMC/SD controller");
357 
358 	return (BUS_PROBE_DEFAULT);
359 }
360 
361 static int
362 aw_mmc_attach(device_t dev)
363 {
364 	struct aw_mmc_softc *sc;
365 	struct sysctl_ctx_list *ctx;
366 	struct sysctl_oid_list *tree;
367 	int error;
368 
369 	sc = device_get_softc(dev);
370 	sc->aw_dev = dev;
371 
372 	sc->aw_mmc_conf = (struct aw_mmc_conf *)ofw_bus_search_compatible(dev, compat_data)->ocd_data;
373 
374 #ifndef MMCCAM
375 	sc->aw_req = NULL;
376 #endif
377 	if (bus_alloc_resources(dev, aw_mmc_res_spec, sc->aw_res) != 0) {
378 		device_printf(dev, "cannot allocate device resources\n");
379 		return (ENXIO);
380 	}
381 	if (bus_setup_intr(dev, sc->aw_res[AW_MMC_IRQRES],
382 	    INTR_TYPE_NET | INTR_MPSAFE, NULL, aw_mmc_intr, sc,
383 	    &sc->aw_intrhand)) {
384 		bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res);
385 		device_printf(dev, "cannot setup interrupt handler\n");
386 		return (ENXIO);
387 	}
388 	mtx_init(&sc->aw_mtx, device_get_nameunit(sc->aw_dev), "aw_mmc",
389 	    MTX_DEF);
390 	callout_init_mtx(&sc->aw_timeoutc, &sc->aw_mtx, 0);
391 
392 	/* De-assert reset */
393 	if (hwreset_get_by_ofw_name(dev, 0, "ahb", &sc->aw_rst_ahb) == 0) {
394 		error = hwreset_deassert(sc->aw_rst_ahb);
395 		if (error != 0) {
396 			device_printf(dev, "cannot de-assert reset\n");
397 			goto fail;
398 		}
399 	}
400 
401 	/* Activate the module clock. */
402 	error = clk_get_by_ofw_name(dev, 0, "ahb", &sc->aw_clk_ahb);
403 	if (error != 0) {
404 		device_printf(dev, "cannot get ahb clock\n");
405 		goto fail;
406 	}
407 	error = clk_enable(sc->aw_clk_ahb);
408 	if (error != 0) {
409 		device_printf(dev, "cannot enable ahb clock\n");
410 		goto fail;
411 	}
412 	error = clk_get_by_ofw_name(dev, 0, "mmc", &sc->aw_clk_mmc);
413 	if (error != 0) {
414 		device_printf(dev, "cannot get mmc clock\n");
415 		goto fail;
416 	}
417 	error = clk_set_freq(sc->aw_clk_mmc, CARD_ID_FREQUENCY,
418 	    CLK_SET_ROUND_DOWN);
419 	if (error != 0) {
420 		device_printf(dev, "cannot init mmc clock\n");
421 		goto fail;
422 	}
423 	error = clk_enable(sc->aw_clk_mmc);
424 	if (error != 0) {
425 		device_printf(dev, "cannot enable mmc clock\n");
426 		goto fail;
427 	}
428 
429 	sc->aw_timeout = 10;
430 	ctx = device_get_sysctl_ctx(dev);
431 	tree = SYSCTL_CHILDREN(device_get_sysctl_tree(dev));
432 	SYSCTL_ADD_INT(ctx, tree, OID_AUTO, "req_timeout", CTLFLAG_RW,
433 	    &sc->aw_timeout, 0, "Request timeout in seconds");
434 
435 	/* Soft Reset controller. */
436 	if (aw_mmc_reset(sc) != 0) {
437 		device_printf(dev, "cannot reset the controller\n");
438 		goto fail;
439 	}
440 
441 	if (aw_mmc_setup_dma(sc) != 0) {
442 		device_printf(sc->aw_dev, "Couldn't setup DMA!\n");
443 		goto fail;
444 	}
445 
446 	/* Set some defaults for freq and supported mode */
447 	sc->aw_host.f_min = 400000;
448 	sc->aw_host.f_max = 52000000;
449 	sc->aw_host.host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340;
450 	sc->aw_host.caps |= MMC_CAP_HSPEED | MMC_CAP_SIGNALING_330;
451 	mmc_fdt_parse(dev, 0, &sc->mmc_helper, &sc->aw_host);
452 	mmc_fdt_gpio_setup(dev, 0, &sc->mmc_helper, aw_mmc_helper_cd_handler);
453 
454 #ifdef MMCCAM
455 	sc->ccb = NULL;
456 
457 	if (mmc_cam_sim_alloc(dev, "aw_mmc", &sc->mmc_sim) != 0) {
458 		device_printf(dev, "cannot alloc cam sim\n");
459 		goto fail;
460 	}
461 #endif /* MMCCAM */
462 
463 	return (0);
464 
465 fail:
466 	callout_drain(&sc->aw_timeoutc);
467 	mtx_destroy(&sc->aw_mtx);
468 	bus_teardown_intr(dev, sc->aw_res[AW_MMC_IRQRES], sc->aw_intrhand);
469 	bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res);
470 
471 	return (ENXIO);
472 }
473 
474 static int
475 aw_mmc_detach(device_t dev)
476 {
477 	struct aw_mmc_softc *sc;
478 	device_t d;
479 
480 	sc = device_get_softc(dev);
481 
482 	clk_disable(sc->aw_clk_mmc);
483 	clk_disable(sc->aw_clk_ahb);
484 	hwreset_assert(sc->aw_rst_ahb);
485 
486 	mmc_fdt_gpio_teardown(&sc->mmc_helper);
487 
488 	callout_drain(&sc->aw_timeoutc);
489 
490 	AW_MMC_LOCK(sc);
491 	d = sc->child;
492 	sc->child = NULL;
493 	AW_MMC_UNLOCK(sc);
494 	if (d != NULL)
495 		device_delete_child(sc->aw_dev, d);
496 
497 	aw_mmc_teardown_dma(sc);
498 
499 	mtx_destroy(&sc->aw_mtx);
500 
501 	bus_teardown_intr(dev, sc->aw_res[AW_MMC_IRQRES], sc->aw_intrhand);
502 	bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res);
503 
504 #ifdef MMCCAM
505 	mmc_cam_sim_free(&sc->mmc_sim);
506 #endif
507 
508 	return (0);
509 }
510 
511 static void
512 aw_dma_desc_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
513 {
514 	struct aw_mmc_softc *sc;
515 
516 	sc = (struct aw_mmc_softc *)arg;
517 	if (err) {
518 		sc->aw_dma_map_err = err;
519 		return;
520 	}
521 	sc->aw_dma_desc_phys = segs[0].ds_addr;
522 }
523 
524 static int
525 aw_mmc_setup_dma(struct aw_mmc_softc *sc)
526 {
527 	int error;
528 
529 	/* Allocate the DMA descriptor memory. */
530 	error = bus_dma_tag_create(
531 	    bus_get_dma_tag(sc->aw_dev),	/* parent */
532 	    AW_MMC_DMA_ALIGN, 0,		/* align, boundary */
533 	    BUS_SPACE_MAXADDR_32BIT,		/* lowaddr */
534 	    BUS_SPACE_MAXADDR,			/* highaddr */
535 	    NULL, NULL,				/* filter, filterarg*/
536 	    AW_MMC_DMA_DESC_SIZE, 1,		/* maxsize, nsegment */
537 	    AW_MMC_DMA_DESC_SIZE,		/* maxsegsize */
538 	    0,					/* flags */
539 	    NULL, NULL,				/* lock, lockarg*/
540 	    &sc->aw_dma_tag);
541 	if (error)
542 		return (error);
543 
544 	error = bus_dmamem_alloc(sc->aw_dma_tag, &sc->aw_dma_desc,
545 	    BUS_DMA_COHERENT | BUS_DMA_WAITOK | BUS_DMA_ZERO,
546 	    &sc->aw_dma_map);
547 	if (error)
548 		return (error);
549 
550 	error = bus_dmamap_load(sc->aw_dma_tag,
551 	    sc->aw_dma_map,
552 	    sc->aw_dma_desc, AW_MMC_DMA_DESC_SIZE,
553 	    aw_dma_desc_cb, sc, 0);
554 	if (error)
555 		return (error);
556 	if (sc->aw_dma_map_err)
557 		return (sc->aw_dma_map_err);
558 
559 	/* Create the DMA map for data transfers. */
560 	error = bus_dma_tag_create(
561 	    bus_get_dma_tag(sc->aw_dev),	/* parent */
562 	    AW_MMC_DMA_ALIGN, 0,		/* align, boundary */
563 	    BUS_SPACE_MAXADDR_32BIT,		/* lowaddr */
564 	    BUS_SPACE_MAXADDR,			/* highaddr */
565 	    NULL, NULL,				/* filter, filterarg*/
566 	    sc->aw_mmc_conf->dma_xferlen *
567 	    AW_MMC_DMA_SEGS, AW_MMC_DMA_SEGS,	/* maxsize, nsegments */
568 	    sc->aw_mmc_conf->dma_xferlen,	/* maxsegsize */
569 	    BUS_DMA_ALLOCNOW,			/* flags */
570 	    NULL, NULL,				/* lock, lockarg*/
571 	    &sc->aw_dma_buf_tag);
572 	if (error)
573 		return (error);
574 	error = bus_dmamap_create(sc->aw_dma_buf_tag, 0,
575 	    &sc->aw_dma_buf_map);
576 	if (error)
577 		return (error);
578 
579 	return (0);
580 }
581 
582 static void
583 aw_mmc_teardown_dma(struct aw_mmc_softc *sc)
584 {
585 
586 	bus_dmamap_unload(sc->aw_dma_tag, sc->aw_dma_map);
587 	bus_dmamem_free(sc->aw_dma_tag, sc->aw_dma_desc, sc->aw_dma_map);
588 	if (bus_dma_tag_destroy(sc->aw_dma_tag) != 0)
589 		device_printf(sc->aw_dev, "Cannot destroy the dma tag\n");
590 
591 	bus_dmamap_unload(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
592 	bus_dmamap_destroy(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
593 	if (bus_dma_tag_destroy(sc->aw_dma_buf_tag) != 0)
594 		device_printf(sc->aw_dev, "Cannot destroy the dma buf tag\n");
595 }
596 
597 static void
598 aw_dma_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
599 {
600 	int i;
601 	struct aw_mmc_dma_desc *dma_desc;
602 	struct aw_mmc_softc *sc;
603 
604 	sc = (struct aw_mmc_softc *)arg;
605 	sc->aw_dma_map_err = err;
606 
607 	if (err)
608 		return;
609 
610 	dma_desc = sc->aw_dma_desc;
611 	for (i = 0; i < nsegs; i++) {
612 		if (segs[i].ds_len == sc->aw_mmc_conf->dma_xferlen)
613 			dma_desc[i].buf_size = 0;		/* Size of 0 indicate max len */
614 		else
615 			dma_desc[i].buf_size = segs[i].ds_len;
616 		dma_desc[i].buf_addr = segs[i].ds_addr;
617 		dma_desc[i].config = AW_MMC_DMA_CONFIG_CH |
618 			AW_MMC_DMA_CONFIG_OWN | AW_MMC_DMA_CONFIG_DIC;
619 
620 		dma_desc[i].next = sc->aw_dma_desc_phys +
621 			((i + 1) * sizeof(struct aw_mmc_dma_desc));
622 	}
623 
624 	dma_desc[0].config |= AW_MMC_DMA_CONFIG_FD;
625 	dma_desc[nsegs - 1].config |= AW_MMC_DMA_CONFIG_LD |
626 		AW_MMC_DMA_CONFIG_ER;
627 	dma_desc[nsegs - 1].config &= ~AW_MMC_DMA_CONFIG_DIC;
628 	dma_desc[nsegs - 1].next = 0;
629 }
630 
631 static int
632 aw_mmc_prepare_dma(struct aw_mmc_softc *sc)
633 {
634 	bus_dmasync_op_t sync_op;
635 	int error;
636 	struct mmc_command *cmd;
637 	uint32_t val;
638 
639 #ifdef MMCCAM
640 	cmd = &sc->ccb->mmcio.cmd;
641 #else
642 	cmd = sc->aw_req->cmd;
643 #endif
644 	if (cmd->data->len > (sc->aw_mmc_conf->dma_xferlen * AW_MMC_DMA_SEGS))
645 		return (EFBIG);
646 	error = bus_dmamap_load(sc->aw_dma_buf_tag, sc->aw_dma_buf_map,
647 	    cmd->data->data, cmd->data->len, aw_dma_cb, sc, 0);
648 	if (error)
649 		return (error);
650 	if (sc->aw_dma_map_err)
651 		return (sc->aw_dma_map_err);
652 
653 	if (cmd->data->flags & MMC_DATA_WRITE)
654 		sync_op = BUS_DMASYNC_PREWRITE;
655 	else
656 		sync_op = BUS_DMASYNC_PREREAD;
657 	bus_dmamap_sync(sc->aw_dma_buf_tag, sc->aw_dma_buf_map, sync_op);
658 	bus_dmamap_sync(sc->aw_dma_tag, sc->aw_dma_map, BUS_DMASYNC_PREWRITE);
659 
660 	/* Enable DMA */
661 	val = AW_MMC_READ_4(sc, AW_MMC_GCTL);
662 	val &= ~AW_MMC_GCTL_FIFO_AC_MOD;
663 	val |= AW_MMC_GCTL_DMA_ENB;
664 	AW_MMC_WRITE_4(sc, AW_MMC_GCTL, val);
665 
666 	/* Reset DMA */
667 	val |= AW_MMC_GCTL_DMA_RST;
668 	AW_MMC_WRITE_4(sc, AW_MMC_GCTL, val);
669 
670 	AW_MMC_WRITE_4(sc, AW_MMC_DMAC, AW_MMC_DMAC_IDMAC_SOFT_RST);
671 	AW_MMC_WRITE_4(sc, AW_MMC_DMAC,
672 	    AW_MMC_DMAC_IDMAC_IDMA_ON | AW_MMC_DMAC_IDMAC_FIX_BURST);
673 
674 	/* Enable RX or TX DMA interrupt */
675 	val = AW_MMC_READ_4(sc, AW_MMC_IDIE);
676 	if (cmd->data->flags & MMC_DATA_WRITE)
677 		val |= AW_MMC_IDST_TX_INT;
678 	else
679 		val |= AW_MMC_IDST_RX_INT;
680 	AW_MMC_WRITE_4(sc, AW_MMC_IDIE, val);
681 
682 	/* Set DMA descritptor list address */
683 	AW_MMC_WRITE_4(sc, AW_MMC_DLBA, sc->aw_dma_desc_phys);
684 
685 	/* FIFO trigger level */
686 	AW_MMC_WRITE_4(sc, AW_MMC_FWLR, AW_MMC_DMA_FTRGLEVEL);
687 
688 	return (0);
689 }
690 
691 static int
692 aw_mmc_reset(struct aw_mmc_softc *sc)
693 {
694 	uint32_t reg;
695 	int timeout;
696 
697 	reg = AW_MMC_READ_4(sc, AW_MMC_GCTL);
698 	reg |= AW_MMC_GCTL_RESET;
699 	AW_MMC_WRITE_4(sc, AW_MMC_GCTL, reg);
700 	timeout = AW_MMC_RESET_RETRY;
701 	while (--timeout > 0) {
702 		if ((AW_MMC_READ_4(sc, AW_MMC_GCTL) & AW_MMC_GCTL_RESET) == 0)
703 			break;
704 		DELAY(100);
705 	}
706 	if (timeout == 0)
707 		return (ETIMEDOUT);
708 
709 	return (0);
710 }
711 
712 static int
713 aw_mmc_init(struct aw_mmc_softc *sc)
714 {
715 	uint32_t reg;
716 	int ret;
717 
718 	ret = aw_mmc_reset(sc);
719 	if (ret != 0)
720 		return (ret);
721 
722 	/* Set the timeout. */
723 	AW_MMC_WRITE_4(sc, AW_MMC_TMOR,
724 	    AW_MMC_TMOR_DTO_LMT_SHIFT(AW_MMC_TMOR_DTO_LMT_MASK) |
725 	    AW_MMC_TMOR_RTO_LMT_SHIFT(AW_MMC_TMOR_RTO_LMT_MASK));
726 
727 	/* Unmask interrupts. */
728 	AW_MMC_WRITE_4(sc, AW_MMC_IMKR, 0);
729 
730 	/* Clear pending interrupts. */
731 	AW_MMC_WRITE_4(sc, AW_MMC_RISR, 0xffffffff);
732 
733 	/* Debug register, undocumented */
734 	AW_MMC_WRITE_4(sc, AW_MMC_DBGC, 0xdeb);
735 
736 	/* Function select register */
737 	AW_MMC_WRITE_4(sc, AW_MMC_FUNS, 0xceaa0000);
738 
739 	AW_MMC_WRITE_4(sc, AW_MMC_IDST, 0xffffffff);
740 
741 	/* Enable interrupts and disable AHB access. */
742 	reg = AW_MMC_READ_4(sc, AW_MMC_GCTL);
743 	reg |= AW_MMC_GCTL_INT_ENB;
744 	reg &= ~AW_MMC_GCTL_FIFO_AC_MOD;
745 	reg &= ~AW_MMC_GCTL_WAIT_MEM_ACCESS;
746 	AW_MMC_WRITE_4(sc, AW_MMC_GCTL, reg);
747 
748 	return (0);
749 }
750 
751 static void
752 aw_mmc_req_done(struct aw_mmc_softc *sc)
753 {
754 	struct mmc_command *cmd;
755 #ifdef MMCCAM
756 	union ccb *ccb;
757 #else
758 	struct mmc_request *req;
759 #endif
760 	uint32_t val, mask;
761 	int retry;
762 
763 #ifdef MMCCAM
764 	ccb = sc->ccb;
765 	cmd = &ccb->mmcio.cmd;
766 #else
767 	cmd = sc->aw_req->cmd;
768 #endif
769 	if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CMD)) {
770 		device_printf(sc->aw_dev, "%s: cmd %d err %d\n", __func__, cmd->opcode, cmd->error);
771 	}
772 	if (cmd->error != MMC_ERR_NONE) {
773 		/* Reset the FIFO and DMA engines. */
774 		mask = AW_MMC_GCTL_FIFO_RST | AW_MMC_GCTL_DMA_RST;
775 		val = AW_MMC_READ_4(sc, AW_MMC_GCTL);
776 		AW_MMC_WRITE_4(sc, AW_MMC_GCTL, val | mask);
777 
778 		retry = AW_MMC_RESET_RETRY;
779 		while (--retry > 0) {
780 			if ((AW_MMC_READ_4(sc, AW_MMC_GCTL) &
781 			    AW_MMC_GCTL_RESET) == 0)
782 				break;
783 			DELAY(100);
784 		}
785 		if (retry == 0)
786 			device_printf(sc->aw_dev,
787 			    "timeout resetting DMA/FIFO\n");
788 		aw_mmc_update_clock(sc, 1);
789 	}
790 
791 	callout_stop(&sc->aw_timeoutc);
792 	sc->aw_intr = 0;
793 	sc->aw_resid = 0;
794 	sc->aw_dma_map_err = 0;
795 	sc->aw_intr_wait = 0;
796 #ifdef MMCCAM
797 	sc->ccb = NULL;
798 	ccb->ccb_h.status =
799 		(ccb->mmcio.cmd.error == 0 ? CAM_REQ_CMP : CAM_REQ_CMP_ERR);
800 	xpt_done(ccb);
801 #else
802 	req = sc->aw_req;
803 	sc->aw_req = NULL;
804 	req->done(req);
805 #endif
806 }
807 
808 static void
809 aw_mmc_req_ok(struct aw_mmc_softc *sc)
810 {
811 	int timeout;
812 	struct mmc_command *cmd;
813 	uint32_t status;
814 
815 	timeout = 1000;
816 	while (--timeout > 0) {
817 		status = AW_MMC_READ_4(sc, AW_MMC_STAR);
818 		if ((status & AW_MMC_STAR_CARD_BUSY) == 0)
819 			break;
820 		DELAY(1000);
821 	}
822 #ifdef MMCCAM
823 	cmd = &sc->ccb->mmcio.cmd;
824 #else
825 	cmd = sc->aw_req->cmd;
826 #endif
827 	if (timeout == 0) {
828 		cmd->error = MMC_ERR_FAILED;
829 		aw_mmc_req_done(sc);
830 		return;
831 	}
832 	if (cmd->flags & MMC_RSP_PRESENT) {
833 		if (cmd->flags & MMC_RSP_136) {
834 			cmd->resp[0] = AW_MMC_READ_4(sc, AW_MMC_RESP3);
835 			cmd->resp[1] = AW_MMC_READ_4(sc, AW_MMC_RESP2);
836 			cmd->resp[2] = AW_MMC_READ_4(sc, AW_MMC_RESP1);
837 			cmd->resp[3] = AW_MMC_READ_4(sc, AW_MMC_RESP0);
838 		} else
839 			cmd->resp[0] = AW_MMC_READ_4(sc, AW_MMC_RESP0);
840 	}
841 	/* All data has been transferred ? */
842 	if (cmd->data != NULL && (sc->aw_resid << 2) < cmd->data->len)
843 		cmd->error = MMC_ERR_FAILED;
844 	aw_mmc_req_done(sc);
845 }
846 
847 static inline void
848 set_mmc_error(struct aw_mmc_softc *sc, int error_code)
849 {
850 #ifdef MMCCAM
851 	sc->ccb->mmcio.cmd.error = error_code;
852 #else
853 	sc->aw_req->cmd->error = error_code;
854 #endif
855 }
856 
857 static void
858 aw_mmc_timeout(void *arg)
859 {
860 	struct aw_mmc_softc *sc;
861 
862 	sc = (struct aw_mmc_softc *)arg;
863 #ifdef MMCCAM
864 	if (sc->ccb != NULL) {
865 #else
866 	if (sc->aw_req != NULL) {
867 #endif
868 		device_printf(sc->aw_dev, "controller timeout\n");
869 		set_mmc_error(sc, MMC_ERR_TIMEOUT);
870 		aw_mmc_req_done(sc);
871 	} else
872 		device_printf(sc->aw_dev,
873 		    "Spurious timeout - no active request\n");
874 }
875 
876 static void
877 aw_mmc_print_error(uint32_t err)
878 {
879 	if(err & AW_MMC_INT_RESP_ERR)
880 		printf("AW_MMC_INT_RESP_ERR ");
881 	if (err & AW_MMC_INT_RESP_CRC_ERR)
882 		printf("AW_MMC_INT_RESP_CRC_ERR ");
883 	if (err & AW_MMC_INT_DATA_CRC_ERR)
884 		printf("AW_MMC_INT_DATA_CRC_ERR ");
885 	if (err & AW_MMC_INT_RESP_TIMEOUT)
886 		printf("AW_MMC_INT_RESP_TIMEOUT ");
887 	if (err & AW_MMC_INT_FIFO_RUN_ERR)
888 		printf("AW_MMC_INT_FIFO_RUN_ERR ");
889 	if (err & AW_MMC_INT_CMD_BUSY)
890 		printf("AW_MMC_INT_CMD_BUSY ");
891 	if (err & AW_MMC_INT_DATA_START_ERR)
892 		printf("AW_MMC_INT_DATA_START_ERR ");
893 	if (err & AW_MMC_INT_DATA_END_BIT_ERR)
894 		printf("AW_MMC_INT_DATA_END_BIT_ERR");
895 	printf("\n");
896 }
897 
898 static void
899 aw_mmc_intr(void *arg)
900 {
901 	bus_dmasync_op_t sync_op;
902 	struct aw_mmc_softc *sc;
903 	struct mmc_data *data;
904 	uint32_t idst, imask, rint;
905 
906 	sc = (struct aw_mmc_softc *)arg;
907 	AW_MMC_LOCK(sc);
908 	rint = AW_MMC_READ_4(sc, AW_MMC_RISR);
909 	idst = AW_MMC_READ_4(sc, AW_MMC_IDST);
910 	imask = AW_MMC_READ_4(sc, AW_MMC_IMKR);
911 	if (idst == 0 && imask == 0 && rint == 0) {
912 		AW_MMC_UNLOCK(sc);
913 		return;
914 	}
915 	if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_INT)) {
916 		device_printf(sc->aw_dev, "idst: %#x, imask: %#x, rint: %#x\n",
917 		    idst, imask, rint);
918 	}
919 #ifdef MMCCAM
920 	if (sc->ccb == NULL) {
921 #else
922 	if (sc->aw_req == NULL) {
923 #endif
924 		device_printf(sc->aw_dev,
925 		    "Spurious interrupt - no active request, rint: 0x%08X\n",
926 		    rint);
927 		aw_mmc_print_error(rint);
928 		goto end;
929 	}
930 	if (rint & AW_MMC_INT_ERR_BIT) {
931 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_INT)) {
932 			device_printf(sc->aw_dev, "error rint: 0x%08X\n", rint);
933 			aw_mmc_print_error(rint);
934 		}
935 		if (rint & AW_MMC_INT_RESP_TIMEOUT)
936 			set_mmc_error(sc, MMC_ERR_TIMEOUT);
937 		else
938 			set_mmc_error(sc, MMC_ERR_FAILED);
939 		aw_mmc_req_done(sc);
940 		goto end;
941 	}
942 	if (idst & AW_MMC_IDST_ERROR) {
943 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_INT))
944 			device_printf(sc->aw_dev, "error idst: 0x%08x\n", idst);
945 		set_mmc_error(sc, MMC_ERR_FAILED);
946 		aw_mmc_req_done(sc);
947 		goto end;
948 	}
949 
950 	sc->aw_intr |= rint;
951 #ifdef MMCCAM
952 	data = sc->ccb->mmcio.cmd.data;
953 #else
954 	data = sc->aw_req->cmd->data;
955 #endif
956 	if (data != NULL && (idst & AW_MMC_IDST_COMPLETE) != 0) {
957 		if (data->flags & MMC_DATA_WRITE)
958 			sync_op = BUS_DMASYNC_POSTWRITE;
959 		else
960 			sync_op = BUS_DMASYNC_POSTREAD;
961 		bus_dmamap_sync(sc->aw_dma_buf_tag, sc->aw_dma_buf_map,
962 		    sync_op);
963 		bus_dmamap_sync(sc->aw_dma_tag, sc->aw_dma_map,
964 		    BUS_DMASYNC_POSTWRITE);
965 		bus_dmamap_unload(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
966 		sc->aw_resid = data->len >> 2;
967 	}
968 	if ((sc->aw_intr & sc->aw_intr_wait) == sc->aw_intr_wait)
969 		aw_mmc_req_ok(sc);
970 
971 end:
972 	AW_MMC_WRITE_4(sc, AW_MMC_IDST, idst);
973 	AW_MMC_WRITE_4(sc, AW_MMC_RISR, rint);
974 	AW_MMC_UNLOCK(sc);
975 }
976 
977 static int
978 aw_mmc_request(device_t bus, device_t child, struct mmc_request *req)
979 {
980 	int blksz;
981 	struct aw_mmc_softc *sc;
982 	struct mmc_command *cmd;
983 	uint32_t cmdreg, imask;
984 	int err;
985 
986 	sc = device_get_softc(bus);
987 
988 	AW_MMC_LOCK(sc);
989 #ifdef MMCCAM
990 	KASSERT(req == NULL, ("req should be NULL in MMCCAM case!"));
991 	/*
992 	 * For MMCCAM, sc->ccb has been NULL-checked and populated
993 	 * by aw_mmc_cam_request() already.
994 	 */
995 	cmd = &sc->ccb->mmcio.cmd;
996 #else
997 	if (sc->aw_req) {
998 		AW_MMC_UNLOCK(sc);
999 		return (EBUSY);
1000 	}
1001 	sc->aw_req = req;
1002 	cmd = req->cmd;
1003 
1004 	if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CMD)) {
1005 		device_printf(sc->aw_dev, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n",
1006 			      cmd->opcode, cmd->arg, cmd->flags,
1007 			      cmd->data != NULL ? (unsigned int)cmd->data->len : 0,
1008 			      cmd->data != NULL ? cmd->data->flags: 0);
1009 	}
1010 #endif
1011 	cmdreg = AW_MMC_CMDR_LOAD;
1012 	imask = AW_MMC_INT_ERR_BIT;
1013 	sc->aw_intr_wait = 0;
1014 	sc->aw_intr = 0;
1015 	sc->aw_resid = 0;
1016 	cmd->error = MMC_ERR_NONE;
1017 
1018 	if (cmd->opcode == MMC_GO_IDLE_STATE)
1019 		cmdreg |= AW_MMC_CMDR_SEND_INIT_SEQ;
1020 
1021 	if (cmd->flags & MMC_RSP_PRESENT)
1022 		cmdreg |= AW_MMC_CMDR_RESP_RCV;
1023 	if (cmd->flags & MMC_RSP_136)
1024 		cmdreg |= AW_MMC_CMDR_LONG_RESP;
1025 	if (cmd->flags & MMC_RSP_CRC)
1026 		cmdreg |= AW_MMC_CMDR_CHK_RESP_CRC;
1027 
1028 	if (cmd->data) {
1029 		cmdreg |= AW_MMC_CMDR_DATA_TRANS | AW_MMC_CMDR_WAIT_PRE_OVER;
1030 
1031 		if (cmd->data->flags & MMC_DATA_MULTI) {
1032 			cmdreg |= AW_MMC_CMDR_STOP_CMD_FLAG;
1033 			imask |= AW_MMC_INT_AUTO_STOP_DONE;
1034 			sc->aw_intr_wait |= AW_MMC_INT_AUTO_STOP_DONE;
1035 		} else {
1036 			sc->aw_intr_wait |= AW_MMC_INT_DATA_OVER;
1037 			imask |= AW_MMC_INT_DATA_OVER;
1038 		}
1039 		if (cmd->data->flags & MMC_DATA_WRITE)
1040 			cmdreg |= AW_MMC_CMDR_DIR_WRITE;
1041 #ifdef MMCCAM
1042 		if (cmd->data->flags & MMC_DATA_BLOCK_SIZE) {
1043 			AW_MMC_WRITE_4(sc, AW_MMC_BKSR, cmd->data->block_size);
1044 			AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
1045 		} else
1046 #endif
1047 		{
1048 			blksz = min(cmd->data->len, MMC_SECTOR_SIZE);
1049 			AW_MMC_WRITE_4(sc, AW_MMC_BKSR, blksz);
1050 			AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
1051 		}
1052 	} else {
1053 		imask |= AW_MMC_INT_CMD_DONE;
1054 	}
1055 
1056 	/* Enable the interrupts we are interested in */
1057 	AW_MMC_WRITE_4(sc, AW_MMC_IMKR, imask);
1058 	AW_MMC_WRITE_4(sc, AW_MMC_RISR, 0xffffffff);
1059 
1060 	/* Enable auto stop if needed */
1061 	AW_MMC_WRITE_4(sc, AW_MMC_A12A,
1062 	    cmdreg & AW_MMC_CMDR_STOP_CMD_FLAG ? 0 : 0xffff);
1063 
1064 	/* Write the command argument */
1065 	AW_MMC_WRITE_4(sc, AW_MMC_CAGR, cmd->arg);
1066 
1067 	/*
1068 	 * If we don't have data start the request
1069 	 * if we do prepare the dma request and start the request
1070 	 */
1071 	if (cmd->data == NULL) {
1072 		AW_MMC_WRITE_4(sc, AW_MMC_CMDR, cmdreg | cmd->opcode);
1073 	} else {
1074 		err = aw_mmc_prepare_dma(sc);
1075 		if (err != 0)
1076 			device_printf(sc->aw_dev, "prepare_dma failed: %d\n", err);
1077 
1078 		AW_MMC_WRITE_4(sc, AW_MMC_CMDR, cmdreg | cmd->opcode);
1079 	}
1080 
1081 	callout_reset(&sc->aw_timeoutc, sc->aw_timeout * hz,
1082 	    aw_mmc_timeout, sc);
1083 	AW_MMC_UNLOCK(sc);
1084 
1085 	return (0);
1086 }
1087 
1088 static int
1089 aw_mmc_read_ivar(device_t bus, device_t child, int which,
1090     uintptr_t *result)
1091 {
1092 	struct aw_mmc_softc *sc;
1093 
1094 	sc = device_get_softc(bus);
1095 	switch (which) {
1096 	default:
1097 		return (EINVAL);
1098 	case MMCBR_IVAR_BUS_MODE:
1099 		*(int *)result = sc->aw_host.ios.bus_mode;
1100 		break;
1101 	case MMCBR_IVAR_BUS_WIDTH:
1102 		*(int *)result = sc->aw_host.ios.bus_width;
1103 		break;
1104 	case MMCBR_IVAR_CHIP_SELECT:
1105 		*(int *)result = sc->aw_host.ios.chip_select;
1106 		break;
1107 	case MMCBR_IVAR_CLOCK:
1108 		*(int *)result = sc->aw_host.ios.clock;
1109 		break;
1110 	case MMCBR_IVAR_F_MIN:
1111 		*(int *)result = sc->aw_host.f_min;
1112 		break;
1113 	case MMCBR_IVAR_F_MAX:
1114 		*(int *)result = sc->aw_host.f_max;
1115 		break;
1116 	case MMCBR_IVAR_HOST_OCR:
1117 		*(int *)result = sc->aw_host.host_ocr;
1118 		break;
1119 	case MMCBR_IVAR_MODE:
1120 		*(int *)result = sc->aw_host.mode;
1121 		break;
1122 	case MMCBR_IVAR_OCR:
1123 		*(int *)result = sc->aw_host.ocr;
1124 		break;
1125 	case MMCBR_IVAR_POWER_MODE:
1126 		*(int *)result = sc->aw_host.ios.power_mode;
1127 		break;
1128 	case MMCBR_IVAR_VDD:
1129 		*(int *)result = sc->aw_host.ios.vdd;
1130 		break;
1131 	case MMCBR_IVAR_VCCQ:
1132 		*(int *)result = sc->aw_host.ios.vccq;
1133 		break;
1134 	case MMCBR_IVAR_CAPS:
1135 		*(int *)result = sc->aw_host.caps;
1136 		break;
1137 	case MMCBR_IVAR_TIMING:
1138 		*(int *)result = sc->aw_host.ios.timing;
1139 		break;
1140 	case MMCBR_IVAR_MAX_DATA:
1141 		*(int *)result = (sc->aw_mmc_conf->dma_xferlen *
1142 		    AW_MMC_DMA_SEGS) / MMC_SECTOR_SIZE;
1143 		break;
1144 	case MMCBR_IVAR_RETUNE_REQ:
1145 		*(int *)result = retune_req_none;
1146 		break;
1147 	}
1148 
1149 	return (0);
1150 }
1151 
1152 static int
1153 aw_mmc_write_ivar(device_t bus, device_t child, int which,
1154     uintptr_t value)
1155 {
1156 	struct aw_mmc_softc *sc;
1157 
1158 	sc = device_get_softc(bus);
1159 	switch (which) {
1160 	default:
1161 		return (EINVAL);
1162 	case MMCBR_IVAR_BUS_MODE:
1163 		sc->aw_host.ios.bus_mode = value;
1164 		break;
1165 	case MMCBR_IVAR_BUS_WIDTH:
1166 		sc->aw_host.ios.bus_width = value;
1167 		break;
1168 	case MMCBR_IVAR_CHIP_SELECT:
1169 		sc->aw_host.ios.chip_select = value;
1170 		break;
1171 	case MMCBR_IVAR_CLOCK:
1172 		sc->aw_host.ios.clock = value;
1173 		break;
1174 	case MMCBR_IVAR_MODE:
1175 		sc->aw_host.mode = value;
1176 		break;
1177 	case MMCBR_IVAR_OCR:
1178 		sc->aw_host.ocr = value;
1179 		break;
1180 	case MMCBR_IVAR_POWER_MODE:
1181 		sc->aw_host.ios.power_mode = value;
1182 		break;
1183 	case MMCBR_IVAR_VDD:
1184 		sc->aw_host.ios.vdd = value;
1185 		break;
1186 	case MMCBR_IVAR_VCCQ:
1187 		sc->aw_host.ios.vccq = value;
1188 		break;
1189 	case MMCBR_IVAR_TIMING:
1190 		sc->aw_host.ios.timing = value;
1191 		break;
1192 	/* These are read-only */
1193 	case MMCBR_IVAR_CAPS:
1194 	case MMCBR_IVAR_HOST_OCR:
1195 	case MMCBR_IVAR_F_MIN:
1196 	case MMCBR_IVAR_F_MAX:
1197 	case MMCBR_IVAR_MAX_DATA:
1198 		return (EINVAL);
1199 	}
1200 
1201 	return (0);
1202 }
1203 
1204 static int
1205 aw_mmc_update_clock(struct aw_mmc_softc *sc, uint32_t clkon)
1206 {
1207 	uint32_t reg;
1208 	int retry;
1209 
1210 	reg = AW_MMC_READ_4(sc, AW_MMC_CKCR);
1211 	reg &= ~(AW_MMC_CKCR_ENB | AW_MMC_CKCR_LOW_POWER |
1212 	    AW_MMC_CKCR_MASK_DATA0);
1213 
1214 	if (clkon)
1215 		reg |= AW_MMC_CKCR_ENB;
1216 	if (sc->aw_mmc_conf->mask_data0)
1217 		reg |= AW_MMC_CKCR_MASK_DATA0;
1218 
1219 	AW_MMC_WRITE_4(sc, AW_MMC_CKCR, reg);
1220 
1221 	reg = AW_MMC_CMDR_LOAD | AW_MMC_CMDR_PRG_CLK |
1222 	    AW_MMC_CMDR_WAIT_PRE_OVER;
1223 	AW_MMC_WRITE_4(sc, AW_MMC_CMDR, reg);
1224 	retry = 0xfffff;
1225 
1226 	while (reg & AW_MMC_CMDR_LOAD && --retry > 0) {
1227 		reg = AW_MMC_READ_4(sc, AW_MMC_CMDR);
1228 		DELAY(10);
1229 	}
1230 	AW_MMC_WRITE_4(sc, AW_MMC_RISR, 0xffffffff);
1231 
1232 	if (reg & AW_MMC_CMDR_LOAD) {
1233 		device_printf(sc->aw_dev, "timeout updating clock\n");
1234 		return (ETIMEDOUT);
1235 	}
1236 
1237 	if (sc->aw_mmc_conf->mask_data0) {
1238 		reg = AW_MMC_READ_4(sc, AW_MMC_CKCR);
1239 		reg &= ~AW_MMC_CKCR_MASK_DATA0;
1240 		AW_MMC_WRITE_4(sc, AW_MMC_CKCR, reg);
1241 	}
1242 
1243 	return (0);
1244 }
1245 
1246 #ifndef MMCCAM
1247 static int
1248 aw_mmc_switch_vccq(device_t bus, device_t child)
1249 {
1250 	struct aw_mmc_softc *sc;
1251 	int uvolt, err;
1252 
1253 	sc = device_get_softc(bus);
1254 
1255 	if (sc->mmc_helper.vqmmc_supply == NULL)
1256 		return EOPNOTSUPP;
1257 
1258 	switch (sc->aw_host.ios.vccq) {
1259 	case vccq_180:
1260 		uvolt = 1800000;
1261 		break;
1262 	case vccq_330:
1263 		uvolt = 3300000;
1264 		break;
1265 	default:
1266 		return EINVAL;
1267 	}
1268 
1269 	err = regulator_set_voltage(sc->mmc_helper.vqmmc_supply, uvolt, uvolt);
1270 	if (err != 0) {
1271 		device_printf(sc->aw_dev,
1272 		    "Cannot set vqmmc to %d<->%d\n",
1273 		    uvolt,
1274 		    uvolt);
1275 		return (err);
1276 	}
1277 
1278 	return (0);
1279 }
1280 #endif
1281 
1282 static int
1283 aw_mmc_update_ios(device_t bus, device_t child)
1284 {
1285 	int error;
1286 	struct aw_mmc_softc *sc;
1287 	struct mmc_ios *ios;
1288 	unsigned int clock;
1289 	uint32_t reg, div = 1;
1290 	int reg_status;
1291 	int rv;
1292 
1293 	sc = device_get_softc(bus);
1294 
1295 	ios = &sc->aw_host.ios;
1296 
1297 	/* Set the bus width. */
1298 	switch (ios->bus_width) {
1299 	case bus_width_1:
1300 		AW_MMC_WRITE_4(sc, AW_MMC_BWDR, AW_MMC_BWDR1);
1301 		break;
1302 	case bus_width_4:
1303 		AW_MMC_WRITE_4(sc, AW_MMC_BWDR, AW_MMC_BWDR4);
1304 		break;
1305 	case bus_width_8:
1306 		AW_MMC_WRITE_4(sc, AW_MMC_BWDR, AW_MMC_BWDR8);
1307 		break;
1308 	}
1309 
1310 	switch (ios->power_mode) {
1311 	case power_on:
1312 		break;
1313 	case power_off:
1314 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
1315 			device_printf(sc->aw_dev, "Powering down sd/mmc\n");
1316 
1317 		if (sc->mmc_helper.vmmc_supply) {
1318 			rv = regulator_status(sc->mmc_helper.vmmc_supply, &reg_status);
1319 			if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
1320 				regulator_disable(sc->mmc_helper.vmmc_supply);
1321 		}
1322 		if (sc->mmc_helper.vqmmc_supply) {
1323 			rv = regulator_status(sc->mmc_helper.vqmmc_supply, &reg_status);
1324 			if (rv == 0 && reg_status == REGULATOR_STATUS_ENABLED)
1325 				regulator_disable(sc->mmc_helper.vqmmc_supply);
1326 		}
1327 
1328 		if (sc->mmc_helper.mmc_pwrseq)
1329 			MMC_PWRSEQ_SET_POWER(sc->mmc_helper.mmc_pwrseq, false);
1330 
1331 		aw_mmc_reset(sc);
1332 		break;
1333 	case power_up:
1334 		if (__predict_false(aw_mmc_debug & AW_MMC_DEBUG_CARD))
1335 			device_printf(sc->aw_dev, "Powering up sd/mmc\n");
1336 
1337 		if (sc->mmc_helper.vmmc_supply) {
1338 			rv = regulator_status(sc->mmc_helper.vmmc_supply, &reg_status);
1339 			if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
1340 				regulator_enable(sc->mmc_helper.vmmc_supply);
1341 		}
1342 		if (sc->mmc_helper.vqmmc_supply) {
1343 			rv = regulator_status(sc->mmc_helper.vqmmc_supply, &reg_status);
1344 			if (rv == 0 && reg_status != REGULATOR_STATUS_ENABLED)
1345 				regulator_enable(sc->mmc_helper.vqmmc_supply);
1346 		}
1347 
1348 		if (sc->mmc_helper.mmc_pwrseq)
1349 			MMC_PWRSEQ_SET_POWER(sc->mmc_helper.mmc_pwrseq, true);
1350 		aw_mmc_init(sc);
1351 		break;
1352 	};
1353 
1354 	/* Enable ddr mode if needed */
1355 	reg = AW_MMC_READ_4(sc, AW_MMC_GCTL);
1356 	if (ios->timing == bus_timing_uhs_ddr50 ||
1357 	  ios->timing == bus_timing_mmc_ddr52)
1358 		reg |= AW_MMC_GCTL_DDR_MOD_SEL;
1359 	else
1360 		reg &= ~AW_MMC_GCTL_DDR_MOD_SEL;
1361 	AW_MMC_WRITE_4(sc, AW_MMC_GCTL, reg);
1362 
1363 	if (ios->clock && ios->clock != sc->aw_clock) {
1364 		sc->aw_clock = clock = ios->clock;
1365 
1366 		/* Disable clock */
1367 		error = aw_mmc_update_clock(sc, 0);
1368 		if (error != 0)
1369 			return (error);
1370 
1371 		if (ios->timing == bus_timing_mmc_ddr52 &&
1372 		    (sc->aw_mmc_conf->new_timing ||
1373 		    ios->bus_width == bus_width_8)) {
1374 			div = 2;
1375 			clock <<= 1;
1376 		}
1377 
1378 		/* Reset the divider. */
1379 		reg = AW_MMC_READ_4(sc, AW_MMC_CKCR);
1380 		reg &= ~AW_MMC_CKCR_DIV;
1381 		reg |= div - 1;
1382 		AW_MMC_WRITE_4(sc, AW_MMC_CKCR, reg);
1383 
1384 		/* New timing mode if needed */
1385 		if (sc->aw_mmc_conf->new_timing) {
1386 			reg = AW_MMC_READ_4(sc, AW_MMC_NTSR);
1387 			reg |= AW_MMC_NTSR_MODE_SELECT;
1388 			AW_MMC_WRITE_4(sc, AW_MMC_NTSR, reg);
1389 		}
1390 
1391 		/* Set the MMC clock. */
1392 		error = clk_disable(sc->aw_clk_mmc);
1393 		if (error != 0 && bootverbose)
1394 			device_printf(sc->aw_dev,
1395 			  "failed to disable mmc clock: %d\n", error);
1396 		error = clk_set_freq(sc->aw_clk_mmc, clock,
1397 		    CLK_SET_ROUND_DOWN);
1398 		if (error != 0) {
1399 			device_printf(sc->aw_dev,
1400 			    "failed to set frequency to %u Hz: %d\n",
1401 			    clock, error);
1402 			return (error);
1403 		}
1404 		error = clk_enable(sc->aw_clk_mmc);
1405 		if (error != 0 && bootverbose)
1406 			device_printf(sc->aw_dev,
1407 			  "failed to re-enable mmc clock: %d\n", error);
1408 
1409 		if (sc->aw_mmc_conf->can_calibrate)
1410 			AW_MMC_WRITE_4(sc, AW_MMC_SAMP_DL, AW_MMC_SAMP_DL_SW_EN);
1411 
1412 		/* Enable clock. */
1413 		error = aw_mmc_update_clock(sc, 1);
1414 		if (error != 0)
1415 			return (error);
1416 	}
1417 
1418 	return (0);
1419 }
1420 
1421 #ifndef MMCCAM
1422 static int
1423 aw_mmc_get_ro(device_t bus, device_t child)
1424 {
1425 	struct aw_mmc_softc *sc;
1426 
1427 	sc = device_get_softc(bus);
1428 
1429 	return (mmc_fdt_gpio_get_readonly(&sc->mmc_helper));
1430 }
1431 
1432 static int
1433 aw_mmc_acquire_host(device_t bus, device_t child)
1434 {
1435 	struct aw_mmc_softc *sc;
1436 	int error;
1437 
1438 	sc = device_get_softc(bus);
1439 	AW_MMC_LOCK(sc);
1440 	while (sc->aw_bus_busy) {
1441 		error = msleep(sc, &sc->aw_mtx, PCATCH, "mmchw", 0);
1442 		if (error != 0) {
1443 			AW_MMC_UNLOCK(sc);
1444 			return (error);
1445 		}
1446 	}
1447 	sc->aw_bus_busy++;
1448 	AW_MMC_UNLOCK(sc);
1449 
1450 	return (0);
1451 }
1452 
1453 static int
1454 aw_mmc_release_host(device_t bus, device_t child)
1455 {
1456 	struct aw_mmc_softc *sc;
1457 
1458 	sc = device_get_softc(bus);
1459 	AW_MMC_LOCK(sc);
1460 	sc->aw_bus_busy--;
1461 	wakeup(sc);
1462 	AW_MMC_UNLOCK(sc);
1463 
1464 	return (0);
1465 }
1466 #endif
1467 
1468 static device_method_t aw_mmc_methods[] = {
1469 	/* Device interface */
1470 	DEVMETHOD(device_probe,		aw_mmc_probe),
1471 	DEVMETHOD(device_attach,	aw_mmc_attach),
1472 	DEVMETHOD(device_detach,	aw_mmc_detach),
1473 
1474 	/* Bus interface */
1475 	DEVMETHOD(bus_read_ivar,	aw_mmc_read_ivar),
1476 	DEVMETHOD(bus_write_ivar,	aw_mmc_write_ivar),
1477 	DEVMETHOD(bus_add_child,        bus_generic_add_child),
1478 
1479 #ifndef MMCCAM
1480 	/* MMC bridge interface */
1481 	DEVMETHOD(mmcbr_update_ios,	aw_mmc_update_ios),
1482 	DEVMETHOD(mmcbr_request,	aw_mmc_request),
1483 	DEVMETHOD(mmcbr_get_ro,		aw_mmc_get_ro),
1484 	DEVMETHOD(mmcbr_switch_vccq,	aw_mmc_switch_vccq),
1485 	DEVMETHOD(mmcbr_acquire_host,	aw_mmc_acquire_host),
1486 	DEVMETHOD(mmcbr_release_host,	aw_mmc_release_host),
1487 #endif
1488 
1489 #ifdef MMCCAM
1490 	/* MMCCAM interface */
1491 	DEVMETHOD(mmc_sim_get_tran_settings,	aw_mmc_get_tran_settings),
1492 	DEVMETHOD(mmc_sim_set_tran_settings,	aw_mmc_set_tran_settings),
1493 	DEVMETHOD(mmc_sim_cam_request,		aw_mmc_cam_request),
1494 #endif
1495 
1496 	DEVMETHOD_END
1497 };
1498 
1499 static devclass_t aw_mmc_devclass;
1500 
1501 static driver_t aw_mmc_driver = {
1502 	"aw_mmc",
1503 	aw_mmc_methods,
1504 	sizeof(struct aw_mmc_softc),
1505 };
1506 
1507 DRIVER_MODULE(aw_mmc, simplebus, aw_mmc_driver, aw_mmc_devclass, NULL,
1508     NULL);
1509 #ifndef MMCCAM
1510 MMC_DECLARE_BRIDGE(aw_mmc);
1511 #endif
1512 SIMPLEBUS_PNP_INFO(compat_data);
1513