struct sh7372_pm_domain sh7372_a4r = {
        .genpd.name = "A4R",
        .bit_shift = 5,
-       .gov = &pm_domain_always_on_gov,
        .suspend = sh7372_a4r_suspend,
        .resume = sh7372_intcs_resume,
 };
        return 0;
 }
 
+/**
+ * sh7372_pm_notifier_fn - SH7372 PM notifier routine.
+ * @notifier: Unused.
+ * @pm_event: Event being handled.
+ * @unused: Unused.
+ */
+static int sh7372_pm_notifier_fn(struct notifier_block *notifier,
+                                unsigned long pm_event, void *unused)
+{
+       switch (pm_event) {
+       case PM_SUSPEND_PREPARE:
+               /*
+                * This is necessary, because the A4R domain has to be "on"
+                * when suspend_device_irqs() and resume_device_irqs() are
+                * executed during system suspend and resume, respectively, so
+                * that those functions don't crash while accessing the INTCS.
+                */
+               pm_genpd_poweron(&sh7372_a4r.genpd);
+               break;
+       case PM_POST_SUSPEND:
+               pm_genpd_poweroff_unused();
+               break;
+       }
+
+       return NOTIFY_DONE;
+}
+
 static void sh7372_suspend_init(void)
 {
        shmobile_suspend_ops.enter = sh7372_enter_suspend;
+       pm_notifier(sh7372_pm_notifier_fn, 0);
 }
 #else
 static void sh7372_suspend_init(void) {}