--- dev/spibus/spi.h.orig 2012-09-13 12:37:07.529154230 -0300 +++ dev/spibus/spi.h 2012-09-13 12:38:07.714155555 -0300 @@ -9,6 +9,7 @@ uint32_t tx_data_sz; void *rx_data; uint32_t rx_data_sz; + int flags; }; struct spi_config { --- mips/atheros/ar71xx_spi.c.orig 2012-09-13 10:29:26.048155122 -0300 +++ mips/atheros/ar71xx_spi.c 2012-09-13 12:53:09.855157799 -0300 @@ -253,15 +253,17 @@ } static uint8_t -ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, int cs, uint8_t data) +ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, int cs, uint8_t data, + int spi_flags) { int bit; - /* CS0 */ uint32_t ioctrl = SPI_IO_CTRL_CSMASK; + /* * low-level for selected CS */ - ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); + if ((spi_flags & SPI_CHIP_SELECT_HIGH) == 0) + ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); uint32_t iod, rds; for (bit = 7; bit >=0; bit--) { @@ -297,13 +299,17 @@ KASSERT(cmd->tx_data_sz == cmd->rx_data_sz, ("TX/RX data sizes should be equal")); + if (cmd->flags & SPI_CHIP_SELECT_HIGH) + ar71xx_spi_chip_deactivate(sc, devi->cs); + /* * Transfer command */ buf_out = (uint8_t *)cmd->tx_cmd; buf_in = (uint8_t *)cmd->rx_cmd; for (i = 0; i < cmd->tx_cmd_sz; i++) - buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i]); + buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i], + cmd->flags); /* * Receive/transmit data (depends on command) @@ -311,7 +317,11 @@ buf_out = (uint8_t *)cmd->tx_data; buf_in = (uint8_t *)cmd->rx_data; for (i = 0; i < cmd->tx_data_sz; i++) - buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i]); + buf_in[i] = ar71xx_spi_txrx(sc, devi->cs, buf_out[i], + cmd->flags); + + if (cmd->flags & SPI_CHIP_SELECT_HIGH) + ar71xx_spi_chip_activate(sc, devi->cs); return (0); }