Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d440bf9f authored by Archana Sathyakumar's avatar Archana Sathyakumar Committed by Matt Wagantall
Browse files

irqchip: gic: Add arch extension to GIC v3



Propagate platform arch extension to call into platform specific
callback functions for GIC operations.

Change-Id: Ief42e9812e0593572bbde0fbe5e641eb9b3f5412
Signed-off-by: default avatarArchana Sathyakumar <asathyak@codeaurora.org>
parent 635ad4a3
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -21,6 +21,12 @@

#include "irq-gic-common.h"

/*
 * Supported arch specific GIC irq extension.
 * Default make them NULL.
 */
struct irq_chip gic_arch_extn;

void gic_configure_irq(unsigned int irq, unsigned int type,
		       void __iomem *base, void (*sync_access)(void))
{
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@
#include <linux/of.h>
#include <linux/irqdomain.h>

extern struct irq_chip gic_arch_extn;

void gic_configure_irq(unsigned int irq, unsigned int type,
                       void __iomem *base, void (*sync_access)(void));
void gic_dist_config(void __iomem *base, int gic_irqs,
+20 −0
Original line number Diff line number Diff line
@@ -213,16 +213,30 @@ static void gic_poke_irq(struct irq_data *d, u32 offset)

static void gic_mask_irq(struct irq_data *d)
{
	if (gic_arch_extn.irq_mask)
		gic_arch_extn.irq_mask(d);

	gic_poke_irq(d, GICD_ICENABLER);
}

static void gic_unmask_irq(struct irq_data *d)
{
	if (gic_arch_extn.irq_unmask)
		gic_arch_extn.irq_unmask(d);
	gic_poke_irq(d, GICD_ISENABLER);
}

static void gic_disable_irq(struct irq_data *d)
{
	if (gic_arch_extn.irq_disable)
		gic_arch_extn.irq_disable(d);
}

static void gic_eoi_irq(struct irq_data *d)
{
	if (gic_arch_extn.irq_eoi)
		gic_arch_extn.irq_eoi(d);

	gic_write_eoir(gic_irq(d));
}

@@ -247,6 +261,9 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
		rwp_wait = gic_dist_wait_for_rwp;
	}

	if (gic_arch_extn.irq_set_type)
		gic_arch_extn.irq_set_type(d, type);

	gic_configure_irq(irq, type, base, rwp_wait);

	return 0;
@@ -592,6 +609,7 @@ static struct irq_chip gic_chip = {
	.irq_eoi		= gic_eoi_irq,
	.irq_set_type		= gic_set_type,
	.irq_set_affinity	= gic_set_affinity,
	.irq_disable		= gic_disable_irq,
};

static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
@@ -721,10 +739,12 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare

	set_handle_irq(gic_handle_irq);

	gic_chip.flags |= gic_arch_extn.flags;
	gic_smp_init();
	gic_dist_init();
	gic_cpu_init();
	gic_cpu_pm_init();

	return 0;

out_free:
+0 −14
Original line number Diff line number Diff line
@@ -90,20 +90,6 @@ static DEFINE_RAW_SPINLOCK(gic_sgi_lock);
#define NR_GIC_CPU_IF 8
static u8 gic_cpu_map[NR_GIC_CPU_IF] __read_mostly;

/*
 * Supported arch specific GIC irq extension.
 * Default make them NULL.
 */
struct irq_chip gic_arch_extn = {
	.irq_eoi	= NULL,
	.irq_mask	= NULL,
	.irq_unmask	= NULL,
	.irq_retrigger	= NULL,
	.irq_set_type	= NULL,
	.irq_set_wake	= NULL,
	.irq_disable	= NULL,
};

#ifndef MAX_GIC_NR
#define MAX_GIC_NR	1
#endif