diff options
-rw-r--r-- | c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c index e15ce5e51c..c88cec9868 100644 --- a/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c +++ b/c/src/lib/libbsp/arm/atsam/spi/atsam_spi_bus.c @@ -394,34 +394,33 @@ static uint32_t atsam_send_command( return 0; } -static int atsam_message_checks(atsam_spi_bus *bus, const spi_ioc_transfer *msg) +static int atsam_check_configure_spi(atsam_spi_bus *bus, const spi_ioc_transfer *msg) { - int status = 0; - - if (msg->bits_per_word < 8 || msg->bits_per_word > 16) { - status = -EINVAL; - } else if (msg->mode > 3) { - status = -EINVAL; - } else if (msg->speed_hz > bus->base.max_speed_hz) { - status = -EINVAL; - } else { - if (msg->mode != bus->base.mode || - msg->speed_hz != bus->base.speed_hz || - msg->bits_per_word != bus->base.bits_per_word || - msg->cs != bus->base.cs || - msg->delay_usecs != bus->base.delay_usecs + if ( + msg->mode != bus->base.mode + || msg->speed_hz != bus->base.speed_hz + || msg->bits_per_word != bus->base.bits_per_word + || msg->cs != bus->base.cs + || msg->delay_usecs != bus->base.delay_usecs + ) { + if ( + msg->bits_per_word < 8 + || msg->bits_per_word > 16 + || msg->mode > 3 + || msg->speed_hz > bus->base.max_speed_hz ) { - bus->base.mode = msg->mode; - bus->base.speed_hz = msg->speed_hz; - bus->base.bits_per_word = msg->bits_per_word; - bus->base.cs = msg->cs; - bus->base.delay_usecs = msg->delay_usecs; - atsam_configure_spi(bus); - status = 1; + return -EINVAL; } + + bus->base.mode = msg->mode; + bus->base.speed_hz = msg->speed_hz; + bus->base.bits_per_word = msg->bits_per_word; + bus->base.cs = msg->cs; + bus->base.delay_usecs = msg->delay_usecs; + atsam_configure_spi(bus); } - return status; + return 0; } static int atsam_spi_setup_transfer(atsam_spi_bus *bus) @@ -430,33 +429,32 @@ static int atsam_spi_setup_transfer(atsam_spi_bus *bus) uint32_t msg_todo = bus->msg_todo; uint32_t i; uint32_t rv_command; - int rv = 0; + int error; - for (i=0; i<msg_todo; i++) { - rv = atsam_message_checks(bus, &msgs[i]); - if (rv < 0) { - break; - } else if (rv == 1) { - atsam_configure_spi(bus); - rv = 0; + for (i = 0; i < msg_todo; ++i) { + error = atsam_check_configure_spi(bus, &msgs[i]); + if (error < 0) { + return error; } + rv_command = atsam_send_command(bus, &msgs[i]); if (rv_command != 0) { - rv = -1; - break; + return -EIO; } rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); bus->rx_transfer_done = false; bus->tx_transfer_done = false; + if (msgs[i].cs_change > 0) { SPI_ReleaseCS(bus->SpiDma.pSpiHw); atsam_finish_command(&bus->SpiDma); bus->spi_switched_on = false; } } - return rv; + + return 0; } static int atsam_spi_transfer( |