--- ar71xx_spi.c 2010-01-20 15:32:33.000000000 -0800 +++ /home/gonzo/old/ar71xx_spi.c 2010-01-20 15:00:28.000000000 -0800 @@ -106,7 +106,7 @@ SPI_WRITE(sc, AR71XX_SPI_FS, 1); sc->sc_reg_ctrl = SPI_READ(sc, AR71XX_SPI_CTRL); SPI_WRITE(sc, AR71XX_SPI_CTRL, 0x43); - SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, SPI_IO_CTRL_CSMASK); + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, 0); device_add_child(dev, "spibus", 0); return (bus_generic_attach(dev)); @@ -115,11 +115,11 @@ static void ar71xx_spi_chip_activate(struct ar71xx_spi_softc *sc, int cs) { - uint32_t ioctrl = SPI_IO_CTRL_CSMASK; + uint32_t ioctrl; /* * Put respective CSx to low */ - ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); + ioctrl = (SPI_IO_CTRL_CS0 << cs); SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, ioctrl); } @@ -130,19 +130,15 @@ /* * Put all CSx to high */ - SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, SPI_IO_CTRL_CSMASK); + SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, 0); } static uint8_t -ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, int cs, uint8_t data) +ar71xx_spi_txrx(struct ar71xx_spi_softc *sc, uint8_t data) { int bit; /* CS0 */ - uint32_t ioctrl = SPI_IO_CTRL_CSMASK; - /* - * low-level for selected CS - */ - ioctrl &= ~(SPI_IO_CTRL_CS0 << cs); + uint32_t ioctrl = SPI_IO_CTRL_CS0; uint32_t iod, rds; for (bit = 7; bit >=0; bit--) { @@ -154,11 +150,9 @@ SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, iod | SPI_IO_CTRL_CLK); } - /* - * Provide falling edge for connected device by clear clock bit. - */ SPI_WRITE(sc, AR71XX_SPI_IO_CTRL, iod); rds = SPI_READ(sc, AR71XX_SPI_RDS); + printf("spi: in:%02x out:%02x\n", data, rds & 0xff); return (rds & 0xff); } @@ -186,7 +180,7 @@ 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, buf_out[i]); /* * Receive/transmit data (depends on command) @@ -194,7 +188,7 @@ 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, buf_out[i]); ar71xx_spi_chip_deactivate(sc, devi->cs);