xref: /freebsd/sys/dev/qcom_qup/qcom_spi.c (revision b647615ede46af66cd0c8bd5a321d4a2cccdabe0)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
3  *
4  * Copyright (c) 2021, Adrian Chadd <adrian@FreeBSD.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice unmodified, this list of conditions, and the following
11  *    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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 
32 #include <sys/bus.h>
33 #include <sys/interrupt.h>
34 #include <sys/malloc.h>
35 #include <sys/lock.h>
36 #include <sys/mutex.h>
37 #include <sys/kernel.h>
38 #include <sys/module.h>
39 #include <sys/rman.h>
40 #include <sys/gpio.h>
41 
42 #include <vm/vm.h>
43 #include <vm/pmap.h>
44 #include <vm/vm_extern.h>
45 
46 #include <machine/bus.h>
47 #include <machine/cpu.h>
48 
49 #include <dev/fdt/fdt_common.h>
50 #include <dev/fdt/fdt_pinctrl.h>
51 
52 #include <dev/gpio/gpiobusvar.h>
53 #include <dev/ofw/ofw_bus.h>
54 #include <dev/ofw/ofw_bus_subr.h>
55 
56 #include <dev/extres/clk/clk.h>
57 #include <dev/extres/hwreset/hwreset.h>
58 
59 #include <dev/spibus/spi.h>
60 #include <dev/spibus/spibusvar.h>
61 #include "spibus_if.h"
62 
63 #include <dev/qcom_qup/qcom_spi_var.h>
64 #include <dev/qcom_qup/qcom_qup_reg.h>
65 #include <dev/qcom_qup/qcom_spi_reg.h>
66 #include <dev/qcom_qup/qcom_spi_debug.h>
67 
68 static struct ofw_compat_data compat_data[] = {
69 	{ "qcom,spi-qup-v1.1.1",	QCOM_SPI_HW_QPI_V1_1 },
70 	{ "qcom,spi-qup-v2.1.1",	QCOM_SPI_HW_QPI_V2_1 },
71 	{ "qcom,spi-qup-v2.2.1",	QCOM_SPI_HW_QPI_V2_2 },
72 	{ NULL,				0 }
73 };
74 
75 /*
76  * Flip the CS GPIO line either active or inactive.
77  *
78  * Actually listen to the CS polarity.
79  */
80 static void
81 qcom_spi_set_chipsel(struct qcom_spi_softc *sc, int cs, bool active)
82 {
83 	bool pinactive;
84 	bool invert = !! (cs & SPIBUS_CS_HIGH);
85 
86 	cs = cs & ~SPIBUS_CS_HIGH;
87 
88 	if (sc->cs_pins[cs] == NULL) {
89 		device_printf(sc->sc_dev,
90 		    "%s: cs=%u, active=%u, invert=%u, no gpio?\n",
91 		    __func__, cs, active, invert);
92 		return;
93 	}
94 
95 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_CHIPSELECT,
96 	    "%s: cs=%u active=%u\n", __func__, cs, active);
97 
98 	/*
99 	 * Default rule here is CS is active low.
100 	 */
101 	if (active)
102 		pinactive = false;
103 	else
104 		pinactive = true;
105 
106 	/*
107 	 * Invert the CS line if required.
108 	 */
109 	if (invert)
110 		pinactive = !! pinactive;
111 
112 	gpio_pin_set_active(sc->cs_pins[cs], pinactive);
113 	gpio_pin_is_active(sc->cs_pins[cs], &pinactive);
114 }
115 
116 static void
117 qcom_spi_intr(void *arg)
118 {
119 	struct qcom_spi_softc *sc = arg;
120 	int ret;
121 
122 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_INTR, "%s: called\n", __func__);
123 
124 
125 	QCOM_SPI_LOCK(sc);
126 	ret = qcom_spi_hw_interrupt_handle(sc);
127 	if (ret != 0) {
128 		device_printf(sc->sc_dev,
129 		    "ERROR: failed to read intr status\n");
130 		goto done;
131 	}
132 
133 	/*
134 	 * Handle spurious interrupts outside of an actual
135 	 * transfer.
136 	 */
137 	if (sc->transfer.active == false) {
138 		device_printf(sc->sc_dev,
139 		    "ERROR: spurious interrupt\n");
140 		qcom_spi_hw_ack_opmode(sc);
141 		goto done;
142 	}
143 
144 	/* Now, handle interrupts */
145 	if (sc->intr.error) {
146 		sc->intr.error = false;
147 		device_printf(sc->sc_dev, "ERROR: intr\n");
148 	}
149 
150 	if (sc->intr.do_rx) {
151 		sc->intr.do_rx = false;
152 		QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_INTR,
153 		    "%s: PIO_READ\n", __func__);
154 		if (sc->state.transfer_mode == QUP_IO_M_MODE_FIFO)
155 			ret = qcom_spi_hw_read_pio_fifo(sc);
156 		else
157 			ret = qcom_spi_hw_read_pio_block(sc);
158 		if (ret != 0) {
159 			device_printf(sc->sc_dev,
160 			    "ERROR: qcom_spi_hw_read failed (%u)\n", ret);
161 			goto done;
162 		}
163 	}
164 	if (sc->intr.do_tx) {
165 		sc->intr.do_tx = false;
166 		QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_INTR,
167 		    "%s: PIO_WRITE\n", __func__);
168 		/*
169 		 * For FIFO operations we do not do a write here, we did
170 		 * it at the beginning of the transfer.
171 		 *
172 		 * For BLOCK operations yes, we call the routine.
173 		 */
174 
175 		if (sc->state.transfer_mode == QUP_IO_M_MODE_FIFO)
176 			ret = qcom_spi_hw_ack_write_pio_fifo(sc);
177 		else
178 			ret = qcom_spi_hw_write_pio_block(sc);
179 		if (ret != 0) {
180 			device_printf(sc->sc_dev,
181 			    "ERROR: qcom_spi_hw_write failed (%u)\n", ret);
182 			goto done;
183 		}
184 	}
185 
186 	/*
187 	 * Do this last.  We may actually have completed the
188 	 * transfer in the PIO receive path above and it will
189 	 * set the done flag here.
190 	 */
191 	if (sc->intr.done) {
192 		sc->intr.done = false;
193 		sc->transfer.done = true;
194 		QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_INTR,
195 		    "%s: transfer done\n", __func__);
196 		wakeup(sc);
197 	}
198 
199 done:
200 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_INTR,
201 	    "%s: done\n", __func__);
202 	QCOM_SPI_UNLOCK(sc);
203 }
204 
205 static int
206 qcom_spi_probe(device_t dev)
207 {
208 
209 	if (!ofw_bus_status_okay(dev))
210 		return (ENXIO);
211 
212 	if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
213 		return (ENXIO);
214 
215 	device_set_desc(dev, "Qualcomm SPI Interface");
216 	return (BUS_PROBE_DEFAULT);
217 }
218 
219 /*
220  * Allocate GPIOs if provided in the SPI controller block.
221  *
222  * Some devices will use GPIO lines for chip select.
223  * It's also quite annoying because some devices will want to use
224  * the hardware provided CS gating for say, the first chipselect block,
225  * and then use GPIOs for the later ones.
226  *
227  * So here we just assume for now that SPI index 0 uses the hardware
228  * lines, and >0 use GPIO lines.  Revisit this if better hardware
229  * shows up.
230  *
231  * And finally, iterating over the cs-gpios list to allocate GPIOs
232  * doesn't actually tell us what the polarity is.  For that we need
233  * to actually iterate over the list of child nodes and check what
234  * their properties are (and look for "spi-cs-high".)
235  */
236 static void
237 qcom_spi_attach_gpios(struct qcom_spi_softc *sc)
238 {
239 	phandle_t node;
240 	int idx, err;
241 
242 	/* Allocate gpio pins for configured chip selects. */
243 	node = ofw_bus_get_node(sc->sc_dev);
244 	for (idx = 0; idx < nitems(sc->cs_pins); idx++) {
245 		err = gpio_pin_get_by_ofw_propidx(sc->sc_dev, node,
246 		    "cs-gpios", idx, &sc->cs_pins[idx]);
247 		if (err == 0) {
248 			err = gpio_pin_setflags(sc->cs_pins[idx],
249 			    GPIO_PIN_OUTPUT);
250 			if (err != 0) {
251 				device_printf(sc->sc_dev,
252 				    "error configuring gpio for"
253 				    " cs %u (%d)\n", idx, err);
254 			}
255 			/*
256 			 * We can't set this HIGH right now because
257 			 * we don't know if it needs to be set to
258 			 * high for inactive or low for inactive
259 			 * based on the child SPI device flags.
260 			 */
261 #if 0
262 			gpio_pin_set_active(sc->cs_pins[idx], 1);
263 			gpio_pin_is_active(sc->cs_pins[idx], &tmp);
264 #endif
265 		} else {
266 			device_printf(sc->sc_dev,
267 			    "cannot configure gpio for chip select %u\n", idx);
268 			sc->cs_pins[idx] = NULL;
269 		}
270 	}
271 }
272 
273 static void
274 qcom_spi_sysctl_attach(struct qcom_spi_softc *sc)
275 {
276 	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
277 	struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
278 
279 	SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
280 	    "debug", CTLFLAG_RW, &sc->sc_debug, 0,
281 	    "control debugging printfs");
282 }
283 
284 static int
285 qcom_spi_attach(device_t dev)
286 {
287 	struct qcom_spi_softc *sc = device_get_softc(dev);
288 	int rid, ret, i, val;
289 
290 	sc->sc_dev = dev;
291 
292 	/*
293 	 * Hardware version is stored in the ofw_compat_data table.
294 	 */
295 	sc->hw_version =
296 	    ofw_bus_search_compatible(dev, compat_data)->ocd_data;
297 
298 	mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF);
299 
300 	rid = 0;
301 	sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
302 	    RF_ACTIVE);
303 	if (!sc->sc_mem_res) {
304 		device_printf(dev, "ERROR: Could not map memory\n");
305 		ret = ENXIO;
306 		goto error;
307 	}
308 
309 	rid = 0;
310 	sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
311 	    RF_ACTIVE | RF_SHAREABLE);
312 	if (!sc->sc_irq_res) {
313 		device_printf(dev, "ERROR: Could not map interrupt\n");
314 		ret = ENXIO;
315 		goto error;
316 	}
317 
318 	ret = bus_setup_intr(dev, sc->sc_irq_res,
319 	    INTR_TYPE_MISC | INTR_MPSAFE,
320 	    NULL, qcom_spi_intr, sc, &sc->sc_irq_h);
321 	if (ret != 0) {
322 		device_printf(dev, "ERROR: could not configure interrupt "
323 		    "(%d)\n",
324 		    ret);
325 		goto error;
326 	}
327 
328 	qcom_spi_attach_gpios(sc);
329 
330 	ret = clk_get_by_ofw_name(dev, 0, "core", &sc->clk_core);
331 	if (ret != 0) {
332 		device_printf(dev, "ERROR: could not get %s clock (%d)\n",
333 		    "core", ret);
334 		goto error;
335 	}
336 	ret = clk_get_by_ofw_name(dev, 0, "iface", &sc->clk_iface);
337 	if (ret != 0) {
338 		device_printf(dev, "ERROR: could not get %s clock (%d)\n",
339 		    "iface", ret);
340 		goto error;
341 	}
342 
343 	/* Bring up initial clocks if they're off */
344 	ret = clk_enable(sc->clk_core);
345 	if (ret != 0) {
346 		device_printf(dev, "ERROR: couldn't enable core clock (%u)\n",
347 		    ret);
348 		goto error;
349 	}
350 	ret = clk_enable(sc->clk_iface);
351 	if (ret != 0) {
352 		device_printf(dev, "ERROR: couldn't enable iface clock (%u)\n",
353 		    ret);
354 		goto error;
355 	}
356 
357 	/*
358 	 * Read optional spi-max-frequency
359 	 */
360 	if (OF_getencprop(ofw_bus_get_node(dev), "spi-max-frequency",
361 	    &val, sizeof(val)) > 0)
362 		sc->config.max_frequency = val;
363 	else
364 		sc->config.max_frequency = SPI_MAX_RATE;
365 
366 	/*
367 	 * Read optional cs-select
368 	 */
369 	if (OF_getencprop(ofw_bus_get_node(dev), "cs-select",
370 	    &val, sizeof(val)) > 0)
371 		sc->config.cs_select = val;
372 	else
373 		sc->config.cs_select = 0;
374 
375 	/*
376 	 * Read optional num-cs
377 	 */
378 	if (OF_getencprop(ofw_bus_get_node(dev), "num-cs",
379 	    &val, sizeof(val)) > 0)
380 		sc->config.num_cs = val;
381 	else
382 		sc->config.num_cs = SPI_NUM_CHIPSELECTS;
383 
384 	ret = fdt_pinctrl_configure_by_name(dev, "default");
385 	if (ret != 0) {
386 		device_printf(dev,
387 		    "ERROR: could not configure default pinmux\n");
388 		goto error;
389 	}
390 
391 	ret = qcom_spi_hw_read_controller_transfer_sizes(sc);
392 	if (ret != 0) {
393 		device_printf(dev, "ERROR: Could not read transfer config\n");
394 		goto error;
395 	}
396 
397 
398 	device_printf(dev, "BLOCK: input=%u bytes, output=%u bytes\n",
399 	    sc->config.input_block_size,
400 	    sc->config.output_block_size);
401 	device_printf(dev, "FIFO: input=%u bytes, output=%u bytes\n",
402 	    sc->config.input_fifo_size,
403 	    sc->config.output_fifo_size);
404 
405 	/* QUP config */
406 	QCOM_SPI_LOCK(sc);
407 	ret = qcom_spi_hw_qup_init_locked(sc);
408 	if (ret != 0) {
409 		device_printf(dev, "ERROR: QUP init failed (%d)\n", ret);
410 		QCOM_SPI_UNLOCK(sc);
411 		goto error;
412 	}
413 
414 	/* Initial SPI config */
415 	ret = qcom_spi_hw_spi_init_locked(sc);
416 	if (ret != 0) {
417 		device_printf(dev, "ERROR: SPI init failed (%d)\n", ret);
418 		QCOM_SPI_UNLOCK(sc);
419 		goto error;
420 	}
421 	QCOM_SPI_UNLOCK(sc);
422 
423 	sc->spibus = device_add_child(dev, "spibus", -1);
424 
425 	/* We're done, so shut down the interface clock for now */
426 	device_printf(dev, "DONE: shutting down interface clock for now\n");
427 	clk_disable(sc->clk_iface);
428 
429 	/* Register for debug sysctl */
430 	qcom_spi_sysctl_attach(sc);
431 
432 	return (bus_generic_attach(dev));
433 error:
434 	if (sc->sc_irq_h)
435 		bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_h);
436 	if (sc->sc_mem_res)
437 		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
438 	if (sc->sc_irq_res)
439 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
440 	if (sc->clk_core) {
441 		clk_disable(sc->clk_core);
442 		clk_release(sc->clk_core);
443 	}
444 	if (sc->clk_iface) {
445 		clk_disable(sc->clk_iface);
446 		clk_release(sc->clk_iface);
447 	}
448 	for (i = 0; i < CS_MAX; i++) {
449 		if (sc->cs_pins[i] != NULL)
450 			gpio_pin_release(sc->cs_pins[i]);
451 	}
452 	mtx_destroy(&sc->sc_mtx);
453 	return (ret);
454 }
455 
456 /*
457  * Do a PIO transfer.
458  *
459  * Note that right now the TX/RX lens need to match, I'm not doing
460  * dummy reads / dummy writes as required if they're not the same
461  * size.  The QUP hardware supports doing multi-phase transactions
462  * where the FIFO isn't engaged for transmit or receive, but it's
463  * not yet being done here.
464  */
465 static int
466 qcom_spi_transfer_pio_block(struct qcom_spi_softc *sc, int mode,
467     char *tx_buf, int tx_len, char *rx_buf, int rx_len)
468 {
469 	int ret = 0;
470 
471 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_TRANSFER, "%s: start\n",
472 	    __func__);
473 
474 	if (rx_len != tx_len) {
475 		device_printf(sc->sc_dev,
476 		    "ERROR: tx/rx len doesn't match (%d/%d)\n",
477 		    tx_len, rx_len);
478 		return (ENXIO);
479 	}
480 
481 	QCOM_SPI_ASSERT_LOCKED(sc);
482 
483 	/*
484 	 * Make initial choices for transfer configuration.
485 	 */
486 	ret = qcom_spi_hw_setup_transfer_selection(sc, tx_len);
487 	if (ret != 0) {
488 		device_printf(sc->sc_dev,
489 		    "ERROR: failed to setup transfer selection (%d)\n",
490 		    ret);
491 		return (ret);
492 	}
493 
494 	/* Now set suitable buffer/lengths */
495 	sc->transfer.tx_buf = tx_buf;
496 	sc->transfer.tx_len = tx_len;
497 	sc->transfer.rx_buf = rx_buf;
498 	sc->transfer.rx_len = rx_len;
499 	sc->transfer.done = false;
500 	sc->transfer.active = false;
501 
502 	/*
503 	 * Loop until the full transfer set is done.
504 	 *
505 	 * qcom_spi_hw_setup_current_transfer() will take care of
506 	 * setting a maximum transfer size for the hardware and choose
507 	 * a suitable operating mode.
508 	 */
509 	while (sc->transfer.tx_offset < sc->transfer.tx_len) {
510 		/*
511 		 * Set transfer to false early; this covers
512 		 * it also finishing a sub-transfer and we're
513 		 * about the put the block into RESET state before
514 		 * starting a new transfer.
515 		 */
516 		sc->transfer.active = false;
517 
518 		QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_TRANSFER,
519 		    "%s: tx=%d of %d bytes, rx=%d of %d bytes\n",
520 		    __func__,
521 		    sc->transfer.tx_offset, sc->transfer.tx_len,
522 		    sc->transfer.rx_offset, sc->transfer.rx_len);
523 
524 		/*
525 		 * Set state to RESET before doing anything.
526 		 *
527 		 * Otherwise the second sub-transfer that we queue up
528 		 * will generate interrupts immediately when we start
529 		 * configuring it here and it'll start underflowing.
530 		 */
531 		ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RESET);
532 		if (ret != 0) {
533 			device_printf(sc->sc_dev,
534 			    "ERROR: can't transition to RESET (%u)\n", ret);
535 			goto done;
536 		}
537 		/* blank interrupt state; we'll do a RESET below */
538 		bzero(&sc->intr, sizeof(sc->intr));
539 		sc->transfer.done = false;
540 
541 		/*
542 		 * Configure what the transfer configuration for this
543 		 * sub-transfer will be.
544 		 */
545 		ret = qcom_spi_hw_setup_current_transfer(sc);
546 		if (ret != 0) {
547 			device_printf(sc->sc_dev,
548 			    "ERROR: failed to setup sub transfer (%d)\n",
549 			    ret);
550 			goto done;
551 		}
552 
553 		/*
554 		 * For now since we're configuring up PIO, we only setup
555 		 * the PIO transfer size.
556 		 */
557 		ret = qcom_spi_hw_setup_pio_transfer_cnt(sc);
558 		if (ret != 0) {
559 			device_printf(sc->sc_dev,
560 			    "ERROR: qcom_spi_hw_setup_pio_transfer_cnt failed"
561 			    " (%u)\n", ret);
562 			goto done;
563 		}
564 
565 #if 0
566 		/*
567 		 * This is what we'd do to setup the block transfer sizes.
568 		 */
569 		ret = qcom_spi_hw_setup_block_transfer_cnt(sc);
570 		if (ret != 0) {
571 			device_printf(sc->sc_dev,
572 			    "ERROR: qcom_spi_hw_setup_block_transfer_cnt failed"
573 			    " (%u)\n", ret);
574 			goto done;
575 		}
576 #endif
577 
578 		ret = qcom_spi_hw_setup_io_modes(sc);
579 		if (ret != 0) {
580 			device_printf(sc->sc_dev,
581 			    "ERROR: qcom_spi_hw_setup_io_modes failed"
582 			    " (%u)\n", ret);
583 			goto done;
584 		}
585 
586 		ret = qcom_spi_hw_setup_spi_io_clock_polarity(sc,
587 		    !! (mode & SPIBUS_MODE_CPOL));
588 		if (ret != 0) {
589 			device_printf(sc->sc_dev,
590 			    "ERROR: qcom_spi_hw_setup_spi_io_clock_polarity"
591 			    "    failed (%u)\n", ret);
592 			goto done;
593 		}
594 
595 		ret = qcom_spi_hw_setup_spi_config(sc, sc->state.frequency,
596 		    !! (mode & SPIBUS_MODE_CPHA));
597 		if (ret != 0) {
598 			device_printf(sc->sc_dev,
599 			    "ERROR: qcom_spi_hw_setup_spi_config failed"
600 			    " (%u)\n", ret);
601 			goto done;
602 		}
603 
604 		ret = qcom_spi_hw_setup_qup_config(sc, !! (tx_len > 0),
605 		    !! (rx_len > 0));
606 		if (ret != 0) {
607 			device_printf(sc->sc_dev,
608 			    "ERROR: qcom_spi_hw_setup_qup_config failed"
609 			    " (%u)\n", ret);
610 			goto done;
611 		}
612 
613 		ret = qcom_spi_hw_setup_operational_mask(sc);
614 		if (ret != 0) {
615 			device_printf(sc->sc_dev,
616 			    "ERROR: qcom_spi_hw_setup_operational_mask failed"
617 			    " (%u)\n", ret);
618 			goto done;
619 		}
620 
621 		/*
622 		 * Setup is done; reset the controller and start the PIO
623 		 * write.
624 		 */
625 
626 		/*
627 		 * Set state to RUN; we may start getting interrupts that
628 		 * are valid and we need to handle.
629 		 */
630 		sc->transfer.active = true;
631 		ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RUN);
632 		if (ret != 0) {
633 			device_printf(sc->sc_dev,
634 			    "ERROR: can't transition to RUN (%u)\n", ret);
635 			goto done;
636 		}
637 
638 		/*
639 		 * Set state to PAUSE
640 		 */
641 		ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_PAUSE);
642 		if (ret != 0) {
643 			device_printf(sc->sc_dev,
644 			    "ERROR: can't transition to PAUSE (%u)\n", ret);
645 			goto done;
646 		}
647 
648 		/*
649 		 * If FIFO mode, write data now.  Else, we'll get an
650 		 * interrupt when it's time to populate more data
651 		 * in BLOCK mode.
652 		 */
653 		if (sc->state.transfer_mode == QUP_IO_M_MODE_FIFO)
654 			ret = qcom_spi_hw_write_pio_fifo(sc);
655 		else
656 			ret = qcom_spi_hw_write_pio_block(sc);
657 		if (ret != 0) {
658 			device_printf(sc->sc_dev,
659 			    "ERROR: qcom_spi_hw_write failed (%u)\n", ret);
660 			goto done;
661 		}
662 
663 		/*
664 		 * Set state to RUN
665 		 */
666 		ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RUN);
667 		if (ret != 0) {
668 			device_printf(sc->sc_dev,
669 			    "ERROR: can't transition to RUN (%u)\n", ret);
670 			goto done;
671 		}
672 
673 		/*
674 		 * Wait for an interrupt notification (which will
675 		 * continue to drive the state machine for this
676 		 * sub-transfer) or timeout.
677 		 */
678 		ret = 0;
679 		while (ret == 0 && sc->transfer.done == false) {
680 			QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_TRANSFER,
681 			    "%s: waiting\n", __func__);
682 			ret = msleep(sc, &sc->sc_mtx, 0, "qcom_spi", 0);
683 		}
684 	}
685 done:
686 	/*
687 	 * Complete; put controller into reset.
688 	 *
689 	 * Don't worry about return value here; if we errored out above then
690 	 * we want to communicate that value to the caller.
691 	 */
692 	(void) qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RESET);
693 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_TRANSFER,
694 	    "%s: completed\n", __func__);
695 
696 	 /*
697 	  * Blank the transfer state so we don't use an old transfer
698 	  * state in a subsequent interrupt.
699 	  */
700 	(void) qcom_spi_hw_complete_transfer(sc);
701 	sc->transfer.active = false;
702 
703 	return (ret);
704 }
705 
706 static int
707 qcom_spi_transfer(device_t dev, device_t child, struct spi_command *cmd)
708 {
709 	struct qcom_spi_softc *sc = device_get_softc(dev);
710 	uint32_t cs_val, mode_val, clock_val;
711 	uint32_t ret = 0;
712 
713 	spibus_get_cs(child, &cs_val);
714 	spibus_get_clock(child, &clock_val);
715 	spibus_get_mode(child, &mode_val);
716 
717 	QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_TRANSFER,
718 	    "%s: called; child cs=0x%08x, clock=%u, mode=0x%08x, "
719 	    "cmd=%u/%u bytes; data=%u/%u bytes\n",
720 	    __func__,
721 	    cs_val,
722 	    clock_val,
723 	    mode_val,
724 	    cmd->tx_cmd_sz, cmd->rx_cmd_sz,
725 	    cmd->tx_data_sz, cmd->rx_data_sz);
726 
727 	QCOM_SPI_LOCK(sc);
728 
729 	/*
730 	 * wait until the controller isn't busy
731 	 */
732 	while (sc->sc_busy == true)
733 		mtx_sleep(sc, &sc->sc_mtx, 0, "qcom_spi_wait", 0);
734 
735 	/*
736 	 * it's ours now!
737 	 */
738 	sc->sc_busy = true;
739 
740 	sc->state.cs_high = !! (cs_val & SPIBUS_CS_HIGH);
741 	sc->state.frequency = clock_val;
742 
743 	/*
744 	 * We can't set the clock frequency and enable it
745 	 * with the driver lock held, as the SPI lock is non-sleepable
746 	 * and the clock framework is sleepable.
747 	 *
748 	 * No other transaction is going on right now, so we can
749 	 * unlock here and do the clock related work.
750 	 */
751 	QCOM_SPI_UNLOCK(sc);
752 
753 	/*
754 	 * Set the clock frequency
755 	 */
756 	ret = clk_set_freq(sc->clk_iface, sc->state.frequency, 0);
757 	if (ret != 0) {
758 		device_printf(sc->sc_dev,
759 		    "ERROR: failed to set frequency to %u\n",
760 		    sc->state.frequency);
761 		goto done2;
762 	}
763 	clk_enable(sc->clk_iface);
764 
765 	QCOM_SPI_LOCK(sc);
766 
767 	/*
768 	 * Set state to RESET
769 	 */
770 	ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RESET);
771 	if (ret != 0) {
772 		device_printf(sc->sc_dev,
773 		    "ERROR: can't transition to RESET (%u)\n", ret);
774 		goto done;
775 	}
776 
777 	/* Assert hardware CS if set, else GPIO */
778 	if (sc->cs_pins[cs_val & ~SPIBUS_CS_HIGH] == NULL)
779 		qcom_spi_hw_spi_cs_force(sc, cs_val & SPIBUS_CS_HIGH, true);
780 	else
781 		qcom_spi_set_chipsel(sc, cs_val & ~SPIBUS_CS_HIGH, true);
782 
783 	/*
784 	 * cmd buffer transfer
785 	 */
786 	ret = qcom_spi_transfer_pio_block(sc, mode_val, cmd->tx_cmd,
787 	    cmd->tx_cmd_sz, cmd->rx_cmd, cmd->rx_cmd_sz);
788 	if (ret != 0) {
789 		device_printf(sc->sc_dev,
790 		    "ERROR: failed to transfer cmd payload (%u)\n", ret);
791 		goto done;
792 	}
793 
794 	/*
795 	 * data buffer transfer
796 	 */
797 	if (cmd->tx_data_sz > 0) {
798 		ret = qcom_spi_transfer_pio_block(sc, mode_val, cmd->tx_data,
799 		    cmd->tx_data_sz, cmd->rx_data, cmd->rx_data_sz);
800 		if (ret != 0) {
801 			device_printf(sc->sc_dev,
802 			    "ERROR: failed to transfer data payload (%u)\n",
803 			    ret);
804 			goto done;
805 		}
806 	}
807 
808 done:
809 	/* De-assert GPIO/CS */
810 	if (sc->cs_pins[cs_val & ~SPIBUS_CS_HIGH] == NULL)
811 		qcom_spi_hw_spi_cs_force(sc, cs_val & ~SPIBUS_CS_HIGH, false);
812 	else
813 		qcom_spi_set_chipsel(sc, cs_val & ~SPIBUS_CS_HIGH, false);
814 
815 	/*
816 	 * Similarly to when we enabled the clock, we can't hold it here
817 	 * across a clk API as that's a sleep lock and we're non-sleepable.
818 	 * So instead we unlock/relock here, but we still hold the busy flag.
819 	 */
820 
821 	QCOM_SPI_UNLOCK(sc);
822 	clk_disable(sc->clk_iface);
823 	QCOM_SPI_LOCK(sc);
824 done2:
825 	/*
826 	 * We're done; so mark the bus as not busy and wakeup
827 	 * the next caller.
828 	 */
829 	sc->sc_busy = false;
830 	wakeup_one(sc);
831 	QCOM_SPI_UNLOCK(sc);
832 	return (ret);
833 }
834 
835 static int
836 qcom_spi_detach(device_t dev)
837 {
838 	struct qcom_spi_softc *sc = device_get_softc(dev);
839 	int i;
840 
841 	bus_generic_detach(sc->sc_dev);
842 	if (sc->spibus != NULL)
843 		device_delete_child(dev, sc->spibus);
844 
845 	if (sc->sc_irq_h)
846 		bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_h);
847 
848 	if (sc->clk_iface) {
849 		clk_disable(sc->clk_iface);
850 		clk_release(sc->clk_iface);
851 	}
852 	if (sc->clk_core) {
853 		clk_disable(sc->clk_core);
854 		clk_release(sc->clk_core);
855 	}
856 
857 	for (i = 0; i < CS_MAX; i++) {
858 		if (sc->cs_pins[i] != NULL)
859 			gpio_pin_release(sc->cs_pins[i]);
860 	}
861 
862 	if (sc->sc_mem_res)
863 		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
864 	if (sc->sc_irq_res)
865 		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
866 
867 	mtx_destroy(&sc->sc_mtx);
868 
869 	return (0);
870 }
871 
872 static phandle_t
873 qcom_spi_get_node(device_t bus, device_t dev)
874 {
875 
876 	return ofw_bus_get_node(bus);
877 }
878 
879 
880 static device_method_t qcom_spi_methods[] = {
881 	/* Device interface */
882 	DEVMETHOD(device_probe,		qcom_spi_probe),
883 	DEVMETHOD(device_attach,	qcom_spi_attach),
884 	DEVMETHOD(device_detach,	qcom_spi_detach),
885 	/* TODO: suspend */
886 	/* TODO: resume */
887 
888 	DEVMETHOD(spibus_transfer,	qcom_spi_transfer),
889 
890 	/* ofw_bus_if */
891 	DEVMETHOD(ofw_bus_get_node,     qcom_spi_get_node),
892 
893 	DEVMETHOD_END
894 };
895 
896 static driver_t qcom_spi_driver = {
897 	"qcom_spi",
898 	qcom_spi_methods,
899 	sizeof(struct qcom_spi_softc),
900 };
901 
902 DRIVER_MODULE(qcom_spi, simplebus, qcom_spi_driver, 0, 0);
903 DRIVER_MODULE(ofw_spibus, qcom_spi, ofw_spibus_driver, 0, 0);
904 MODULE_DEPEND(qcom_spi, ofw_spibus, 1, 1, 1);
905 SIMPLEBUS_PNP_INFO(compat_data);
906