xref: /netbsd-src/sys/arch/arm/imx/imx23_ssp.c (revision a4ddc2c8fb9af816efe3b1c375a5530aef0e89e9)
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