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

Commit 683c66bf authored by Andrew Victor's avatar Andrew Victor Committed by Russell King
Browse files

[ARM] 3583/1: AT91RM9200 IRQ suspend/resume support



Patch from Andrew Victor

Added suspend/resume/set_wake support for the AT91RM9200's AIC interrupt
controller.

Signed-off-by: default avatarAndrew Victor <andrew@sanpeople.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 37f2e4bc
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -118,11 +118,47 @@ static int at91rm9200_irq_type(unsigned irq, unsigned type)
	return 0;
}

#ifdef CONFIG_PM

static u32 wakeups;
static u32 backups;

static int at91rm9200_irq_set_wake(unsigned irq, unsigned value)
{
	if (unlikely(irq >= 32))
		return -EINVAL;

	if (value)
		wakeups |= (1 << irq);
	else
		wakeups &= ~(1 << irq);

	return 0;
}

void at91_irq_suspend(void)
{
	backups = at91_sys_read(AT91_AIC_IMR);
	at91_sys_write(AT91_AIC_IDCR, backups);
	at91_sys_write(AT91_AIC_IECR, wakeups);
}

void at91_irq_resume(void)
{
	at91_sys_write(AT91_AIC_IDCR, wakeups);
	at91_sys_write(AT91_AIC_IECR, backups);
}

#else
#define at91rm9200_irq_set_wake	NULL
#endif

static struct irqchip at91rm9200_irq_chip = {
	.ack		= at91rm9200_mask_irq,
	.mask		= at91rm9200_mask_irq,
	.unmask		= at91rm9200_unmask_irq,
	.set_type	= at91rm9200_irq_type,
	.set_wake	= at91rm9200_irq_set_wake,
};

/*