diff --git a/repos/dde_linux/src/include/lx_emul/init.h b/repos/dde_linux/src/include/lx_emul/init.h index cf37c47568..9dfe76b220 100644 --- a/repos/dde_linux/src/include/lx_emul/init.h +++ b/repos/dde_linux/src/include/lx_emul/init.h @@ -30,6 +30,8 @@ extern void * lx_emul_init_task_struct; void lx_emul_register_of_clk_initcall(char const *compat, void *fn); +void lx_emul_register_of_irqchip_initcall(char const *compat, void *fn); + #ifdef __cplusplus } #endif diff --git a/repos/dde_linux/src/include/lx_emul/shadow/linux/of.h b/repos/dde_linux/src/include/lx_emul/shadow/linux/of.h index 78462e967e..b8c201a655 100644 --- a/repos/dde_linux/src/include/lx_emul/shadow/linux/of.h +++ b/repos/dde_linux/src/include/lx_emul/shadow/linux/of.h @@ -18,10 +18,18 @@ #include #undef OF_DECLARE_1 +#undef OF_DECLARE_2 +/* used to populate __clk_of_table */ #define OF_DECLARE_1(table, name, compat, fn) \ static void __of_declare_initcall_##fn##name(void)__attribute__((constructor)); \ static void __of_declare_initcall_##fn##name() { \ lx_emul_register_of_##table##_initcall(compat, fn); }; +/* used to populate __irqchip_of_table */ +#define OF_DECLARE_2(table, name, compat, fn) \ + static void __of_declare_initcall_##fn##name(void)__attribute__((constructor)); \ + static void __of_declare_initcall_##fn##name() { \ + lx_emul_register_of_##table##_initcall(compat, fn); }; + #endif /* _LX_EMUL__SHADOW__LINUX__OF_H_ */ diff --git a/repos/dde_linux/src/lib/lx_emul/irqchip.c b/repos/dde_linux/src/lib/lx_emul/irqchip.c index f7f6773596..88f6ba659c 100644 --- a/repos/dde_linux/src/lib/lx_emul/irqchip.c +++ b/repos/dde_linux/src/lib/lx_emul/irqchip.c @@ -134,16 +134,32 @@ static int __init dde_irqchip_init(struct device_node *node, } -struct of_device_id __irqchip_of_table[] = { - { - .compatible = "arm,gic-v3", - .data = dde_irqchip_init - }, - { - .compatible = "arm,gic-400", - .data = dde_irqchip_init +enum { LX_EMUL_MAX_OF_IRQ_CHIPS = 16 }; + + +struct of_device_id __irqchip_of_table[LX_EMUL_MAX_OF_IRQ_CHIPS] = { }; + + +void lx_emul_register_of_irqchip_initcall(char const *compat, void *fn) +{ + static unsigned count; + + if (count == LX_EMUL_MAX_OF_IRQ_CHIPS) { + printk("lx_emul_register_of_irqchip_initcall: __irqchip_of_table exhausted\n"); + return; } -}; + + strncpy(__irqchip_of_table[count].compatible, compat, + sizeof(__irqchip_of_table[count].compatible)); + + __irqchip_of_table[count].data = fn; + + count++; +} + + +IRQCHIP_DECLARE(dde_gic_v3, "arm,gic-v3", dde_irqchip_init); +IRQCHIP_DECLARE(dde_gic_400, "arm,gic-400", dde_irqchip_init); int lx_emul_irq_task_function(void * data)