Index: arm/lpc/lpc_spi.c =================================================================== --- arm/lpc/lpc_spi.c (revision 240418) +++ arm/lpc/lpc_spi.c (working copy) @@ -136,6 +136,24 @@ return (EBUSY); } +static void +lpc_spi_acquire_bus(device_t dev, device_t child) +{ + struct spibus_ivar *devi = SPIBUS_IVAR(child); + + /* Set CS active */ + lpc_gpio_set_state(child, devi->cs, 0); +} + +static void +lpc_spi_release_bus(device_t dev, device_t child) +{ + struct spibus_ivar *devi = SPIBUS_IVAR(child); + + /* Set CS inactive */ + lpc_gpio_set_state(child, devi->cs, 1); +} + static int lpc_spi_transfer(device_t dev, device_t child, struct spi_command *cmd) { @@ -144,9 +162,6 @@ uint8_t *in_buf, *out_buf; int i; - /* Set CS active */ - lpc_gpio_set_state(child, devi->cs, 0); - /* Wait for FIFO to be ready */ while ((lpc_spi_read_4(sc, LPC_SSP_SR) & LPC_SSP_SR_TNF) == 0); @@ -166,9 +181,6 @@ in_buf[i] = lpc_spi_read_4(sc, LPC_SSP_DR); } - /* Set CS inactive */ - lpc_gpio_set_state(child, devi->cs, 1); - return (0); } @@ -179,6 +191,8 @@ DEVMETHOD(device_detach, lpc_spi_detach), /* SPI interface */ + DEVMETHOD(spibus_acquire_bus, lpc_spi_acquire_bus), + DEVMETHOD(spibus_release_bus, lpc_spi_release_bus), DEVMETHOD(spibus_transfer, lpc_spi_transfer), { 0, 0 } Index: mips/atheros/ar71xx_spi.c =================================================================== --- mips/atheros/ar71xx_spi.c (revision 240418) +++ mips/atheros/ar71xx_spi.c (working copy) @@ -133,6 +133,26 @@ SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, SPI_IO_CTRL_CSMASK); } +static void +ar71xx_spi_acquire_bus(device_t dev, device_t child) +{ + struct ar71xx_spi_softc *sc = device_get_softc(dev); + struct spibus_ivar *devi = SPIBUS_IVAR(child); + + /* Select the SPI device. */ + ar71xx_spi_chip_activate(sc, devi->cs); +} + +static void +ar71xx_spi_release_bus(device_t dev, device_t child) +{ + struct ar71xx_spi_softc *sc = device_get_softc(dev); + struct spibus_ivar *devi = SPIBUS_IVAR(child); + + /* Deselect the SPI device. */ + ar71xx_spi_chip_deactivate(sc, devi->cs); +} + static uint8_t ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, int cs, uint8_t data) { @@ -173,8 +193,6 @@ sc = device_get_softc(dev); - ar71xx_spi_chip_activate(sc, devi->cs); - KASSERT(cmd->tx_cmd_sz == cmd->rx_cmd_sz, ("TX/RX command sizes should be equal")); KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, @@ -196,8 +214,6 @@ for (i = 0; i < cmd->tx_data_sz; i++) buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i]); - ar71xx_spi_chip_deactivate(sc, devi->cs); - return (0); } @@ -221,6 +237,8 @@ DEVMETHOD(device_attach, ar71xx_spi_attach), DEVMETHOD(device_detach, ar71xx_spi_detach), + DEVMETHOD(spibus_acquire_bus, ar71xx_spi_acquire_bus), + DEVMETHOD(spibus_release_bus, ar71xx_spi_release_bus), DEVMETHOD(spibus_transfer, ar71xx_spi_transfer), {0, 0}