13
13
#include <linux/of_platform.h>
14
14
#include <linux/spinlock.h>
15
15
16
- #define CTRL_STRIDE_OFF (_t , _r ) (_t * 8 * _r)
16
+ #define CTRL_STRIDE_OFF (_t , _r ) (_t * 4 * _r)
17
17
#define CHANCTRL 0x0
18
18
#define CHANMASK (n , t ) (CTRL_STRIDE_OFF(t, 0) + 0x4 * (n) + 0x4)
19
19
#define CHANSET (n , t ) (CTRL_STRIDE_OFF(t, 1) + 0x4 * (n) + 0x4)
@@ -26,7 +26,7 @@ struct irqsteer_data {
26
26
struct clk * ipg_clk ;
27
27
int irq ;
28
28
raw_spinlock_t lock ;
29
- int irq_groups ;
29
+ int reg_num ;
30
30
int channel ;
31
31
struct irq_domain * domain ;
32
32
u32 * saved_reg ;
@@ -35,7 +35,7 @@ struct irqsteer_data {
35
35
static int imx_irqsteer_get_reg_index (struct irqsteer_data * data ,
36
36
unsigned long irqnum )
37
37
{
38
- return (data -> irq_groups * 2 - irqnum / 32 - 1 );
38
+ return (data -> reg_num - irqnum / 32 - 1 );
39
39
}
40
40
41
41
static void imx_irqsteer_irq_unmask (struct irq_data * d )
@@ -46,9 +46,9 @@ static void imx_irqsteer_irq_unmask(struct irq_data *d)
46
46
u32 val ;
47
47
48
48
raw_spin_lock_irqsave (& data -> lock , flags );
49
- val = readl_relaxed (data -> regs + CHANMASK (idx , data -> irq_groups ));
49
+ val = readl_relaxed (data -> regs + CHANMASK (idx , data -> reg_num ));
50
50
val |= BIT (d -> hwirq % 32 );
51
- writel_relaxed (val , data -> regs + CHANMASK (idx , data -> irq_groups ));
51
+ writel_relaxed (val , data -> regs + CHANMASK (idx , data -> reg_num ));
52
52
raw_spin_unlock_irqrestore (& data -> lock , flags );
53
53
}
54
54
@@ -60,9 +60,9 @@ static void imx_irqsteer_irq_mask(struct irq_data *d)
60
60
u32 val ;
61
61
62
62
raw_spin_lock_irqsave (& data -> lock , flags );
63
- val = readl_relaxed (data -> regs + CHANMASK (idx , data -> irq_groups ));
63
+ val = readl_relaxed (data -> regs + CHANMASK (idx , data -> reg_num ));
64
64
val &= ~BIT (d -> hwirq % 32 );
65
- writel_relaxed (val , data -> regs + CHANMASK (idx , data -> irq_groups ));
65
+ writel_relaxed (val , data -> regs + CHANMASK (idx , data -> reg_num ));
66
66
raw_spin_unlock_irqrestore (& data -> lock , flags );
67
67
}
68
68
@@ -94,13 +94,13 @@ static void imx_irqsteer_irq_handler(struct irq_desc *desc)
94
94
95
95
chained_irq_enter (irq_desc_get_chip (desc ), desc );
96
96
97
- for (i = 0 ; i < data -> irq_groups * 64 ; i += 32 ) {
97
+ for (i = 0 ; i < data -> reg_num * 32 ; i += 32 ) {
98
98
int idx = imx_irqsteer_get_reg_index (data , i );
99
99
unsigned long irqmap ;
100
100
int pos , virq ;
101
101
102
102
irqmap = readl_relaxed (data -> regs +
103
- CHANSTATUS (idx , data -> irq_groups ));
103
+ CHANSTATUS (idx , data -> reg_num ));
104
104
105
105
for_each_set_bit (pos , & irqmap , 32 ) {
106
106
virq = irq_find_mapping (data -> domain , pos + i );
@@ -146,12 +146,15 @@ static int imx_irqsteer_probe(struct platform_device *pdev)
146
146
147
147
raw_spin_lock_init (& data -> lock );
148
148
149
- of_property_read_u32 (np , "fsl,irq-groups " , & data -> irq_groups );
149
+ of_property_read_u32 (np , "fsl,num-irqs " , & data -> reg_num );
150
150
of_property_read_u32 (np , "fsl,channel" , & data -> channel );
151
151
152
+ /* one register bit map represents 32 input interrupts */
153
+ data -> reg_num /= 32 ;
154
+
152
155
if (IS_ENABLED (CONFIG_PM_SLEEP )) {
153
156
data -> saved_reg = devm_kzalloc (& pdev -> dev ,
154
- sizeof (u32 ) * data -> irq_groups * 2 ,
157
+ sizeof (u32 ) * data -> reg_num ,
155
158
GFP_KERNEL );
156
159
if (!data -> saved_reg )
157
160
return - ENOMEM ;
@@ -166,7 +169,7 @@ static int imx_irqsteer_probe(struct platform_device *pdev)
166
169
/* steer all IRQs into configured channel */
167
170
writel_relaxed (BIT (data -> channel ), data -> regs + CHANCTRL );
168
171
169
- data -> domain = irq_domain_add_linear (np , data -> irq_groups * 64 ,
172
+ data -> domain = irq_domain_add_linear (np , data -> reg_num * 32 ,
170
173
& imx_irqsteer_domain_ops , data );
171
174
if (!data -> domain ) {
172
175
dev_err (& pdev -> dev , "failed to create IRQ domain\n" );
@@ -199,19 +202,19 @@ static void imx_irqsteer_save_regs(struct irqsteer_data *data)
199
202
{
200
203
int i ;
201
204
202
- for (i = 0 ; i < data -> irq_groups * 2 ; i ++ )
205
+ for (i = 0 ; i < data -> reg_num ; i ++ )
203
206
data -> saved_reg [i ] = readl_relaxed (data -> regs +
204
- CHANMASK (i , data -> irq_groups ));
207
+ CHANMASK (i , data -> reg_num ));
205
208
}
206
209
207
210
static void imx_irqsteer_restore_regs (struct irqsteer_data * data )
208
211
{
209
212
int i ;
210
213
211
214
writel_relaxed (BIT (data -> channel ), data -> regs + CHANCTRL );
212
- for (i = 0 ; i < data -> irq_groups * 2 ; i ++ )
215
+ for (i = 0 ; i < data -> reg_num ; i ++ )
213
216
writel_relaxed (data -> saved_reg [i ],
214
- data -> regs + CHANMASK (i , data -> irq_groups ));
217
+ data -> regs + CHANMASK (i , data -> reg_num ));
215
218
}
216
219
217
220
static int imx_irqsteer_suspend (struct device * dev )
0 commit comments