From 0ba4c3b0787eb349458b0187623bc260d3789ebc Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Sun, 2 Feb 2014 04:20:41 +0100 Subject: imx233: enhance icoll with priority and soft IRQ Change-Id: If9568ab6e11bf933b2cc607e5a86866a975886bc --- firmware/target/arm/imx233/debug-imx233.c | 3 ++- firmware/target/arm/imx233/icoll-imx233.c | 29 +++++++++++++++++++++++++++++ firmware/target/arm/imx233/icoll-imx233.h | 7 +++++++ 3 files changed, 38 insertions(+), 1 deletion(-) (limited to 'firmware') diff --git a/firmware/target/arm/imx233/debug-imx233.c b/firmware/target/arm/imx233/debug-imx233.c index d5d4d08b9a..1069c9ceaa 100644 --- a/firmware/target/arm/imx233/debug-imx233.c +++ b/firmware/target/arm/imx233/debug-imx233.c @@ -518,7 +518,8 @@ bool dbg_hw_info_icoll(void) for(int i = first_irq, j = 0; i < dbg_irqs_count && j < line_count; i++, j++) { struct imx233_icoll_irq_info_t info = imx233_icoll_get_irq_info(dbg_irqs[i].src); - lcd_putsf(0, j, "%s", dbg_irqs[i].name); + static char prio[4] = {'-', '+', '^', '!'}; + lcd_putsf(0, j, "%c%s", prio[info.priority & 3], dbg_irqs[i].name); if(info.enabled || info.freq > 0) lcd_putsf(10, j, "%d", info.freq); } diff --git a/firmware/target/arm/imx233/icoll-imx233.c b/firmware/target/arm/imx233/icoll-imx233.c index b753af8d54..cd96b6fae6 100644 --- a/firmware/target/arm/imx233/icoll-imx233.c +++ b/firmware/target/arm/imx233/icoll-imx233.c @@ -126,6 +126,11 @@ struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src) info.enabled = BF_RDn(ICOLL_PRIORITYn, src / 4, ENABLEx(src % 4)); #else info.enabled = BF_RDn(ICOLL_INTERRUPTn, src, ENABLE); +#endif +#if IMX233_SUBTARGET < 3780 + info.priority = BF_RDn(ICOLL_PRIORITYn, src / 4, PRIORITYx(src % 4)); +#else + info.priority = BF_RDn(ICOLL_INTERRUPTn, src, PRIORITY); #endif info.freq = irq_count_old[src]; return info; @@ -165,6 +170,21 @@ void fiq_handler(void) { } +void imx233_icoll_force_irq(unsigned src, bool enable) +{ +#if IMX233_SUBTARGET < 3780 + if(enable) + BF_SETn(ICOLL_PRIORITYn, src / 4, SOFTIRQx(src % 4)); + else + BF_CLRn(ICOLL_PRIORITYn, src / 4, SOFTIRQx(src % 4)); +#else + if(enable) + BF_SETn(ICOLL_INTERRUPTn, src, SOFTIRQ); + else + BF_CLRn(ICOLL_INTERRUPTn, src, SOFTIRQ); +#endif +} + void imx233_icoll_enable_interrupt(int src, bool enable) { #if IMX233_SUBTARGET < 3780 @@ -180,6 +200,15 @@ void imx233_icoll_enable_interrupt(int src, bool enable) #endif } +void imx233_icoll_set_priority(int src, unsigned prio) +{ +#if IMX233_SUBTARGET < 3780 + BF_WRn(ICOLL_PRIORITYn, src / 4, PRIORITYx(src % 4), prio); +#else + BF_WRn(ICOLL_INTERRUPTn, src, PRIORITY, prio); +#endif +} + void imx233_icoll_init(void) { imx233_reset_block(&HW_ICOLL_CTRL); diff --git a/firmware/target/arm/imx233/icoll-imx233.h b/firmware/target/arm/imx233/icoll-imx233.h index 81d7695ec5..cf87305e11 100644 --- a/firmware/target/arm/imx233/icoll-imx233.h +++ b/firmware/target/arm/imx233/icoll-imx233.h @@ -62,16 +62,23 @@ #if IMX233_SUBTARGET >= 3600 && IMX233_SUBTARGET < 3780 #define BP_ICOLL_PRIORITYn_ENABLEx(x) (2 + 8 * (x)) #define BM_ICOLL_PRIORITYn_ENABLEx(x) (1 << (2 + 8 * (x))) +#define BP_ICOLL_PRIORITYn_PRIORITYx(x) (0 + 8 * (x)) +#define BM_ICOLL_PRIORITYn_PRIORITYx(x) (3 << (0 + 8 * (x))) +#define BP_ICOLL_PRIORITYn_SOFTIRQx(x) (3 + 8 * (x)) +#define BM_ICOLL_PRIORITYn_SOFTIRQx(x) (1 << (3 + 8 * (x))) #endif struct imx233_icoll_irq_info_t { bool enabled; unsigned freq; + unsigned priority; }; void imx233_icoll_init(void); void imx233_icoll_enable_interrupt(int src, bool enable); +void imx233_icoll_set_priority(int src, unsigned prio); struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src); +void imx233_icoll_force_irq(unsigned src, bool enable); #endif /* ICOLL_IMX233_H */ -- cgit