1 /*- 2 * Copyright (c) 2016 Rubicon Communications, LLC (Netgate) 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 */ 27 #include <sys/cdefs.h> 28 __FBSDID("$FreeBSD$"); 29 30 #include <sys/param.h> 31 #include <sys/systm.h> 32 #include <sys/bus.h> 33 34 #include <sys/kernel.h> 35 #include <sys/module.h> 36 #include <sys/rman.h> 37 #include <sys/lock.h> 38 #include <sys/mutex.h> 39 #include <sys/sysctl.h> 40 41 #include <machine/bus.h> 42 #include <machine/resource.h> 43 #include <machine/intr.h> 44 45 #include <dev/fdt/fdt_common.h> 46 #include <dev/ofw/ofw_bus.h> 47 #include <dev/ofw/ofw_bus_subr.h> 48 49 #include <dev/spibus/spi.h> 50 #include <dev/spibus/spibusvar.h> 51 52 #include <arm/ti/ti_prcm.h> 53 #include <arm/ti/ti_hwmods.h> 54 #include <arm/ti/ti_spireg.h> 55 #include <arm/ti/ti_spivar.h> 56 57 #include "spibus_if.h" 58 59 static void ti_spi_intr(void *); 60 static int ti_spi_detach(device_t); 61 62 #undef TI_SPI_DEBUG 63 #ifdef TI_SPI_DEBUG 64 #define IRQSTATUSBITS \ 65 "\020\1TX0_EMPTY\2TX0_UNDERFLOW\3RX0_FULL\4RX0_OVERFLOW" \ 66 "\5TX1_EMPTY\6TX1_UNDERFLOW\7RX1_FULL\11TX2_EMPTY" \ 67 "\12TX1_UNDERFLOW\13RX2_FULL\15TX3_EMPTY\16TX3_UNDERFLOW" \ 68 "\17RX3_FULL\22EOW" 69 #define CONFBITS \ 70 "\020\1PHA\2POL\7EPOL\17DMAW\20DMAR\21DPE0\22DPE1\23IS" \ 71 "\24TURBO\25FORCE\30SBE\31SBPOL\34FFEW\35FFER\36CLKG" 72 #define STATBITS \ 73 "\020\1RXS\2TXS\3EOT\4TXFFE\5TXFFF\6RXFFE\7RXFFFF" 74 #define MODULCTRLBITS \ 75 "\020\1SINGLE\2NOSPIEN\3SLAVE\4SYST\10MOA\11FDAA" 76 #define CTRLBITS \ 77 "\020\1ENABLED" 78 79 static void 80 ti_spi_printr(device_t dev) 81 { 82 int clk, conf, ctrl, div, i, j, wl; 83 struct ti_spi_softc *sc; 84 uint32_t reg; 85 86 sc = device_get_softc(dev); 87 reg = TI_SPI_READ(sc, MCSPI_SYSCONFIG); 88 device_printf(dev, "SYSCONFIG: %#x\n", reg); 89 reg = TI_SPI_READ(sc, MCSPI_SYSSTATUS); 90 device_printf(dev, "SYSSTATUS: %#x\n", reg); 91 reg = TI_SPI_READ(sc, MCSPI_IRQSTATUS); 92 device_printf(dev, "IRQSTATUS: 0x%b\n", reg, IRQSTATUSBITS); 93 reg = TI_SPI_READ(sc, MCSPI_IRQENABLE); 94 device_printf(dev, "IRQENABLE: 0x%b\n", reg, IRQSTATUSBITS); 95 reg = TI_SPI_READ(sc, MCSPI_MODULCTRL); 96 device_printf(dev, "MODULCTRL: 0x%b\n", reg, MODULCTRLBITS); 97 for (i = 0; i < sc->sc_numcs; i++) { 98 ctrl = TI_SPI_READ(sc, MCSPI_CTRL_CH(i)); 99 conf = TI_SPI_READ(sc, MCSPI_CONF_CH(i)); 100 device_printf(dev, "CH%dCONF: 0x%b\n", i, conf, CONFBITS); 101 if (conf & MCSPI_CONF_CLKG) { 102 div = (conf >> MCSPI_CONF_CLK_SHIFT) & MCSPI_CONF_CLK_MSK; 103 div |= ((ctrl >> MCSPI_CTRL_EXTCLK_SHIFT) & MCSPI_CTRL_EXTCLK_MSK) << 4; 104 } else { 105 div = 1; 106 j = (conf >> MCSPI_CONF_CLK_SHIFT) & MCSPI_CONF_CLK_MSK; 107 while (j-- > 0) 108 div <<= 1; 109 } 110 clk = TI_SPI_GCLK / div; 111 wl = ((conf >> MCSPI_CONF_WL_SHIFT) & MCSPI_CONF_WL_MSK) + 1; 112 device_printf(dev, "wordlen: %-2d clock: %d\n", wl, clk); 113 reg = TI_SPI_READ(sc, MCSPI_STAT_CH(i)); 114 device_printf(dev, "CH%dSTAT: 0x%b\n", i, reg, STATBITS); 115 device_printf(dev, "CH%dCTRL: 0x%b\n", i, ctrl, CTRLBITS); 116 } 117 reg = TI_SPI_READ(sc, MCSPI_XFERLEVEL); 118 device_printf(dev, "XFERLEVEL: %#x\n", reg); 119 } 120 #endif 121 122 static void 123 ti_spi_set_clock(struct ti_spi_softc *sc, int ch, int freq) 124 { 125 uint32_t clkdiv, conf, div, extclk, reg; 126 127 clkdiv = TI_SPI_GCLK / freq; 128 if (clkdiv > MCSPI_EXTCLK_MSK) { 129 extclk = 0; 130 clkdiv = 0; 131 div = 1; 132 while (TI_SPI_GCLK / div > freq && clkdiv <= 0xf) { 133 clkdiv++; 134 div <<= 1; 135 } 136 conf = clkdiv << MCSPI_CONF_CLK_SHIFT; 137 } else { 138 extclk = clkdiv >> 4; 139 clkdiv &= MCSPI_CONF_CLK_MSK; 140 conf = MCSPI_CONF_CLKG | clkdiv << MCSPI_CONF_CLK_SHIFT; 141 } 142 143 reg = TI_SPI_READ(sc, MCSPI_CTRL_CH(ch)); 144 reg &= ~(MCSPI_CTRL_EXTCLK_MSK << MCSPI_CTRL_EXTCLK_SHIFT); 145 reg |= extclk << MCSPI_CTRL_EXTCLK_SHIFT; 146 TI_SPI_WRITE(sc, MCSPI_CTRL_CH(ch), reg); 147 148 reg = TI_SPI_READ(sc, MCSPI_CONF_CH(ch)); 149 reg &= ~(MCSPI_CONF_CLKG | MCSPI_CONF_CLK_MSK << MCSPI_CONF_CLK_SHIFT); 150 TI_SPI_WRITE(sc, MCSPI_CONF_CH(ch), reg | conf); 151 } 152 153 static int 154 ti_spi_probe(device_t dev) 155 { 156 157 if (!ofw_bus_status_okay(dev)) 158 return (ENXIO); 159 if (!ofw_bus_is_compatible(dev, "ti,omap4-mcspi")) 160 return (ENXIO); 161 162 device_set_desc(dev, "TI McSPI controller"); 163 164 return (BUS_PROBE_DEFAULT); 165 } 166 167 static int 168 ti_spi_attach(device_t dev) 169 { 170 int clk_id, err, i, rid, timeout; 171 struct ti_spi_softc *sc; 172 uint32_t rev; 173 174 sc = device_get_softc(dev); 175 sc->sc_dev = dev; 176 177 /* 178 * Get the MMCHS device id from FDT. If it's not there use the newbus 179 * unit number (which will work as long as the devices are in order and 180 * none are skipped in the fdt). Note that this is a property we made 181 * up and added in freebsd, it doesn't exist in the published bindings. 182 */ 183 clk_id = ti_hwmods_get_clock(dev); 184 if (clk_id == INVALID_CLK_IDENT) { 185 device_printf(dev, 186 "failed to get clock based on hwmods property\n"); 187 return (EINVAL); 188 } 189 190 /* Activate the McSPI module. */ 191 err = ti_prcm_clk_enable(clk_id); 192 if (err) { 193 device_printf(dev, "Error: failed to activate source clock\n"); 194 return (err); 195 } 196 197 /* Get the number of available channels. */ 198 if ((OF_getencprop(ofw_bus_get_node(dev), "ti,spi-num-cs", 199 &sc->sc_numcs, sizeof(sc->sc_numcs))) <= 0) { 200 sc->sc_numcs = 2; 201 } 202 203 rid = 0; 204 sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 205 RF_ACTIVE); 206 if (!sc->sc_mem_res) { 207 device_printf(dev, "cannot allocate memory window\n"); 208 return (ENXIO); 209 } 210 211 sc->sc_bst = rman_get_bustag(sc->sc_mem_res); 212 sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res); 213 214 rid = 0; 215 sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, 216 RF_ACTIVE); 217 if (!sc->sc_irq_res) { 218 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); 219 device_printf(dev, "cannot allocate interrupt\n"); 220 return (ENXIO); 221 } 222 223 /* Hook up our interrupt handler. */ 224 if (bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_MISC | INTR_MPSAFE, 225 NULL, ti_spi_intr, sc, &sc->sc_intrhand)) { 226 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); 227 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); 228 device_printf(dev, "cannot setup the interrupt handler\n"); 229 return (ENXIO); 230 } 231 232 mtx_init(&sc->sc_mtx, "ti_spi", NULL, MTX_DEF); 233 234 /* Issue a softreset to the controller */ 235 TI_SPI_WRITE(sc, MCSPI_SYSCONFIG, MCSPI_SYSCONFIG_SOFTRESET); 236 timeout = 1000; 237 while (!(TI_SPI_READ(sc, MCSPI_SYSSTATUS) & 238 MCSPI_SYSSTATUS_RESETDONE)) { 239 if (--timeout == 0) { 240 device_printf(dev, 241 "Error: Controller reset operation timed out\n"); 242 ti_spi_detach(dev); 243 return (ENXIO); 244 } 245 DELAY(100); 246 } 247 248 /* Print the McSPI module revision. */ 249 rev = TI_SPI_READ(sc, MCSPI_REVISION); 250 device_printf(dev, 251 "scheme: %#x func: %#x rtl: %d rev: %d.%d custom rev: %d\n", 252 (rev >> MCSPI_REVISION_SCHEME_SHIFT) & MCSPI_REVISION_SCHEME_MSK, 253 (rev >> MCSPI_REVISION_FUNC_SHIFT) & MCSPI_REVISION_FUNC_MSK, 254 (rev >> MCSPI_REVISION_RTL_SHIFT) & MCSPI_REVISION_RTL_MSK, 255 (rev >> MCSPI_REVISION_MAJOR_SHIFT) & MCSPI_REVISION_MAJOR_MSK, 256 (rev >> MCSPI_REVISION_MINOR_SHIFT) & MCSPI_REVISION_MINOR_MSK, 257 (rev >> MCSPI_REVISION_CUSTOM_SHIFT) & MCSPI_REVISION_CUSTOM_MSK); 258 259 /* Set Master mode, single channel. */ 260 TI_SPI_WRITE(sc, MCSPI_MODULCTRL, MCSPI_MODULCTRL_SINGLE); 261 262 /* Clear pending interrupts and disable interrupts. */ 263 TI_SPI_WRITE(sc, MCSPI_IRQENABLE, 0x0); 264 TI_SPI_WRITE(sc, MCSPI_IRQSTATUS, 0xffff); 265 266 for (i = 0; i < sc->sc_numcs; i++) { 267 /* 268 * Default to SPI mode 0, CS active low, 8 bits word length and 269 * 500kHz clock. 270 */ 271 TI_SPI_WRITE(sc, MCSPI_CONF_CH(i), 272 MCSPI_CONF_DPE0 | MCSPI_CONF_EPOL | 273 (8 - 1) << MCSPI_CONF_WL_SHIFT); 274 /* Set initial clock - 500kHz. */ 275 ti_spi_set_clock(sc, i, 500000); 276 } 277 278 #ifdef TI_SPI_DEBUG 279 ti_spi_printr(dev); 280 #endif 281 282 device_add_child(dev, "spibus", -1); 283 284 return (bus_generic_attach(dev)); 285 } 286 287 static int 288 ti_spi_detach(device_t dev) 289 { 290 struct ti_spi_softc *sc; 291 292 sc = device_get_softc(dev); 293 294 /* Clear pending interrupts and disable interrupts. */ 295 TI_SPI_WRITE(sc, MCSPI_IRQENABLE, 0); 296 TI_SPI_WRITE(sc, MCSPI_IRQSTATUS, 0xffff); 297 298 /* Reset controller. */ 299 TI_SPI_WRITE(sc, MCSPI_SYSCONFIG, MCSPI_SYSCONFIG_SOFTRESET); 300 301 bus_generic_detach(dev); 302 303 mtx_destroy(&sc->sc_mtx); 304 if (sc->sc_intrhand) 305 bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_intrhand); 306 if (sc->sc_irq_res) 307 bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); 308 if (sc->sc_mem_res) 309 bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); 310 311 return (0); 312 } 313 314 static int 315 ti_spi_fill_fifo(struct ti_spi_softc *sc) 316 { 317 int bytes, timeout; 318 struct spi_command *cmd; 319 uint32_t written; 320 uint8_t *data; 321 322 cmd = sc->sc_cmd; 323 bytes = min(sc->sc_len - sc->sc_written, sc->sc_fifolvl); 324 while (bytes-- > 0) { 325 data = (uint8_t *)cmd->tx_cmd; 326 written = sc->sc_written++; 327 if (written >= cmd->tx_cmd_sz) { 328 data = (uint8_t *)cmd->tx_data; 329 written -= cmd->tx_cmd_sz; 330 } 331 if (sc->sc_fifolvl == 1) { 332 /* FIFO disabled. */ 333 timeout = 1000; 334 while (--timeout > 0 && (TI_SPI_READ(sc, 335 MCSPI_STAT_CH(sc->sc_cs)) & MCSPI_STAT_TXS) == 0) { 336 DELAY(100); 337 } 338 if (timeout == 0) 339 return (-1); 340 } 341 TI_SPI_WRITE(sc, MCSPI_TX_CH(sc->sc_cs), data[written]); 342 } 343 344 return (0); 345 } 346 347 static int 348 ti_spi_drain_fifo(struct ti_spi_softc *sc) 349 { 350 int bytes, timeout; 351 struct spi_command *cmd; 352 uint32_t read; 353 uint8_t *data; 354 355 cmd = sc->sc_cmd; 356 bytes = min(sc->sc_len - sc->sc_read, sc->sc_fifolvl); 357 while (bytes-- > 0) { 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; 363 } 364 if (sc->sc_fifolvl == 1) { 365 /* FIFO disabled. */ 366 timeout = 1000; 367 while (--timeout > 0 && (TI_SPI_READ(sc, 368 MCSPI_STAT_CH(sc->sc_cs)) & MCSPI_STAT_RXS) == 0) { 369 DELAY(100); 370 } 371 if (timeout == 0) 372 return (-1); 373 } 374 data[read] = TI_SPI_READ(sc, MCSPI_RX_CH(sc->sc_cs)); 375 } 376 377 return (0); 378 } 379 380 static void 381 ti_spi_intr(void *arg) 382 { 383 int eow; 384 struct ti_spi_softc *sc; 385 uint32_t status; 386 387 eow = 0; 388 sc = (struct ti_spi_softc *)arg; 389 TI_SPI_LOCK(sc); 390 status = TI_SPI_READ(sc, MCSPI_IRQSTATUS); 391 392 /* 393 * No new TX_empty or RX_full event will be asserted while the CPU has 394 * not performed the number of writes or reads defined by 395 * MCSPI_XFERLEVEL[AEL] and MCSPI_XFERLEVEL[AFL]. It is responsibility 396 * of CPU perform the right number of writes and reads. 397 */ 398 if (status & MCSPI_IRQ_TX0_EMPTY) 399 ti_spi_fill_fifo(sc); 400 if (status & MCSPI_IRQ_RX0_FULL) 401 ti_spi_drain_fifo(sc); 402 403 if (status & MCSPI_IRQ_EOW) 404 eow = 1; 405 406 /* Clear interrupt status. */ 407 TI_SPI_WRITE(sc, MCSPI_IRQSTATUS, status); 408 409 /* Check for end of transfer. */ 410 if (sc->sc_written == sc->sc_len && sc->sc_read == sc->sc_len) { 411 sc->sc_flags |= TI_SPI_DONE; 412 wakeup(sc->sc_dev); 413 } 414 415 TI_SPI_UNLOCK(sc); 416 } 417 418 static int 419 ti_spi_pio_transfer(struct ti_spi_softc *sc) 420 { 421 422 while (sc->sc_len - sc->sc_written > 0) { 423 if (ti_spi_fill_fifo(sc) == -1) 424 return (EIO); 425 if (ti_spi_drain_fifo(sc) == -1) 426 return (EIO); 427 } 428 429 return (0); 430 } 431 432 static int 433 ti_spi_gcd(int a, int b) 434 { 435 int m; 436 437 while ((m = a % b) != 0) { 438 a = b; 439 b = m; 440 } 441 442 return (b); 443 } 444 445 static int 446 ti_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) 447 { 448 int cs, err; 449 struct ti_spi_softc *sc; 450 uint32_t reg; 451 452 sc = device_get_softc(dev); 453 454 KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz, 455 ("TX/RX command sizes should be equal")); 456 KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, 457 ("TX/RX data sizes should be equal")); 458 459 /* Get the proper chip select for this child. */ 460 spibus_get_cs(child, &cs); 461 if (cs < 0 || cs > sc->sc_numcs) { 462 device_printf(dev, "Invalid chip select %d requested by %s\n", 463 cs, device_get_nameunit(child)); 464 return (EINVAL); 465 } 466 467 TI_SPI_LOCK(sc); 468 469 /* If the controller is in use wait until it is available. */ 470 while (sc->sc_flags & TI_SPI_BUSY) 471 mtx_sleep(dev, &sc->sc_mtx, 0, "ti_spi", 0); 472 473 /* Now we have control over SPI controller. */ 474 sc->sc_flags = TI_SPI_BUSY; 475 476 /* Save the SPI command data. */ 477 sc->sc_cs = cs; 478 sc->sc_cmd = cmd; 479 sc->sc_read = 0; 480 sc->sc_written = 0; 481 sc->sc_len = cmd->tx_cmd_sz + cmd->tx_data_sz; 482 sc->sc_fifolvl = ti_spi_gcd(sc->sc_len, TI_SPI_FIFOSZ); 483 if (sc->sc_fifolvl < 2 || sc->sc_len > 0xffff) 484 sc->sc_fifolvl = 1; /* FIFO disabled. */ 485 /* Disable FIFO for now. */ 486 sc->sc_fifolvl = 1; 487 488 /* Use a safe clock - 500kHz. */ 489 ti_spi_set_clock(sc, sc->sc_cs, 500000); 490 491 /* Disable the FIFO. */ 492 TI_SPI_WRITE(sc, MCSPI_XFERLEVEL, 0); 493 494 /* 8 bits word, d0 miso, d1 mosi, mode 0 and CS active low. */ 495 reg = TI_SPI_READ(sc, MCSPI_CONF_CH(sc->sc_cs)); 496 reg &= ~(MCSPI_CONF_FFER | MCSPI_CONF_FFEW | MCSPI_CONF_SBPOL | 497 MCSPI_CONF_SBE | MCSPI_CONF_TURBO | MCSPI_CONF_IS | 498 MCSPI_CONF_DPE1 | MCSPI_CONF_DPE0 | MCSPI_CONF_DMAR | 499 MCSPI_CONF_DMAW | MCSPI_CONF_EPOL); 500 reg |= MCSPI_CONF_DPE0 | MCSPI_CONF_EPOL | MCSPI_CONF_WL8BITS; 501 TI_SPI_WRITE(sc, MCSPI_CONF_CH(sc->sc_cs), reg); 502 503 #if 0 504 /* Enable channel interrupts. */ 505 reg = TI_SPI_READ(sc, MCSPI_IRQENABLE); 506 reg |= 0xf; 507 TI_SPI_WRITE(sc, MCSPI_IRQENABLE, reg); 508 #endif 509 510 /* Start the transfer. */ 511 reg = TI_SPI_READ(sc, MCSPI_CTRL_CH(sc->sc_cs)); 512 TI_SPI_WRITE(sc, MCSPI_CTRL_CH(sc->sc_cs), reg | MCSPI_CTRL_ENABLE); 513 514 /* Force CS on. */ 515 reg = TI_SPI_READ(sc, MCSPI_CONF_CH(sc->sc_cs)); 516 TI_SPI_WRITE(sc, MCSPI_CONF_CH(sc->sc_cs), reg |= MCSPI_CONF_FORCE); 517 518 err = 0; 519 if (sc->sc_fifolvl == 1) 520 err = ti_spi_pio_transfer(sc); 521 522 /* Force CS off. */ 523 reg = TI_SPI_READ(sc, MCSPI_CONF_CH(sc->sc_cs)); 524 reg &= ~MCSPI_CONF_FORCE; 525 TI_SPI_WRITE(sc, MCSPI_CONF_CH(sc->sc_cs), reg); 526 527 /* Disable IRQs. */ 528 reg = TI_SPI_READ(sc, MCSPI_IRQENABLE); 529 reg &= ~0xf; 530 TI_SPI_WRITE(sc, MCSPI_IRQENABLE, reg); 531 TI_SPI_WRITE(sc, MCSPI_IRQSTATUS, 0xf); 532 533 /* Disable the SPI channel. */ 534 reg = TI_SPI_READ(sc, MCSPI_CTRL_CH(sc->sc_cs)); 535 reg &= ~MCSPI_CTRL_ENABLE; 536 TI_SPI_WRITE(sc, MCSPI_CTRL_CH(sc->sc_cs), reg); 537 538 /* Disable FIFO. */ 539 reg = TI_SPI_READ(sc, MCSPI_CONF_CH(sc->sc_cs)); 540 reg &= ~(MCSPI_CONF_FFER | MCSPI_CONF_FFEW); 541 TI_SPI_WRITE(sc, MCSPI_CONF_CH(sc->sc_cs), reg); 542 543 /* Release the controller and wakeup the next thread waiting for it. */ 544 sc->sc_flags = 0; 545 wakeup_one(dev); 546 TI_SPI_UNLOCK(sc); 547 548 return (err); 549 } 550 551 static phandle_t 552 ti_spi_get_node(device_t bus, device_t dev) 553 { 554 555 /* Share controller node with spibus. */ 556 return (ofw_bus_get_node(bus)); 557 } 558 559 static device_method_t ti_spi_methods[] = { 560 /* Device interface */ 561 DEVMETHOD(device_probe, ti_spi_probe), 562 DEVMETHOD(device_attach, ti_spi_attach), 563 DEVMETHOD(device_detach, ti_spi_detach), 564 565 /* SPI interface */ 566 DEVMETHOD(spibus_transfer, ti_spi_transfer), 567 568 /* ofw_bus interface */ 569 DEVMETHOD(ofw_bus_get_node, ti_spi_get_node), 570 571 DEVMETHOD_END 572 }; 573 574 static devclass_t ti_spi_devclass; 575 576 static driver_t ti_spi_driver = { 577 "spi", 578 ti_spi_methods, 579 sizeof(struct ti_spi_softc), 580 }; 581 582 DRIVER_MODULE(ti_spi, simplebus, ti_spi_driver, ti_spi_devclass, 0, 0); 583