summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/target/arm/imx233/icoll-imx233.c52
-rw-r--r--firmware/target/arm/imx233/icoll-imx233.h21
2 files changed, 55 insertions, 18 deletions
diff --git a/firmware/target/arm/imx233/icoll-imx233.c b/firmware/target/arm/imx233/icoll-imx233.c
index 1bd363e781..20b526d4fb 100644
--- a/firmware/target/arm/imx233/icoll-imx233.c
+++ b/firmware/target/arm/imx233/icoll-imx233.c
@@ -36,12 +36,8 @@ default_interrupt(INT_TIMER0);
36default_interrupt(INT_TIMER1); 36default_interrupt(INT_TIMER1);
37default_interrupt(INT_TIMER2); 37default_interrupt(INT_TIMER2);
38default_interrupt(INT_TIMER3); 38default_interrupt(INT_TIMER3);
39default_interrupt(INT_LCDIF_DMA);
40default_interrupt(INT_LCDIF_ERROR);
41default_interrupt(INT_SSP1_DMA); 39default_interrupt(INT_SSP1_DMA);
42default_interrupt(INT_SSP1_ERROR); 40default_interrupt(INT_SSP1_ERROR);
43default_interrupt(INT_SSP2_DMA);
44default_interrupt(INT_SSP2_ERROR);
45default_interrupt(INT_I2C_DMA); 41default_interrupt(INT_I2C_DMA);
46default_interrupt(INT_I2C_ERROR); 42default_interrupt(INT_I2C_ERROR);
47default_interrupt(INT_GPIO0); 43default_interrupt(INT_GPIO0);
@@ -60,11 +56,19 @@ default_interrupt(INT_DAC_DMA);
60default_interrupt(INT_DAC_ERROR); 56default_interrupt(INT_DAC_ERROR);
61default_interrupt(INT_ADC_DMA); 57default_interrupt(INT_ADC_DMA);
62default_interrupt(INT_ADC_ERROR); 58default_interrupt(INT_ADC_ERROR);
63default_interrupt(INT_DCP);
64default_interrupt(INT_TOUCH_DETECT); 59default_interrupt(INT_TOUCH_DETECT);
65default_interrupt(INT_RTC_1MSEC); 60default_interrupt(INT_RTC_1MSEC);
66 61/* STMP3700+ specific */
67void INT_RTC_1MSEC(void); 62#if IMX233_SUBTARGET >= 3700
63default_interrupt(INT_SSP2_DMA);
64default_interrupt(INT_SSP2_ERROR);
65default_interrupt(INT_DCP);
66default_interrupt(INT_LCDIF_DMA);
67default_interrupt(INT_LCDIF_ERROR);
68#endif
69/* STMP3780+ specific */
70#if IMX233_SUBTARGET >= 3780
71#endif
68 72
69typedef void (*isr_t)(void); 73typedef void (*isr_t)(void);
70 74
@@ -75,12 +79,8 @@ static isr_t isr_table[INT_SRC_NR_SOURCES] =
75 [INT_SRC_TIMER(1)] = INT_TIMER1, 79 [INT_SRC_TIMER(1)] = INT_TIMER1,
76 [INT_SRC_TIMER(2)] = INT_TIMER2, 80 [INT_SRC_TIMER(2)] = INT_TIMER2,
77 [INT_SRC_TIMER(3)] = INT_TIMER3, 81 [INT_SRC_TIMER(3)] = INT_TIMER3,
78 [INT_SRC_LCDIF_DMA] = INT_LCDIF_DMA,
79 [INT_SRC_LCDIF_ERROR] = INT_LCDIF_ERROR,
80 [INT_SRC_SSP1_DMA] = INT_SSP1_DMA, 82 [INT_SRC_SSP1_DMA] = INT_SSP1_DMA,
81 [INT_SRC_SSP1_ERROR] = INT_SSP1_ERROR, 83 [INT_SRC_SSP1_ERROR] = INT_SSP1_ERROR,
82 [INT_SRC_SSP2_DMA] = INT_SSP2_DMA,
83 [INT_SRC_SSP2_ERROR] = INT_SSP2_ERROR,
84 [INT_SRC_I2C_DMA] = INT_I2C_DMA, 84 [INT_SRC_I2C_DMA] = INT_I2C_DMA,
85 [INT_SRC_I2C_ERROR] = INT_I2C_ERROR, 85 [INT_SRC_I2C_ERROR] = INT_I2C_ERROR,
86 [INT_SRC_GPIO0] = INT_GPIO0, 86 [INT_SRC_GPIO0] = INT_GPIO0,
@@ -99,9 +99,17 @@ static isr_t isr_table[INT_SRC_NR_SOURCES] =
99 [INT_SRC_DAC_ERROR] = INT_DAC_ERROR, 99 [INT_SRC_DAC_ERROR] = INT_DAC_ERROR,
100 [INT_SRC_ADC_DMA] = INT_ADC_DMA, 100 [INT_SRC_ADC_DMA] = INT_ADC_DMA,
101 [INT_SRC_ADC_ERROR] = INT_ADC_ERROR, 101 [INT_SRC_ADC_ERROR] = INT_ADC_ERROR,
102 [INT_SRC_DCP] = INT_DCP,
103 [INT_SRC_TOUCH_DETECT] = INT_TOUCH_DETECT, 102 [INT_SRC_TOUCH_DETECT] = INT_TOUCH_DETECT,
104 [INT_SRC_RTC_1MSEC] = INT_RTC_1MSEC, 103 [INT_SRC_RTC_1MSEC] = INT_RTC_1MSEC,
104#if IMX233_SUBTARGET >= 3700
105 [INT_SRC_SSP2_DMA] = INT_SSP2_DMA,
106 [INT_SRC_SSP2_ERROR] = INT_SSP2_ERROR,
107 [INT_SRC_DCP] = INT_DCP,
108 [INT_SRC_LCDIF_DMA] = INT_LCDIF_DMA,
109 [INT_SRC_LCDIF_ERROR] = INT_LCDIF_ERROR,
110#endif
111#if IMX233_SUBTARGET >= 3780
112#endif
105}; 113};
106 114
107#define IRQ_STORM_DELAY 100 /* ms */ 115#define IRQ_STORM_DELAY 100 /* ms */
@@ -113,7 +121,11 @@ static uint32_t irq_count[INT_SRC_NR_SOURCES];
113struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src) 121struct imx233_icoll_irq_info_t imx233_icoll_get_irq_info(int src)
114{ 122{
115 struct imx233_icoll_irq_info_t info; 123 struct imx233_icoll_irq_info_t info;
124#if IMX233_SUBTARGET < 3780
125 info.enabled = BF_RDn(ICOLL_PRIORITYn, src / 4, ENABLEx(src % 4));
126#else
116 info.enabled = BF_RDn(ICOLL_INTERRUPTn, src, ENABLE); 127 info.enabled = BF_RDn(ICOLL_INTERRUPTn, src, ENABLE);
128#endif
117 info.freq = irq_count_old[src]; 129 info.freq = irq_count_old[src];
118 return info; 130 return info;
119} 131}
@@ -154,19 +166,31 @@ void fiq_handler(void)
154 166
155void imx233_icoll_enable_interrupt(int src, bool enable) 167void imx233_icoll_enable_interrupt(int src, bool enable)
156{ 168{
169#if IMX233_SUBTARGET < 3780
170 if(enable)
171 BF_SETn(ICOLL_PRIORITYn, src / 4, ENABLEx(src % 4));
172 else
173 BF_CLRn(ICOLL_PRIORITYn, src / 4, ENABLEx(src % 4));
174#else
157 if(enable) 175 if(enable)
158 BF_SETn(ICOLL_INTERRUPTn, src, ENABLE); 176 BF_SETn(ICOLL_INTERRUPTn, src, ENABLE);
159 else 177 else
160 BF_CLRn(ICOLL_INTERRUPTn, src, ENABLE); 178 BF_CLRn(ICOLL_INTERRUPTn, src, ENABLE);
179#endif
161} 180}
162 181
163void imx233_icoll_init(void) 182void imx233_icoll_init(void)
164{ 183{
165 imx233_reset_block(&HW_ICOLL_CTRL); 184 imx233_reset_block(&HW_ICOLL_CTRL);
166 /* disable all interrupts: 185 /* disable all interrupts */
167 * priority = 0, disable, disable fiq */ 186 /* priority = 0, disable, disable fiq */
187#if IMX233_SUBTARGET >= 3780
168 for(int i = 0; i < INT_SRC_NR_SOURCES; i++) 188 for(int i = 0; i < INT_SRC_NR_SOURCES; i++)
169 HW_ICOLL_INTERRUPTn(i) = 0; 189 HW_ICOLL_INTERRUPTn(i) = 0;
190#else
191 for(int i = 0; i < INT_SRC_NR_SOURCES / 4; i++)
192 HW_ICOLL_PRIORITYn(i) = 0;
193#endif
170 /* setup vbase as isr_table */ 194 /* setup vbase as isr_table */
171 HW_ICOLL_VBASE = (uint32_t)&isr_table; 195 HW_ICOLL_VBASE = (uint32_t)&isr_table;
172 /* enable final irq bit */ 196 /* enable final irq bit */
diff --git a/firmware/target/arm/imx233/icoll-imx233.h b/firmware/target/arm/imx233/icoll-imx233.h
index e44b67f1d4..81d7695ec5 100644
--- a/firmware/target/arm/imx233/icoll-imx233.h
+++ b/firmware/target/arm/imx233/icoll-imx233.h
@@ -26,7 +26,6 @@
26 26
27#include "regs/regs-icoll.h" 27#include "regs/regs-icoll.h"
28 28
29#define INT_SRC_SSP2_ERROR 2
30#define INT_SRC_VDD5V 3 29#define INT_SRC_VDD5V 3
31#define INT_SRC_DAC_DMA 5 30#define INT_SRC_DAC_DMA 5
32#define INT_SRC_DAC_ERROR 6 31#define INT_SRC_DAC_ERROR 6
@@ -39,17 +38,31 @@
39#define INT_SRC_GPIO1 17 38#define INT_SRC_GPIO1 17
40#define INT_SRC_GPIO2 18 39#define INT_SRC_GPIO2 18
41#define INT_SRC_GPIO(i) (INT_SRC_GPIO0 + (i)) 40#define INT_SRC_GPIO(i) (INT_SRC_GPIO0 + (i))
42#define INT_SRC_SSP2_DMA 20
43#define INT_SRC_I2C_DMA 26 41#define INT_SRC_I2C_DMA 26
44#define INT_SRC_I2C_ERROR 27 42#define INT_SRC_I2C_ERROR 27
45#define INT_SRC_TIMER(nr) (28 + (nr)) 43#define INT_SRC_TIMER(nr) (28 + (nr))
46#define INT_SRC_TOUCH_DETECT 36 44#define INT_SRC_TOUCH_DETECT 36
47#define INT_SRC_LRADC_CHx(x) (37 + (x)) 45#define INT_SRC_LRADC_CHx(x) (37 + (x))
46#define INT_SRC_RTC_1MSEC 48
47#define INT_SRC_NR_SOURCES 64
48/* STMP3700+ specific */
49#if IMX233_SUBTARGET >= 3700
50#define INT_SRC_SSP2_ERROR 2
51#define INT_SRC_SSP2_DMA 20
48#define INT_SRC_LCDIF_DMA 45 52#define INT_SRC_LCDIF_DMA 45
49#define INT_SRC_LCDIF_ERROR 46 53#define INT_SRC_LCDIF_ERROR 46
50#define INT_SRC_RTC_1MSEC 48
51#define INT_SRC_DCP 54 54#define INT_SRC_DCP 54
52#define INT_SRC_NR_SOURCES 66 55#endif
56/* STMP3780+ specific */
57#if IMX233_SUBTARGET >= 3780
58
59#endif
60
61/* helpers */
62#if IMX233_SUBTARGET >= 3600 && IMX233_SUBTARGET < 3780
63#define BP_ICOLL_PRIORITYn_ENABLEx(x) (2 + 8 * (x))
64#define BM_ICOLL_PRIORITYn_ENABLEx(x) (1 << (2 + 8 * (x)))
65#endif
53 66
54struct imx233_icoll_irq_info_t 67struct imx233_icoll_irq_info_t
55{ 68{