Commit 0f966d74 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

PM / shmobile: Don't include SH7372's INTCS in syscore suspend/resume

Since the SH7372's INTCS in included into syscore suspend/resume,
which causes the chip to be accessed when PM domains have been
turned off during system suspend, the A4R domain containing the
INTCS has to stay on during system sleep, which is suboptimal
from the power consumption point of view.

For this reason, add a new INTC flag, skip_syscore_suspend, to mark
the INTCS for intc_suspend() and intc_resume(), so that they don't
touch it.  This allows the A4R domain to be turned off during
system suspend and the INTCS state is resrored during system
resume by the A4R's "power on" code.
Suggested-by: default avatarMagnus Damm <damm@opensource.se>
Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Acked-by: default avatarMagnus Damm <damm@opensource.se>
parent f7dadb37
...@@ -535,6 +535,7 @@ static struct resource intcs_resources[] __initdata = { ...@@ -535,6 +535,7 @@ static struct resource intcs_resources[] __initdata = {
static struct intc_desc intcs_desc __initdata = { static struct intc_desc intcs_desc __initdata = {
.name = "sh7372-intcs", .name = "sh7372-intcs",
.force_enable = ENABLED_INTCS, .force_enable = ENABLED_INTCS,
.skip_syscore_suspend = true,
.resource = intcs_resources, .resource = intcs_resources,
.num_resources = ARRAY_SIZE(intcs_resources), .num_resources = ARRAY_SIZE(intcs_resources),
.hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers, .hw = INTC_HW_DESC(intcs_vectors, intcs_groups, intcs_mask_registers,
......
...@@ -354,6 +354,8 @@ int __init register_intc_controller(struct intc_desc *desc) ...@@ -354,6 +354,8 @@ int __init register_intc_controller(struct intc_desc *desc)
if (desc->force_enable) if (desc->force_enable)
intc_enable_disable_enum(desc, d, desc->force_enable, 1); intc_enable_disable_enum(desc, d, desc->force_enable, 1);
d->skip_suspend = desc->skip_syscore_suspend;
nr_intc_controllers++; nr_intc_controllers++;
return 0; return 0;
...@@ -386,6 +388,9 @@ static int intc_suspend(void) ...@@ -386,6 +388,9 @@ static int intc_suspend(void)
list_for_each_entry(d, &intc_list, list) { list_for_each_entry(d, &intc_list, list) {
int irq; int irq;
if (d->skip_suspend)
continue;
/* enable wakeup irqs belonging to this intc controller */ /* enable wakeup irqs belonging to this intc controller */
for_each_active_irq(irq) { for_each_active_irq(irq) {
struct irq_data *data; struct irq_data *data;
...@@ -409,6 +414,9 @@ static void intc_resume(void) ...@@ -409,6 +414,9 @@ static void intc_resume(void)
list_for_each_entry(d, &intc_list, list) { list_for_each_entry(d, &intc_list, list) {
int irq; int irq;
if (d->skip_suspend)
continue;
for_each_active_irq(irq) { for_each_active_irq(irq) {
struct irq_data *data; struct irq_data *data;
struct irq_chip *chip; struct irq_chip *chip;
......
...@@ -67,6 +67,7 @@ struct intc_desc_int { ...@@ -67,6 +67,7 @@ struct intc_desc_int {
struct intc_window *window; struct intc_window *window;
unsigned int nr_windows; unsigned int nr_windows;
struct irq_chip chip; struct irq_chip chip;
bool skip_suspend;
}; };
......
...@@ -95,6 +95,7 @@ struct intc_desc { ...@@ -95,6 +95,7 @@ struct intc_desc {
unsigned int num_resources; unsigned int num_resources;
intc_enum force_enable; intc_enum force_enable;
intc_enum force_disable; intc_enum force_disable;
bool skip_syscore_suspend;
struct intc_hw_desc hw; struct intc_hw_desc hw;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment