| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 |