Merge tag 'imx-soc-3.15' of git://git.linaro.org/people/shawnguo/linux-2.6 into next/soc
i.MX SoC changes for 3.15 from Shawn Guo: - Support suspend from ocram (DDR IO floating) for imx6 platforms - Add cpuidle support for imx6sl - Sparse warning fixes for imx6sl and vf610 clock code - Remove PWM platform code - Support ptp and rmii clock from pad - Support WEIM CS GPR configuration - Random cleanups and defconfig updates * tag 'imx-soc-3.15' of git://git.linaro.org/people/shawnguo/linux-2.6: (373 commits) ARM: imx6: drop .text.head section annotation from headsmp.S ARM: imx6: build suspend-imx6.o with CONFIG_SOC_IMX6 ARM: imx6: rename pm-imx6q.c to pm-imx6.c ARM: imx6: introduce CONFIG_SOC_IMX6 for i.MX6 common stuff ARM: imx6: do not call imx6q_suspend_init() with !CONFIG_SUSPEND ARM: imx6: call suspend_set_ops() from suspend routine ARM: imx6: build headsmp.o only on CONFIG_SMP ARM: imx6: move v7_cpu_resume() into suspend-imx6.S ARM i.MX6q: Mark VPU and IPU AXI transfers as cacheable, increase IPU priority ARM: imx6q: Add GPR6 and GPR7 register definitions for iomuxc gpr bus: imx-weim: support CS GPR configuration ARM: mach-imx: Kconfig: Remove IMX_HAVE_PLATFORM_IMX2_WDT from SOC_IMX53 ARM: imx_v6_v7_defconfig: Select CONFIG_DEBUG_FS ARM: mach-imx: Select CONFIG_SRAM at ARCH_MXC level ARM: imx: add speed grading check for i.mx6 soc ARM: imx: avoid calling clk APIs in idle thread which may cause schedule ARM: imx6q: support ptp and rmii clock from pad ARM: imx6q: remove unneeded clk lookups ARM: imx_v6_v7_defconfig: Select CONFIG_MMC_UNSAFE_RESUME ARM: imx_v4_v5_defconfig: Select CONFIG_MMC_UNSAFE_RESUME ...
This commit is contained in:
@@ -111,7 +111,8 @@ IRQCHIP_DECLARE(orion_intc, "marvell,orion-intc", orion_irq_init);
|
||||
static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
struct irq_domain *d = irq_get_handler_data(irq);
|
||||
struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, irq);
|
||||
|
||||
struct irq_chip_generic *gc = irq_get_domain_generic_chip(d, 0);
|
||||
u32 stat = readl_relaxed(gc->reg_base + ORION_BRIDGE_IRQ_CAUSE) &
|
||||
gc->mask_cache;
|
||||
|
||||
@@ -123,6 +124,19 @@ static void orion_bridge_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Bridge IRQ_CAUSE is asserted regardless of IRQ_MASK register.
|
||||
* To avoid interrupt events on stale irqs, we clear them before unmask.
|
||||
*/
|
||||
static unsigned int orion_bridge_irq_startup(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_type *ct = irq_data_get_chip_type(d);
|
||||
|
||||
ct->chip.irq_ack(d);
|
||||
ct->chip.irq_unmask(d);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init orion_bridge_irq_init(struct device_node *np,
|
||||
struct device_node *parent)
|
||||
{
|
||||
@@ -143,7 +157,7 @@ static int __init orion_bridge_irq_init(struct device_node *np,
|
||||
}
|
||||
|
||||
ret = irq_alloc_domain_generic_chips(domain, nrirqs, 1, np->name,
|
||||
handle_level_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE);
|
||||
handle_edge_irq, clr, 0, IRQ_GC_INIT_MASK_CACHE);
|
||||
if (ret) {
|
||||
pr_err("%s: unable to alloc irq domain gc\n", np->name);
|
||||
return ret;
|
||||
@@ -176,12 +190,14 @@ static int __init orion_bridge_irq_init(struct device_node *np,
|
||||
|
||||
gc->chip_types[0].regs.ack = ORION_BRIDGE_IRQ_CAUSE;
|
||||
gc->chip_types[0].regs.mask = ORION_BRIDGE_IRQ_MASK;
|
||||
gc->chip_types[0].chip.irq_startup = orion_bridge_irq_startup;
|
||||
gc->chip_types[0].chip.irq_ack = irq_gc_ack_clr_bit;
|
||||
gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit;
|
||||
gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit;
|
||||
|
||||
/* mask all interrupts */
|
||||
/* mask and clear all interrupts */
|
||||
writel(0, gc->reg_base + ORION_BRIDGE_IRQ_MASK);
|
||||
writel(0, gc->reg_base + ORION_BRIDGE_IRQ_CAUSE);
|
||||
|
||||
irq_set_handler_data(irq, domain);
|
||||
irq_set_chained_handler(irq, orion_bridge_irq_handler);
|
||||
|
Reference in New Issue
Block a user