summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2014-02-02 04:20:41 +0100
committerAmaury Pouly <amaury.pouly@gmail.com>2014-02-10 23:14:24 +0100
commit0ba4c3b0787eb349458b0187623bc260d3789ebc (patch)
treee39d75cd87da2921423bd1c3f15c619ff5af07f1 /firmware
parentab5dfd55aaa37da65a4168d0dc46f9a3a7d8844a (diff)
downloadrockbox-0ba4c3b0787eb349458b0187623bc260d3789ebc.tar.gz
rockbox-0ba4c3b0787eb349458b0187623bc260d3789ebc.tar.bz2
rockbox-0ba4c3b0787eb349458b0187623bc260d3789ebc.zip
imx233: enhance icoll with priority and soft IRQ
Change-Id: If9568ab6e11bf933b2cc607e5a86866a975886bc
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/imx233/debug-imx233.c3
-rw-r--r--firmware/target/arm/imx233/icoll-imx233.c29
-rw-r--r--firmware/target/arm/imx233/icoll-imx233.h7
3 files changed, 38 insertions, 1 deletions
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
@@ -127,6 +127,11 @@ struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src)
#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 */