irq: add irq_handler_enable_suspend_only() interface

Change-Id: I3cda4c3a4ce5928be32eaa8b65ccd4e16946c116
Signed-off-by: Joseph Chen <chenjh@rock-chips.com>
This commit is contained in:
Joseph Chen 2019-08-02 11:49:18 +08:00 committed by Jianhong Chen
parent 4176611909
commit 2c4e90c1f8
3 changed files with 29 additions and 0 deletions

View File

@ -21,6 +21,8 @@ struct irqchip_desc {
struct irq_chip *gpio; struct irq_chip *gpio;
struct irq_chip *virq; struct irq_chip *virq;
int suspend_irq[PLATFORM_SUSPEND_MAX_IRQ];
int suspend_num;
}; };
static struct irq_desc irq_desc[PLATFORM_MAX_IRQ]; static struct irq_desc irq_desc[PLATFORM_MAX_IRQ];
@ -246,13 +248,38 @@ void irq_free_handler(int irq)
} }
} }
int irq_handler_enable_suspend_only(int irq)
{
if (bad_irq(irq))
return -EINVAL;
if (irqchip.suspend_num >= PLATFORM_SUSPEND_MAX_IRQ) {
printf("Over max count(%d) of suspend irq\n",
PLATFORM_SUSPEND_MAX_IRQ);
return -EPERM;
}
irqchip.suspend_irq[irqchip.suspend_num++] = irq;
return 0;
}
int irqs_suspend(void) int irqs_suspend(void)
{ {
int i;
for (i = 0; i < irqchip.suspend_num; i++)
irq_handler_enable(irqchip.suspend_irq[i]);
return irqchip.gic->irq_suspend(); return irqchip.gic->irq_suspend();
} }
int irqs_resume(void) int irqs_resume(void)
{ {
int i;
for (i = 0; i < irqchip.suspend_num; i++)
irq_handler_disable(irqchip.suspend_irq[i]);
return irqchip.gic->irq_resume(); return irqchip.gic->irq_resume();
} }

View File

@ -15,6 +15,7 @@
/* /*
* IRQ-NUMBERS * IRQ-NUMBERS
*/ */
#define PLATFORM_SUSPEND_MAX_IRQ 12
#define PLATFORM_GIC_MAX_IRQ (GIC_IRQS_NR) #define PLATFORM_GIC_MAX_IRQ (GIC_IRQS_NR)
#define PLATFORM_GPIO_MAX_IRQ (GIC_IRQS_NR + GPIO_IRQS_NR) #define PLATFORM_GPIO_MAX_IRQ (GIC_IRQS_NR + GPIO_IRQS_NR)
#define PLATFORM_MAX_IRQ (GIC_IRQS_NR + GPIO_IRQS_NR) #define PLATFORM_MAX_IRQ (GIC_IRQS_NR + GPIO_IRQS_NR)

View File

@ -94,6 +94,7 @@ void irq_free_handler(int irq);
int irq_set_irq_type(int irq, unsigned int type); int irq_set_irq_type(int irq, unsigned int type);
int irq_revert_irq_type(int irq); int irq_revert_irq_type(int irq);
int irq_handler_enable(int irq); int irq_handler_enable(int irq);
int irq_handler_enable_suspend_only(int irq);
int irq_handler_disable(int irq); int irq_handler_disable(int irq);
int irq_get_gpio_level(int irq); int irq_get_gpio_level(int irq);
int irqs_suspend(void); int irqs_suspend(void);