Lines Matching +full:wait +full:- +full:pin +full:- +full:polarity
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
58 {"broadcom,bcm2835-spi", 1},
59 {"brcm,bcm2835-spi", 1},
81 reg--;
105 mtx_assert(&sc->sc_mtx, MA_OWNED);
130 if (error != 0 || req->newptr == NULL)
150 if (error != 0 || req->newptr == NULL)
201 ctx = device_get_sysctl_ctx(sc->sc_dev);
202 tree_node = device_get_sysctl_tree(sc->sc_dev);
209 bcm_spi_cpol_proc, "IU", "SPI BUS clock polarity");
215 bcm_spi_cspol0_proc, "IU", "SPI BUS chip select 0 polarity");
218 bcm_spi_cspol1_proc, "IU", "SPI BUS chip select 1 polarity");
221 bcm_spi_cspol2_proc, "IU", "SPI BUS chip select 2 polarity");
231 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
251 sc->sc_dev = dev;
254 sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
256 if (!sc->sc_mem_res) {
261 sc->sc_bst = rman_get_bustag(sc->sc_mem_res);
262 sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res);
265 sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
267 if (!sc->sc_irq_res) {
268 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
274 if (bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
275 NULL, bcm_spi_intr, sc, &sc->sc_intrhand)) {
276 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
277 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
282 mtx_init(&sc->sc_mtx, "bcm_spi", NULL, MTX_DEF);
315 mtx_destroy(&sc->sc_mtx);
316 if (sc->sc_intrhand)
317 bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand);
318 if (sc->sc_irq_res)
319 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res);
320 if (sc->sc_mem_res)
321 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res);
333 cmd = sc->sc_cmd;
335 while (sc->sc_written < sc->sc_len &&
337 data = (uint8_t *)cmd->tx_cmd;
338 written = sc->sc_written++;
339 if (written >= cmd->tx_cmd_sz) {
340 data = (uint8_t *)cmd->tx_data;
341 written -= cmd->tx_cmd_sz;
355 cmd = sc->sc_cmd;
357 while (sc->sc_read < sc->sc_len && cs == SPI_CS_RXD) {
358 data = (uint8_t *)cmd->rx_cmd;
359 read = sc->sc_read++;
360 if (read >= cmd->rx_cmd_sz) {
361 data = (uint8_t *)cmd->rx_data;
362 read -= cmd->rx_cmd_sz;
378 if ((sc->sc_flags & BCM_SPI_BUSY) == 0) {
383 /* TX - Fill up the FIFO. */
386 /* RX - Drain the FIFO. */
390 if (sc->sc_written == sc->sc_len && sc->sc_read == sc->sc_len) {
392 if ((sc->sc_flags & BCM_SPI_KEEP_CS) == 0) {
396 wakeup(sc->sc_dev);
411 KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz,
413 KASSERT(cmd->tx_data_sz == cmd->rx_data_sz,
442 /* If the controller is in use wait until it is available. */
444 if (sc->sc_thread != curthread)
445 while (sc->sc_flags & BCM_SPI_BUSY)
446 mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", 0);
449 sc->sc_flags = BCM_SPI_BUSY;
451 if ((cmd->flags & SPI_FLAG_KEEP_CS) != 0)
452 sc->sc_flags |= BCM_SPI_KEEP_CS;
455 if (sc->sc_thread != curthread)
460 sc->sc_thread = curthread;
463 sc->sc_cmd = cmd;
464 sc->sc_read = 0;
465 sc->sc_written = 0;
466 sc->sc_len = cmd->tx_cmd_sz + cmd->tx_data_sz;
470 * Assign CS polarity first, while the CS indicates 'inactive'.
471 * This will need to set the correct polarity bit based on the 'cs', and
472 * the polarity bit will remain in this state, even after the transaction
493 * Set the mode in 'SPI_CS' (clock phase and polarity bits).
494 * This must happen before CS output pin is active.
503 * Set the clock divider in 'SPI_CLK - see 'bcm_spi_clock_proc()'.
511 clock--;
526 /* Wait for the transaction to complete. */
527 err = mtx_sleep(dev, &sc->sc_mtx, 0, "bcm_spi", hz * 2);
530 if (!(cmd->flags & SPI_FLAG_KEEP_CS)) {
533 sc->sc_thread = 0;
537 sc->sc_flags &= ~BCM_SPI_BUSY;
546 device_printf(sc->sc_dev, "SPI error (timeout)\n");