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

Commit 4c82e452 authored by Simon Horman's avatar Simon Horman
Browse files

Merge tag 'renesas-intc-external-irq2-for-v3.10' into soc-base

Update for Renesas INTC External IRQ pin driver for v3.10

This adds support for shared interrupt lines to the
Renesas INTC External IRQ pin driver which has already
been queued up for v3.10 (tag renesas-intc-external-irq-for-v3.10).

The patch "irqchip: intc-irqpin: Add support for shared interrupt lines"
in renesas-intc-external-irq2-for-v3.10 is a dependency for
"ARM: shmobile: r8a7740: Migrate from INTC to GIC". That dependency is
the reason for this merge.
parents d75bc78b 427cc720
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ config ARCH_SH73A0
	select CPU_V7
	select I2C
	select SH_CLK_CPG
	select RENESAS_INTC_IRQPIN

config ARCH_R8A7740
	bool "R-Mobile A1 (R8A77400)"
@@ -31,6 +32,7 @@ config ARCH_R8A7779
	select SH_CLK_CPG
	select USB_ARCH_HAS_EHCI
	select USB_ARCH_HAS_OHCI
	select RENESAS_INTC_IRQPIN

config ARCH_EMEV2
	bool "Emma Mobile EV2"
+7 −7
Original line number Diff line number Diff line
@@ -81,7 +81,7 @@ static struct resource smsc9221_resources[] = {
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= intcs_evt2irq(0x260), /* IRQ3 */
		.start	= irq_pin(3), /* IRQ3 */
		.flags	= IORESOURCE_IRQ,
	},
};
@@ -115,7 +115,7 @@ static struct resource usb_resources[] = {
		.flags	= IORESOURCE_MEM,
	},
	[1] = {
		.start	= intcs_evt2irq(0x220), /* IRQ1 */
		.start	= irq_pin(1), /* IRQ1 */
		.flags	= IORESOURCE_IRQ,
	},
};
@@ -138,7 +138,7 @@ struct usbhs_private {
	struct renesas_usbhs_platform_info info;
};

#define IRQ15			intcs_evt2irq(0x03e0)
#define IRQ15			irq_pin(15)
#define USB_PHY_MODE		(1 << 4)
#define USB_PHY_INT_EN		((1 << 3) | (1 << 2))
#define USB_PHY_ON		(1 << 1)
@@ -563,25 +563,25 @@ static struct i2c_board_info i2c0_devices[] = {
	},
	{
		I2C_BOARD_INFO("ak8975", 0x0c),
		.irq = intcs_evt2irq(0x3380), /* IRQ28 */
		.irq = irq_pin(28), /* IRQ28 */
	},
	{
		I2C_BOARD_INFO("adxl34x", 0x1d),
		.irq = intcs_evt2irq(0x3340), /* IRQ26 */
		.irq = irq_pin(26), /* IRQ26 */
	},
};

static struct i2c_board_info i2c1_devices[] = {
	{
		I2C_BOARD_INFO("st1232-ts", 0x55),
		.irq = intcs_evt2irq(0x300), /* IRQ8 */
		.irq = irq_pin(8), /* IRQ8 */
	},
};

static struct i2c_board_info i2c3_devices[] = {
	{
		I2C_BOARD_INFO("pcf8575", 0x20),
		.irq		= intcs_evt2irq(0x3260), /* IRQ19 */
		.irq = irq_pin(19), /* IRQ19 */
		.platform_data = &pcf8575_pdata,
	},
};
+1 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ extern void r8a7740_pm_init(void);

extern void r8a7779_init_delay(void);
extern void r8a7779_init_irq(void);
extern void r8a7779_init_irq_extpin(int irlm);
extern void r8a7779_init_irq_dt(void);
extern void r8a7779_map_io(void);
extern void r8a7779_earlytimer_init(void);
+4 −0
Original line number Diff line number Diff line
@@ -12,4 +12,8 @@
#define INTCS_VECT(n, vect)	INTC_VECT((n), INTCS_VECT_BASE + (vect))
#define intcs_evt2irq(evt)	evt2irq(INTCS_VECT_BASE + (evt))

/* External IRQ pins */
#define IRQPIN_BASE		2000
#define irq_pin(nr)		((nr) + IRQPIN_BASE)

#endif /* __ASM_MACH_IRQS_H */
+52 −1
Original line number Diff line number Diff line
@@ -19,13 +19,16 @@
 */
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/irqchip/arm-gic.h>
#include <mach/common.h>
#include <linux/platform_data/irq-renesas-intc-irqpin.h>
#include <linux/irqchip.h>
#include <mach/common.h>
#include <mach/intc.h>
#include <mach/irqs.h>
#include <mach/r8a7779.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
@@ -39,6 +42,54 @@
#define INT2NTSR0 IOMEM(0xfe700060)
#define INT2NTSR1 IOMEM(0xfe700064)

static struct renesas_intc_irqpin_config irqpin0_platform_data = {
	.irq_base = irq_pin(0), /* IRQ0 -> IRQ3 */
	.sense_bitfield_width = 2,
};

static struct resource irqpin0_resources[] = {
	DEFINE_RES_MEM(0xfe78001c, 4), /* ICR1 */
	DEFINE_RES_MEM(0xfe780010, 4), /* INTPRI */
	DEFINE_RES_MEM(0xfe780024, 4), /* INTREQ */
	DEFINE_RES_MEM(0xfe780044, 4), /* INTMSK0 */
	DEFINE_RES_MEM(0xfe780064, 4), /* INTMSKCLR0 */
	DEFINE_RES_IRQ(gic_spi(27)), /* IRQ0 */
	DEFINE_RES_IRQ(gic_spi(28)), /* IRQ1 */
	DEFINE_RES_IRQ(gic_spi(29)), /* IRQ2 */
	DEFINE_RES_IRQ(gic_spi(30)), /* IRQ3 */
};

static struct platform_device irqpin0_device = {
	.name		= "renesas_intc_irqpin",
	.id		= 0,
	.resource	= irqpin0_resources,
	.num_resources	= ARRAY_SIZE(irqpin0_resources),
	.dev		= {
		.platform_data	= &irqpin0_platform_data,
	},
};

void __init r8a7779_init_irq_extpin(int irlm)
{
	void __iomem *icr0 = ioremap_nocache(0xfe780000, PAGE_SIZE);
	unsigned long tmp;

	if (icr0) {
		tmp = ioread32(icr0);
		if (irlm)
			tmp |= 1 << 23; /* IRQ0 -> IRQ3 as individual pins */
		else
			tmp &= ~(1 << 23); /* IRL mode - not supported */
		tmp |= (1 << 21); /* LVLMODE = 1 */
		iowrite32(tmp, icr0);
		iounmap(icr0);

		if (irlm)
			platform_device_register(&irqpin0_device);
	} else
		pr_warn("r8a7779: unable to setup external irq pin mode\n");
}

static int r8a7779_set_wake(struct irq_data *data, unsigned int on)
{
	return 0; /* always allow wakeup */
Loading