Home | History | Annotate | Line # | Download | only in ingenic
      1 /*	$NetBSD: jzmmc.c,v 1.1 2026/07/26 20:15:17 rkujawa Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2017, 2026 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     17  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     18  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  * POSSIBILITY OF SUCH DAMAGE.
     27  */
     28 
     29 /*
     30  * Ingenic JZ4780 MMC/SD controller (MSC) driver.
     31  *
     32  * The driver has a few peculiarities related to CI20:
     33  * - only MSC1 is supported
     34  * - the pins must be muxed here
     35  * - card detect is a plain GPIO on PF20
     36  * - card power is a fixed always-on 3.3V rail
     37  */
     38 
     39 #include <sys/cdefs.h>
     40 __KERNEL_RCSID(0, "$NetBSD: jzmmc.c,v 1.1 2026/07/26 20:15:17 rkujawa Exp $");
     41 
     42 #include "opt_ingenic.h"
     43 
     44 #include <sys/param.h>
     45 #include <sys/systm.h>
     46 #include <sys/device.h>
     47 #include <sys/kernel.h>
     48 #include <sys/proc.h>
     49 #include <sys/bus.h>
     50 #include <sys/mutex.h>
     51 #include <sys/condvar.h>
     52 
     53 #include <dev/sdmmc/sdmmcvar.h>
     54 #include <dev/sdmmc/sdmmcchip.h>
     55 #include <dev/sdmmc/sdmmcreg.h>
     56 
     57 #include <mips/ingenic/ingenic_var.h>
     58 #include <mips/ingenic/ingenic_regs.h>
     59 
     60 /*
     61  * SDMA descriptor
     62  */
     63 #define JZMMC_NDESC		SDMMC_MAXNSEGS
     64 #define JZMMC_DESC_WORDS	4
     65 #define JZMMC_DESC_SIZE		(JZMMC_DESC_WORDS * 4)
     66 #define JZMMC_DESC_NDA		0
     67 #define JZMMC_DESC_DA		1
     68 #define JZMMC_DESC_LEN		2
     69 #define JZMMC_DESC_CMD		3
     70 
     71 #ifdef JZMMC_DEBUG
     72 #define DPRINTF printf
     73 #else
     74 #define DPRINTF while (0) printf
     75 #endif
     76 
     77 /*
     78  * The CGU MSC1CDR divider runs off the MPLL, which u-boot programs to
     79  * 1200MHz on the CI20
     80  */
     81 #define JZMMC_MPLL_KHZ		1200000		/* should be configurable */
     82 #define JZMMC_CDR_DIV		11
     83 #define JZMMC_DEVCLK_KHZ	(JZMMC_MPLL_KHZ / ((JZMMC_CDR_DIV + 1) * 2))
     84 
     85 /* SD slot pins: PE20-23 = D0-D3, PE28 = CLK, PE29 = CMD, all function 1 */
     86 static const int jzmmc_sdslot_pins[] = { 20, 21, 22, 23, 28, 29 };
     87 #define JZMMC_GPIO_E		4
     88 #define JZMMC_GPIO_F		5
     89 #define JZMMC_CD_PIN		20	/* PF20, active low */
     90 
     91 struct jzmmc_softc {
     92 	device_t		sc_dev;
     93 	bus_space_tag_t		sc_bst;
     94 	bus_space_handle_t	sc_bsh;
     95 	device_t		sc_sdmmc;
     96 	void			*sc_ih;
     97 	kmutex_t		sc_intr_lock;
     98 	kcondvar_t		sc_intr_cv;
     99 	bus_dma_tag_t		sc_dmat;
    100 	bus_dmamap_t		sc_desc_map;
    101 	bus_dma_segment_t	sc_desc_seg;
    102 	uint32_t		*sc_desc;	/* uncached descriptor ring */
    103 	uint32_t		sc_widthbits;	/* cached CMDAT bus width */
    104 	u_int			sc_dma_fails;	/* silent errors */
    105 	bool			sc_inited;	/* init sent */
    106 	bool			sc_use_intr;	/* handler established */
    107 	bool			sc_use_dma;	/* descriptor ring ready */
    108 };
    109 
    110 #define MR4(sc, r)	bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (r))
    111 #define MW4(sc, r, v)	bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (r), (v))
    112 #define MR2(sc, r)	bus_space_read_2((sc)->sc_bst, (sc)->sc_bsh, (r))
    113 #define MW2(sc, r, v)	bus_space_write_2((sc)->sc_bst, (sc)->sc_bsh, (r), (v))
    114 #define MW1(sc, r, v)	bus_space_write_1((sc)->sc_bst, (sc)->sc_bsh, (r), (v))
    115 
    116 #define JZMMC_FIFO_BURST	16
    117 
    118 #define JZMMC_REG_SIZE		0x100	/* registers end at RTCNT, 0x5c */
    119 
    120 static int	jzmmc_match(device_t, cfdata_t, void *);
    121 static void	jzmmc_attach(device_t, device_t, void *);
    122 
    123 static int	jzmmc_host_reset(sdmmc_chipset_handle_t);
    124 static uint32_t	jzmmc_host_ocr(sdmmc_chipset_handle_t);
    125 static int	jzmmc_host_maxblklen(sdmmc_chipset_handle_t);
    126 static int	jzmmc_card_detect(sdmmc_chipset_handle_t);
    127 static int	jzmmc_write_protect(sdmmc_chipset_handle_t);
    128 static int	jzmmc_bus_power(sdmmc_chipset_handle_t, uint32_t);
    129 static int	jzmmc_bus_clock(sdmmc_chipset_handle_t, int);
    130 static int	jzmmc_bus_width(sdmmc_chipset_handle_t, int);
    131 static int	jzmmc_bus_rod(sdmmc_chipset_handle_t, int);
    132 static void	jzmmc_exec_command(sdmmc_chipset_handle_t,
    133 		    struct sdmmc_command *);
    134 static void	jzmmc_card_enable_intr(sdmmc_chipset_handle_t, int);
    135 static void	jzmmc_card_intr_ack(sdmmc_chipset_handle_t);
    136 
    137 static struct sdmmc_chip_functions jzmmc_chip_functions = {
    138 	.host_reset		= jzmmc_host_reset,
    139 	.host_ocr		= jzmmc_host_ocr,
    140 	.host_maxblklen		= jzmmc_host_maxblklen,
    141 	.card_detect		= jzmmc_card_detect,
    142 	.write_protect		= jzmmc_write_protect,
    143 	.bus_power		= jzmmc_bus_power,
    144 	.bus_clock		= jzmmc_bus_clock,
    145 	.bus_width		= jzmmc_bus_width,
    146 	.bus_rod		= jzmmc_bus_rod,
    147 	.exec_command		= jzmmc_exec_command,
    148 	.card_enable_intr	= jzmmc_card_enable_intr,
    149 	.card_intr_ack		= jzmmc_card_intr_ack,
    150 };
    151 
    152 CFATTACH_DECL_NEW(jzmmc, sizeof(struct jzmmc_softc),
    153     jzmmc_match, jzmmc_attach, NULL, NULL);
    154 
    155 /*
    156  * Polled fallback, used before the interrupt handler is established.
    157  */
    158 static int
    159 jzmmc_wait_iflg_poll(struct jzmmc_softc *sc, uint32_t mask, int timo_ms)
    160 {
    161 	int us = timo_ms * 1000;
    162 	int spin;
    163 
    164 	for (spin = 200; spin > 0 && us > 0; spin--) {
    165 		if (MR4(sc, JZ_MSC_IFLG) & mask)
    166 			return 0;
    167 		delay(5);
    168 		us -= 5;
    169 	}
    170 	while (us > 0) {
    171 		if (MR4(sc, JZ_MSC_IFLG) & mask)
    172 			return 0;
    173 		kpause("jzmmcw", false, mstohz(10) ? mstohz(10) : 1, NULL);
    174 		us -= 10000;
    175 	}
    176 	return ETIMEDOUT;
    177 }
    178 
    179 /*
    180  * Interrupt-driven wait
    181  */
    182 static int
    183 jzmmc_wait_iflg(struct jzmmc_softc *sc, uint32_t mask, int timo_ms)
    184 {
    185 	int error, timo;
    186 
    187 	if (!sc->sc_use_intr || cold) {
    188 		error = jzmmc_wait_iflg_poll(sc, mask, timo_ms);
    189 		goto out;
    190 	}
    191 
    192 	mutex_enter(&sc->sc_intr_lock);
    193 	MW4(sc, JZ_MSC_IMASK, MR4(sc, JZ_MSC_IMASK) & ~mask);
    194 	timo = mstohz(timo_ms) ? mstohz(timo_ms) : 1;
    195 	while ((MR4(sc, JZ_MSC_IFLG) & mask) == 0) {
    196 		error = cv_timedwait(&sc->sc_intr_cv, &sc->sc_intr_lock, timo);
    197 		if (error != 0)
    198 			break;
    199 	}
    200 	MW4(sc, JZ_MSC_IMASK, MR4(sc, JZ_MSC_IMASK) | mask);
    201 	error = (MR4(sc, JZ_MSC_IFLG) & mask) ? 0 : ETIMEDOUT;
    202 	mutex_exit(&sc->sc_intr_lock);
    203 out:
    204 	if (error != 0) {
    205 		DPRINTF("%s: timeout waiting for iflg %08x "
    206 		    "(iflg %08x stat %08x)\n",
    207 		    device_xname(sc->sc_dev), mask, MR4(sc, JZ_MSC_IFLG),
    208 		    MR4(sc, JZ_MSC_STAT));
    209 	}
    210 	return error;
    211 }
    212 
    213 static int
    214 jzmmc_intr(void *arg)
    215 {
    216 	struct jzmmc_softc *sc = arg;
    217 	uint32_t pend, imask;
    218 
    219 	mutex_enter(&sc->sc_intr_lock);
    220 	imask = MR4(sc, JZ_MSC_IMASK);
    221 	pend = MR4(sc, JZ_MSC_IFLG) & ~imask;
    222 	if (pend == 0) {
    223 		mutex_exit(&sc->sc_intr_lock);
    224 		return 0;
    225 	}
    226 	MW4(sc, JZ_MSC_IMASK, imask | pend);
    227 	cv_broadcast(&sc->sc_intr_cv);
    228 	mutex_exit(&sc->sc_intr_lock);
    229 	return 1;
    230 }
    231 
    232 static int
    233 jzmmc_controller_reset(struct jzmmc_softc *sc)
    234 {
    235 	int timo;
    236 
    237 	MW2(sc, JZ_MSC_CTRL, JZ_RESET);
    238 	delay(20);
    239 	for (timo = 1000; timo > 0; timo--) {
    240 		if ((MR4(sc, JZ_MSC_STAT) & JZ_IS_RESETTING) == 0)
    241 			break;
    242 		delay(10);
    243 	}
    244 	if (timo == 0)
    245 		return ETIMEDOUT;
    246 
    247 	/* mask all interrupts (we poll), ack any stale flags */
    248 	MW4(sc, JZ_MSC_IMASK, 0xffffffff);
    249 	MW4(sc, JZ_MSC_IFLG, 0xffffffff);
    250 	/* generous hardware timeouts, in MSC_CLK cycles */
    251 	MW2(sc, JZ_MSC_RESTO, 0xffff);
    252 	MW4(sc, JZ_MSC_RDTO, 0xffffffff);
    253 	/* keep the internal DMA engine off the FIFO between transfers */
    254 	MW4(sc, JZ_MSC_DMAC, 0);
    255 	return 0;
    256 }
    257 
    258 /*
    259  * Allocate the SDMA descriptor ring
    260  */
    261 static int
    262 jzmmc_dma_init(struct jzmmc_softc *sc)
    263 {
    264 	int error, rseg;
    265 	void *kva;
    266 
    267 	error = bus_dmamem_alloc(sc->sc_dmat, JZMMC_NDESC * JZMMC_DESC_SIZE,
    268 	    JZMMC_DESC_SIZE, 0, &sc->sc_desc_seg, 1, &rseg, BUS_DMA_WAITOK);
    269 	if (error != 0)
    270 		return error;
    271 	error = bus_dmamem_map(sc->sc_dmat, &sc->sc_desc_seg, rseg,
    272 	    JZMMC_NDESC * JZMMC_DESC_SIZE, &kva,
    273 	    BUS_DMA_WAITOK | BUS_DMA_COHERENT);
    274 	if (error != 0)
    275 		goto free;
    276 	error = bus_dmamap_create(sc->sc_dmat, JZMMC_NDESC * JZMMC_DESC_SIZE,
    277 	    1, JZMMC_NDESC * JZMMC_DESC_SIZE, 0, BUS_DMA_WAITOK,
    278 	    &sc->sc_desc_map);
    279 	if (error != 0)
    280 		goto unmap;
    281 	error = bus_dmamap_load(sc->sc_dmat, sc->sc_desc_map, kva,
    282 	    JZMMC_NDESC * JZMMC_DESC_SIZE, NULL, BUS_DMA_WAITOK);
    283 	if (error != 0)
    284 		goto destroy;
    285 	sc->sc_desc = kva;
    286 	return 0;
    287 
    288 destroy:
    289 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_desc_map);
    290 unmap:
    291 	bus_dmamem_unmap(sc->sc_dmat, kva, JZMMC_NDESC * JZMMC_DESC_SIZE);
    292 free:
    293 	bus_dmamem_free(sc->sc_dmat, &sc->sc_desc_seg, rseg);
    294 	return error;
    295 }
    296 
    297 /*
    298  * Build the descriptor chain for cmd's dmamap, one descriptor per
    299  * segment, and hand it to the engine.
    300  */
    301 static void
    302 jzmmc_dma_prepare(struct jzmmc_softc *sc, struct sdmmc_command *cmd)
    303 {
    304 	bus_dmamap_t map = cmd->c_dmamap;
    305 	const bus_addr_t ring = sc->sc_desc_map->dm_segs[0].ds_addr;
    306 	bus_size_t resid = cmd->c_datalen, len;
    307 	uint32_t *d;
    308 	int seg;
    309 
    310 	KASSERT(map->dm_nsegs > 0 && map->dm_nsegs <= JZMMC_NDESC);
    311 	KASSERT(map->dm_mapsize >= cmd->c_datalen);
    312 	for (seg = 0; resid > 0; seg++) {
    313 		KASSERT(seg < map->dm_nsegs);
    314 		KASSERT(((map->dm_segs[seg].ds_addr |
    315 		    map->dm_segs[seg].ds_len) & 0x3) == 0);
    316 		len = MIN(map->dm_segs[seg].ds_len, resid);
    317 		resid -= len;
    318 		d = &sc->sc_desc[seg * JZMMC_DESC_WORDS];
    319 		d[JZMMC_DESC_NDA] = resid == 0 ? 0 :
    320 		    ring + (seg + 1) * JZMMC_DESC_SIZE;
    321 		d[JZMMC_DESC_DA] = map->dm_segs[seg].ds_addr;
    322 		d[JZMMC_DESC_LEN] = len;
    323 		d[JZMMC_DESC_CMD] = resid == 0 ?
    324 		    (JZ_DMA_ENDI | JZ_DMA_LINK) : 0;
    325 	}
    326 	wbflush();
    327 	MW4(sc, JZ_MSC_DMANDA, ring);
    328 }
    329 
    330 static int
    331 jzmmc_match(device_t parent, cfdata_t match, void *aux)
    332 {
    333 	struct apbus_attach_args *aa = aux;
    334 
    335 	if (strcmp(aa->aa_name, "jzmmc") != 0)
    336 		return 0;
    337 	if (aa->aa_addr != JZ_MSC1_BASE)
    338 		return 0;
    339 	return 1;
    340 }
    341 
    342 static void
    343 jzmmc_attach(device_t parent, device_t self, void *aux)
    344 {
    345 	struct jzmmc_softc *sc = device_private(self);
    346 	struct apbus_attach_args *aa = aux;
    347 	struct sdmmcbus_attach_args saa;
    348 	int error;
    349 	size_t i;
    350 
    351 	sc->sc_dev = self;
    352 	sc->sc_bst = aa->aa_bst;
    353 	sc->sc_dmat = aa->aa_dmat;
    354 	sc->sc_widthbits = JZ_BUS_1BIT;
    355 	sc->sc_inited = false;
    356 
    357 	aprint_naive("\n");
    358 	aprint_normal(": SD/MMC controller\n");
    359 
    360 	error = bus_space_map(aa->aa_bst, aa->aa_addr, JZMMC_REG_SIZE, 0, &sc->sc_bsh);
    361 	if (error != 0) {
    362 		aprint_error_dev(self, "can't map registers: %d\n", error);
    363 		return;
    364 	}
    365 
    366 	/* mux the SD-slot pins to MSC1 (port E function 1), CD as input */
    367 	for (i = 0; i < __arraycount(jzmmc_sdslot_pins); i++)
    368 		gpio_as_dev1(JZMMC_GPIO_E, jzmmc_sdslot_pins[i]);
    369 	gpio_as_input(JZMMC_GPIO_F, JZMMC_CD_PIN);
    370 
    371 	/* device clock from the CGU: MPLL / ((div+1)*2) */
    372 	error = ingenic_cdr_set(aa->aa_clockreg,
    373 	    MSCCDR_MPLL | JZMMC_CDR_DIV);
    374 	if (error != 0) {
    375 		aprint_error_dev(self, "clock divider stuck busy\n");
    376 		goto fail;
    377 	}
    378 	aprint_normal_dev(self, "device clock %d kHz (MPLL assumed %d kHz)\n",
    379 	    JZMMC_DEVCLK_KHZ, JZMMC_MPLL_KHZ);
    380 
    381 	if (jzmmc_controller_reset(sc) != 0) {
    382 		aprint_error_dev(self, "controller stuck in reset, stat %08x\n",
    383 		    MR4(sc, JZ_MSC_STAT));
    384 		goto fail;
    385 	}
    386 
    387 	mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_VM);
    388 	cv_init(&sc->sc_intr_cv, "jzmmcirq");
    389 
    390 	/*
    391 	 * All interrupts are masked (and stay masked outside of waits),
    392 	 * so establishing the handler this early is safe.
    393 	 */
    394 	sc->sc_ih = evbmips_intr_establish(aa->aa_irq, jzmmc_intr, sc);
    395 	if (sc->sc_ih == NULL)
    396 		aprint_error_dev(self, "can't establish interrupt, polling\n");
    397 	sc->sc_use_intr = sc->sc_ih != NULL;
    398 
    399 	error = jzmmc_dma_init(sc);
    400 	if (error != 0)
    401 		aprint_error_dev(self,
    402 		    "can't set up DMA descriptors (%d), using PIO\n", error);
    403 	sc->sc_use_dma = error == 0;
    404 
    405 	aprint_normal_dev(self, "card %spresent\n",
    406 	    jzmmc_card_detect(sc) ? "" : "not ");
    407 
    408 	memset(&saa, 0, sizeof(saa));
    409 	saa.saa_busname = "sdmmc";
    410 	saa.saa_sct = &jzmmc_chip_functions;
    411 	saa.saa_sch = sc;
    412 	saa.saa_dmat = aa->aa_dmat;
    413 	saa.saa_clkmin = JZMMC_DEVCLK_KHZ / 128;
    414 	/*
    415 	 * 50MHz (CLKRT = 0) is only used for SD high-speed timing
    416 	 */
    417 	saa.saa_clkmax = JZMMC_DEVCLK_KHZ;
    418 	saa.saa_caps = SMC_CAPS_4BIT_MODE | SMC_CAPS_POLL_CARD_DET |
    419 	    SMC_CAPS_SD_HIGHSPEED | SMC_CAPS_AUTO_STOP;
    420 	if (sc->sc_use_dma) {
    421 		saa.saa_caps |= SMC_CAPS_DMA | SMC_CAPS_MULTI_SEG_DMA;
    422 		/* the framework bounces buffers this can't express */
    423 		saa.saa_dma_align_mask = 0x3;
    424 	}
    425 
    426 	sc->sc_sdmmc = config_found(self, &saa, NULL, CFARGS_NONE);
    427 	return;
    428 
    429 fail:
    430 	bus_space_unmap(aa->aa_bst, sc->sc_bsh, JZMMC_REG_SIZE);
    431 }
    432 
    433 static int
    434 jzmmc_host_reset(sdmmc_chipset_handle_t sch)
    435 {
    436 	struct jzmmc_softc *sc = sch;
    437 
    438 	sc->sc_inited = false;
    439 	return jzmmc_controller_reset(sc);
    440 }
    441 
    442 static uint32_t
    443 jzmmc_host_ocr(sdmmc_chipset_handle_t sch)
    444 {
    445 
    446 	return MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V;
    447 }
    448 
    449 static int
    450 jzmmc_host_maxblklen(sdmmc_chipset_handle_t sch)
    451 {
    452 
    453 	return 512;
    454 }
    455 
    456 static int
    457 jzmmc_card_detect(sdmmc_chipset_handle_t sch)
    458 {
    459 
    460 	/* PF20, active low */
    461 	return !gpio_get(JZMMC_GPIO_F, JZMMC_CD_PIN);
    462 }
    463 
    464 static int
    465 jzmmc_write_protect(sdmmc_chipset_handle_t sch)
    466 {
    467 
    468 	return 0;	/* no write-protect switch wired up */
    469 }
    470 
    471 static int
    472 jzmmc_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr)
    473 {
    474 
    475 	return 0;	/* fixed always-on 3.3V */
    476 }
    477 
    478 static int
    479 jzmmc_bus_clock(sdmmc_chipset_handle_t sch, int freq)
    480 {
    481 	struct jzmmc_softc *sc = sch;
    482 	int n;
    483 
    484 	if (freq == 0) {
    485 		MW2(sc, JZ_MSC_CTRL, JZ_CLOCK_STOP);
    486 		return 0;
    487 	}
    488 	/* smallest 2^n divider with devclk/2^n <= freq (in kHz) */
    489 	for (n = 0; n < 7; n++) {
    490 		if ((JZMMC_DEVCLK_KHZ >> n) <= freq)
    491 			break;
    492 	}
    493 	MW2(sc, JZ_MSC_CLKRT, n);
    494 	/*
    495 	 * Above 25MHz the controller MUST drive CMD/DAT a quarter clock
    496 	 * early and sample on the rising edge... without this every
    497 	 * transfer fails with CRC errors.
    498 	 */
    499 	if ((JZMMC_DEVCLK_KHZ >> n) > 25000)
    500 		MW4(sc, JZ_MSC_LPM, JZ_RISING_4 | JZ_SMP_SEL | JZ_LPM);
    501 	else
    502 		MW4(sc, JZ_MSC_LPM, 0);
    503 	DPRINTF("%s: clock req %d kHz -> CLKRT %d (%d kHz)\n",
    504 	    device_xname(sc->sc_dev), freq, n, JZMMC_DEVCLK_KHZ >> n);
    505 	return 0;
    506 }
    507 
    508 static int
    509 jzmmc_bus_width(sdmmc_chipset_handle_t sch, int width)
    510 {
    511 	struct jzmmc_softc *sc = sch;
    512 
    513 	switch (width) {
    514 	case 1:
    515 		sc->sc_widthbits = JZ_BUS_1BIT;
    516 		break;
    517 	case 4:
    518 		sc->sc_widthbits = JZ_BUS_4BIT;
    519 		break;
    520 	default:
    521 		return EINVAL;
    522 	}
    523 	return 0;
    524 }
    525 
    526 static int
    527 jzmmc_bus_rod(sdmmc_chipset_handle_t sch, int on)
    528 {
    529 
    530 	return ENOTSUP;
    531 }
    532 
    533 static void
    534 jzmmc_card_enable_intr(sdmmc_chipset_handle_t sch, int enable)
    535 {
    536 	/* no SDIO support */
    537 }
    538 
    539 static void
    540 jzmmc_card_intr_ack(sdmmc_chipset_handle_t sch)
    541 {
    542 	/* no SDIO support */
    543 }
    544 
    545 static void
    546 jzmmc_read_response(struct jzmmc_softc *sc, struct sdmmc_command *cmd)
    547 {
    548 	uint32_t b[4];
    549 	uint16_t r[9];
    550 	int i;
    551 
    552 	if (!ISSET(cmd->c_flags, SCF_RSP_PRESENT))
    553 		return;
    554 
    555 	if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    556 		bus_space_read_multi_2(sc->sc_bst, sc->sc_bsh, JZ_MSC_RES,
    557 		    r, 9);
    558 		/* byte-carried halfwords: b[i] spans r[2i]..r[2i+2] */
    559 		for (i = 0; i < 4; i++) {
    560 			b[i] = ((uint32_t)r[2 * i] << 24) |
    561 			    ((uint32_t)r[2 * i + 1] << 8) |
    562 			    ((uint32_t)r[2 * i + 2] >> 8);
    563 		}
    564 		/* b[0] = bits 127:96 of the payload ... b[3] = bits 31:0 */
    565 		cmd->c_resp[0] = (b[2] << 24) | (b[3] >> 8);
    566 		cmd->c_resp[1] = (b[1] << 24) | (b[2] >> 8);
    567 		cmd->c_resp[2] = (b[0] << 24) | (b[1] >> 8);
    568 		cmd->c_resp[3] = b[0] >> 8;
    569 		DPRINTF("%s: R2 raw %08x %08x %08x %08x -> resp %08x %08x %08x %08x\n",
    570 		    device_xname(sc->sc_dev), b[0], b[1], b[2], b[3],
    571 		    cmd->c_resp[0], cmd->c_resp[1], cmd->c_resp[2],
    572 		    cmd->c_resp[3]);
    573 	} else {
    574 		bus_space_read_multi_2(sc->sc_bst, sc->sc_bsh, JZ_MSC_RES,
    575 		    r, 3);
    576 		cmd->c_resp[0] = ((uint32_t)r[0] << 24) |
    577 		    ((uint32_t)r[1] << 8) | (r[2] & 0xff);
    578 	}
    579 }
    580 
    581 static int
    582 jzmmc_pio_read(struct jzmmc_softc *sc, struct sdmmc_command *cmd)
    583 {
    584 	uint32_t *p = cmd->c_data;
    585 	size_t nwords = cmd->c_datalen / 4;
    586 	uint32_t stat;
    587 	int guard, spin;
    588 
    589 	DPRINTF("%s: pio_read %zu words, rtcnt %u iflg %08x stat %08x\n",
    590 	    device_xname(sc->sc_dev), nwords, MR4(sc, JZ_MSC_RTCNT),
    591 	    MR4(sc, JZ_MSC_IFLG), MR4(sc, JZ_MSC_STAT));
    592 	guard = 100;		/* ~1s: 100 x 10ms kpause */
    593 	spin = 2000;
    594 	while (nwords > 0) {
    595 		stat = MR4(sc, JZ_MSC_STAT);
    596 		if (stat & JZ_TIME_OUT_READ)
    597 			return ETIMEDOUT;
    598 		if (stat & JZ_CRC_READ_ERR)
    599 			return EIO;
    600 		/*
    601 		 * the FIFO carries a byte stream, which a byte-swapping
    602 		 * bus_space must not reorder. Burst when the trigger
    603 		 * level guarantees a full JZMMC_FIFO_BURST, drain
    604 		 * word-wise below it.
    605 		 */
    606 		if (nwords >= JZMMC_FIFO_BURST &&
    607 		    (MR4(sc, JZ_MSC_IFLG) & JZ_INT_RXFIFO_RD_REQ)) {
    608 			bus_space_read_multi_stream_4(sc->sc_bst, sc->sc_bsh,
    609 			    JZ_MSC_RXFIFO, p, JZMMC_FIFO_BURST);
    610 			p += JZMMC_FIFO_BURST;
    611 			nwords -= JZMMC_FIFO_BURST;
    612 			spin = 2000;
    613 			continue;
    614 		}
    615 		if ((stat & JZ_DATA_FIFO_EMPTY) == 0) {
    616 			bus_space_read_multi_stream_4(sc->sc_bst, sc->sc_bsh,
    617 			    JZ_MSC_RXFIFO, p, 1);
    618 			p++;
    619 			nwords--;
    620 			spin = 2000;
    621 			continue;
    622 		}
    623 		if (spin > 0) {
    624 			spin--;
    625 			delay(1);
    626 		} else {
    627 			if (--guard == 0)
    628 				return ETIMEDOUT;
    629 			kpause("jzmmcr", false,
    630 			    mstohz(10) ? mstohz(10) : 1, NULL);
    631 		}
    632 	}
    633 	return 0;
    634 }
    635 
    636 static int
    637 jzmmc_pio_write(struct jzmmc_softc *sc, struct sdmmc_command *cmd)
    638 {
    639 	const uint32_t *p = cmd->c_data;
    640 	size_t nwords = cmd->c_datalen / 4;
    641 	uint32_t stat;
    642 	int guard, spin;
    643 
    644 	guard = 100;
    645 	spin = 2000;
    646 	while (nwords > 0) {
    647 		stat = MR4(sc, JZ_MSC_STAT);
    648 		if ((stat & JZ_CRC_WRITE_ERR_M) != JZ_CRC_WRITE_OK)
    649 			return EIO;
    650 		if (nwords >= JZMMC_FIFO_BURST &&
    651 		    (MR4(sc, JZ_MSC_IFLG) & JZ_INT_TXFIFO_WR_REQ)) {
    652 			bus_space_write_multi_stream_4(sc->sc_bst, sc->sc_bsh,
    653 			    JZ_MSC_TXFIFO, p, JZMMC_FIFO_BURST);
    654 			p += JZMMC_FIFO_BURST;
    655 			nwords -= JZMMC_FIFO_BURST;
    656 			spin = 2000;
    657 			continue;
    658 		}
    659 		if ((stat & JZ_DATA_FIFO_FULL) == 0) {
    660 			bus_space_write_multi_stream_4(sc->sc_bst, sc->sc_bsh,
    661 			    JZ_MSC_TXFIFO, p, 1);
    662 			p++;
    663 			nwords--;
    664 			spin = 2000;
    665 			continue;
    666 		}
    667 		if (spin > 0) {
    668 			spin--;
    669 			delay(1);
    670 		} else {
    671 			if (--guard == 0)
    672 				return ETIMEDOUT;
    673 			kpause("jzmmcw", false,
    674 			    mstohz(10) ? mstohz(10) : 1, NULL);
    675 		}
    676 	}
    677 	return 0;
    678 }
    679 
    680 static int
    681 jzmmc_dma_wait_read(struct jzmmc_softc *sc, struct sdmmc_command *cmd)
    682 {
    683 	const uint32_t errbits = JZ_INT_TIMEOUT_READ | JZ_INT_CRC_READ_ERR;
    684 	uint32_t stat;
    685 	int error;
    686 
    687 	error = jzmmc_wait_iflg(sc, JZ_INT_DMAEND | errbits, 5000);
    688 	stat = MR4(sc, JZ_MSC_STAT);
    689 	if (error != 0) {
    690 		if ((stat & (JZ_TIME_OUT_READ | JZ_CRC_READ_ERR)) == 0) {
    691 			if (sc->sc_dma_fails++ < 5)
    692 				device_printf(sc->sc_dev,
    693 				    "silent DMA fail: dmanda %08x "
    694 				    "dmada %08x dmalen %08x dmacmd %08x "
    695 				    "snob %d\n",
    696 				    MR4(sc, JZ_MSC_DMANDA),
    697 				    MR4(sc, JZ_MSC_DMADA),
    698 				    MR4(sc, JZ_MSC_DMALEN),
    699 				    MR4(sc, JZ_MSC_DMACMD),
    700 				    MR2(sc, JZ_MSC_SNOB));
    701 		}
    702 		return error;
    703 	}
    704 	MW4(sc, JZ_MSC_IFLG,
    705 	    MR4(sc, JZ_MSC_IFLG) & (JZ_INT_DMAEND | errbits));
    706 	if (stat & JZ_TIME_OUT_READ)
    707 		return ETIMEDOUT;
    708 	if (stat & JZ_CRC_READ_ERR)
    709 		return EIO;
    710 	return 0;
    711 }
    712 
    713 static void
    714 jzmmc_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
    715 {
    716 	struct jzmmc_softc *sc = sch;
    717 	uint32_t cmdat, stat, iflg;
    718 	bool dma = false, autostop = false;
    719 	int error = 0;
    720 
    721 #ifdef JZMMC_DEBUG_VERBOSE
    722 	printf("%s: CMD%d arg %08x flags %#x datalen %d\n",
    723 	    device_xname(sc->sc_dev), cmd->c_opcode, cmd->c_arg,
    724 	    cmd->c_flags, cmd->c_datalen);
    725 #endif
    726 
    727 	cmdat = sc->sc_widthbits;
    728 
    729 	/* response format */
    730 	if (!ISSET(cmd->c_flags, SCF_RSP_PRESENT))
    731 		cmdat |= JZ_RES_NONE;
    732 	else if (ISSET(cmd->c_flags, SCF_RSP_136))
    733 		cmdat |= JZ_RES_R2;
    734 	else if (!ISSET(cmd->c_flags, SCF_RSP_CRC))
    735 		cmdat |= JZ_RES_R3;
    736 	else {
    737 		cmdat |= JZ_RES_R1;
    738 		if (ISSET(cmd->c_flags, SCF_RSP_BSY))
    739 			cmdat |= JZ_BUSY;
    740 	}
    741 
    742 	if (!sc->sc_inited) {
    743 		cmdat |= JZ_INIT;
    744 		sc->sc_inited = true;
    745 	}
    746 
    747 	if (cmd->c_datalen > 0) {
    748 		if (cmd->c_blklen == 0 || (cmd->c_datalen % 4) != 0) {
    749 			error = EINVAL;
    750 			goto done;
    751 		}
    752 		cmdat |= JZ_DATA_EN;
    753 		if (!ISSET(cmd->c_flags, SCF_CMD_READ))
    754 			cmdat |= JZ_WRITE;
    755 		dma = sc->sc_use_dma && cmd->c_dmamap != NULL;
    756 		if (dma) {
    757 			jzmmc_dma_prepare(sc, cmd);
    758 		} else {
    759 			/*
    760 			 * PIO: the internal descriptor DMA must be explicitly
    761 			 * disabled or it owns the data FIFO's read port
    762 			 */
    763 			MW4(sc, JZ_MSC_DMAC, 0);
    764 		}
    765 		MW2(sc, JZ_MSC_BLKLEN, cmd->c_blklen);
    766 		MW2(sc, JZ_MSC_NOB, cmd->c_datalen / cmd->c_blklen);
    767 		/*
    768 		 * Multi-block transfers need STOP_TRANSMISSION
    769 		 */
    770 		if (cmd->c_datalen > cmd->c_blklen) {
    771 			cmdat |= JZ_AUTO_CMD12;
    772 			autostop = true;
    773 		}
    774 	}
    775 
    776 	MW4(sc, JZ_MSC_IFLG, 0xffffffff);	/* ack stale flags */
    777 	MW1(sc, JZ_MSC_CMD, cmd->c_opcode);
    778 	MW4(sc, JZ_MSC_ARG, cmd->c_arg);
    779 	MW4(sc, JZ_MSC_CMDAT, cmdat);
    780 	MW2(sc, JZ_MSC_CTRL, JZ_CLOCK_START | JZ_START_OP);
    781 	/*
    782 	 * The engine may be enabled only once the operation has started
    783 	 */
    784 	if (dma)
    785 		MW4(sc, JZ_MSC_DMAC, JZ_INCR_16 | JZ_DMAEN);
    786 
    787 
    788 	error = jzmmc_wait_iflg(sc, JZ_INT_EMD_CMD_RES, 200);
    789 	if (error != 0)
    790 		goto done;
    791 	/*
    792 	 * Snapshot both status views BEFORE acknowledging anything
    793 	 */
    794 	iflg = MR4(sc, JZ_MSC_IFLG);
    795 	stat = MR4(sc, JZ_MSC_STAT);
    796 	if ((stat & JZ_TIME_OUT_RES) || (iflg & JZ_INT_TIMEOUT_RES)) {
    797 		MW4(sc, JZ_MSC_IFLG,
    798 		    JZ_INT_EMD_CMD_RES | JZ_INT_TIMEOUT_RES);
    799 		/*
    800 		 * ensure that we don't get phantom cards
    801 		 */
    802 		error = ETIMEDOUT;
    803 		goto done;
    804 	}
    805 	MW4(sc, JZ_MSC_IFLG, JZ_INT_EMD_CMD_RES);
    806 	if ((stat & JZ_CRC_RES_ERR) && ISSET(cmd->c_flags, SCF_RSP_CRC)) {
    807 		error = EIO;
    808 		goto done;
    809 	}
    810 
    811 	jzmmc_read_response(sc, cmd);
    812 
    813 	if (cmd->c_datalen > 0) {
    814 		if (dma) {
    815 			/* DMA writes complete via the common tail below */
    816 			if (ISSET(cmd->c_flags, SCF_CMD_READ))
    817 				error = jzmmc_dma_wait_read(sc, cmd);
    818 		} else if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    819 			error = jzmmc_pio_read(sc, cmd);
    820 		} else {
    821 			error = jzmmc_pio_write(sc, cmd);
    822 		}
    823 #ifdef JZMMC_DEBUG
    824 		if (error == 0 && cmd->c_datalen <= 8 && !dma &&
    825 		    ISSET(cmd->c_flags, SCF_CMD_READ)) {
    826 			const uint8_t *db = cmd->c_data;
    827 			printf("%s: CMD%d data:", device_xname(sc->sc_dev),
    828 			    cmd->c_opcode);
    829 			for (size_t j = 0; j < cmd->c_datalen; j++)
    830 				printf(" %02x", db[j]);
    831 			printf("\n");
    832 		}
    833 #endif
    834 		if (error != 0)
    835 			goto done;
    836 
    837 		error = jzmmc_wait_iflg(sc, JZ_INT_DATA_TRAN_DONE, 5000);
    838 		if (error != 0)
    839 			goto done;
    840 		MW4(sc, JZ_MSC_IFLG, JZ_INT_DATA_TRAN_DONE);
    841 
    842 		if (autostop) {
    843 			/* controller-generated CMD12 (and its response) */
    844 			error = jzmmc_wait_iflg(sc,
    845 			    JZ_INT_AUTO_CMD12_DONE, 5000);
    846 			if (error != 0)
    847 				goto done;
    848 			MW4(sc, JZ_MSC_IFLG, JZ_INT_AUTO_CMD12_DONE);
    849 		}
    850 
    851 		if (!ISSET(cmd->c_flags, SCF_CMD_READ)) {
    852 			/* wait for the card to finish programming */
    853 			error = jzmmc_wait_iflg(sc, JZ_INT_PRG_DONE, 5000);
    854 			if (error != 0)
    855 				goto done;
    856 			MW4(sc, JZ_MSC_IFLG, JZ_INT_PRG_DONE);
    857 			stat = MR4(sc, JZ_MSC_STAT);
    858 			if ((stat & JZ_CRC_WRITE_ERR_M) != JZ_CRC_WRITE_OK)
    859 				error = EIO;
    860 		}
    861 		/*
    862 		 * with the transfer fully over, take the engine off the FIFO
    863 		 */
    864 		if (dma)
    865 			MW4(sc, JZ_MSC_DMAC, 0);
    866 	}
    867 
    868 done:
    869 	if (error != 0) {
    870 		DPRINTF("%s: CMD%d error %d (stat %08x iflg %08x snob %d)\n",
    871 		    device_xname(sc->sc_dev), cmd->c_opcode, error,
    872 		    MR4(sc, JZ_MSC_STAT), MR4(sc, JZ_MSC_IFLG),
    873 		    MR2(sc, JZ_MSC_SNOB));
    874 		if (dma)
    875 			MW4(sc, JZ_MSC_DMAC, 0);
    876 		/*
    877 		 * Reset the controller so a failed command doesn't
    878 		 * break the following ones.
    879 		 */
    880 		jzmmc_controller_reset(sc);
    881 	}
    882 	cmd->c_error = error;
    883 	SET(cmd->c_flags, SCF_ITSDONE);
    884 }
    885 
    886