drivers: Add func to config gpio pin for secure access

Add func to config gpio pin for secure access

Signed-off-by: Sheetal Tigadoli <sheetal.tigadoli@broadcom.com>
Acked-by: Jerome Forissier <jerome@forissier.org>
diff --git a/core/arch/arm/plat-bcm/platform_config.h b/core/arch/arm/plat-bcm/platform_config.h
index d9220e2..f9f8c5e 100644
--- a/core/arch/arm/plat-bcm/platform_config.h
+++ b/core/arch/arm/plat-bcm/platform_config.h
@@ -24,6 +24,9 @@
 #define ASIU_GPIO_INTR		190
 #define GPIO_NUM_START0		0
 #define NUM_GPIOS0		151
+
+#define CHIP_SECURE_GPIO_CONTROL0_BASE	0x68b60000
+
 #define SPI_0_BASE		0x68a80000
 #define SPI_0_END		(SPI_0_BASE + 0x1000)
 #define SPI_0_CLK_HZ		175000000
diff --git a/core/drivers/bcm_gpio.c b/core/drivers/bcm_gpio.c
index 58d34d6..4d875e8 100644
--- a/core/drivers/bcm_gpio.c
+++ b/core/drivers/bcm_gpio.c
@@ -24,6 +24,11 @@
 
 #define IPROC_GPIO_SHIFT(pin)		((pin) % NGPIOS_PER_BANK)
 
+#define GPIO_BANK_CNT			5
+#define SEC_GPIO_SIZE			0x4
+#define IPROC_GPIO_SEC_CFG_REG(pin) \
+	(((GPIO_BANK_CNT - 1) - GPIO_BANK(pin)) * SEC_GPIO_SIZE)
+
 static SLIST_HEAD(, bcm_gpio_chip) gclist = SLIST_HEAD_INITIALIZER(gclist);
 
 struct bcm_gpio_chip *bcm_gpio_pin_to_chip(unsigned int pin)
@@ -146,6 +151,18 @@
 };
 KEEP_PAGER(bcm_gpio_ops);
 
+void iproc_gpio_set_secure(int gpiopin)
+{
+	vaddr_t regaddr = 0;
+	unsigned int shift = IPROC_GPIO_SHIFT(gpiopin);
+	vaddr_t baseaddr = (vaddr_t)phys_to_virt(CHIP_SECURE_GPIO_CONTROL0_BASE,
+						 MEM_AREA_IO_SEC);
+
+	regaddr = baseaddr + IPROC_GPIO_SEC_CFG_REG(gpiopin);
+
+	io_clrbits32(regaddr, BIT(shift));
+}
+
 static void iproc_gpio_init(struct bcm_gpio_chip *gc, unsigned int paddr,
 			    unsigned int gpio_base, unsigned int ngpios)
 {
diff --git a/core/include/drivers/bcm_gpio.h b/core/include/drivers/bcm_gpio.h
index 348592a..12de82b 100644
--- a/core/include/drivers/bcm_gpio.h
+++ b/core/include/drivers/bcm_gpio.h
@@ -26,6 +26,8 @@
 	SLIST_ENTRY(bcm_gpio_chip) link;
 };
 
-/* returns bcm_gpio_chip handle for a GPIO pin */
+/* Returns bcm_gpio_chip handle for a GPIO pin */
 struct bcm_gpio_chip *bcm_gpio_pin_to_chip(unsigned int pin);
+/* Set gpiopin as secure */
+void iproc_gpio_set_secure(int gpiopin);
 #endif	/* BCM_GPIO_H */