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

Commit 863a08dc authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

irqchip: exynos: pass irq_base from platform



The platform code knows the IRQ base, while the irqchip driver
should really not. This is a littly hacky because we still
hardwire the IRQ base to 160 for the combiner in the DT case,
when we should really use -1. Removing that line will cause
a linear IRQ domain to be use, as we should.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Cc: Thomas Gleixner <tglx@linutronix.de>
parent 92c8e496
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -447,7 +447,8 @@ void __init exynos4_init_irq(void)
#endif
#endif


	if (!of_have_populated_dt())
	if (!of_have_populated_dt())
		combiner_init(S5P_VA_COMBINER_BASE, NULL, max_combiner_nr());
		combiner_init(S5P_VA_COMBINER_BASE, NULL,
			      max_combiner_nr(), COMBINER_IRQ(0, 0));


	/*
	/*
	 * The parameters of s5p_init_irq() are for VIC init.
	 * The parameters of s5p_init_irq() are for VIC init.
+1 −1
Original line number Original line Diff line number Diff line
@@ -70,7 +70,7 @@ void exynos4212_register_clocks(void);


struct device_node;
struct device_node;
void combiner_init(void __iomem *combiner_base, struct device_node *np,
void combiner_init(void __iomem *combiner_base, struct device_node *np,
			unsigned int max_nr);
			unsigned int max_nr, int irq_base);


extern struct smp_operations exynos_smp_ops;
extern struct smp_operations exynos_smp_ops;


+13 −10
Original line number Original line Diff line number Diff line
@@ -206,27 +206,22 @@ static unsigned int combiner_lookup_irq(int group)


void __init combiner_init(void __iomem *combiner_base,
void __init combiner_init(void __iomem *combiner_base,
			  struct device_node *np,
			  struct device_node *np,
			  unsigned int max_nr)
			  unsigned int max_nr,
			  int irq_base)
{
{
	int i, irq, irq_base;
	int i, irq;
	unsigned int nr_irq;
	unsigned int nr_irq;
	struct combiner_chip_data *combiner_data;
	struct combiner_chip_data *combiner_data;


	nr_irq = max_nr * IRQ_IN_COMBINER;
	nr_irq = max_nr * IRQ_IN_COMBINER;


	irq_base = irq_alloc_descs(COMBINER_IRQ(0, 0), 1, nr_irq, 0);
	if (IS_ERR_VALUE(irq_base)) {
		irq_base = COMBINER_IRQ(0, 0);
		pr_warning("%s: irq desc alloc failed. Continuing with %d as linux irq base\n", __func__, irq_base);
	}

	combiner_data = kcalloc(max_nr, sizeof (*combiner_data), GFP_KERNEL);
	combiner_data = kcalloc(max_nr, sizeof (*combiner_data), GFP_KERNEL);
	if (!combiner_data) {
	if (!combiner_data) {
		pr_warning("%s: could not allocate combiner data\n", __func__);
		pr_warning("%s: could not allocate combiner data\n", __func__);
		return;
		return;
	}
	}


	combiner_irq_domain = irq_domain_add_legacy(np, nr_irq, irq_base, 0,
	combiner_irq_domain = irq_domain_add_simple(np, nr_irq, irq_base,
				&combiner_irq_domain_ops, combiner_data);
				&combiner_irq_domain_ops, combiner_data);
	if (WARN_ON(!combiner_irq_domain)) {
	if (WARN_ON(!combiner_irq_domain)) {
		pr_warning("%s: irq domain init failed\n", __func__);
		pr_warning("%s: irq domain init failed\n", __func__);
@@ -253,6 +248,7 @@ static int __init combiner_of_init(struct device_node *np,
{
{
	void __iomem *combiner_base;
	void __iomem *combiner_base;
	unsigned int max_nr = 20;
	unsigned int max_nr = 20;
	int irq_base = -1;


	combiner_base = of_iomap(np, 0);
	combiner_base = of_iomap(np, 0);
	if (!combiner_base) {
	if (!combiner_base) {
@@ -266,7 +262,14 @@ static int __init combiner_of_init(struct device_node *np,
			__func__, max_nr);
			__func__, max_nr);
	}
	}


	combiner_init(combiner_base, np, max_nr);
	/* 
	 * FIXME: This is a hardwired COMBINER_IRQ(0,0). Once all devices
	 * get their IRQ from DT, remove this in order to get dynamic
	 * allocation.
	 */
	irq_base = 160;

	combiner_init(combiner_base, np, max_nr, irq_base);


	return 0;
	return 0;
}
}