Lines Matching +full:tbg +full:- +full:a +full:- +full:p
1 /*-
15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62 bus_space_write_4((_sc)->sc_bst, (_sc)->sc_bsh, (_off), (_val))
64 bus_space_read_4((_sc)->sc_bst, (_sc)->sc_bsh, (_off))
65 #define A37X0_SPI_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx)
66 #define A37X0_SPI_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
72 * to retrieve the actual TBG and PLL settings.
107 { "marvell,armada-3700-spi", 1 },
134 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in a37x0_spi_probe()
150 sc->sc_dev = dev; in a37x0_spi_attach()
153 sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in a37x0_spi_attach()
155 if (!sc->sc_mem_res) { in a37x0_spi_attach()
160 sc->sc_bst = rman_get_bustag(sc->sc_mem_res); in a37x0_spi_attach()
161 sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res); in a37x0_spi_attach()
164 sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, in a37x0_spi_attach()
166 if (!sc->sc_irq_res) { in a37x0_spi_attach()
167 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); in a37x0_spi_attach()
181 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); in a37x0_spi_attach()
182 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); in a37x0_spi_attach()
201 if (bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE, in a37x0_spi_attach()
202 NULL, a37x0_spi_intr, sc, &sc->sc_intrhand)) { in a37x0_spi_attach()
203 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); in a37x0_spi_attach()
204 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); in a37x0_spi_attach()
209 mtx_init(&sc->sc_mtx, "a37x0_spi", NULL, MTX_DEF); in a37x0_spi_attach()
211 /* Read the controller max-frequency. */ in a37x0_spi_attach()
212 if (OF_getencprop(ofw_bus_get_node(dev), "spi-max-frequency", &maxfreq, in a37x0_spi_attach()
213 sizeof(maxfreq)) == -1) in a37x0_spi_attach()
215 sc->sc_maxfreq = maxfreq; in a37x0_spi_attach()
233 mtx_destroy(&sc->sc_mtx); in a37x0_spi_detach()
234 if (sc->sc_intrhand) in a37x0_spi_detach()
235 bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand); in a37x0_spi_detach()
236 if (sc->sc_irq_res) in a37x0_spi_detach()
237 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); in a37x0_spi_detach()
238 if (sc->sc_mem_res) in a37x0_spi_detach()
239 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); in a37x0_spi_detach()
249 uint8_t *p; in a37x0_spi_rx_byte() local
251 if (sc->sc_read == sc->sc_len) in a37x0_spi_rx_byte()
253 cmd = sc->sc_cmd; in a37x0_spi_rx_byte()
254 p = (uint8_t *)cmd->rx_cmd; in a37x0_spi_rx_byte()
255 read = sc->sc_read++; in a37x0_spi_rx_byte()
256 if (read >= cmd->rx_cmd_sz) { in a37x0_spi_rx_byte()
257 p = (uint8_t *)cmd->rx_data; in a37x0_spi_rx_byte()
258 read -= cmd->rx_cmd_sz; in a37x0_spi_rx_byte()
260 p[read] = A37X0_SPI_READ(sc, A37X0_SPI_DATA_IN) & 0xff; in a37x0_spi_rx_byte()
268 uint8_t *p; in a37x0_spi_tx_byte() local
270 if (sc->sc_written == sc->sc_len) in a37x0_spi_tx_byte()
272 cmd = sc->sc_cmd; in a37x0_spi_tx_byte()
273 p = (uint8_t *)cmd->tx_cmd; in a37x0_spi_tx_byte()
274 written = sc->sc_written++; in a37x0_spi_tx_byte()
275 if (written >= cmd->tx_cmd_sz) { in a37x0_spi_tx_byte()
276 p = (uint8_t *)cmd->tx_data; in a37x0_spi_tx_byte()
277 written -= cmd->tx_cmd_sz; in a37x0_spi_tx_byte()
279 A37X0_SPI_WRITE(sc, A37X0_SPI_DATA_OUT, p[written]); in a37x0_spi_tx_byte()
287 if (sc->sc_maxfreq > 0 && clock > sc->sc_maxfreq) in a37x0_spi_set_clock()
288 clock = sc->sc_maxfreq; in a37x0_spi_set_clock()
346 if ((sc->sc_flags & A37X0_SPI_BUSY) == 0) { in a37x0_spi_intr()
359 if (sc->sc_written == sc->sc_len && sc->sc_read == sc->sc_len) in a37x0_spi_intr()
360 wakeup(sc->sc_dev); in a37x0_spi_intr()
374 KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz, in a37x0_spi_transfer()
376 KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, in a37x0_spi_transfer()
407 while (sc->sc_flags & A37X0_SPI_BUSY) in a37x0_spi_transfer()
408 mtx_sleep(dev, &sc->sc_mtx, 0, "a37x0_spi", 0); in a37x0_spi_transfer()
411 sc->sc_flags = A37X0_SPI_BUSY; in a37x0_spi_transfer()
421 /* Save a pointer to the SPI command. */ in a37x0_spi_transfer()
422 sc->sc_cmd = cmd; in a37x0_spi_transfer()
423 sc->sc_read = 0; in a37x0_spi_transfer()
424 sc->sc_written = 0; in a37x0_spi_transfer()
425 sc->sc_len = cmd->tx_cmd_sz + cmd->tx_data_sz; in a37x0_spi_transfer()
431 while ((sc->sc_len - sc->sc_written) > 0) { in a37x0_spi_transfer()
438 while (--timeout > 0) { in a37x0_spi_transfer()
455 sc->sc_flags = 0; in a37x0_spi_transfer()