diff options
Diffstat (limited to 'arch/arm/plat-mxc/tzic.c')
| -rw-r--r-- | arch/arm/plat-mxc/tzic.c | 40 | 
1 files changed, 29 insertions, 11 deletions
diff --git a/arch/arm/plat-mxc/tzic.c b/arch/arm/plat-mxc/tzic.c index a3c164c7ba8..98308ec1f32 100644 --- a/arch/arm/plat-mxc/tzic.c +++ b/arch/arm/plat-mxc/tzic.c @@ -73,7 +73,28 @@ static int tzic_set_irq_fiq(unsigned int irq, unsigned int type)  #define tzic_set_irq_fiq NULL  #endif -static unsigned int *wakeup_intr[4]; +#ifdef CONFIG_PM +static void tzic_irq_suspend(struct irq_data *d) +{ +	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); +	int idx = gc->irq_base >> 5; + +	__raw_writel(gc->wake_active, tzic_base + TZIC_WAKEUP0(idx)); +} + +static void tzic_irq_resume(struct irq_data *d) +{ +	struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); +	int idx = gc->irq_base >> 5; + +	__raw_writel(__raw_readl(tzic_base + TZIC_ENSET0(idx)), +		     tzic_base + TZIC_WAKEUP0(idx)); +} + +#else +#define tzic_irq_suspend NULL +#define tzic_irq_resume NULL +#endif  static struct mxc_extra_irq tzic_extra_irq = {  #ifdef CONFIG_FIQ @@ -91,12 +112,13 @@ static __init void tzic_init_gc(unsigned int irq_start)  				    handle_level_irq);  	gc->private = &tzic_extra_irq;  	gc->wake_enabled = IRQ_MSK(32); -	wakeup_intr[idx] = &gc->wake_active;  	ct = gc->chip_types;  	ct->chip.irq_mask = irq_gc_mask_disable_reg;  	ct->chip.irq_unmask = irq_gc_unmask_enable_reg;  	ct->chip.irq_set_wake = irq_gc_set_wake; +	ct->chip.irq_suspend = tzic_irq_suspend; +	ct->chip.irq_resume = tzic_irq_resume;  	ct->regs.disable = TZIC_ENCLEAR0(idx);  	ct->regs.enable = TZIC_ENSET0(idx); @@ -167,23 +189,19 @@ void __init tzic_init_irq(void __iomem *irqbase)  /**   * tzic_enable_wake() - enable wakeup interrupt   * - * @param is_idle		1 if called in idle loop (ENSET0 register); - *				0 to be used when called from low power entry   * @return			0 if successful; non-zero otherwise   */ -int tzic_enable_wake(int is_idle) +int tzic_enable_wake(void)  { -	unsigned int i, v; +	unsigned int i;  	__raw_writel(1, tzic_base + TZIC_DSMINT);  	if (unlikely(__raw_readl(tzic_base + TZIC_DSMINT) == 0))  		return -EAGAIN; -	for (i = 0; i < 4; i++) { -		v = is_idle ? __raw_readl(tzic_base + TZIC_ENSET0(i)) : -			*wakeup_intr[i]; -		__raw_writel(v, tzic_base + TZIC_WAKEUP0(i)); -	} +	for (i = 0; i < 4; i++) +		__raw_writel(__raw_readl(tzic_base + TZIC_ENSET0(i)), +			     tzic_base + TZIC_WAKEUP0(i));  	return 0;  }  |