11
11
#include <linux/init.h>
12
12
#include <linux/irq.h>
13
13
#include <linux/irqchip.h>
14
- #include <linux/irqchip/irq-davinci-cp-intc.h>
15
14
#include <linux/irqdomain.h>
16
15
#include <linux/io.h>
17
16
#include <linux/of.h>
@@ -154,24 +153,20 @@ static const struct irq_domain_ops davinci_cp_intc_irq_domain_ops = {
154
153
.xlate = irq_domain_xlate_onetwocell ,
155
154
};
156
155
157
- static int __init
158
- davinci_cp_intc_do_init (const struct davinci_cp_intc_config * config ,
159
- struct device_node * node )
156
+ static int __init davinci_cp_intc_do_init (struct resource * res , unsigned int num_irqs ,
157
+ struct device_node * node )
160
158
{
161
- unsigned int num_regs = BITS_TO_LONGS (config -> num_irqs );
159
+ unsigned int num_regs = BITS_TO_LONGS (num_irqs );
162
160
int offset , irq_base ;
163
161
void __iomem * req ;
164
162
165
- req = request_mem_region (config -> reg .start ,
166
- resource_size (& config -> reg ),
167
- "davinci-cp-intc" );
163
+ req = request_mem_region (res -> start , resource_size (res ), "davinci-cp-intc" );
168
164
if (!req ) {
169
165
pr_err ("%s: register range busy\n" , __func__ );
170
166
return - EBUSY ;
171
167
}
172
168
173
- davinci_cp_intc_base = ioremap (config -> reg .start ,
174
- resource_size (& config -> reg ));
169
+ davinci_cp_intc_base = ioremap (res -> start , resource_size (res ));
175
170
if (!davinci_cp_intc_base ) {
176
171
pr_err ("%s: unable to ioremap register range\n" , __func__ );
177
172
return - EINVAL ;
@@ -184,37 +179,33 @@ davinci_cp_intc_do_init(const struct davinci_cp_intc_config *config,
184
179
185
180
/* Disable system interrupts */
186
181
for (offset = 0 ; offset < num_regs ; offset ++ )
187
- davinci_cp_intc_write (~0 ,
188
- DAVINCI_CP_INTC_SYS_ENABLE_CLR (offset ));
182
+ davinci_cp_intc_write (~0 , DAVINCI_CP_INTC_SYS_ENABLE_CLR (offset ));
189
183
190
184
/* Set to normal mode, no nesting, no priority hold */
191
185
davinci_cp_intc_write (0 , DAVINCI_CP_INTC_CTRL );
192
186
davinci_cp_intc_write (0 , DAVINCI_CP_INTC_HOST_CTRL );
193
187
194
188
/* Clear system interrupt status */
195
189
for (offset = 0 ; offset < num_regs ; offset ++ )
196
- davinci_cp_intc_write (~0 ,
197
- DAVINCI_CP_INTC_SYS_STAT_CLR (offset ));
190
+ davinci_cp_intc_write (~0 , DAVINCI_CP_INTC_SYS_STAT_CLR (offset ));
198
191
199
192
/* Enable nIRQ (what about nFIQ?) */
200
193
davinci_cp_intc_write (1 , DAVINCI_CP_INTC_HOST_ENABLE_IDX_SET );
201
194
195
+ /* 4 channels per register */
196
+ num_regs = (num_irqs + 3 ) >> 2 ;
202
197
/* Default all priorities to channel 7. */
203
- num_regs = (config -> num_irqs + 3 ) >> 2 ; /* 4 channels per register */
204
198
for (offset = 0 ; offset < num_regs ; offset ++ )
205
- davinci_cp_intc_write (0x07070707 ,
206
- DAVINCI_CP_INTC_CHAN_MAP (offset ));
199
+ davinci_cp_intc_write (0x07070707 , DAVINCI_CP_INTC_CHAN_MAP (offset ));
207
200
208
- irq_base = irq_alloc_descs (-1 , 0 , config -> num_irqs , 0 );
201
+ irq_base = irq_alloc_descs (-1 , 0 , num_irqs , 0 );
209
202
if (irq_base < 0 ) {
210
- pr_err ("%s: unable to allocate interrupt descriptors: %d\n" ,
211
- __func__ , irq_base );
203
+ pr_err ("%s: unable to allocate interrupt descriptors: %d\n" , __func__ , irq_base );
212
204
return irq_base ;
213
205
}
214
206
215
- davinci_cp_intc_irq_domain = irq_domain_add_legacy (
216
- node , config -> num_irqs , irq_base , 0 ,
217
- & davinci_cp_intc_irq_domain_ops , NULL );
207
+ davinci_cp_intc_irq_domain = irq_domain_add_legacy (node , num_irqs , irq_base , 0 ,
208
+ & davinci_cp_intc_irq_domain_ops , NULL );
218
209
219
210
if (!davinci_cp_intc_irq_domain ) {
220
211
pr_err ("%s: unable to create an interrupt domain\n" , __func__ );
@@ -229,31 +220,25 @@ davinci_cp_intc_do_init(const struct davinci_cp_intc_config *config,
229
220
return 0 ;
230
221
}
231
222
232
- int __init davinci_cp_intc_init (const struct davinci_cp_intc_config * config )
233
- {
234
- return davinci_cp_intc_do_init (config , NULL );
235
- }
236
-
237
223
static int __init davinci_cp_intc_of_init (struct device_node * node ,
238
224
struct device_node * parent )
239
225
{
240
- struct davinci_cp_intc_config config = { };
226
+ unsigned int num_irqs ;
227
+ struct resource res ;
241
228
int ret ;
242
229
243
- ret = of_address_to_resource (node , 0 , & config . reg );
230
+ ret = of_address_to_resource (node , 0 , & res );
244
231
if (ret ) {
245
- pr_err ("%s: unable to get the register range from device-tree\n" ,
246
- __func__ );
232
+ pr_err ("%s: unable to get the register range from device-tree\n" , __func__ );
247
233
return ret ;
248
234
}
249
235
250
- ret = of_property_read_u32 (node , "ti,intc-size" , & config . num_irqs );
236
+ ret = of_property_read_u32 (node , "ti,intc-size" , & num_irqs );
251
237
if (ret ) {
252
- pr_err ("%s: unable to read the 'ti,intc-size' property\n" ,
253
- __func__ );
238
+ pr_err ("%s: unable to read the 'ti,intc-size' property\n" , __func__ );
254
239
return ret ;
255
240
}
256
241
257
- return davinci_cp_intc_do_init (& config , node );
242
+ return davinci_cp_intc_do_init (& res , num_irqs , node );
258
243
}
259
244
IRQCHIP_DECLARE (cp_intc , "ti,cp-intc" , davinci_cp_intc_of_init );
0 commit comments