On 03/25/2012 07:38 AM, Thomas Abraham wrote: > The of_irq_init function stops processing the interrupt controller hierarchy > when there are no more interrupt controller parents identified. Though this > condition suffices most cases, there are cases where a interrupt controller's > parent controller does not participate in the initialization of the interrupt > hierarchy. An example of such a case is the use of a interrupt nexus node > by a interrupt controller node which delivers interrupts to separate interrupt > parent controllers. > > Instead of stopping the processing of interrupt controller hierarchy in such > a case, the orphan interrupt controller node's descriptor can be identified > and its 'logical' parent in the descriptor is set as NULL. The processing of > interrupt hierarchy is then restarted by looking for descriptors which have > a NULL interrupt parent. > > Cc: Rob Herring <rob.herring@xxxxxxxxxxx> > Cc: Grant Likely <grant.likely@xxxxxxxxxxxx> > Signed-off-by: Thomas Abraham <thomas.abraham@xxxxxxxxxx> > --- Wouldn't this accomplish the same thing? You just need to add the wakeup-map node name to your matches list. diff --git a/drivers/of/irq.c b/drivers/of/irq.c index 9cf0060..deeaf00 100644 --- a/drivers/of/irq.c +++ b/drivers/of/irq.c @@ -416,8 +416,6 @@ void __init of_irq_init(const struct of_device_id *matches) INIT_LIST_HEAD(&intc_parent_list); for_each_matching_node(np, matches) { - if (!of_find_property(np, "interrupt-controller", NULL)) - continue; /* * Here, we allocate and populate an intc_desc with the node * pointer, interrupt-parent device_node etc. > drivers/of/irq.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 44 insertions(+), 1 deletions(-) > > diff --git a/drivers/of/irq.c b/drivers/of/irq.c > index 9cf0060..70c6ece 100644 > --- a/drivers/of/irq.c > +++ b/drivers/of/irq.c > @@ -400,6 +400,38 @@ struct intc_desc { > }; > > /** > + * of_irq_mark_orphan_desc - Set parent as NULL for a orphan intc_desc > + * @intc_desc_list: the list of intc_desc to search for orphan intc_desc > + * > + * This is a helper function for the of_irq_init function and is invoked > + * when there are child nodes available in intc_desc_list but there are > + * no parent nodes in intc_parent_list. When invoked, this function > + * searches for a intc_desc instance that does not have a parent intc_desc > + * instance in intc_desc_list. The very reason of the invocation of this > + * function ensures that a orphan intc_desc will be found. When found, the > + * interrupt_parent of the orphan intc_desc is set to NULL. > + */ > +static void of_irq_mark_orphan_desc(struct list_head *intc_desc_list) > +{ > + struct intc_desc *desc, *temp_desc; > + > + list_for_each_entry_safe(desc, temp_desc, intc_desc_list, list) { > + struct intc_desc *td1, *td2; > + list_for_each_entry_safe(td1, td2, intc_desc_list, list) { > + if (desc->interrupt_parent == td1->dev) > + break; > + } > + if (desc->interrupt_parent == td1->dev) > + continue; > + > + pr_debug("%s: set interrupt_parent of 'intc_desc' with dev name" > + " %s as NULL\n", __func__, desc->dev->full_name); > + desc->interrupt_parent = NULL; > + return; > + } > +} > + > +/** > * of_irq_init - Scan and init matching interrupt controllers in DT > * @matches: 0 terminated array of nodes to match and init function to call > * > @@ -481,8 +513,19 @@ void __init of_irq_init(const struct of_device_id *matches) > /* Get the next pending parent that might have children */ > desc = list_first_entry(&intc_parent_list, typeof(*desc), list); > if (list_empty(&intc_parent_list) || !desc) { > + /* > + * This has reached a point where there are children in > + * the intc_desc_list but no parent in intc_parent_list. > + * This means there is a child desc in intc_desc_list > + * whose parent is not one of the remaining elements of > + * the intc_desc_list. Such a child node is marked as > + * orphan (interrupt_parent is set to NULL) and the > + * process continues with parent set to NULL. > + */ > pr_err("of_irq_init: children remain, but no parents\n"); > - break; > + of_irq_mark_orphan_desc(&intc_desc_list); > + parent = NULL; > + continue; > } > list_del(&desc->list); > parent = desc->dev; -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html