stm32: bl: Allow SH_INT_WAKEUP to be on any gpio bank

Change-Id: I9fe0548ea049bb1648a7c6327d5b4e3a91cb3cdc
Signed-off-by: Ben Fennema <fennema@google.com>
diff --git a/firmware/os/platform/stm32/bl.c b/firmware/os/platform/stm32/bl.c
index 2b62d66..8c77064 100644
--- a/firmware/os/platform/stm32/bl.c
+++ b/firmware/os/platform/stm32/bl.c
@@ -9,6 +9,7 @@
 #include <plat/cmsis.h>
 
 #include <bl.h>
+#include <gpio.h>
 
 struct StmUdid
 {
@@ -93,13 +94,11 @@
 typedef void (*FlashWriteF)(volatile uint8_t *, uint8_t, volatile uint32_t *);
 
 static struct StmSpi *SPI;
-static struct StmGpio *GPIOA;
 static struct StmRcc *RCC;
+static struct Gpio *wakeupGpio;
 static uint32_t mOldApb2State;
 static uint32_t mOldAhb1State;
 
-#define INT_IN_PIN          (SH_INT_WAKEUP - GPIO_PA(0))
-
 #define FLASH_ACR_LAT(x)    ((x) & FLASH_ACR_LAT_MASK)
 #define FLASH_ACR_LAT_MASK  0x0F
 #define FLASH_ACR_PRFTEN    0x00000100
@@ -412,17 +411,11 @@
 void blSetup()
 {
     SPI = (struct StmSpi*)SPI1_BASE;
-    GPIOA = (struct StmGpio*)GPIOA_BASE;
     RCC = (struct StmRcc*)RCC_BASE;
+    struct Gpio *gpio;
+    int i;
 
-    if (SH_INT_WAKEUP < GPIO_PA(0) || SH_INT_WAKEUP > GPIO_PA(15)) {
-
-        //link time assert :)
-        extern void ThisIsAnError_BlIntPinNotInGpioA(void);
-        ThisIsAnError_BlIntPinNotInGpioA();
-    }
-
-    //SPI & GPIOA on
+    //SPI1 & GPIOA on
     mOldApb2State = RCC->APB2ENR;
     mOldAhb1State = RCC->AHB1ENR;
     RCC->APB2ENR |= PERIPH_APB2_SPI1;
@@ -434,16 +427,20 @@
     RCC->APB2RSTR &=~ PERIPH_APB2_SPI1;
     RCC->AHB1RSTR &=~ PERIPH_AHB1_GPIOA;
 
-    //configure GPIOA for SPI A4..A7 for SPI use (function 5), int pin as not func, high speed, no pullups, not open drain, proper directions
-    GPIOA->AFR[0] = (GPIOA->AFR[0] & 0x0000ffff & ~(0x0f << (INT_IN_PIN * 4))) | 0x55550000;
-    GPIOA->OSPEEDR |= 0x0000ff00 | (3 << (INT_IN_PIN * 2));
-    GPIOA->PUPDR &=~ (0x0000ff00 | (3 << (INT_IN_PIN * 2)));
-    GPIOA->OTYPER &=~ (0x00f0 | (1 << INT_IN_PIN));
-    GPIOA->MODER = (GPIOA->MODER & 0xffff00ff & ~(0x03 << (INT_IN_PIN * 2))) | 0x0000aa00;
+    //configure GPIOA for SPI A4..A7 for AF_SPI1 use (function 5), int pin as not func, high speed, no pullups, not open drain, proper directions
+    for (i=4; i<=7; i++) {
+        gpio = gpioRequest(GPIO_PA(i));
+        gpioConfigAlt(gpio, GPIO_SPEED_HIGH, GPIO_PULL_NONE, GPIO_OUT_PUSH_PULL, GPIO_AF_SPI1);
+        gpioRelease(gpio);
+    }
+
+    wakeupGpio = gpioRequest(SH_INT_WAKEUP);
+    gpioConfigInput(wakeupGpio, GPIO_SPEED_HIGH, GPIO_PULL_NONE);
 }
 
 void blCleanup()
 {
+    gpioRelease(wakeupGpio);
     //reset units & return APB2 & AHB1 to initial state
     RCC->APB2RSTR |= PERIPH_APB2_SPI1;
     RCC->AHB1RSTR |= PERIPH_AHB1_GPIOA;
@@ -455,7 +452,7 @@
 
 bool blHostActive()
 {
-    return !(GPIOA->IDR & (1 << INT_IN_PIN));
+    return !gpioGet(wakeupGpio);
 }
 
 void blConfigIo()