|
@@ -533,3 +533,87 @@ GET_GPIO_P(both)
|
|
|
GET_GPIO_P(maska)
|
|
|
GET_GPIO_P(maskb)
|
|
|
|
|
|
+
|
|
|
+#ifdef CONFIG_PM
|
|
|
+DECLARE_RESERVED_MAP(wakeup, GPIO_BANK_NUM);
|
|
|
+
|
|
|
+static const unsigned int sic_iwr_irqs[] = {
|
|
|
+#if defined(BF533_FAMILY)
|
|
|
+ IRQ_PROG_INTB
|
|
|
+#elif defined(BF537_FAMILY)
|
|
|
+ IRQ_PF_INTB_WATCH, IRQ_PORTG_INTB, IRQ_PH_INTB_MAC_TX
|
|
|
+#elif defined(BF538_FAMILY)
|
|
|
+ IRQ_PORTF_INTB
|
|
|
+#elif defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
|
+ IRQ_PORTF_INTB, IRQ_PORTG_INTB, IRQ_PORTH_INTB
|
|
|
+#elif defined(BF561_FAMILY)
|
|
|
+ IRQ_PROG0_INTB, IRQ_PROG1_INTB, IRQ_PROG2_INTB
|
|
|
+#else
|
|
|
+# error no SIC_IWR defined
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|
|
|
+/***********************************************************
|
|
|
+*
|
|
|
+* FUNCTIONS: Blackfin PM Setup API
|
|
|
+*
|
|
|
+* INPUTS/OUTPUTS:
|
|
|
+* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
|
|
|
+* type -
|
|
|
+* PM_WAKE_RISING
|
|
|
+* PM_WAKE_FALLING
|
|
|
+* PM_WAKE_HIGH
|
|
|
+* PM_WAKE_LOW
|
|
|
+* PM_WAKE_BOTH_EDGES
|
|
|
+*
|
|
|
+* DESCRIPTION: Blackfin PM Driver API
|
|
|
+*
|
|
|
+* CAUTION:
|
|
|
+*************************************************************
|
|
|
+* MODIFICATION HISTORY :
|
|
|
+**************************************************************/
|
|
|
+int gpio_pm_wakeup_ctrl(unsigned gpio, unsigned ctrl)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
+ if (check_gpio(gpio) < 0)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ flags = hard_local_irq_save();
|
|
|
+ if (ctrl)
|
|
|
+ reserve(wakeup, gpio);
|
|
|
+ else
|
|
|
+ unreserve(wakeup, gpio);
|
|
|
+
|
|
|
+ set_gpio_maskb(gpio, ctrl);
|
|
|
+ hard_local_irq_restore(flags);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int bfin_pm_standby_ctrl(unsigned ctrl)
|
|
|
+{
|
|
|
+ u16 bank, mask, i;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
+ mask = map_entry(wakeup, i);
|
|
|
+ bank = gpio_bank(i);
|
|
|
+
|
|
|
+ if (mask)
|
|
|
+ bfin_internal_set_wake(sic_iwr_irqs[bank], ctrl);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void bfin_gpio_pm_hibernate_suspend(void)
|
|
|
+{
|
|
|
+ int i, bank;
|
|
|
+
|
|
|
+#ifdef BF538_FAMILY
|
|
|
+ for (i = 0; i < ARRAY_SIZE(port_fer_saved); ++i)
|
|
|
+ port_fer_saved[i] = *port_fer[i];
|
|
|
+#endif
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
+ bank = gpio_bank(i);
|
|
|
+
|