SPI HAL API: lock()/open() and close()/unlock() merged

This commit is contained in:
Xenofon (Fontas) Fafoutis 2018-04-03 12:58:47 +01:00
parent 2cad626360
commit d7baa54bd0
4 changed files with 32 additions and 101 deletions

View File

@ -147,18 +147,6 @@ spix_wait_eorx(spi_device_t *dev)
while(!(REG(spi_regs[dev->spi_controller].base + SSI_SR) & SSI_SR_RNE));
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_lock(spi_device_t *dev)
{
if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) {
return SPI_DEV_STATUS_BUS_LOCKED;
}
board_spi_locks_spi[dev->spi_controller].owner = dev;
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/
bool
spi_arch_has_lock(spi_device_t *dev)
{
@ -180,20 +168,7 @@ spi_arch_is_bus_locked(spi_device_t *dev)
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_unlock(spi_device_t *dev)
{
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
}
board_spi_locks_spi[dev->spi_controller].owner = NULL;
mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock);
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_open(spi_device_t *dev)
spi_arch_lock_and_open(spi_device_t *dev)
{
const spi_regs_t *regs;
uint32_t scr;
@ -213,10 +188,13 @@ spi_arch_open(spi_device_t *dev)
uint32_t mode = 0;
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
/* lock the SPI bus */
if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) {
return SPI_DEV_STATUS_BUS_LOCKED;
}
board_spi_locks_spi[dev->spi_controller].owner = dev;
/* Set SPI phase */
if(dev->spi_pha != 0) {
mode = mode | SSI_CR0_SPH;
@ -287,7 +265,7 @@ spi_arch_open(spi_device_t *dev)
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_close(spi_device_t *dev)
spi_arch_close_and_unlock(spi_device_t *dev)
{
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
@ -296,6 +274,10 @@ spi_arch_close(spi_device_t *dev)
/* Disable SSI */
REG(SYS_CTRL_RCGCSSI) &= ~(1 << dev->spi_controller);
/* Unlock the SPI bus */
board_spi_locks_spi[dev->spi_controller].owner = NULL;
mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock);
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/

View File

@ -67,18 +67,6 @@ static const board_spi_controller_t spi_controller[SPI_CONTROLLER_COUNT] = {
}
};
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_lock(spi_device_t *dev)
{
if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) {
return SPI_DEV_STATUS_BUS_LOCKED;
}
board_spi_locks_spi[dev->spi_controller].owner = dev;
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/
bool
spi_arch_has_lock(spi_device_t *dev)
{
@ -99,19 +87,6 @@ spi_arch_is_bus_locked(spi_device_t *dev)
return false;
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_unlock(spi_device_t *dev)
{
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
}
board_spi_locks_spi[dev->spi_controller].owner = NULL;
mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock);
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/
static uint32_t
get_mode(spi_device_t *dev)
{
@ -128,14 +103,17 @@ get_mode(spi_device_t *dev)
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_open(spi_device_t *dev)
spi_arch_lock_and_open(spi_device_t *dev)
{
uint32_t c;
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
/* Lock the SPI bus */
if(mutex_try_lock(&board_spi_locks_spi[dev->spi_controller].lock) == false) {
return SPI_DEV_STATUS_BUS_LOCKED;
}
board_spi_locks_spi[dev->spi_controller].owner = dev;
/* CS pin configuration */
ti_lib_ioc_pin_type_gpio_output(dev->pin_spi_cs);
@ -166,7 +144,7 @@ spi_arch_open(spi_device_t *dev)
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_arch_close(spi_device_t *dev)
spi_arch_close_and_unlock(spi_device_t *dev)
{
if(!spi_arch_has_lock(dev)) {
return SPI_DEV_STATUS_BUS_NOT_OWNED;
@ -187,6 +165,10 @@ spi_arch_close(spi_device_t *dev)
ti_lib_ioc_pin_type_gpio_input(dev->pin_spi_sck);
ti_lib_ioc_io_port_pull_set(dev->pin_spi_sck, IOC_IOPULL_DOWN);
/* Unlock the SPI bus */
board_spi_locks_spi[dev->spi_controller].owner = NULL;
mutex_unlock(&board_spi_locks_spi[dev->spi_controller].lock);
return SPI_DEV_STATUS_OK;
}
/*---------------------------------------------------------------------------*/

View File

@ -45,39 +45,23 @@
spi_status_t
spi_acquire(spi_device_t *dev)
{
spi_status_t r;
if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) {
return SPI_DEV_STATUS_EINVAL;
}
/* lock the bus */
r = spi_arch_lock(dev);
if(r != SPI_DEV_STATUS_OK) {
return r;
}
/* open the bus */
return spi_arch_open(dev);
/* lock and open the bus */
return spi_arch_lock_and_open(dev);
}
/*---------------------------------------------------------------------------*/
spi_status_t
spi_release(spi_device_t *dev)
{
spi_status_t r;
if(dev == NULL || dev->spi_controller >= SPI_CONTROLLER_COUNT) {
return SPI_DEV_STATUS_EINVAL;
}
/* unlock the bus */
r = spi_arch_close(dev);
if(r != SPI_DEV_STATUS_OK) {
return r;
}
/* unlock the bus */
return spi_arch_unlock(dev);
/* close and unlock the bus */
return spi_arch_close_and_unlock(dev);
}
/*---------------------------------------------------------------------------*/
spi_status_t

View File

@ -258,24 +258,6 @@ spi_status_t spi_read_register(spi_device_t *dev, uint8_t reg,
/* These are architecture-specific functions to be implemented by each CPU. */
/*---------------------------------------------------------------------------*/
/**
* \brief Locks an SPI controller to device dev.
* \param dev An SPI device configuration which defines the controller
* to be locked and the device that locks it.
* \return SPI return code
*
*/
spi_status_t spi_arch_lock(spi_device_t *dev);
/**
* \brief Unlocks an SPI controller.
* \param dev An SPI device configuration which defines the controller
* to be unlocked and the device that unlocks it.
* \return SPI return code
*
*/
spi_status_t spi_arch_unlock(spi_device_t *dev);
/**
* \brief Checks if a device has locked an SPI controller
* \param dev An SPI device configuration which defines the controller
@ -295,7 +277,7 @@ bool spi_arch_has_lock(spi_device_t *dev);
bool spi_arch_is_bus_locked(spi_device_t *dev);
/**
* \brief Opens an SPI controller to the configuration specified.
* \brief Locks and opens an SPI controller to the configuration specified.
* \param dev An SPI device configuration.
* \return SPI return code
*
@ -303,19 +285,20 @@ bool spi_arch_is_bus_locked(spi_device_t *dev);
* controller.
*
*/
spi_status_t spi_arch_open(spi_device_t *dev);
spi_status_t spi_arch_lock_and_open(spi_device_t *dev);
/**
* \brief Closes an SPI controller
* \brief Closes and unlocks an SPI controller
* \param dev An SPI device configuration that specifies the controller.
* \return SPI return code
*
* This should turn off the SPI controller to put it in low power mode.
* This should turn off the SPI controller to put it in low power mode
* and unlock it.
* It should work only if the device has already locked the SPI
* controller.
*
*/
spi_status_t spi_arch_close(spi_device_t *dev);
spi_status_t spi_arch_close_and_unlock(spi_device_t *dev);
/**
* \brief Performs an SPI transfer