[PATCH 11 minor addeum] arm/raspberrypi: GPIO - using RTEMS interrupt lock during BSP
Pavel Pisa
pisa at cmp.felk.cvut.cz
Tue Sep 6 17:18:33 UTC 2016
Locking can be used only when RTEMS reaches multitasking state
_System_state_Is_up( _System_state_Get() )
---
c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c b/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
index 6c01d62..f7c8c36 100644
--- a/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
+++ b/c/src/lib/libbsp/arm/raspberrypi/gpio/rpi-gpio.c
@@ -19,6 +19,7 @@
#include <bsp/irq-generic.h>
#include <bsp/gpio.h>
#include <bsp/rpi-gpio.h>
+#include <rtems/score/sysstate.h>
#include <stdlib.h>
@@ -57,16 +58,21 @@ static rtems_status_code rpi_select_pin_function(
/* Calculate the pin function select register address. */
volatile uint32_t *pin_addr = (uint32_t *) BCM2835_GPIO_REGS_BASE +
(pin / 10);
- uint32_t reg_old;
uint32_t reg_new;
+ int use_locks;
rtems_interrupt_lock_context lock_context;
- rtems_interrupt_lock_acquire(&rtems_gpio_bsp_lock, &lock_context);
- reg_new = reg_old = *pin_addr;
+ use_locks = _System_state_Is_up( _System_state_Get() );
+ if ( use_locks )
+ rtems_interrupt_lock_acquire(&rtems_gpio_bsp_lock, &lock_context);
+
+ reg_new = *pin_addr;
reg_new &= ~SELECT_PIN_FUNCTION(RPI_ALT_FUNC_MASK, pin);
reg_new |= SELECT_PIN_FUNCTION(type, pin);
*pin_addr = reg_new;
- rtems_interrupt_lock_release(&rtems_gpio_bsp_lock, &lock_context);
+
+ if ( use_locks )
+ rtems_interrupt_lock_release(&rtems_gpio_bsp_lock, &lock_context);
return RTEMS_SUCCESSFUL;
}
--
1.9.1
More information about the devel
mailing list