diff options
author | Jiang Liu <jiang.liu@linux.intel.com> | 2014-11-06 09:20:18 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2014-11-23 07:01:46 -0500 |
commit | 2cb625478f8cea0f72b565007a35e1eb7882ac3a (patch) | |
tree | edfe2cdb021c7c9e6e4bacd75489a4d059cd1ef6 | |
parent | 515085ef7ee74694bc9b02bc45196452defad59a (diff) |
genirq: Add IRQ_SET_MASK_OK_DONE to support stacked irqchip
Add IRQ_SET_MASK_OK_DONE in addition to IRQ_SET_MASK_OK and
IRQ_SET_MASK_OK_NOCOPY to support stacked irqchip. IRQ_SET_MASK_OK_DONE
is the same as IRQ_SET_MASK_OK to irq core. To stacked irqchip, it means
that ascendant irqchips have done all the work and no more handling
needed in descendant irqchips.
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Grant Likely <grant.likely@linaro.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Yingjoe Chen <yingjoe.chen@mediatek.com>
Cc: Yijing Wang <wangyijing@huawei.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/linux/irq.h | 4 | ||||
-rw-r--r-- | kernel/irq/manage.c | 2 |
2 files changed, 6 insertions, 0 deletions
diff --git a/include/linux/irq.h b/include/linux/irq.h index d58e58935465..566b1e541323 100644 --- a/include/linux/irq.h +++ b/include/linux/irq.h | |||
@@ -114,10 +114,14 @@ enum { | |||
114 | * | 114 | * |
115 | * IRQ_SET_MASK_OK - OK, core updates irq_data.affinity | 115 | * IRQ_SET_MASK_OK - OK, core updates irq_data.affinity |
116 | * IRQ_SET_MASK_NOCPY - OK, chip did update irq_data.affinity | 116 | * IRQ_SET_MASK_NOCPY - OK, chip did update irq_data.affinity |
117 | * IRQ_SET_MASK_OK_DONE - Same as IRQ_SET_MASK_OK for core. Special code to | ||
118 | * support stacked irqchips, which indicates skipping | ||
119 | * all descendent irqchips. | ||
117 | */ | 120 | */ |
118 | enum { | 121 | enum { |
119 | IRQ_SET_MASK_OK = 0, | 122 | IRQ_SET_MASK_OK = 0, |
120 | IRQ_SET_MASK_OK_NOCOPY, | 123 | IRQ_SET_MASK_OK_NOCOPY, |
124 | IRQ_SET_MASK_OK_DONE, | ||
121 | }; | 125 | }; |
122 | 126 | ||
123 | struct msi_desc; | 127 | struct msi_desc; |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 0a9104b4608b..80692373abd6 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -183,6 +183,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, | |||
183 | ret = chip->irq_set_affinity(data, mask, force); | 183 | ret = chip->irq_set_affinity(data, mask, force); |
184 | switch (ret) { | 184 | switch (ret) { |
185 | case IRQ_SET_MASK_OK: | 185 | case IRQ_SET_MASK_OK: |
186 | case IRQ_SET_MASK_OK_DONE: | ||
186 | cpumask_copy(data->affinity, mask); | 187 | cpumask_copy(data->affinity, mask); |
187 | case IRQ_SET_MASK_OK_NOCOPY: | 188 | case IRQ_SET_MASK_OK_NOCOPY: |
188 | irq_set_thread_affinity(desc); | 189 | irq_set_thread_affinity(desc); |
@@ -600,6 +601,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq, | |||
600 | 601 | ||
601 | switch (ret) { | 602 | switch (ret) { |
602 | case IRQ_SET_MASK_OK: | 603 | case IRQ_SET_MASK_OK: |
604 | case IRQ_SET_MASK_OK_DONE: | ||
603 | irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK); | 605 | irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK); |
604 | irqd_set(&desc->irq_data, flags); | 606 | irqd_set(&desc->irq_data, flags); |
605 | 607 | ||