[PATCH 5/7] irqchip/partition-percpu: Refactor backend method calling

From: Marc Zyngier
Date: Tue Apr 24 2018 - 10:36:46 EST


The various methods provided by the partition-percpu irqchip are only
wrappers that end-up calling into the underlying irqchip. As we're
about to change the code a bit, let's start with introducing a set
of helpers that will make that transition much more painless.

No functionnal change.

Signed-off-by: Marc Zyngier <marc.zyngier@xxxxxxx>
---
drivers/irqchip/irq-partition-percpu.c | 70 +++++++++++++++-------------------
1 file changed, 30 insertions(+), 40 deletions(-)

diff --git a/drivers/irqchip/irq-partition-percpu.c b/drivers/irqchip/irq-partition-percpu.c
index 229f96ab3e26..be0df6e0add9 100644
--- a/drivers/irqchip/irq-partition-percpu.c
+++ b/drivers/irqchip/irq-partition-percpu.c
@@ -39,68 +39,58 @@ static bool partition_check_cpu(struct partition_desc *part,
return cpumask_test_cpu(cpu, &part->parts[hwirq].mask);
}

+#define PART_IF_METHOD(method, d) \
+ struct partition_desc *part; \
+ struct irq_chip *chip; \
+ struct irq_data *data; \
+ \
+ part = irq_data_get_irq_chip_data(d); \
+ chip = irq_desc_get_chip(part->chained_desc); \
+ data = irq_desc_get_irq_data(part->chained_desc); \
+ if (partition_check_cpu(part, smp_processor_id(), d->hwirq) && \
+ chip->method)
+
+#define PART_CALL_METHOD_VOID(method, d, ...) \
+ do { \
+ PART_IF_METHOD(method, d) \
+ chip->method(data, ##__VA_ARGS__); \
+ } while(0)
+
+#define PART_CALL_METHOD_INT(retval, method, d, ...) \
+ ({ \
+ int ret = retval; \
+ PART_IF_METHOD(method, d) \
+ ret = chip->method(data, ##__VA_ARGS__); \
+ ret; \
+ })
+
static void partition_irq_mask(struct irq_data *d)
{
- struct partition_desc *part = irq_data_get_irq_chip_data(d);
- struct irq_chip *chip = irq_desc_get_chip(part->chained_desc);
- struct irq_data *data = irq_desc_get_irq_data(part->chained_desc);
-
- if (partition_check_cpu(part, smp_processor_id(), d->hwirq) &&
- chip->irq_mask)
- chip->irq_mask(data);
+ PART_CALL_METHOD_VOID(irq_mask, d);
}

static void partition_irq_unmask(struct irq_data *d)
{
- struct partition_desc *part = irq_data_get_irq_chip_data(d);
- struct irq_chip *chip = irq_desc_get_chip(part->chained_desc);
- struct irq_data *data = irq_desc_get_irq_data(part->chained_desc);
-
- if (partition_check_cpu(part, smp_processor_id(), d->hwirq) &&
- chip->irq_unmask)
- chip->irq_unmask(data);
+ PART_CALL_METHOD_VOID(irq_unmask, d);
}

static int partition_irq_set_irqchip_state(struct irq_data *d,
enum irqchip_irq_state which,
bool val)
{
- struct partition_desc *part = irq_data_get_irq_chip_data(d);
- struct irq_chip *chip = irq_desc_get_chip(part->chained_desc);
- struct irq_data *data = irq_desc_get_irq_data(part->chained_desc);
-
- if (partition_check_cpu(part, smp_processor_id(), d->hwirq) &&
- chip->irq_set_irqchip_state)
- return chip->irq_set_irqchip_state(data, which, val);
-
- return -EINVAL;
+ return PART_CALL_METHOD_INT(-EINVAL, irq_set_irqchip_state, d, which, val);
}

static int partition_irq_get_irqchip_state(struct irq_data *d,
enum irqchip_irq_state which,
bool *val)
{
- struct partition_desc *part = irq_data_get_irq_chip_data(d);
- struct irq_chip *chip = irq_desc_get_chip(part->chained_desc);
- struct irq_data *data = irq_desc_get_irq_data(part->chained_desc);
-
- if (partition_check_cpu(part, smp_processor_id(), d->hwirq) &&
- chip->irq_get_irqchip_state)
- return chip->irq_get_irqchip_state(data, which, val);
-
- return -EINVAL;
+ return PART_CALL_METHOD_INT(-EINVAL, irq_get_irqchip_state, d, which, val);
}

static int partition_irq_set_type(struct irq_data *d, unsigned int type)
{
- struct partition_desc *part = irq_data_get_irq_chip_data(d);
- struct irq_chip *chip = irq_desc_get_chip(part->chained_desc);
- struct irq_data *data = irq_desc_get_irq_data(part->chained_desc);
-
- if (chip->irq_set_type)
- return chip->irq_set_type(data, type);
-
- return -EINVAL;
+ return PART_CALL_METHOD_INT(IRQ_SET_MASK_OK_NOCOPY, irq_set_type, d, type);
}

static void partition_irq_print_chip(struct irq_data *d, struct seq_file *p)
--
2.14.2