summaryrefslogtreecommitdiffstats
path: root/c/src/libchip
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-15 13:33:42 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-16 09:07:33 +0200
commit598f39cd872abf4de0b669cf12bdc19cb4504b76 (patch)
tree9fca081f9bfa07c7ab8d3a622790d06098c2bdc0 /c/src/libchip
parentbsps/powerpc: SMP support for one TSEC driver (diff)
downloadrtems-598f39cd872abf4de0b669cf12bdc19cb4504b76.tar.bz2
libchip: SMP support for NS16550
Diffstat (limited to 'c/src/libchip')
-rw-r--r--c/src/libchip/serial/ns16550.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c
index 91c3001928..390c729a54 100644
--- a/c/src/libchip/serial/ns16550.c
+++ b/c/src/libchip/serial/ns16550.c
@@ -58,6 +58,9 @@
#endif
#endif
+static rtems_interrupt_lock ns16550_lock =
+ RTEMS_INTERRUPT_LOCK_INITIALIZER("NS16550");
+
/*
* Flow control is only supported when using interrupts
*/
@@ -271,7 +274,7 @@ void ns16550_outch_polled(console_tbl *c, char out)
getRegister_f get = c->getRegister;
setRegister_f set = c->setRegister;
uint32_t status = 0;
- rtems_interrupt_level level;
+ rtems_interrupt_lock_context lock_context;
/* Save port interrupt mask */
uint32_t interrupt_mask = get( port, NS16550_INTERRUPT_ENABLE);
@@ -281,7 +284,7 @@ void ns16550_outch_polled(console_tbl *c, char out)
while (true) {
/* Try to transmit the character in a critical section */
- rtems_interrupt_disable( level);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
/* Read the transmitter holding register and check it */
status = get( port, NS16550_LINE_STATUS);
@@ -290,10 +293,10 @@ void ns16550_outch_polled(console_tbl *c, char out)
set( port, NS16550_TRANSMIT_BUFFER, out);
/* Finished */
- rtems_interrupt_enable( level);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
break;
} else {
- rtems_interrupt_enable( level);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
}
/* Wait for transmitter holding register to be empty */
@@ -324,7 +327,7 @@ void ns16550_write_polled(int minor, char out)
NS16550_STATIC int ns16550_assert_RTS(int minor)
{
uint32_t pNS16550;
- uint32_t Irql;
+ rtems_interrupt_lock_context lock_context;
ns16550_context *pns16550Context;
setRegister_f setReg;
@@ -336,10 +339,10 @@ NS16550_STATIC int ns16550_assert_RTS(int minor)
/*
* Assert RTS
*/
- rtems_interrupt_disable(Irql);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
pns16550Context->ucModemCtrl|=SP_MODEM_RTS;
(*setReg)(pNS16550, NS16550_MODEM_CONTROL, pns16550Context->ucModemCtrl);
- rtems_interrupt_enable(Irql);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
return 0;
}
@@ -350,7 +353,7 @@ NS16550_STATIC int ns16550_assert_RTS(int minor)
NS16550_STATIC int ns16550_negate_RTS(int minor)
{
uint32_t pNS16550;
- uint32_t Irql;
+ rtems_interrupt_lock_context lock_context;
ns16550_context *pns16550Context;
setRegister_f setReg;
@@ -362,10 +365,10 @@ NS16550_STATIC int ns16550_negate_RTS(int minor)
/*
* Negate RTS
*/
- rtems_interrupt_disable(Irql);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
pns16550Context->ucModemCtrl&=~SP_MODEM_RTS;
(*setReg)(pNS16550, NS16550_MODEM_CONTROL, pns16550Context->ucModemCtrl);
- rtems_interrupt_enable(Irql);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
return 0;
}
@@ -381,7 +384,7 @@ NS16550_STATIC int ns16550_negate_RTS(int minor)
NS16550_STATIC int ns16550_assert_DTR(int minor)
{
uint32_t pNS16550;
- uint32_t Irql;
+ rtems_interrupt_lock_context lock_context;
ns16550_context *pns16550Context;
setRegister_f setReg;
@@ -393,10 +396,10 @@ NS16550_STATIC int ns16550_assert_DTR(int minor)
/*
* Assert DTR
*/
- rtems_interrupt_disable(Irql);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
pns16550Context->ucModemCtrl|=SP_MODEM_DTR;
(*setReg)(pNS16550, NS16550_MODEM_CONTROL, pns16550Context->ucModemCtrl);
- rtems_interrupt_enable(Irql);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
return 0;
}
@@ -407,7 +410,7 @@ NS16550_STATIC int ns16550_assert_DTR(int minor)
NS16550_STATIC int ns16550_negate_DTR(int minor)
{
uint32_t pNS16550;
- uint32_t Irql;
+ rtems_interrupt_lock_context lock_context;
ns16550_context *pns16550Context;
setRegister_f setReg;
@@ -419,10 +422,10 @@ NS16550_STATIC int ns16550_negate_DTR(int minor)
/*
* Negate DTR
*/
- rtems_interrupt_disable(Irql);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
pns16550Context->ucModemCtrl&=~SP_MODEM_DTR;
(*setReg)(pNS16550, NS16550_MODEM_CONTROL,pns16550Context->ucModemCtrl);
- rtems_interrupt_enable(Irql);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
return 0;
}
@@ -443,7 +446,7 @@ int ns16550_set_attributes(
uint8_t ucLineControl;
uint32_t baud_requested;
setRegister_f setReg;
- uint32_t Irql;
+ rtems_interrupt_lock_context lock_context;
const console_tbl *c = Console_Port_Tbl [minor];
pNS16550 = c->ulCtrlPort1;
@@ -497,7 +500,7 @@ int ns16550_set_attributes(
* Now actually set the chip
*/
- rtems_interrupt_disable(Irql);
+ rtems_interrupt_lock_acquire(&ns16550_lock, &lock_context);
/*
* Set the baud rate
@@ -516,7 +519,7 @@ int ns16550_set_attributes(
*/
(*setReg)(pNS16550, NS16550_LINE_CONTROL, ucLineControl );
- rtems_interrupt_enable(Irql);
+ rtems_interrupt_lock_release(&ns16550_lock, &lock_context);
return 0;
}