Home | History | Annotate | Line # | Download | only in imx
imx23_ssp.c revision 1.3
      1 /* $Id: imx23_ssp.c,v 1.3 2013/03/03 10:33:56 jkunz Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2012 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Petri Laakso.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include <sys/param.h>
     33 #include <sys/types.h>
     34 #include <sys/bus.h>
     35 #include <sys/cdefs.h>
     36 #include <sys/condvar.h>
     37 #include <sys/device.h>
     38 #include <sys/errno.h>
     39 #include <sys/mutex.h>
     40 #include <sys/systm.h>
     41 
     42 #include <arm/pic/picvar.h>
     43 
     44 #include <arm/imx/imx23_apbdmavar.h>
     45 #include <arm/imx/imx23_icollreg.h>
     46 #include <arm/imx/imx23_sspreg.h>
     47 #include <arm/imx/imx23var.h>
     48 
     49 #include <dev/sdmmc/sdmmcchip.h>
     50 #include <dev/sdmmc/sdmmcreg.h>
     51 #include <dev/sdmmc/sdmmcvar.h>
     52 
     53 /*
     54  * SD/MMC host controller driver for i.MX23.
     55  *
     56  * TODO:
     57  *
     58  * - Add support for SMC_CAPS_AUTO_STOP.
     59  */
     60 
     61 #define DMA_MAXNSEGS ((MAXPHYS / PAGE_SIZE) + 1)
     62 
     63 typedef struct issp_softc {
     64 	device_t sc_dev;
     65 	apbdma_softc_t sc_dmac;
     66 	bus_dma_tag_t sc_dmat;
     67 	bus_dmamap_t sc_dmamp;
     68 	bus_size_t sc_chnsiz;
     69 	bus_dma_segment_t sc_ds[1];
     70 	int sc_rseg;
     71 	bus_space_handle_t sc_hdl;
     72 	bus_space_tag_t sc_iot;
     73 	device_t sc_sdmmc;
     74 	kmutex_t sc_lock;
     75 	struct kcondvar sc_intr_cv;
     76 	unsigned int dma_channel;
     77 	uint32_t sc_dma_error;
     78 	uint32_t sc_irq_error;
     79 	uint8_t sc_state;
     80 	uint8_t sc_bus_width;
     81 } *issp_softc_t;
     82 
     83 static int	issp_match(device_t, cfdata_t, void *);
     84 static void	issp_attach(device_t, device_t, void *);
     85 static int	issp_activate(device_t, enum devact);
     86 
     87 static void	issp_reset(struct issp_softc *);
     88 static void	issp_init(struct issp_softc *);
     89 static uint32_t	issp_set_sck(struct issp_softc *, uint32_t);
     90 static int	issp_dma_intr(void *);
     91 static int	issp_error_intr(void *);
     92 static void	issp_ack_intr(struct issp_softc *);
     93 static void	issp_create_dma_cmd_list_multi(issp_softc_t, void *,
     94     struct sdmmc_command *);
     95 static void	issp_create_dma_cmd_list_single(issp_softc_t, void *,
     96     struct sdmmc_command *);
     97 static void	issp_create_dma_cmd_list(issp_softc_t, void *,
     98     struct sdmmc_command *);
     99 
    100 /* sdmmc(4) driver chip function prototypes. */
    101 static int	issp_host_reset(sdmmc_chipset_handle_t);
    102 static uint32_t	issp_host_ocr(sdmmc_chipset_handle_t);
    103 static int	issp_host_maxblklen(sdmmc_chipset_handle_t);
    104 static int	issp_card_detect(sdmmc_chipset_handle_t);
    105 static int	issp_write_protect(sdmmc_chipset_handle_t);
    106 static int	issp_bus_power(sdmmc_chipset_handle_t, uint32_t);
    107 static int	issp_bus_clock(sdmmc_chipset_handle_t, int);
    108 static int	issp_bus_width(sdmmc_chipset_handle_t, int);
    109 static int	issp_bus_rod(sdmmc_chipset_handle_t, int);
    110 static void	issp_exec_command(sdmmc_chipset_handle_t,
    111 		struct sdmmc_command *);
    112 static void	issp_card_enable_intr(sdmmc_chipset_handle_t, int);
    113 static void	issp_card_intr_ack(sdmmc_chipset_handle_t);
    114 
    115 static struct sdmmc_chip_functions issp_functions = {
    116 	.host_reset	= issp_host_reset,
    117 	.host_ocr	= issp_host_ocr,
    118 	.host_maxblklen	= issp_host_maxblklen,
    119 	.card_detect	= issp_card_detect,
    120 	.write_protect	= issp_write_protect,
    121 	.bus_power	= issp_bus_power,
    122 	.bus_clock	= issp_bus_clock,
    123 	.bus_width	= issp_bus_width,
    124 	.bus_rod	= issp_bus_rod,
    125 	.exec_command	= issp_exec_command,
    126 	.card_enable_intr = issp_card_enable_intr,
    127 	.card_intr_ack	= issp_card_intr_ack
    128 };
    129 
    130 CFATTACH_DECL3_NEW(ssp,
    131 	sizeof(struct issp_softc),
    132 	issp_match,
    133 	issp_attach,
    134 	NULL,
    135 	issp_activate,
    136 	NULL,
    137 	NULL,
    138 	0
    139 );
    140 
    141 #define SSP_SOFT_RST_LOOP 455	/* At least 1 us ... */
    142 
    143 #define SSP_RD(sc, reg)							\
    144 	bus_space_read_4(sc->sc_iot, sc->sc_hdl, (reg))
    145 #define SSP_WR(sc, reg, val)						\
    146 	bus_space_write_4(sc->sc_iot, sc->sc_hdl, (reg), (val))
    147 
    148 #define SSP_CLK		96000000	/* CLK_SSP from PLL is 96 MHz */
    149 #define SSP_CLK_MIN	400		/* 400 kHz */
    150 #define SSP_CLK_MAX	48000		/* 48 MHz */
    151 
    152 /* DATA_TIMEOUT is calculated as: * (1 / SSP_CLK) * (DATA_TIMEOUT * 4096) */
    153 #define DATA_TIMEOUT 0x4240	/* 723ms */
    154 
    155 #define BUS_WIDTH_1_BIT 0x0
    156 #define BUS_WIDTH_4_BIT 0x1
    157 #define BUS_WIDTH_8_BIT 0x2
    158 
    159 #define SSP1_ATTACHED	1
    160 #define SSP2_ATTACHED	2
    161 
    162 /* Flags for sc_state. */
    163 #define SSP_STATE_IDLE	0
    164 #define SSP_STATE_DMA	1
    165 
    166 #define PIO_WORD_CTRL0	0
    167 #define PIO_WORD_CMD0	1
    168 #define PIO_WORD_CMD1	2
    169 
    170 #define HW_SSP_CTRL1_IRQ_MASK (						\
    171     HW_SSP_CTRL1_SDIO_IRQ |						\
    172     HW_SSP_CTRL1_RESP_ERR_IRQ |						\
    173     HW_SSP_CTRL1_RESP_TIMEOUT_IRQ |					\
    174     HW_SSP_CTRL1_DATA_TIMEOUT_IRQ |					\
    175     HW_SSP_CTRL1_DATA_CRC_IRQ |						\
    176     HW_SSP_CTRL1_FIFO_UNDERRUN_IRQ |					\
    177     HW_SSP_CTRL1_RECV_TIMEOUT_IRQ |					\
    178     HW_SSP_CTRL1_FIFO_OVERRUN_IRQ)
    179 
    180 /* SSP does not support over 64k transfer size. */
    181 #define MAX_TRANSFER_SIZE 65536
    182 
    183 static int
    184 issp_match(device_t parent, cfdata_t match, void *aux)
    185 {
    186 	struct apb_attach_args *aa = aux;
    187 
    188 	if ((aa->aa_addr == HW_SSP1_BASE) && (aa->aa_size == HW_SSP1_SIZE))
    189 		return 1;
    190 
    191 	if ((aa->aa_addr == HW_SSP2_BASE) && (aa->aa_size == HW_SSP2_SIZE))
    192 		return 1;
    193 
    194 	return 0;
    195 }
    196 
    197 static void
    198 issp_attach(device_t parent, device_t self, void *aux)
    199 {
    200 	struct issp_softc *sc = device_private(self);
    201 	struct apb_softc *sc_parent = device_private(parent);
    202 	struct apb_attach_args *aa = aux;
    203 	struct sdmmcbus_attach_args saa;
    204 	static int ssp_attached = 0;
    205 	int error;
    206 	void *intr;
    207 
    208 	sc->sc_dev = self;
    209 	sc->sc_iot = aa->aa_iot;
    210 	sc->sc_dmat = aa->aa_dmat;
    211 
    212 	/* Test if device instance is already attached. */
    213 	if (aa->aa_addr == HW_SSP1_BASE && ISSET(ssp_attached, SSP1_ATTACHED)) {
    214 		aprint_error_dev(sc->sc_dev, "SSP1 already attached\n");
    215 		return;
    216 	}
    217 	if (aa->aa_addr == HW_SSP2_BASE && ISSET(ssp_attached, SSP2_ATTACHED)) {
    218 		aprint_error_dev(sc->sc_dev, "SSP2 already attached\n");
    219 		return;
    220 	}
    221 
    222 	if (aa->aa_addr == HW_SSP1_BASE) {
    223 		sc->dma_channel = APBH_DMA_CHANNEL_SSP1;
    224 	}
    225 	if (aa->aa_addr == HW_SSP2_BASE) {
    226 		sc->dma_channel = APBH_DMA_CHANNEL_SSP2;
    227 	}
    228 
    229 	/* This driver requires DMA functionality from the bus.
    230 	 * Parent bus passes handle to the DMA controller instance. */
    231 	if (sc_parent->dmac == NULL) {
    232 		aprint_error_dev(sc->sc_dev, "DMA functionality missing\n");
    233 		return;
    234 	}
    235 	sc->sc_dmac = device_private(sc_parent->dmac);
    236 
    237 	/* Initialize lock. */
    238 	mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SDMMC);
    239 
    240 	/* Condvar to wait interrupt complete. */
    241 	cv_init(&sc->sc_intr_cv, "ssp_intr");
    242 
    243 	/* Establish interrupt handlers for SSP errors and SSP DMA. */
    244 	if (aa->aa_addr == HW_SSP1_BASE) {
    245 		intr = intr_establish(IRQ_SSP1_DMA, IPL_SDMMC, IST_LEVEL,
    246 		    issp_dma_intr, sc);
    247 		if (intr == NULL) {
    248 			aprint_error_dev(sc->sc_dev, "Unable to establish "
    249 			    "interrupt for SSP1 DMA\n");
    250 			return;
    251 		}
    252 		intr = intr_establish(IRQ_SSP1_ERROR, IPL_SDMMC, IST_LEVEL,
    253 		    issp_error_intr, sc);
    254 		if (intr == NULL) {
    255 			aprint_error_dev(sc->sc_dev, "Unable to establish "
    256 			    "interrupt for SSP1 ERROR\n");
    257 			return;
    258 		}
    259 	}
    260 
    261 	if (aa->aa_addr == HW_SSP2_BASE) {
    262 		intr = intr_establish(IRQ_SSP2_DMA, IPL_SDMMC, IST_LEVEL,
    263 		    issp_dma_intr, sc);
    264 		if (intr == NULL) {
    265 			aprint_error_dev(sc->sc_dev, "Unable to establish "
    266 			    "interrupt for SSP2 DMA\n");
    267 			return;
    268 		}
    269 		intr = intr_establish(IRQ_SSP2_ERROR, IPL_SDMMC, IST_LEVEL,
    270 		    issp_error_intr, sc);
    271 		if (intr == NULL) {
    272 			aprint_error_dev(sc->sc_dev, "Unable to establish "
    273 			    "interrupt for SSP2 ERROR\n");
    274 			return;
    275 		}
    276 	}
    277 
    278 	/* Allocate DMA handle. */
    279 	error = bus_dmamap_create(sc->sc_dmat, MAXPHYS, 1, MAXPHYS,
    280 	    0, BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, &sc->sc_dmamp);
    281 	if (error) {
    282 		aprint_error_dev(sc->sc_dev,
    283 		    "Unable to allocate DMA handle\n");
    284 		return;
    285 	}
    286 
    287 	/* Allocate memory for DMA command chain. */
    288 	sc->sc_chnsiz = sizeof(struct apbdma_command) *
    289 	    (MAX_TRANSFER_SIZE / SDMMC_SECTOR_SIZE);
    290 
    291 	error = bus_dmamem_alloc(sc->sc_dmat, sc->sc_chnsiz, PAGE_SIZE, 0,
    292 	    sc->sc_ds, 1, &sc->sc_rseg, BUS_DMA_NOWAIT);
    293 	if (error) {
    294 		aprint_error_dev(sc->sc_dev,
    295 		    "Unable to allocate DMA memory\n");
    296 		return;
    297 	}
    298 
    299 	/* Initialize DMA channel. */
    300 	apbdma_chan_init(sc->sc_dmac, sc->dma_channel);
    301 
    302 	/* Map SSP bus space. */
    303 	if (bus_space_map(sc->sc_iot, aa->aa_addr, aa->aa_size, 0,
    304 	    &sc->sc_hdl)) {
    305 		aprint_error_dev(sc->sc_dev, "Unable to map SSP bus space\n");
    306 		return;
    307 	}
    308 
    309 	issp_reset(sc);
    310 	issp_init(sc);
    311 
    312 	uint32_t issp_vers = SSP_RD(sc, HW_SSP_VERSION);
    313 	aprint_normal(": SSP Block v%" __PRIuBIT ".%" __PRIuBIT "\n",
    314 	    __SHIFTOUT(issp_vers, HW_SSP_VERSION_MAJOR),
    315 	    __SHIFTOUT(issp_vers, HW_SSP_VERSION_MINOR));
    316 
    317 	/* Attach sdmmc to ssp bus. */
    318 	saa.saa_busname = "sdmmc";
    319 	saa.saa_sct	= &issp_functions;
    320 	saa.saa_spi_sct	= NULL;
    321 	saa.saa_sch	= sc;
    322 	saa.saa_dmat	= aa->aa_dmat;
    323 	saa.saa_clkmin	= SSP_CLK_MIN;
    324 	saa.saa_clkmax	= SSP_CLK_MAX;
    325 	saa.saa_caps	= SMC_CAPS_DMA | SMC_CAPS_4BIT_MODE |
    326 	    SMC_CAPS_MULTI_SEG_DMA;
    327 
    328 	sc->sc_sdmmc = config_found(sc->sc_dev, &saa, NULL);
    329 	if (sc->sc_sdmmc == NULL) {
    330 		aprint_error_dev(sc->sc_dev, "unable to attach sdmmc\n");
    331 		return;
    332 	}
    333 
    334 	/* Device instance was succesfully attached. */
    335 	if (aa->aa_addr == HW_SSP1_BASE)
    336 		ssp_attached |= SSP1_ATTACHED;
    337 	if (aa->aa_addr == HW_SSP2_BASE)
    338 		ssp_attached |= SSP2_ATTACHED;
    339 
    340 	return;
    341 }
    342 
    343 static int
    344 issp_activate(device_t self, enum devact act)
    345 {
    346 	return EOPNOTSUPP;
    347 }
    348 
    349 /*
    350  * sdmmc chip functions.
    351  */
    352 static int
    353 issp_host_reset(sdmmc_chipset_handle_t sch)
    354 {
    355 	struct issp_softc *sc = sch;
    356 	issp_reset(sc);
    357 	return 0;
    358 }
    359 
    360 static uint32_t
    361 issp_host_ocr(sdmmc_chipset_handle_t sch)
    362 {
    363 	/* SSP supports at least 3.2 - 3.3v */
    364 	return MMC_OCR_3_2V_3_3V;
    365 }
    366 
    367 static int
    368 issp_host_maxblklen(sdmmc_chipset_handle_t sch)
    369 {
    370 	return 512;
    371 }
    372 
    373 /*
    374  * Called at the beginning of sdmmc_task_thread to detect the presence
    375  * of the SD card.
    376  */
    377 static int
    378 issp_card_detect(sdmmc_chipset_handle_t sch)
    379 {
    380 	return 1;
    381 }
    382 
    383 static int
    384 issp_write_protect(sdmmc_chipset_handle_t sch)
    385 {
    386 	/* The device is not write protected. */
    387 	return 0;
    388 }
    389 
    390 static int
    391 issp_bus_power(sdmmc_chipset_handle_t sch, uint32_t ocr)
    392 {
    393 	/* i.MX23 SSP does not support setting bus power. */
    394 	return 0;
    395 }
    396 
    397 static int
    398 issp_bus_clock(sdmmc_chipset_handle_t sch, int clock)
    399 {
    400 	struct issp_softc *sc = sch;
    401 	uint32_t sck;
    402 
    403 	if (clock < SSP_CLK_MIN)
    404 		sck = issp_set_sck(sc, SSP_CLK_MIN * 1000);
    405 	else
    406 		sck = issp_set_sck(sc, clock * 1000);
    407 
    408 	/* Notify user if we didn't get the exact clock rate from SSP that was
    409 	 * requested from the SDMMC subsystem. */
    410 	if (sck != clock * 1000) {
    411 		sck = sck / 1000;
    412 		if (((sck) / 1000) != 0)
    413 			aprint_normal_dev(sc->sc_dev, "bus clock @ %u.%03u "
    414 			    "MHz\n", sck / 1000, sck % 1000);
    415 		else
    416 			aprint_normal_dev(sc->sc_dev, "bus clock @ %u KHz\n",
    417 			    sck % 1000);
    418 	}
    419 
    420 	return 0;
    421 }
    422 
    423 static int
    424 issp_bus_width(sdmmc_chipset_handle_t sch, int width)
    425 {
    426 	struct issp_softc *sc = sch;
    427 
    428 	switch(width) {
    429 	case(1):
    430 		sc->sc_bus_width = BUS_WIDTH_1_BIT;
    431 		break;
    432 	case(4):
    433 		sc->sc_bus_width = BUS_WIDTH_4_BIT;
    434 		break;
    435 	case(8):
    436 		sc->sc_bus_width = BUS_WIDTH_8_BIT;
    437 		break;
    438 	default:
    439 		return 1;
    440 	}
    441 
    442 	return 0;
    443 }
    444 
    445 static int
    446 issp_bus_rod(sdmmc_chipset_handle_t sch, int rod)
    447 {
    448 	/* Go to data transfer mode. */
    449 	return 0;
    450 }
    451 
    452 static void
    453 issp_exec_command(sdmmc_chipset_handle_t sch, struct sdmmc_command *cmd)
    454 {
    455 	issp_softc_t sc = sch;
    456 	void *dma_chain;
    457 	int error;
    458 
    459 	/* SSP does not support over 64k transfer size. */
    460 	if (cmd->c_data != NULL && cmd->c_datalen > MAX_TRANSFER_SIZE) {
    461 		aprint_error_dev(sc->sc_dev, "transfer size over %d: %d\n",
    462 		    MAX_TRANSFER_SIZE, cmd->c_datalen);
    463 		cmd->c_error = ENODEV;
    464 		return;
    465 	}
    466 
    467 	/* Map dma_chain to point allocated previously allocated DMA chain. */
    468 	error = bus_dmamem_map(sc->sc_dmat, sc->sc_ds, 1, sc->sc_chnsiz,
    469 	    &dma_chain, BUS_DMA_NOWAIT);
    470 	if (error) {
    471 		aprint_error_dev(sc->sc_dev, "bus_dmamem_map: %d\n", error);
    472 		cmd->c_error = error;
    473 		goto out;
    474 	}
    475 
    476 	error = bus_dmamap_load(sc->sc_dmat, sc->sc_dmamp, dma_chain,
    477 	    sc->sc_chnsiz, NULL, BUS_DMA_NOWAIT|BUS_DMA_WRITE);
    478 	if (error) {
    479 		aprint_error_dev(sc->sc_dev, "bus_dmamap_load: %d\n", error);
    480 		cmd->c_error = error;
    481 		goto dmamem_unmap;
    482 	}
    483 
    484 	memset(dma_chain, 0, sc->sc_chnsiz);
    485 
    486 	/* Setup DMA command chain.*/
    487 	if (cmd->c_data != NULL && (cmd->c_datalen / cmd->c_blklen) > 1) {
    488 		/* Multi block transfer. */
    489 		issp_create_dma_cmd_list_multi(sc, dma_chain, cmd);
    490 	} else if (cmd->c_data != NULL && cmd->c_datalen) {
    491 		/* Single block transfer. */
    492 		issp_create_dma_cmd_list_single(sc, dma_chain, cmd);
    493 	} else {
    494 		/* Only command, no data. */
    495 		issp_create_dma_cmd_list(sc, dma_chain, cmd);
    496 	}
    497 
    498 	/* Tell DMA controller where it can find just initialized DMA chain. */
    499 	apbdma_chan_set_chain(sc->sc_dmac, sc->dma_channel, sc->sc_dmamp);
    500 
    501 	/* Synchronize command chain before DMA controller accesses it. */
    502 	bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamp, 0, sc->sc_chnsiz,
    503 	    BUS_DMASYNC_PREWRITE);
    504 
    505 	sc->sc_state = SSP_STATE_DMA;
    506 	sc->sc_irq_error = 0;
    507 	sc->sc_dma_error = 0;
    508 	cmd->c_error = 0;
    509 
    510 	mutex_enter(&sc->sc_lock);
    511 
    512 	/* Run DMA command chain. */
    513 	apbdma_run(sc->sc_dmac, sc->dma_channel);
    514 
    515 	/* Wait DMA to complete. */
    516 	while (sc->sc_state == SSP_STATE_DMA)
    517 		cv_wait(&sc->sc_intr_cv, &sc->sc_lock);
    518 
    519 	mutex_exit(&sc->sc_lock);
    520 
    521 	bus_dmamap_sync(sc->sc_dmat, sc->sc_dmamp, 0, sc->sc_chnsiz,
    522 	    BUS_DMASYNC_POSTWRITE);
    523 
    524 	if (sc->sc_dma_error) {
    525 		if (sc->sc_dma_error == DMA_IRQ_TERM) {
    526 			apbdma_chan_reset(sc->sc_dmac, sc->dma_channel);
    527 			cmd->c_error = sc->sc_dma_error;
    528 		}
    529 		else if (sc->sc_dma_error == DMA_IRQ_BUS_ERROR) {
    530 			aprint_error_dev(sc->sc_dev, "DMA_IRQ_BUS_ERROR: %d\n",
    531 			    sc->sc_irq_error);
    532 			cmd->c_error = sc->sc_dma_error;
    533 		}
    534 	}
    535 
    536 	if (sc->sc_irq_error) {
    537 		/* Do not log RESP_TIMEOUT_IRQ error if bus width is 0 as it is
    538 		 * expected during SD card initialization phase. */
    539 		if (sc->sc_bus_width) {
    540 			aprint_error_dev(sc->sc_dev, "SSP_ERROR_IRQ: %d\n",
    541 			    sc->sc_irq_error);
    542 		}
    543 		else if(!(sc->sc_irq_error & HW_SSP_CTRL1_RESP_TIMEOUT_IRQ)) {
    544 			aprint_error_dev(sc->sc_dev, "SSP_ERROR_IRQ: %d\n",
    545 			    sc->sc_irq_error);
    546 		}
    547 
    548 		/* Shift unsigned error code so it fits nicely to signed int. */
    549 		cmd->c_error = sc->sc_irq_error >> 8;
    550 	}
    551 
    552 	/* Check reponse from the card if such was requested. */
    553 	if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
    554 		cmd->c_resp[0] = SSP_RD(sc, HW_SSP_SDRESP0);
    555 		if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    556 			cmd->c_resp[1] = SSP_RD(sc, HW_SSP_SDRESP1);
    557 			cmd->c_resp[2] = SSP_RD(sc, HW_SSP_SDRESP2);
    558 			cmd->c_resp[3] = SSP_RD(sc, HW_SSP_SDRESP3);
    559 			/*
    560 			 * Remove CRC7 + LSB by rotating all bits right by 8 to
    561 			 * make sdmmc __bitfield() happy.
    562 			 */
    563 			cmd->c_resp[0] >>= 8; /* Remove CRC7 + LSB. */
    564 			cmd->c_resp[0] |= (0x000000FF & cmd->c_resp[1]) << 24;
    565 			cmd->c_resp[1] >>= 8;
    566 			cmd->c_resp[1] |= (0x000000FF & cmd->c_resp[2]) << 24;
    567 			cmd->c_resp[2] >>= 8;
    568 			cmd->c_resp[2] |= (0x000000FF & cmd->c_resp[3]) << 24;
    569 			cmd->c_resp[3] >>= 8;
    570 		}
    571 	}
    572 
    573 	bus_dmamap_unload(sc->sc_dmat, sc->sc_dmamp);
    574 dmamem_unmap:
    575 	bus_dmamem_unmap(sc->sc_dmat, dma_chain, sc->sc_chnsiz);
    576 out:
    577 
    578 	return;
    579 }
    580 
    581 static void
    582 issp_card_enable_intr(sdmmc_chipset_handle_t sch, int irq)
    583 {
    584 	struct issp_softc *sc = sch;
    585 	aprint_error_dev(sc->sc_dev, "issp_card_enable_intr not implemented\n");
    586 	return;
    587 }
    588 
    589 static void
    590 issp_card_intr_ack(sdmmc_chipset_handle_t sch)
    591 {
    592 	struct issp_softc *sc = sch;
    593 	aprint_error_dev(sc->sc_dev, "issp_card_intr_ack not implemented\n");
    594 	return;
    595 }
    596 
    597 /*
    598  * Reset the SSP block.
    599  *
    600  * Inspired by i.MX23 RM "39.3.10 Correct Way to Soft Reset a Block"
    601  */
    602 static void
    603 issp_reset(struct issp_softc *sc)
    604 {
    605 	unsigned int loop;
    606 
    607 	/* Prepare for soft-reset by making sure that SFTRST is not currently
    608 	 * asserted. Also clear CLKGATE so we can wait for its assertion below.
    609 	 */
    610 	SSP_WR(sc, HW_SSP_CTRL0_CLR, HW_SSP_CTRL0_SFTRST);
    611 
    612 	/* Wait at least a microsecond for SFTRST to deassert. */
    613 	loop = 0;
    614 	while ((SSP_RD(sc, HW_SSP_CTRL0) & HW_SSP_CTRL0_SFTRST) ||
    615 	    (loop < SSP_SOFT_RST_LOOP))
    616 		loop++;
    617 
    618 	/* Clear CLKGATE so we can wait for its assertion below. */
    619 	SSP_WR(sc, HW_SSP_CTRL0_CLR, HW_SSP_CTRL0_CLKGATE);
    620 
    621 	/* Soft-reset the block. */
    622 	SSP_WR(sc, HW_SSP_CTRL0_SET, HW_SSP_CTRL0_SFTRST);
    623 
    624 	/* Wait until clock is in the gated state. */
    625 	while (!(SSP_RD(sc, HW_SSP_CTRL0) & HW_SSP_CTRL0_CLKGATE));
    626 
    627 	/* Bring block out of reset. */
    628 	SSP_WR(sc, HW_SSP_CTRL0_CLR, HW_SSP_CTRL0_SFTRST);
    629 
    630 	loop = 0;
    631 	while ((SSP_RD(sc, HW_SSP_CTRL0) & HW_SSP_CTRL0_SFTRST) ||
    632 	    (loop < SSP_SOFT_RST_LOOP))
    633 		loop++;
    634 
    635 	SSP_WR(sc, HW_SSP_CTRL0_CLR, HW_SSP_CTRL0_CLKGATE);
    636 
    637 	/* Wait until clock is in the NON-gated state. */
    638 	while (SSP_RD(sc, HW_SSP_CTRL0) & HW_SSP_CTRL0_CLKGATE);
    639 
    640 	return;
    641 }
    642 
    643 /*
    644  * Initialize SSP controller to SD/MMC mode.
    645  */
    646 static void
    647 issp_init(struct issp_softc *sc)
    648 {
    649 	uint32_t reg;
    650 
    651 	reg = SSP_RD(sc, HW_SSP_CTRL0);
    652 	reg |= HW_SSP_CTRL0_ENABLE;
    653 
    654 	/* Initial data bus width is 1-bit. */
    655 	reg &= ~(HW_SSP_CTRL0_BUS_WIDTH);
    656 	reg |= __SHIFTIN(BUS_WIDTH_1_BIT, HW_SSP_CTRL0_BUS_WIDTH) |
    657 	    HW_SSP_CTRL0_WAIT_FOR_IRQ | HW_SSP_CTRL0_ENABLE;
    658 	SSP_WR(sc, HW_SSP_CTRL0, reg);
    659 	sc->sc_bus_width = BUS_WIDTH_1_BIT;
    660 
    661 	/* Set data timeout. */
    662 	reg = SSP_RD(sc, HW_SSP_TIMING);
    663 	reg &= ~(HW_SSP_TIMING_TIMEOUT);
    664 	reg |= __SHIFTIN(DATA_TIMEOUT, HW_SSP_TIMING_TIMEOUT);
    665 	SSP_WR(sc, HW_SSP_TIMING, reg);
    666 
    667 	/* Set initial clock rate to minimum. */
    668 	issp_set_sck(sc, SSP_CLK_MIN * 1000);
    669 
    670 	reg = SSP_RD(sc, HW_SSP_CTRL1);
    671 	/* Enable all but SDIO IRQ's. */
    672 	reg |= HW_SSP_CTRL1_RESP_ERR_IRQ_EN |
    673 	    HW_SSP_CTRL1_RESP_TIMEOUT_IRQ_EN |
    674 	    HW_SSP_CTRL1_DATA_TIMEOUT_IRQ_EN |
    675 	    HW_SSP_CTRL1_DATA_CRC_IRQ_EN |
    676 	    HW_SSP_CTRL1_FIFO_UNDERRUN_EN |
    677 	    HW_SSP_CTRL1_RECV_TIMEOUT_IRQ_EN |
    678 	    HW_SSP_CTRL1_FIFO_OVERRUN_IRQ_EN;
    679 	reg |= HW_SSP_CTRL1_DMA_ENABLE;
    680 	reg |= HW_SSP_CTRL1_POLARITY;
    681 	/* Set SD/MMC mode and use use 8-bits per word. */
    682 	reg &= ~(HW_SSP_CTRL1_WORD_LENGTH | HW_SSP_CTRL1_SSP_MODE);
    683 	reg |= __SHIFTIN(0x7, HW_SSP_CTRL1_WORD_LENGTH) |
    684 	    __SHIFTIN(0x3, HW_SSP_CTRL1_SSP_MODE);
    685 	SSP_WR(sc, HW_SSP_CTRL1, reg);
    686 
    687 	return;
    688 }
    689 
    690 /*
    691  * Set SSP_SCK clock rate to the value specified in target.
    692  *
    693  * SSP_SCK is calculated as: SSP_CLK / (CLOCK_DIVIDE * (1 + CLOCK_RATE))
    694  *
    695  * issp_set_sck finds the most suitable CLOCK_DIVIDE and CLOCK_RATE register
    696  * values for the target clock rate by iterating through all possible register
    697  * values.
    698  */
    699 static uint32_t
    700 issp_set_sck(struct issp_softc *sc, uint32_t target)
    701 {
    702 	uint32_t newclk, found, reg;
    703 	uint8_t div, rate, d, r;
    704 
    705 	found = div = rate = 0;
    706 
    707 	for (d = 2; d < 254; d++) {
    708 		for (r = 0; r < 255; r++) {
    709 			newclk = SSP_CLK / (d * (1 + r));
    710 			if (newclk == target) {
    711 				found = newclk;
    712 				div = d;
    713 				rate = r;
    714 				goto out;
    715 			}
    716 			if (newclk < target && newclk > found) {
    717 				found = newclk;
    718 				div = d;
    719 				rate = r;
    720 			}
    721 		}
    722 	}
    723 out:
    724 	reg = SSP_RD(sc, HW_SSP_TIMING);
    725 	reg &= ~(HW_SSP_TIMING_CLOCK_DIVIDE | HW_SSP_TIMING_CLOCK_RATE);
    726 	reg |= __SHIFTIN(div, HW_SSP_TIMING_CLOCK_DIVIDE) |
    727 	    __SHIFTIN(rate, HW_SSP_TIMING_CLOCK_RATE);
    728 	SSP_WR(sc, HW_SSP_TIMING, reg);
    729 
    730 	return SSP_CLK / (div * (1 + rate));
    731 }
    732 
    733 /*
    734  * IRQ from DMA.
    735  */
    736 static int
    737 issp_dma_intr(void *arg)
    738 {
    739 	issp_softc_t sc = arg;
    740 	unsigned int dma_err;
    741 
    742 	dma_err = apbdma_intr_status(sc->sc_dmac, sc->dma_channel);
    743 
    744 	if (dma_err) {
    745 		apbdma_ack_error_intr(sc->sc_dmac, sc->dma_channel);
    746 	} else {
    747 		apbdma_ack_intr(sc->sc_dmac, sc->dma_channel);
    748 	}
    749 
    750 	mutex_enter(&sc->sc_lock);
    751 
    752 	sc->sc_dma_error = dma_err;
    753 	sc->sc_state = SSP_STATE_IDLE;
    754 
    755 	/* Signal thread that interrupt was handled. */
    756 	cv_signal(&sc->sc_intr_cv);
    757 
    758 	mutex_exit(&sc->sc_lock);
    759 
    760 	/* Return 1 to acknowledge IRQ. */
    761 	return 1;
    762 }
    763 
    764 /*
    765  * IRQ from SSP block.
    766  *
    767  * When SSP receives IRQ it terminates ongoing DMA transfer by issuing DMATERM
    768  * signal to DMA block.
    769  */
    770 static int
    771 issp_error_intr(void *arg)
    772 {
    773 	issp_softc_t sc = arg;
    774 
    775 	mutex_enter(&sc->sc_lock);
    776 
    777 	sc->sc_irq_error =
    778 	    SSP_RD(sc, HW_SSP_CTRL1) & HW_SSP_CTRL1_IRQ_MASK;
    779 
    780 	issp_ack_intr(sc);
    781 
    782 	mutex_exit(&sc->sc_lock);
    783 
    784 	/* Return 1 to acknowledge IRQ. */
    785 	return 1;
    786 }
    787 
    788 /*
    789  * Acknowledge SSP error IRQ.
    790  */
    791 static void
    792 issp_ack_intr(struct issp_softc *sc)
    793 {
    794 
    795 	/* Acknowledge all IRQ's. */
    796 	SSP_WR(sc, HW_SSP_CTRL1_CLR, HW_SSP_CTRL1_IRQ_MASK);
    797 
    798 	return;
    799 }
    800 
    801 /*
    802  * Set up multi block DMA transfer.
    803  */
    804 static void
    805 issp_create_dma_cmd_list_multi(issp_softc_t sc, void *dma_chain,
    806     struct sdmmc_command *cmd)
    807 {
    808 	apbdma_command_t dma_cmd;
    809 	int blocks;
    810 	int nblk;
    811 
    812 	blocks = cmd->c_datalen / cmd->c_blklen;
    813 	nblk = 0;
    814 	dma_cmd = dma_chain;
    815 
    816 	/* HEAD */
    817 	apbdma_cmd_buf(&dma_cmd[nblk], cmd->c_blklen * nblk, cmd->c_dmamap);
    818 	apbdma_cmd_chain(&dma_cmd[nblk], &dma_cmd[nblk+1], dma_chain,
    819 	    sc->sc_dmamp);
    820 
    821 	dma_cmd[nblk].control =
    822 	    __SHIFTIN(cmd->c_blklen, APBDMA_CMD_XFER_COUNT) |
    823 	    __SHIFTIN(3, APBDMA_CMD_CMDPIOWORDS) | APBDMA_CMD_HALTONTERMINATE |
    824 	    APBDMA_CMD_CHAIN;
    825 
    826 	if (!ISSET(cmd->c_flags, SCF_RSP_CRC)) {
    827 		dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |=
    828 		    HW_SSP_CTRL0_IGNORE_CRC;
    829 	}
    830 
    831 	dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_DATA_XFER |
    832 	    __SHIFTIN(sc->sc_bus_width, HW_SSP_CTRL0_BUS_WIDTH) |
    833 	    HW_SSP_CTRL0_WAIT_FOR_IRQ |
    834 	    __SHIFTIN(cmd->c_datalen, HW_SSP_CTRL0_XFER_COUNT);
    835 
    836 	if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
    837 		dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |=
    838 		    HW_SSP_CTRL0_GET_RESP;
    839 		if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    840 			dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |=
    841 			    HW_SSP_CTRL0_LONG_RESP;
    842 		}
    843 	}
    844 
    845 	dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_ENABLE;
    846 
    847 	dma_cmd[nblk].pio_words[PIO_WORD_CMD0] =
    848 	    __SHIFTIN(ffs(cmd->c_blklen) - 1, HW_SSP_CMD0_BLOCK_SIZE) |
    849 	    __SHIFTIN(blocks - 1, HW_SSP_CMD0_BLOCK_COUNT) |
    850 	    __SHIFTIN(cmd->c_opcode, HW_SSP_CMD0_CMD);
    851 
    852 	dma_cmd[nblk].pio_words[PIO_WORD_CMD1] = cmd->c_arg;
    853 
    854 	if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    855 		dma_cmd[nblk].control |=
    856 		    __SHIFTIN(APBDMA_CMD_DMA_WRITE, APBDMA_CMD_COMMAND);
    857 		dma_cmd[nblk].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_READ;
    858 	} else {
    859 		dma_cmd[nblk].control |=
    860 		    __SHIFTIN(APBDMA_CMD_DMA_READ, APBDMA_CMD_COMMAND);
    861 	}
    862 
    863 	nblk++;
    864 
    865 	/* BODY: Build commands for blocks between head and tail, if any. */
    866 	for (; nblk < blocks - 1; nblk++) {
    867 
    868 		apbdma_cmd_buf(&dma_cmd[nblk], cmd->c_blklen * nblk,
    869 		    cmd->c_dmamap);
    870 
    871 		apbdma_cmd_chain(&dma_cmd[nblk], &dma_cmd[nblk+1], dma_chain,
    872 		    sc->sc_dmamp);
    873 
    874 		dma_cmd[nblk].control =
    875 		    __SHIFTIN(cmd->c_blklen, APBDMA_CMD_XFER_COUNT) |
    876 		    APBDMA_CMD_HALTONTERMINATE | APBDMA_CMD_CHAIN;
    877 
    878 		if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    879 			dma_cmd[nblk].control |=
    880 			    __SHIFTIN(APBDMA_CMD_DMA_WRITE,
    881 				APBDMA_CMD_COMMAND);
    882 		} else {
    883 			dma_cmd[nblk].control |=
    884 			    __SHIFTIN(APBDMA_CMD_DMA_READ, APBDMA_CMD_COMMAND);
    885 		}
    886 	}
    887 
    888 	/* TAIL
    889 	 *
    890 	 * TODO: Send CMD12/STOP with last DMA command to support
    891 	 * SMC_CAPS_AUTO_STOP.
    892 	 */
    893 	apbdma_cmd_buf(&dma_cmd[nblk], cmd->c_blklen * nblk, cmd->c_dmamap);
    894 	/* next = NULL */
    895 	dma_cmd[nblk].control =
    896 	    __SHIFTIN(cmd->c_blklen, APBDMA_CMD_XFER_COUNT) |
    897 	    APBDMA_CMD_HALTONTERMINATE | APBDMA_CMD_WAIT4ENDCMD |
    898 	    APBDMA_CMD_SEMAPHORE | APBDMA_CMD_IRQONCMPLT;
    899 
    900 	if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    901 		dma_cmd[nblk].control |= __SHIFTIN(APBDMA_CMD_DMA_WRITE,
    902 		    APBDMA_CMD_COMMAND);
    903 	} else {
    904 		dma_cmd[nblk].control |= __SHIFTIN(APBDMA_CMD_DMA_READ,
    905 		    APBDMA_CMD_COMMAND);
    906 	}
    907 
    908 	return;
    909 }
    910 
    911 /*
    912  * Set up single block DMA transfer.
    913  */
    914 static void
    915 issp_create_dma_cmd_list_single(issp_softc_t sc, void *dma_chain,
    916     struct sdmmc_command *cmd)
    917 {
    918 	apbdma_command_t dma_cmd;
    919 
    920 	dma_cmd = dma_chain;
    921 
    922 	dma_cmd[0].control = __SHIFTIN(cmd->c_datalen, APBDMA_CMD_XFER_COUNT) |
    923 	    __SHIFTIN(3, APBDMA_CMD_CMDPIOWORDS) |
    924 	    APBDMA_CMD_HALTONTERMINATE | APBDMA_CMD_WAIT4ENDCMD |
    925 	    APBDMA_CMD_SEMAPHORE | APBDMA_CMD_IRQONCMPLT;
    926 
    927 	/* Transfer single block to the beginning of the DMA buffer. */
    928 	apbdma_cmd_buf(&dma_cmd[0], 0, cmd->c_dmamap);
    929 
    930 	if (!ISSET(cmd->c_flags, SCF_RSP_CRC)) {
    931 		dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    932 		    HW_SSP_CTRL0_IGNORE_CRC;
    933 	}
    934 
    935 	dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    936 	    HW_SSP_CTRL0_DATA_XFER |
    937 	    __SHIFTIN(sc->sc_bus_width, HW_SSP_CTRL0_BUS_WIDTH) |
    938 	    HW_SSP_CTRL0_WAIT_FOR_IRQ |
    939 	    __SHIFTIN(cmd->c_datalen, HW_SSP_CTRL0_XFER_COUNT);
    940 
    941 	if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
    942 		dma_cmd[0].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_GET_RESP;
    943 		if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    944 			dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    945 			    HW_SSP_CTRL0_LONG_RESP;
    946 		}
    947 	}
    948 
    949 	dma_cmd[0].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_ENABLE;
    950 
    951 	dma_cmd[0].pio_words[PIO_WORD_CMD0] =
    952 	    HW_SSP_CMD0_APPEND_8CYC |
    953 	    __SHIFTIN(cmd->c_opcode, HW_SSP_CMD0_CMD);
    954 	dma_cmd[0].pio_words[PIO_WORD_CMD1] = cmd->c_arg;
    955 
    956 	if (ISSET(cmd->c_flags, SCF_CMD_READ)) {
    957 		dma_cmd[0].control |=
    958 		    __SHIFTIN(APBDMA_CMD_DMA_WRITE, APBDMA_CMD_COMMAND);
    959 		dma_cmd[0].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_READ;
    960 	} else {
    961 		dma_cmd[0].control |=
    962 		    __SHIFTIN(APBDMA_CMD_DMA_READ, APBDMA_CMD_COMMAND);
    963 	}
    964 
    965 	return;
    966 }
    967 
    968 /*
    969  * Do DMA PIO (issue CMD). No block transfers.
    970  */
    971 static void
    972 issp_create_dma_cmd_list(issp_softc_t sc, void *dma_chain,
    973     struct sdmmc_command *cmd)
    974 {
    975 	apbdma_command_t dma_cmd;
    976 
    977 	dma_cmd = dma_chain;
    978 
    979 	dma_cmd[0].control = __SHIFTIN(3, APBDMA_CMD_CMDPIOWORDS) |
    980 	    APBDMA_CMD_HALTONTERMINATE | APBDMA_CMD_WAIT4ENDCMD |
    981 	    APBDMA_CMD_SEMAPHORE | APBDMA_CMD_IRQONCMPLT |
    982 	    __SHIFTIN(APBDMA_CMD_NO_DMA_XFER, APBDMA_CMD_COMMAND);
    983 
    984 	if (!ISSET(cmd->c_flags, SCF_RSP_CRC)) {
    985 		dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    986 		    HW_SSP_CTRL0_IGNORE_CRC;
    987 	}
    988 
    989 	dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    990 	    __SHIFTIN(sc->sc_bus_width, HW_SSP_CTRL0_BUS_WIDTH) |
    991 	    HW_SSP_CTRL0_WAIT_FOR_IRQ;
    992 
    993 	if (ISSET(cmd->c_flags, SCF_RSP_PRESENT)) {
    994 		dma_cmd[0].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_GET_RESP;
    995 		if (ISSET(cmd->c_flags, SCF_RSP_136)) {
    996 			dma_cmd[0].pio_words[PIO_WORD_CTRL0] |=
    997 			    HW_SSP_CTRL0_LONG_RESP;
    998 		}
    999 	}
   1000 
   1001 	dma_cmd[0].pio_words[PIO_WORD_CTRL0] |= HW_SSP_CTRL0_ENABLE;
   1002 
   1003 	dma_cmd[0].pio_words[PIO_WORD_CMD0] =
   1004 		__SHIFTIN(cmd->c_opcode, HW_SSP_CMD0_CMD);
   1005 	dma_cmd[0].pio_words[PIO_WORD_CMD1] = cmd->c_arg;
   1006 
   1007 	return;
   1008 }
   1009