sh: rework ipr code
This patch reworks the ipr code by grouping the offset array together with the ipr_data structure in a new data structure called ipr_desc. This new structure also contains the name of the controller in struct irq_chip. The idea behind putting struct irq_chip in there is that we can use offsetof() to locate the base addresses in the irq_chip callbacks. This strategy has much in common with the recently merged intc2 code. One logic change has been made - the original ipr code enabled the interrupts by default but with this patch they are all disabled by default. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Bu işleme şunda yer alıyor:

işlemeyi yapan:
Paul Mundt

ebeveyn
50f63f2518
işleme
68abdbbb03
@@ -48,7 +48,7 @@ static int __init sh7705_devices_setup(void)
|
||||
}
|
||||
__initcall(sh7705_devices_setup);
|
||||
|
||||
static struct ipr_data sh7705_ipr_map[] = {
|
||||
static struct ipr_data ipr_irq_table[] = {
|
||||
/* IRQ, IPR-idx, shift, priority */
|
||||
{ 16, 0, 12, 2 }, /* TMU0 TUNI*/
|
||||
{ 17, 0, 8, 2 }, /* TMU1 TUNI */
|
||||
@@ -70,25 +70,29 @@ static struct ipr_data sh7705_ipr_map[] = {
|
||||
};
|
||||
|
||||
static unsigned long ipr_offsets[] = {
|
||||
0xFFFFFEE2 /* 0: IPRA */
|
||||
, 0xFFFFFEE4 /* 1: IPRB */
|
||||
, 0xA4000016 /* 2: IPRC */
|
||||
, 0xA4000018 /* 3: IPRD */
|
||||
, 0xA400001A /* 4: IPRE */
|
||||
, 0xA4080000 /* 5: IPRF */
|
||||
, 0xA4080002 /* 6: IPRG */
|
||||
, 0xA4080004 /* 7: IPRH */
|
||||
0xFFFFFEE2, /* 0: IPRA */
|
||||
0xFFFFFEE4, /* 1: IPRB */
|
||||
0xA4000016, /* 2: IPRC */
|
||||
0xA4000018, /* 3: IPRD */
|
||||
0xA400001A, /* 4: IPRE */
|
||||
0xA4080000, /* 5: IPRF */
|
||||
0xA4080002, /* 6: IPRG */
|
||||
0xA4080004, /* 7: IPRH */
|
||||
};
|
||||
|
||||
/* given the IPR index return the address of the IPR register */
|
||||
unsigned int map_ipridx_to_addr(int idx)
|
||||
{
|
||||
if (idx >= ARRAY_SIZE(ipr_offsets))
|
||||
return 0;
|
||||
return ipr_offsets[idx];
|
||||
}
|
||||
static struct ipr_desc ipr_irq_desc = {
|
||||
.ipr_offsets = ipr_offsets,
|
||||
.nr_offsets = ARRAY_SIZE(ipr_offsets),
|
||||
|
||||
void __init init_IRQ_ipr()
|
||||
.ipr_data = ipr_irq_table,
|
||||
.nr_irqs = ARRAY_SIZE(ipr_irq_table),
|
||||
|
||||
.chip = {
|
||||
.name = "IPR-sh7705",
|
||||
},
|
||||
};
|
||||
|
||||
void __init init_IRQ_ipr(void)
|
||||
{
|
||||
make_ipr_irq(sh7705_ipr_map, ARRAY_SIZE(sh7705_ipr_map));
|
||||
register_ipr_controller(&ipr_irq_desc);
|
||||
}
|
||||
|
Yeni konuda referans
Bir kullanıcı engelle