summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c')
-rw-r--r--c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c221
1 files changed, 141 insertions, 80 deletions
diff --git a/c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c b/c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c
index 20d8572157..a9478cd0ab 100644
--- a/c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c
+++ b/c/src/lib/libcpu/powerpc/mpc8xx/console-generic/console-generic.c
@@ -53,16 +53,14 @@
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
+#include <bsp/irq.h>
+#include <bspIo.h> /* for printk */
extern rtems_cpu_table Cpu_table;
/* BSP supplied routine */
extern int mbx8xx_console_get_configuration();
-#ifdef EPPCBUG_SMC1
-extern unsigned32 simask_copy;
-#endif
-
/*
* Interrupt-driven input buffer
*/
@@ -88,9 +86,6 @@ static char brg_used[4];
/* Used to track termios private data for callbacks */
struct rtems_termios_tty *ttyp[NUM_PORTS];
-/* Used to record previous ISR */
-static rtems_isr_entry old_handler[NUM_PORTS];
-
/*
* Device-specific routines
*/
@@ -99,12 +94,12 @@ static unsigned char m8xx_get_brg_clk(int);
void m8xx_console_reserve_resources(rtems_configuration_table *);
static int m8xx_smc_set_attributes(int, const struct termios*);
static int m8xx_scc_set_attributes(int, const struct termios*);
-static rtems_isr m8xx_smc1_interrupt_handler(rtems_vector_number);
-static rtems_isr m8xx_smc2_interrupt_handler(rtems_vector_number);
-static rtems_isr m8xx_scc2_interrupt_handler(rtems_vector_number);
+static void m8xx_smc1_interrupt_handler(void);
+static void m8xx_smc2_interrupt_handler(void);
+static void m8xx_scc2_interrupt_handler(void);
#if defined(mpc860)
-static rtems_isr m8xx_scc3_interrupt_handler(rtems_vector_number);
-static rtems_isr m8xx_scc4_interrupt_handler(rtems_vector_number);
+static void m8xx_scc3_interrupt_handler(void);
+static void m8xx_scc4_interrupt_handler(void);
#endif
/*
@@ -387,8 +382,7 @@ m8xx_uart_setAttributes(
/*
* Interrupt handlers
*/
-static rtems_isr
-m8xx_scc2_interrupt_handler (rtems_vector_number v)
+static void m8xx_scc2_interrupt_handler ()
{
int nb_overflow;
@@ -425,13 +419,12 @@ m8xx_scc2_interrupt_handler (rtems_vector_number v)
(void *)ttyp[SCC2_MINOR],
(int)TxBd[SCC2_MINOR]->length);
}
- m8xx.cisr = 1UL << 29; /* Clear SCC2 interrupt-in-service bit */
}
#ifdef mpc860
-static rtems_isr
-m8xx_scc3_interrupt_handler (rtems_vector_number v)
+static void
+m8xx_scc3_interrupt_handler (void)
{
int nb_overflow;
@@ -468,12 +461,11 @@ m8xx_scc3_interrupt_handler (rtems_vector_number v)
(void *)ttyp[SCC3_MINOR],
(int)TxBd[SCC3_MINOR]->length);
}
- m8xx.cisr = 1UL << 28; /* Clear SCC3 interrupt-in-service bit */
}
-static rtems_isr
-m8xx_scc4_interrupt_handler (rtems_vector_number v)
+static void
+m8xx_scc4_interrupt_handler (void)
{
int nb_overflow;
@@ -510,12 +502,11 @@ m8xx_scc4_interrupt_handler (rtems_vector_number v)
(void *)ttyp[SCC4_MINOR],
(int)TxBd[SCC4_MINOR]->length);
}
- m8xx.cisr = 1UL << 27; /* Clear SCC4 interrupt-in-service bit */
}
#endif
-static rtems_isr
-m8xx_smc1_interrupt_handler (rtems_vector_number v)
+static void
+m8xx_smc1_interrupt_handler (void)
{
int nb_overflow;
@@ -552,12 +543,11 @@ m8xx_smc1_interrupt_handler (rtems_vector_number v)
(void *)ttyp[SMC1_MINOR],
(int)TxBd[SMC1_MINOR]->length);
}
- m8xx.cisr = 1UL << 4; /* Clear SMC1 interrupt-in-service bit */
}
-static rtems_isr
-m8xx_smc2_interrupt_handler (rtems_vector_number v)
+static void
+m8xx_smc2_interrupt_handler (void)
{
int nb_overflow;
@@ -594,16 +584,77 @@ m8xx_smc2_interrupt_handler (rtems_vector_number v)
(void *)ttyp[SMC2_MINOR],
(int)TxBd[SMC2_MINOR]->length);
}
- m8xx.cisr = 1UL << 3; /* Clear SMC2 interrupt-in-service bit */
}
+void m8xx_scc_enable(const rtems_irq_connect_data* ptr)
+{
+ volatile m8xxSCCRegisters_t *sccregs = 0;
+ switch (ptr->name) {
+#if defined(mpc860)
+ case BSP_CPM_IRQ_SCC4 :
+ sccregs = &m8xx.scc4;
+ break;
+ case BSP_CPM_IRQ_SCC3 :
+ sccregs = &m8xx.scc3;
+ break;
+#endif
+ case BSP_CPM_IRQ_SCC2 :
+ sccregs = &m8xx.scc2;
+ break;
+ case BSP_CPM_IRQ_SCC1 :
+ sccregs = &m8xx.scc1;
+ break;
+ default:
+ break;
+ }
+ sccregs->sccm = 3;
+}
+void m8xx_scc_disable(const rtems_irq_connect_data* ptr)
+{
+ volatile m8xxSCCRegisters_t *sccregs = 0;
+ switch (ptr->name) {
+#if defined(mpc860)
+ case BSP_CPM_IRQ_SCC4 :
+ sccregs = &m8xx.scc4;
+ break;
+ case BSP_CPM_IRQ_SCC3 :
+ sccregs = &m8xx.scc3;
+ break;
+#endif
+ case BSP_CPM_IRQ_SCC2 :
+ sccregs = &m8xx.scc2;
+ break;
+ case BSP_CPM_IRQ_SCC1 :
+ sccregs = &m8xx.scc1;
+ break;
+ default:
+ break;
+ }
+ sccregs->sccm &= (~3);
+}
+
+int m8xx_scc_isOn(const rtems_irq_connect_data* ptr)
+{
+ return BSP_irq_enabled_at_cpm (ptr->name);
+}
+
+static rtems_irq_connect_data consoleIrqData =
+{
+ BSP_CPM_IRQ_SCC2,
+ (rtems_irq_hdl)m8xx_scc2_interrupt_handler,
+ (rtems_irq_enable) m8xx_scc_enable,
+ (rtems_irq_disable) m8xx_scc_disable,
+ (rtems_irq_is_enabled) m8xx_scc_isOn
+};
+
void
m8xx_uart_scc_initialize (int minor)
{
unsigned char brg;
volatile m8xxSCCparms_t *sccparms = 0;
volatile m8xxSCCRegisters_t *sccregs = 0;
+ int res;
/*
* Check that minor number is valid
@@ -777,37 +828,63 @@ m8xx_uart_scc_initialize (int minor)
if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 ) {
switch (minor) {
case SCC2_MINOR:
- rtems_interrupt_catch (m8xx_scc2_interrupt_handler,
- PPC_IRQ_CPM_SCC2,
- &old_handler[minor]);
-
- sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */
- m8xx.cimr |= 1UL << 29; /* Enable SCC2 interrupts */
break;
#ifdef mpc860
- case SCC3_MINOR:
- rtems_interrupt_catch (m8xx_scc3_interrupt_handler,
- PPC_IRQ_CPM_SCC3,
- &old_handler[minor]);
-
- sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */
- m8xx.cimr |= 1UL << 28; /* Enable SCC2 interrupts */
- break;
+ case SCC3_MINOR:
+ consoleIrqData.name = BSP_CPM_IRQ_SCC3;
+ consoleIrqData.hdl = m8xx_scc3_interrupt_handler;
+ break;
- case SCC4_MINOR:
- rtems_interrupt_catch (m8xx_scc4_interrupt_handler,
- PPC_IRQ_CPM_SCC4,
- &old_handler[minor]);
-
- sccregs->sccm = 3; /* Enable SCC2 Rx & Tx interrupts */
- m8xx.cimr |= 1UL << 27; /* Enable SCC2 interrupts */
- break;
+ case SCC4_MINOR:
+ consoleIrqData.name = BSP_CPM_IRQ_SCC4;
+ consoleIrqData.hdl = m8xx_scc4_interrupt_handler;
+ break;
#endif /* mpc860 */
}
+ if (!BSP_install_rtems_irq_handler (&consoleIrqData)) {
+ printk("Unable to connect SCC Irq handler\n");
+ rtems_fatal_error_occurred(1);
+ }
+ }
+}
+
+void m8xx_smc_enable(const rtems_irq_connect_data* ptr)
+{
+ volatile m8xxSMCRegisters_t *smcregs = 0;
+ switch (ptr->name) {
+ case BSP_CPM_IRQ_SMC1 :
+ smcregs = &m8xx.smc1;
+ break;
+ case BSP_CPM_IRQ_SMC2_OR_PIP :
+ smcregs = &m8xx.smc2;
+ break;
+ default:
+ break;
+ }
+ smcregs->smcm = 3;
+}
+
+void m8xx_smc_disable(const rtems_irq_connect_data* ptr)
+{
+ volatile m8xxSMCRegisters_t *smcregs = 0;
+ switch (ptr->name) {
+ case BSP_CPM_IRQ_SMC1 :
+ smcregs = &m8xx.smc1;
+ break;
+ case BSP_CPM_IRQ_SMC2_OR_PIP :
+ smcregs = &m8xx.smc2;
+ break;
+ default:
+ break;
}
+ smcregs->smcm &= (~3);
}
+int m8xx_smc_isOn(const rtems_irq_connect_data* ptr)
+{
+ return BSP_irq_enabled_at_cpm (ptr->name);
+}
void
m8xx_uart_smc_initialize (int minor)
@@ -923,24 +1000,23 @@ m8xx_uart_smc_initialize (int minor)
*/
smcregs->smcmr |= M8xx_SMCMR_TEN | M8xx_SMCMR_REN;
if ( (mbx8xx_console_get_configuration() & 0x06) == 0x02 ) {
+ consoleIrqData.on = m8xx_smc_enable;
+ consoleIrqData.off = m8xx_smc_disable;
+ consoleIrqData.isOn = m8xx_smc_isOn;
switch (minor) {
- case SMC1_MINOR:
- rtems_interrupt_catch (m8xx_smc1_interrupt_handler,
- PPC_IRQ_CPM_SMC1,
- &old_handler[minor]);
-
- smcregs->smcm = 3; /* Enable SMC1 Rx & Tx interrupts */
- m8xx.cimr |= 1UL << 4; /* Enable SMC1 interrupts */
- break;
+ case SMC1_MINOR:
+ consoleIrqData.name = BSP_CPM_IRQ_SMC1;
+ consoleIrqData.hdl = m8xx_smc1_interrupt_handler;
+ break;
- case SMC2_MINOR:
- rtems_interrupt_catch (m8xx_smc2_interrupt_handler,
- PPC_IRQ_CPM_SMC2,
- &old_handler[minor]);
-
- smcregs->smcm = 3; /* Enable SMC2 Rx & Tx interrupts */
- m8xx.cimr |= 1UL << 3; /* Enable SMC2 interrupts */
- break;
+ case SMC2_MINOR:
+ consoleIrqData.name = BSP_CPM_IRQ_SMC2_OR_PIP;
+ consoleIrqData.hdl = m8xx_smc2_interrupt_handler;
+ break;
+ }
+ if (!BSP_install_rtems_irq_handler (&consoleIrqData)) {
+ printk("Unable to connect SMC Irq handler\n");
+ rtems_fatal_error_occurred(1);
}
}
}
@@ -957,21 +1033,6 @@ m8xx_uart_initialize(void)
}
-void
-m8xx_uart_interrupts_initialize(void)
-{
-#ifdef mpc860
- m8xx.cicr = 0x00E43F80; /* SCaP=SCC1, SCbP=SCC2, SCcP=SCC3,
- SCdP=SCC4, IRL=1, HP=PC15, IEN=1 */
-#else
- m8xx.cicr = 0x00043F80; /* SCaP=SCC1, SCbP=SCC2, IRL=1, HP=PC15, IEN=1 */
-#endif
- m8xx.simask |= M8xx_SIMASK_LVM1; /* Enable level interrupts */
-#ifdef EPPCBUG_SMC1
- simask_copy = m8xx.simask;
-#endif
-}
-
int
m8xx_uart_pollRead(