1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
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/cdefs.h>
30 __FBSDID("$FreeBSD$");
31
32 #include <sys/param.h>
33 #include <sys/systm.h>
34
35 #include <sys/bus.h>
36 #include <sys/interrupt.h>
37 #include <sys/malloc.h>
38 #include <sys/lock.h>
39 #include <sys/mutex.h>
40 #include <sys/kernel.h>
41 #include <sys/module.h>
42 #include <sys/rman.h>
43
44 #include <vm/vm.h>
45 #include <vm/pmap.h>
46 #include <vm/vm_extern.h>
47
48 #include <machine/bus.h>
49 #include <machine/cpu.h>
50
51 #include <dev/gpio/gpiobusvar.h>
52 #include <dev/ofw/ofw_bus.h>
53 #include <dev/ofw/ofw_bus_subr.h>
54
55 #include <dev/extres/clk/clk.h>
56 #include <dev/extres/hwreset/hwreset.h>
57
58 #include <dev/spibus/spi.h>
59 #include <dev/spibus/spibusvar.h>
60 #include "spibus_if.h"
61
62 #include <dev/qcom_qup/qcom_spi_var.h>
63 #include <dev/qcom_qup/qcom_spi_reg.h>
64 #include <dev/qcom_qup/qcom_qup_reg.h>
65 #include <dev/qcom_qup/qcom_spi_debug.h>
66
67 int
68 qcom_spi_hw_read_controller_transfer_sizes(struct qcom_spi_softc *sc)
69 {
70 uint32_t reg, val;
71
72 reg = QCOM_SPI_READ_4(sc, QUP_IO_M_MODES);
73
74 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
75 "%s: QUP_IO_M_MODES=0x%08x\n", __func__, reg);
76
77 /* Input block size */
78 val = (reg >> QUP_IO_M_INPUT_BLOCK_SIZE_SHIFT)
79 & QUP_IO_M_INPUT_BLOCK_SIZE_MASK;
80 if (val == 0)
81 sc->config.input_block_size = 4;
82 else
83 sc->config.input_block_size = val * 16;
84
85 /* Output block size */
86 val = (reg >> QUP_IO_M_OUTPUT_BLOCK_SIZE_SHIFT)
87 & QUP_IO_M_OUTPUT_BLOCK_SIZE_MASK;
88 if (val == 0)
89 sc->config.output_block_size = 4;
90 else
91 sc->config.output_block_size = val * 16;
92
93 /* Input FIFO size */
94 val = (reg >> QUP_IO_M_INPUT_FIFO_SIZE_SHIFT)
95 & QUP_IO_M_INPUT_FIFO_SIZE_MASK;
96 sc->config.input_fifo_size =
97 sc->config.input_block_size * (2 << val);
98
99 /* Output FIFO size */
100 val = (reg >> QUP_IO_M_OUTPUT_FIFO_SIZE_SHIFT)
101 & QUP_IO_M_OUTPUT_FIFO_SIZE_MASK;
102 sc->config.output_fifo_size =
103 sc->config.output_block_size * (2 << val);
104
105 return (0);
106 }
107
108 static bool
109 qcom_spi_hw_qup_is_state_valid_locked(struct qcom_spi_softc *sc)
110 {
111 uint32_t reg;
112
113 QCOM_SPI_ASSERT_LOCKED(sc);
114
115 reg = QCOM_SPI_READ_4(sc, QUP_STATE);
116 QCOM_SPI_BARRIER_READ(sc);
117
118 return !! (reg & QUP_STATE_VALID);
119 }
120
121 static int
122 qcom_spi_hw_qup_wait_state_valid_locked(struct qcom_spi_softc *sc)
123 {
124 int i;
125
126 for (i = 0; i < 10; i++) {
127 if (qcom_spi_hw_qup_is_state_valid_locked(sc))
128 break;
129 }
130 if (i >= 10) {
131 device_printf(sc->sc_dev,
132 "ERROR: timeout waiting for valid state\n");
133 return (ENXIO);
134 }
135 return (0);
136 }
137
138 static bool
139 qcom_spi_hw_is_opmode_dma_locked(struct qcom_spi_softc *sc)
140 {
141
142 QCOM_SPI_ASSERT_LOCKED(sc);
143
144 if (sc->state.transfer_mode == QUP_IO_M_MODE_DMOV)
145 return (true);
146 if (sc->state.transfer_mode == QUP_IO_M_MODE_BAM)
147 return (true);
148 return (false);
149 }
150
151 int
152 qcom_spi_hw_qup_set_state_locked(struct qcom_spi_softc *sc, uint32_t state)
153 {
154 uint32_t cur_state;
155 int ret;
156
157 QCOM_SPI_ASSERT_LOCKED(sc);
158
159 /* Wait until the state becomes valid */
160 ret = qcom_spi_hw_qup_wait_state_valid_locked(sc);
161 if (ret != 0) {
162 return (ret);
163 }
164
165 cur_state = QCOM_SPI_READ_4(sc, QUP_STATE);
166
167 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_STATE_CHANGE,
168 "%s: target state=%d, cur_state=0x%08x\n",
169 __func__, state, cur_state);
170
171 /*
172 * According to the QUP specification, when going
173 * from PAUSE to RESET, two writes are required.
174 */
175 if ((state == QUP_STATE_RESET)
176 && ((cur_state & QUP_STATE_MASK) == QUP_STATE_PAUSE)) {
177 QCOM_SPI_WRITE_4(sc, QUP_STATE, QUP_STATE_CLEAR);
178 QCOM_SPI_BARRIER_WRITE(sc);
179 QCOM_SPI_WRITE_4(sc, QUP_STATE, QUP_STATE_CLEAR);
180 QCOM_SPI_BARRIER_WRITE(sc);
181 } else {
182 cur_state &= ~QUP_STATE_MASK;
183 cur_state |= state;
184 QCOM_SPI_WRITE_4(sc, QUP_STATE, cur_state);
185 QCOM_SPI_BARRIER_WRITE(sc);
186 }
187
188 /* Wait until the state becomes valid */
189 ret = qcom_spi_hw_qup_wait_state_valid_locked(sc);
190 if (ret != 0) {
191 return (ret);
192 }
193
194 cur_state = QCOM_SPI_READ_4(sc, QUP_STATE);
195
196 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_STATE_CHANGE,
197 "%s: FINISH: target state=%d, cur_state=0x%08x\n",
198 __func__, state, cur_state);
199
200 return (0);
201 }
202
203 /*
204 * Do initial QUP setup.
205 *
206 * This is initially for the SPI driver; it would be interesting to see how
207 * much of this is the same with the I2C/HSUART paths.
208 */
209 int
210 qcom_spi_hw_qup_init_locked(struct qcom_spi_softc *sc)
211 {
212 int ret;
213
214 QCOM_SPI_ASSERT_LOCKED(sc);
215
216 /* Full hardware reset */
217 (void) qcom_spi_hw_do_full_reset(sc);
218
219 ret = qcom_spi_hw_qup_set_state_locked(sc, QUP_STATE_RESET);
220 if (ret != 0) {
221 device_printf(sc->sc_dev, "ERROR: %s: couldn't reset\n",
222 __func__);
223 goto error;
224 }
225
226 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, 0);
227 QCOM_SPI_WRITE_4(sc, QUP_IO_M_MODES, 0);
228 /* Note: no QUP_OPERATIONAL_MASK in QUP v1 */
229 if (! QCOM_SPI_QUP_VERSION_V1(sc))
230 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL_MASK, 0);
231
232 /* Explicitly disable input overrun in QUP v1 */
233 if (QCOM_SPI_QUP_VERSION_V1(sc))
234 QCOM_SPI_WRITE_4(sc, QUP_ERROR_FLAGS_EN,
235 QUP_ERROR_OUTPUT_OVER_RUN
236 | QUP_ERROR_INPUT_UNDER_RUN
237 | QUP_ERROR_OUTPUT_UNDER_RUN);
238 QCOM_SPI_BARRIER_WRITE(sc);
239
240 return (0);
241 error:
242 return (ret);
243 }
244
245 /*
246 * Do initial SPI setup.
247 */
248 int
249 qcom_spi_hw_spi_init_locked(struct qcom_spi_softc *sc)
250 {
251
252 QCOM_SPI_ASSERT_LOCKED(sc);
253
254 /* Initial SPI error flags */
255 QCOM_SPI_WRITE_4(sc, SPI_ERROR_FLAGS_EN,
256 QUP_ERROR_INPUT_UNDER_RUN
257 | QUP_ERROR_OUTPUT_UNDER_RUN);
258 QCOM_SPI_BARRIER_WRITE(sc);
259
260 /* Initial SPI config */
261 QCOM_SPI_WRITE_4(sc, SPI_CONFIG, 0);
262 QCOM_SPI_BARRIER_WRITE(sc);
263
264 /* Initial CS/tri-state io control config */
265 QCOM_SPI_WRITE_4(sc, SPI_IO_CONTROL,
266 SPI_IO_C_NO_TRI_STATE
267 | SPI_IO_C_CS_SELECT(sc->config.cs_select));
268 QCOM_SPI_BARRIER_WRITE(sc);
269
270 return (0);
271 }
272
273 /*
274 * Force the currently selected device CS line to be active
275 * or inactive.
276 *
277 * This forces it to be active or inactive rather than letting
278 * the SPI transfer machine do its thing. If you want to be able
279 * break up a big transaction into a handful of smaller ones,
280 * without toggling /CS_n for that device, then you need it forced.
281 * (If you toggle the /CS_n to the device to inactive then active,
282 * NOR/NAND devices tend to stop a block transfer.)
283 */
284 int
285 qcom_spi_hw_spi_cs_force(struct qcom_spi_softc *sc, int cs, bool enable)
286 {
287 uint32_t reg;
288
289 QCOM_SPI_ASSERT_LOCKED(sc);
290
291 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_CHIPSELECT,
292 "%s: called, enable=%u\n",
293 __func__, enable);
294
295 reg = QCOM_SPI_READ_4(sc, SPI_IO_CONTROL);
296 if (enable)
297 reg |= SPI_IO_C_FORCE_CS;
298 else
299 reg &= ~SPI_IO_C_FORCE_CS;
300 reg &= ~SPI_IO_C_CS_SELECT_MASK;
301 reg |= SPI_IO_C_CS_SELECT(cs);
302 QCOM_SPI_WRITE_4(sc, SPI_IO_CONTROL, reg);
303 QCOM_SPI_BARRIER_WRITE(sc);
304
305 return (0);
306 }
307
308 /*
309 * ACK/store current interrupt flag state.
310 */
311 int
312 qcom_spi_hw_interrupt_handle(struct qcom_spi_softc *sc)
313 {
314 uint32_t qup_error, spi_error, op_flags;
315
316 QCOM_SPI_ASSERT_LOCKED(sc);
317
318 /* Get QUP/SPI state */
319 qup_error = QCOM_SPI_READ_4(sc, QUP_ERROR_FLAGS);
320 spi_error = QCOM_SPI_READ_4(sc, SPI_ERROR_FLAGS);
321 op_flags = QCOM_SPI_READ_4(sc, QUP_OPERATIONAL);
322
323 /* ACK state */
324 QCOM_SPI_WRITE_4(sc, QUP_ERROR_FLAGS, qup_error);
325 QCOM_SPI_WRITE_4(sc, SPI_ERROR_FLAGS, spi_error);
326
327 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_INTR,
328 "%s: called; qup=0x%08x, spi=0x%08x, op=0x%08x\n",
329 __func__,
330 qup_error,
331 spi_error,
332 op_flags);
333
334 /* handle error flags */
335 if (qup_error != 0) {
336 device_printf(sc->sc_dev, "ERROR: (QUP) mask=0x%08x\n",
337 qup_error);
338 sc->intr.error = true;
339 }
340 if (spi_error != 0) {
341 device_printf(sc->sc_dev, "ERROR: (SPI) mask=0x%08x\n",
342 spi_error);
343 sc->intr.error = true;
344 }
345
346 /* handle operational state */
347 if (qcom_spi_hw_is_opmode_dma_locked(sc)) {
348 /* ACK interrupts now */
349 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, op_flags);
350 if ((op_flags & QUP_OP_IN_SERVICE_FLAG)
351 && (op_flags & QUP_OP_MAX_INPUT_DONE_FLAG))
352 sc->intr.rx_dma_done = true;
353 if ((op_flags & QUP_OP_OUT_SERVICE_FLAG)
354 && (op_flags & QUP_OP_MAX_OUTPUT_DONE_FLAG))
355 sc->intr.tx_dma_done = true;
356 } else {
357 /* FIFO/Block */
358 if (op_flags & QUP_OP_IN_SERVICE_FLAG)
359 sc->intr.do_rx = true;
360 if (op_flags & QUP_OP_OUT_SERVICE_FLAG)
361 sc->intr.do_tx = true;
362 }
363
364 /* Check if we've finished transfers */
365 if (op_flags & QUP_OP_MAX_INPUT_DONE_FLAG)
366 sc->intr.done = true;
367 if (sc->intr.error)
368 sc->intr.done = true;
369
370 return (0);
371 }
372
373 /*
374 * Make initial transfer selections based on the transfer sizes
375 * and alignment.
376 *
377 * For now this'll just default to FIFO until that works, and then
378 * will grow to include BLOCK / DMA as appropriate.
379 */
380 int
381 qcom_spi_hw_setup_transfer_selection(struct qcom_spi_softc *sc, uint32_t len)
382 {
383
384 QCOM_SPI_ASSERT_LOCKED(sc);
385
386 /*
387 * For now only support doing a single FIFO transfer.
388 * The main PIO transfer routine loop will break it up for us.
389 */
390 sc->state.transfer_mode = QUP_IO_M_MODE_FIFO;
391 sc->transfer.tx_offset = 0;
392 sc->transfer.rx_offset = 0;
393 sc->transfer.tx_len = 0;
394 sc->transfer.rx_len = 0;
395 sc->transfer.tx_buf = NULL;
396 sc->transfer.rx_buf = NULL;
397
398 /*
399 * If we're sending a DWORD multiple sized block (like IO buffers)
400 * then we can totally just use the DWORD size transfers.
401 *
402 * This is really only valid for PIO/block modes; I'm not yet
403 * sure what we should do for DMA modes.
404 */
405 if (len > 0 && len % 4 == 0)
406 sc->state.transfer_word_size = 4;
407 else
408 sc->state.transfer_word_size = 1;
409
410 return (0);
411 }
412
413 /*
414 * Blank the transfer state after a full transfer is completed.
415 */
416 int
417 qcom_spi_hw_complete_transfer(struct qcom_spi_softc *sc)
418 {
419 QCOM_SPI_ASSERT_LOCKED(sc);
420
421 sc->state.transfer_mode = QUP_IO_M_MODE_FIFO;
422 sc->transfer.tx_offset = 0;
423 sc->transfer.rx_offset = 0;
424 sc->transfer.tx_len = 0;
425 sc->transfer.rx_len = 0;
426 sc->transfer.tx_buf = NULL;
427 sc->transfer.rx_buf = NULL;
428 sc->state.transfer_word_size = 0;
429 return (0);
430 }
431
432 /*
433 * Configure up the transfer selection for the current transfer.
434 *
435 * This calculates how many words we can transfer in the current
436 * transfer and what's left to transfer.
437 */
438 int
439 qcom_spi_hw_setup_current_transfer(struct qcom_spi_softc *sc)
440 {
441 uint32_t bytes_left;
442
443 QCOM_SPI_ASSERT_LOCKED(sc);
444
445 /*
446 * XXX For now, base this on the TX side buffer size, not both.
447 * Later on we'll want to configure it based on the MAX of
448 * either and just eat up the dummy values in the PIO
449 * routines. (For DMA it's .. more annoyingly complicated
450 * if the transfer sizes are not symmetrical.)
451 */
452 bytes_left = sc->transfer.tx_len - sc->transfer.tx_offset;
453
454 if (sc->state.transfer_mode == QUP_IO_M_MODE_FIFO) {
455 /*
456 * For FIFO transfers the num_words limit depends upon
457 * the word size, FIFO size and how many bytes are left.
458 * It definitely will be under SPI_MAX_XFER so don't
459 * worry about that here.
460 */
461 sc->transfer.num_words = bytes_left / sc->state.transfer_word_size;
462 sc->transfer.num_words = MIN(sc->transfer.num_words,
463 sc->config.input_fifo_size / sizeof(uint32_t));
464 } else if (sc->state.transfer_mode == QUP_IO_M_MODE_BLOCK) {
465 /*
466 * For BLOCK transfers the logic will be a little different.
467 * Instead of it being based on the maximum input_fifo_size,
468 * it'll be broken down into the 'words per block" size but
469 * our maximum transfer size will ACTUALLY be capped by
470 * SPI_MAX_XFER (65536-64 bytes.) Each transfer
471 * will end up being in multiples of a block until the
472 * last transfer.
473 */
474 sc->transfer.num_words = bytes_left / sc->state.transfer_word_size;
475 sc->transfer.num_words = MIN(sc->transfer.num_words,
476 SPI_MAX_XFER);
477 }
478
479
480 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
481 "%s: transfer.tx_len=%u,"
482 "transfer.tx_offset=%u,"
483 " transfer_word_size=%u,"
484 " bytes_left=%u, num_words=%u, fifo_word_max=%u\n",
485 __func__,
486 sc->transfer.tx_len,
487 sc->transfer.tx_offset,
488 sc->state.transfer_word_size,
489 bytes_left,
490 sc->transfer.num_words,
491 sc->config.input_fifo_size / sizeof(uint32_t));
492
493 return (0);
494 }
495
496 /*
497 * Setup the PIO FIFO transfer count.
498 *
499 * Note that we get a /single/ TX/RX phase up to these num_words
500 * transfers.
501 */
502 int
503 qcom_spi_hw_setup_pio_transfer_cnt(struct qcom_spi_softc *sc)
504 {
505
506 QCOM_SPI_ASSERT_LOCKED(sc);
507
508 QCOM_SPI_WRITE_4(sc, QUP_MX_READ_CNT, sc->transfer.num_words);
509 QCOM_SPI_WRITE_4(sc, QUP_MX_WRITE_CNT, sc->transfer.num_words);
510 QCOM_SPI_WRITE_4(sc, QUP_MX_INPUT_CNT, 0);
511 QCOM_SPI_WRITE_4(sc, QUP_MX_OUTPUT_CNT, 0);
512
513 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
514 "%s: num_words=%u\n", __func__,
515 sc->transfer.num_words);
516
517 QCOM_SPI_BARRIER_WRITE(sc);
518
519 return (0);
520 }
521
522 /*
523 * Setup the PIO BLOCK transfer count.
524 *
525 * This sets up the total transfer size, in TX/RX FIFO block size
526 * chunks. We will get multiple notifications when a block sized
527 * chunk of data is avaliable or required.
528 */
529 int
530 qcom_spi_hw_setup_block_transfer_cnt(struct qcom_spi_softc *sc)
531 {
532
533 QCOM_SPI_ASSERT_LOCKED(sc);
534
535 QCOM_SPI_WRITE_4(sc, QUP_MX_READ_CNT, 0);
536 QCOM_SPI_WRITE_4(sc, QUP_MX_WRITE_CNT, 0);
537 QCOM_SPI_WRITE_4(sc, QUP_MX_INPUT_CNT, sc->transfer.num_words);
538 QCOM_SPI_WRITE_4(sc, QUP_MX_OUTPUT_CNT, sc->transfer.num_words);
539 QCOM_SPI_BARRIER_WRITE(sc);
540
541 return (0);
542 }
543
544 int
545 qcom_spi_hw_setup_io_modes(struct qcom_spi_softc *sc)
546 {
547 uint32_t reg;
548
549 QCOM_SPI_ASSERT_LOCKED(sc);
550
551 reg = QCOM_SPI_READ_4(sc, QUP_IO_M_MODES);
552
553 reg &= ~((QUP_IO_M_INPUT_MODE_MASK << QUP_IO_M_INPUT_MODE_SHIFT)
554 | (QUP_IO_M_OUTPUT_MODE_MASK << QUP_IO_M_OUTPUT_MODE_SHIFT));
555
556 /*
557 * If it's being done using DMA then the hardware will
558 * need to pack and unpack the byte stream into the word/dword
559 * stream being expected by the SPI/QUP micro engine.
560 *
561 * For PIO modes we're doing the pack/unpack in software,
562 * see the pio/block transfer routines.
563 */
564 if (qcom_spi_hw_is_opmode_dma_locked(sc))
565 reg |= (QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN);
566 else
567 reg &= ~(QUP_IO_M_PACK_EN | QUP_IO_M_UNPACK_EN);
568
569 /* Transfer mode */
570 reg |= ((sc->state.transfer_mode & QUP_IO_M_INPUT_MODE_MASK)
571 << QUP_IO_M_INPUT_MODE_SHIFT);
572 reg |= ((sc->state.transfer_mode & QUP_IO_M_OUTPUT_MODE_MASK)
573 << QUP_IO_M_OUTPUT_MODE_SHIFT);
574
575 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
576 "%s: QUP_IO_M_MODES=0x%08x\n", __func__, reg);
577
578 QCOM_SPI_WRITE_4(sc, QUP_IO_M_MODES, reg);
579 QCOM_SPI_BARRIER_WRITE(sc);
580
581 return (0);
582 }
583
584 int
585 qcom_spi_hw_setup_spi_io_clock_polarity(struct qcom_spi_softc *sc,
586 bool cpol)
587 {
588 uint32_t reg;
589
590 QCOM_SPI_ASSERT_LOCKED(sc);
591
592 reg = QCOM_SPI_READ_4(sc, SPI_IO_CONTROL);
593
594 if (cpol)
595 reg |= SPI_IO_C_CLK_IDLE_HIGH;
596 else
597 reg &= ~SPI_IO_C_CLK_IDLE_HIGH;
598
599 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
600 "%s: SPI_IO_CONTROL=0x%08x\n", __func__, reg);
601
602 QCOM_SPI_WRITE_4(sc, SPI_IO_CONTROL, reg);
603 QCOM_SPI_BARRIER_WRITE(sc);
604
605 return (0);
606 }
607
608 int
609 qcom_spi_hw_setup_spi_config(struct qcom_spi_softc *sc, uint32_t clock_val,
610 bool cpha)
611 {
612 uint32_t reg;
613
614 /*
615 * For now we don't have a way to configure loopback SPI for testing,
616 * or the clock/transfer phase. When we do then here's where we
617 * would put that.
618 */
619
620 QCOM_SPI_ASSERT_LOCKED(sc);
621
622 reg = QCOM_SPI_READ_4(sc, SPI_CONFIG);
623 reg &= ~SPI_CONFIG_LOOPBACK;
624
625 if (cpha)
626 reg &= ~SPI_CONFIG_INPUT_FIRST;
627 else
628 reg |= SPI_CONFIG_INPUT_FIRST;
629
630 /*
631 * If the frequency is above SPI_HS_MIN_RATE then enable high speed.
632 * This apparently improves stability.
633 *
634 * Note - don't do this if SPI loopback is enabled!
635 */
636 if (clock_val >= SPI_HS_MIN_RATE)
637 reg |= SPI_CONFIG_HS_MODE;
638 else
639 reg &= ~SPI_CONFIG_HS_MODE;
640
641 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
642 "%s: SPI_CONFIG=0x%08x\n", __func__, reg);
643
644 QCOM_SPI_WRITE_4(sc, SPI_CONFIG, reg);
645 QCOM_SPI_BARRIER_WRITE(sc);
646
647 return (0);
648 }
649
650 int
651 qcom_spi_hw_setup_qup_config(struct qcom_spi_softc *sc, bool is_tx, bool is_rx)
652 {
653 uint32_t reg;
654
655 QCOM_SPI_ASSERT_LOCKED(sc);
656
657 reg = QCOM_SPI_READ_4(sc, QUP_CONFIG);
658 reg &= ~(QUP_CONFIG_NO_INPUT | QUP_CONFIG_NO_OUTPUT | QUP_CONFIG_N);
659
660 /* SPI mode */
661 reg |= QUP_CONFIG_SPI_MODE;
662
663 /* bitmask for number of bits per word being used in each FIFO slot */
664 reg |= ((sc->state.transfer_word_size * 8) - 1) & QUP_CONFIG_N;
665
666 /*
667 * When doing DMA we need to configure whether we are shifting
668 * data in, out, and/or both. For PIO/block modes it must stay
669 * unset.
670 */
671 if (qcom_spi_hw_is_opmode_dma_locked(sc)) {
672 if (is_rx == false)
673 reg |= QUP_CONFIG_NO_INPUT;
674 if (is_tx == false)
675 reg |= QUP_CONFIG_NO_OUTPUT;
676 }
677
678 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
679 "%s: QUP_CONFIG=0x%08x\n", __func__, reg);
680
681 QCOM_SPI_WRITE_4(sc, QUP_CONFIG, reg);
682 QCOM_SPI_BARRIER_WRITE(sc);
683
684 return (0);
685 }
686
687 int
688 qcom_spi_hw_setup_operational_mask(struct qcom_spi_softc *sc)
689 {
690
691 QCOM_SPI_ASSERT_LOCKED(sc);
692
693 if (QCOM_SPI_QUP_VERSION_V1(sc)) {
694 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TRANSFER_SETUP,
695 "%s: skipping, qupv1\n", __func__);
696 return (0);
697 }
698
699 if (qcom_spi_hw_is_opmode_dma_locked(sc))
700 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL_MASK,
701 QUP_OP_IN_SERVICE_FLAG | QUP_OP_OUT_SERVICE_FLAG);
702 else
703 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL_MASK, 0);
704
705 QCOM_SPI_BARRIER_WRITE(sc);
706
707 return (0);
708 }
709
710 /*
711 * ACK that we already have serviced the output FIFO.
712 */
713 int
714 qcom_spi_hw_ack_write_pio_fifo(struct qcom_spi_softc *sc)
715 {
716
717 QCOM_SPI_ASSERT_LOCKED(sc);
718 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, QUP_OP_OUT_SERVICE_FLAG);
719 QCOM_SPI_BARRIER_WRITE(sc);
720 return (0);
721 }
722
723 int
724 qcom_spi_hw_ack_opmode(struct qcom_spi_softc *sc)
725 {
726
727 QCOM_SPI_ASSERT_LOCKED(sc);
728
729 QCOM_SPI_BARRIER_READ(sc);
730 QCOM_SPI_READ_4(sc, QUP_OPERATIONAL);
731 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, QUP_OP_OUT_SERVICE_FLAG);
732 QCOM_SPI_BARRIER_WRITE(sc);
733
734 return (0);
735
736 }
737
738 /*
739 * Read the value from the TX buffer into the given 32 bit DWORD,
740 * pre-shifting it into the place requested.
741 *
742 * Returns true if there was a byte available, false otherwise.
743 */
744 static bool
745 qcom_spi_hw_write_from_tx_buf(struct qcom_spi_softc *sc, int shift,
746 uint32_t *val)
747 {
748
749 QCOM_SPI_ASSERT_LOCKED(sc);
750
751 if (sc->transfer.tx_buf == NULL)
752 return false;
753
754 if (sc->transfer.tx_offset < sc->transfer.tx_len) {
755 *val |= (sc->transfer.tx_buf[sc->transfer.tx_offset] & 0xff)
756 << shift;
757 sc->transfer.tx_offset++;
758 return true;
759 }
760
761 return false;
762 }
763
764 int
765 qcom_spi_hw_write_pio_fifo(struct qcom_spi_softc *sc)
766 {
767 uint32_t i;
768 int num_bytes = 0;
769
770 QCOM_SPI_ASSERT_LOCKED(sc);
771
772 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, QUP_OP_OUT_SERVICE_FLAG);
773 QCOM_SPI_BARRIER_WRITE(sc);
774
775 /*
776 * Loop over the transfer num_words, do complain if we are full.
777 */
778 for (i = 0; i < sc->transfer.num_words; i++) {
779 uint32_t reg;
780
781 /* Break if FIFO is full */
782 if ((QCOM_SPI_READ_4(sc, QUP_OPERATIONAL)
783 & QUP_OP_OUT_FIFO_FULL) != 0) {
784 device_printf(sc->sc_dev, "%s: FIFO full\n", __func__);
785 break;
786 }
787
788 /*
789 * Handle 1, 2, 4 byte transfer packing rules.
790 *
791 * Unlike read, where the shifting is done towards the MSB
792 * for us by default, we have to do it ourselves for transmit.
793 * There's a bit that one can set to do the preshifting
794 * (and u-boot uses it!) but I'll stick with what Linux is
795 * doing to make it easier for future maintenance.
796 *
797 * The format is the same as 4 byte RX - 0xaabbccdd;
798 * the byte ordering on the wire being aa, bb, cc, dd.
799 */
800 reg = 0;
801 if (sc->state.transfer_word_size == 1) {
802 if (qcom_spi_hw_write_from_tx_buf(sc, 24, ®))
803 num_bytes++;
804 } else if (sc->state.transfer_word_size == 2) {
805 if (qcom_spi_hw_write_from_tx_buf(sc, 24, ®))
806 num_bytes++;
807 if (qcom_spi_hw_write_from_tx_buf(sc, 16, ®))
808 num_bytes++;
809 } else if (sc->state.transfer_word_size == 4) {
810 if (qcom_spi_hw_write_from_tx_buf(sc, 24, ®))
811 num_bytes++;
812 if (qcom_spi_hw_write_from_tx_buf(sc, 16, ®))
813 num_bytes++;
814 if (qcom_spi_hw_write_from_tx_buf(sc, 8, ®))
815 num_bytes++;
816 if (qcom_spi_hw_write_from_tx_buf(sc, 0, ®))
817 num_bytes++;
818 }
819
820 /*
821 * always shift out something in case we need phantom
822 * writes to finish things up whilst we read a reply
823 * payload.
824 */
825 QCOM_SPI_WRITE_4(sc, QUP_OUTPUT_FIFO, reg);
826 QCOM_SPI_BARRIER_WRITE(sc);
827 }
828
829 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TX_FIFO,
830 "%s: wrote %d bytes (%d fifo slots)\n",
831 __func__, num_bytes, sc->transfer.num_words);
832
833 return (0);
834 }
835
836 int
837 qcom_spi_hw_write_pio_block(struct qcom_spi_softc *sc)
838 {
839 /* Not yet implemented */
840 return (ENXIO);
841 }
842
843 /*
844 * Read data into the RX buffer and increment the RX offset.
845 *
846 * Return true if the byte was saved into the RX buffer, else
847 * return false.
848 */
849 static bool
850 qcom_spi_hw_read_into_rx_buf(struct qcom_spi_softc *sc, uint8_t val)
851 {
852 QCOM_SPI_ASSERT_LOCKED(sc);
853
854 if (sc->transfer.rx_buf == NULL)
855 return false;
856
857 /* Make sure we aren't overflowing the receive buffer */
858 if (sc->transfer.rx_offset < sc->transfer.rx_len) {
859 sc->transfer.rx_buf[sc->transfer.rx_offset] = val;
860 sc->transfer.rx_offset++;
861 return true;
862 }
863 return false;
864 }
865
866 /*
867 * Read "n_words" transfers, and push those bytes into the receive buffer.
868 * Make sure we have enough space, and make sure we don't overflow the
869 * read buffer size too!
870 */
871 int
872 qcom_spi_hw_read_pio_fifo(struct qcom_spi_softc *sc)
873 {
874 uint32_t i;
875 uint32_t reg;
876 int num_bytes = 0;
877
878 QCOM_SPI_ASSERT_LOCKED(sc);
879
880 QCOM_SPI_WRITE_4(sc, QUP_OPERATIONAL, QUP_OP_IN_SERVICE_FLAG);
881 QCOM_SPI_BARRIER_WRITE(sc);
882
883 for (i = 0; i < sc->transfer.num_words; i++) {
884 /* Break if FIFO is empty */
885 QCOM_SPI_BARRIER_READ(sc);
886 reg = QCOM_SPI_READ_4(sc, QUP_OPERATIONAL);
887 if ((reg & QUP_OP_IN_FIFO_NOT_EMPTY) == 0) {
888 device_printf(sc->sc_dev, "%s: FIFO empty\n", __func__);
889 break;
890 }
891
892 /*
893 * Always read num_words up to FIFO being non-empty; that way
894 * if we have mis-matching TX/RX buffer sizes for some reason
895 * we will read the needed phantom bytes.
896 */
897 reg = QCOM_SPI_READ_4(sc, QUP_INPUT_FIFO);
898
899 /*
900 * Unpack the receive buffer based on whether we are
901 * doing 1, 2, or 4 byte transfer words.
902 */
903 if (sc->state.transfer_word_size == 1) {
904 if (qcom_spi_hw_read_into_rx_buf(sc, reg & 0xff))
905 num_bytes++;
906 } else if (sc->state.transfer_word_size == 2) {
907 if (qcom_spi_hw_read_into_rx_buf(sc, (reg >> 8) & 0xff))
908 num_bytes++;
909 if (qcom_spi_hw_read_into_rx_buf(sc, reg & 0xff))
910 num_bytes++;
911 } else if (sc->state.transfer_word_size == 4) {
912 if (qcom_spi_hw_read_into_rx_buf(sc, (reg >> 24) & 0xff))
913 num_bytes++;
914 if (qcom_spi_hw_read_into_rx_buf(sc, (reg >> 16) & 0xff))
915 num_bytes++;
916 if (qcom_spi_hw_read_into_rx_buf(sc, (reg >> 8) & 0xff))
917 num_bytes++;
918 if (qcom_spi_hw_read_into_rx_buf(sc, reg & 0xff))
919 num_bytes++;
920 }
921 }
922
923 QCOM_SPI_DPRINTF(sc, QCOM_SPI_DEBUG_HW_TX_FIFO,
924 "%s: read %d bytes (%d transfer words)\n",
925 __func__, num_bytes, sc->transfer.num_words);
926
927 #if 0
928 /*
929 * This is a no-op for FIFO mode, it's only a thing for BLOCK
930 * transfers.
931 */
932 QCOM_SPI_BARRIER_READ(sc);
933 reg = QCOM_SPI_READ_4(sc, QUP_OPERATIONAL);
934 if (reg & QUP_OP_MAX_INPUT_DONE_FLAG) {
935 device_printf(sc->sc_dev, "%s: read complete (DONE)\n" ,
936 __func__);
937 sc->intr.done = true;
938 }
939 #endif
940
941 #if 0
942 /*
943 * And see if we've finished the transfer and won't be getting
944 * any more. Then treat it as done as well.
945 *
946 * In FIFO only mode we don't get a completion interrupt;
947 * we get an interrupt when the FIFO has enough data present.
948 */
949 if ((sc->state.transfer_mode == QUP_IO_M_MODE_FIFO)
950 && (sc->transfer.rx_offset >= sc->transfer.rx_len)) {
951 device_printf(sc->sc_dev, "%s: read complete (rxlen)\n",
952 __func__);
953 sc->intr.done = true;
954 }
955 #endif
956
957 /*
958 * For FIFO transfers we get a /single/ result that complete
959 * the FIFO transfer. We won't get any subsequent transfers;
960 * we'll need to schedule a new FIFO transfer.
961 */
962 sc->intr.done = true;
963
964 return (0);
965 }
966
967 int
968 qcom_spi_hw_read_pio_block(struct qcom_spi_softc *sc)
969 {
970
971 /* Not yet implemented */
972 return (ENXIO);
973 }
974
975 int
976 qcom_spi_hw_do_full_reset(struct qcom_spi_softc *sc)
977 {
978 QCOM_SPI_ASSERT_LOCKED(sc);
979
980 QCOM_SPI_WRITE_4(sc, QUP_SW_RESET, 1);
981 QCOM_SPI_BARRIER_WRITE(sc);
982 DELAY(100);
983
984 return (0);
985 }
Cache object: 2248281a0adbec5594bd1c19ac223890
|