|
@@ -617,3 +617,114 @@ void bfin_gpio_pm_hibernate_suspend(void)
|
|
|
for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
bank = gpio_bank(i);
|
|
|
|
|
|
+#if defined(CONFIG_BF52x) || defined(BF537_FAMILY) || defined(CONFIG_BF51x)
|
|
|
+ gpio_bank_saved[bank].fer = *port_fer[bank];
|
|
|
+#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
|
+ gpio_bank_saved[bank].mux = *port_mux[bank];
|
|
|
+#else
|
|
|
+ if (bank == 0)
|
|
|
+ gpio_bank_saved[bank].mux = bfin_read_PORT_MUX();
|
|
|
+#endif
|
|
|
+#endif
|
|
|
+ gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
|
+ gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
|
|
+ gpio_bank_saved[bank].polar = gpio_array[bank]->polar;
|
|
|
+ gpio_bank_saved[bank].dir = gpio_array[bank]->dir;
|
|
|
+ gpio_bank_saved[bank].edge = gpio_array[bank]->edge;
|
|
|
+ gpio_bank_saved[bank].both = gpio_array[bank]->both;
|
|
|
+ gpio_bank_saved[bank].maska = gpio_array[bank]->maska;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef BFIN_SPECIAL_GPIO_BANKS
|
|
|
+ bfin_special_gpio_pm_hibernate_suspend();
|
|
|
+#endif
|
|
|
+
|
|
|
+ AWA_DUMMY_READ(maska);
|
|
|
+}
|
|
|
+
|
|
|
+void bfin_gpio_pm_hibernate_restore(void)
|
|
|
+{
|
|
|
+ int i, bank;
|
|
|
+
|
|
|
+#ifdef BF538_FAMILY
|
|
|
+ for (i = 0; i < ARRAY_SIZE(port_fer_saved); ++i)
|
|
|
+ *port_fer[i] = port_fer_saved[i];
|
|
|
+#endif
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
+ bank = gpio_bank(i);
|
|
|
+
|
|
|
+#if defined(CONFIG_BF52x) || defined(BF537_FAMILY) || defined(CONFIG_BF51x)
|
|
|
+#if defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
|
+ *port_mux[bank] = gpio_bank_saved[bank].mux;
|
|
|
+#else
|
|
|
+ if (bank == 0)
|
|
|
+ bfin_write_PORT_MUX(gpio_bank_saved[bank].mux);
|
|
|
+#endif
|
|
|
+ *port_fer[bank] = gpio_bank_saved[bank].fer;
|
|
|
+#endif
|
|
|
+ gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
|
|
+ gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
|
|
+ & gpio_bank_saved[bank].dir;
|
|
|
+ gpio_array[bank]->dir = gpio_bank_saved[bank].dir;
|
|
|
+ gpio_array[bank]->polar = gpio_bank_saved[bank].polar;
|
|
|
+ gpio_array[bank]->edge = gpio_bank_saved[bank].edge;
|
|
|
+ gpio_array[bank]->both = gpio_bank_saved[bank].both;
|
|
|
+ gpio_array[bank]->maska = gpio_bank_saved[bank].maska;
|
|
|
+ }
|
|
|
+
|
|
|
+#ifdef BFIN_SPECIAL_GPIO_BANKS
|
|
|
+ bfin_special_gpio_pm_hibernate_restore();
|
|
|
+#endif
|
|
|
+
|
|
|
+ AWA_DUMMY_READ(maska);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#endif
|
|
|
+#else /* CONFIG_BF54x || CONFIG_BF60x */
|
|
|
+#ifdef CONFIG_PM
|
|
|
+
|
|
|
+int bfin_pm_standby_ctrl(unsigned ctrl)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void bfin_gpio_pm_hibernate_suspend(void)
|
|
|
+{
|
|
|
+ int i, bank;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
+ bank = gpio_bank(i);
|
|
|
+
|
|
|
+ gpio_bank_saved[bank].fer = gpio_array[bank]->port_fer;
|
|
|
+ gpio_bank_saved[bank].mux = gpio_array[bank]->port_mux;
|
|
|
+ gpio_bank_saved[bank].data = gpio_array[bank]->data;
|
|
|
+ gpio_bank_saved[bank].inen = gpio_array[bank]->inen;
|
|
|
+ gpio_bank_saved[bank].dir = gpio_array[bank]->dir_set;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void bfin_gpio_pm_hibernate_restore(void)
|
|
|
+{
|
|
|
+ int i, bank;
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_BLACKFIN_GPIOS; i += GPIO_BANKSIZE) {
|
|
|
+ bank = gpio_bank(i);
|
|
|
+
|
|
|
+ gpio_array[bank]->port_mux = gpio_bank_saved[bank].mux;
|
|
|
+ gpio_array[bank]->port_fer = gpio_bank_saved[bank].fer;
|
|
|
+ gpio_array[bank]->inen = gpio_bank_saved[bank].inen;
|
|
|
+ gpio_array[bank]->data_set = gpio_bank_saved[bank].data
|
|
|
+ & gpio_bank_saved[bank].dir;
|
|
|
+ gpio_array[bank]->dir_set = gpio_bank_saved[bank].dir;
|
|
|
+ }
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+unsigned short get_gpio_dir(unsigned gpio)
|
|
|
+{
|
|
|
+ return (0x01 & (gpio_array[gpio_bank(gpio)]->dir_clear >> gpio_sub_n(gpio)));
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(get_gpio_dir);
|
|
|
+
|