[coreboot-gerrit] New patch to review for coreboot: 8b0e4b3 ipq806x: implement GPIO API

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Wed Mar 18 06:22:03 CET 2015


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/8718

-gerrit

commit 8b0e4b3dd74ce754eede8df6a342e65c2dbaca84
Author: Vadim Bendebury <vbendeb at chromium.org>
Date:   Fri Jul 25 17:34:42 2014 -0700

    ipq806x: implement GPIO API
    
    Add implementation of the GPIO API defined in src/include/gpiolib.h.
    Also, clean up the GPIO driver, make it use pointers instead of
    integers for register address.
    
    This requires a touch in the SPI driver, where the CS GPIO is toggled
    and in the board function where it enables USB interface.
    
    BUG=chrome-os-partner:30489
    TEST=tested with the following patches, observed proto0 properly read
         the board ID.
    
    Original-Change-Id: I0962947c6bb32a854ca300752d259a48e9e7b4eb
    Original-Signed-off-by: Vadim Bendebury <vbendeb at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/210115
    Original-Reviewed-by: David Hendricks <dhendrix at chromium.org>
    (cherry picked from commit e951f735001509d135cc61530ed0eecb5fc31a85)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I8a612dce000931835054086c1b02ebfc43dc57d2
---
 src/mainboard/google/storm/mainboard.c   |  1 +
 src/soc/qualcomm/ipq806x/gpio.c          | 97 +++++++++++++++-----------------
 src/soc/qualcomm/ipq806x/include/gpio.h  |  5 +-
 src/soc/qualcomm/ipq806x/include/iomap.h |  4 +-
 src/soc/qualcomm/ipq806x/spi.c           |  4 +-
 5 files changed, 53 insertions(+), 58 deletions(-)

diff --git a/src/mainboard/google/storm/mainboard.c b/src/mainboard/google/storm/mainboard.c
index bb4cff8..94f3a92 100644
--- a/src/mainboard/google/storm/mainboard.c
+++ b/src/mainboard/google/storm/mainboard.c
@@ -40,6 +40,7 @@ static void setup_usb(void)
 #if !CONFIG_BOARD_VARIANT_AP148
 	gpio_tlmm_config_set(USB_ENABLE_GPIO, FUNC_SEL_GPIO,
 			     GPIO_PULL_UP, GPIO_10MA, GPIO_ENABLE);
+	gpio_set_out_value(USB_ENABLE_GPIO, 1);
 #endif
 	usb_clock_config();
 
diff --git a/src/soc/qualcomm/ipq806x/gpio.c b/src/soc/qualcomm/ipq806x/gpio.c
index ac41e1a..8cce3ba 100644
--- a/src/soc/qualcomm/ipq806x/gpio.c
+++ b/src/soc/qualcomm/ipq806x/gpio.c
@@ -50,20 +50,20 @@ static inline int gpio_not_valid(gpio_t gpio)
 Function description: configure GPIO functinality
 Arguments :
 gpio_t gpio - Gpio number
-unsigned int func - Functionality number
-unsigned int pull - pull up/down, no pull range(0-3)
-unsigned int drvstr - range (0 - 7)-> (2- 16)MA steps of 2
-unsigned int enable - 1 - Disable, 2- Enable.
+unsigned func - Functionality number
+unsigned pull - pull up/down, no pull range(0-3)
+unsigned drvstr - range (0 - 7)-> (2- 16)MA steps of 2
+unsigned enable - 0 Disable, 1 - Enable.
 
 Return : None
 *******************************************************/
 
 
-void gpio_tlmm_config_set(gpio_t gpio, unsigned int func,
-			  unsigned int pull, unsigned int drvstr,
-			  unsigned int enable)
+void gpio_tlmm_config_set(gpio_t gpio, unsigned func,
+			  unsigned pull, unsigned drvstr,
+			  unsigned enable)
 {
-        unsigned int val = 0;
+        unsigned val = 0;
 
 	if (gpio_not_valid(gpio))
 		return;
@@ -72,33 +72,33 @@ void gpio_tlmm_config_set(gpio_t gpio, unsigned int func,
         val |= (func & GPIO_CFG_FUNC_MASK) << GPIO_CFG_FUNC_SHIFT;
         val |= (drvstr & GPIO_CFG_DRV_MASK) << GPIO_CFG_DRV_SHIFT;
         val |= (enable & GPIO_CFG_OE_MASK) << GPIO_CFG_OE_SHIFT;
-        unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio);
-        writel(val, addr);
+
+        writel(val, GPIO_CONFIG_ADDR(gpio));
 }
 
 /*******************************************************
 Function description: Get GPIO configuration
 Arguments :
 gpio_t gpio - Gpio number
-unsigned int *func - Functionality number
-unsigned int *pull - pull up/down, no pull range(0-3)
-unsigned int *drvstr - range (0 - 7)-> (2- 16)MA steps of 2
-unsigned int *enable - 1 - Disable, 2- Enable.
+unsigned *func - Functionality number
+unsigned *pull - pull up/down, no pull range(0-3)
+unsigned *drvstr - range (0 - 7)-> (2- 16)MA steps of 2
+unsigned *enable - 0 - Disable, 1- Enable.
 
 Return : None
 *******************************************************/
 
 
-void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func,
-			  unsigned int *pull, unsigned int *drvstr,
-			  unsigned int *enable)
+void gpio_tlmm_config_get(gpio_t gpio, unsigned *func,
+			  unsigned *pull, unsigned *drvstr,
+			  unsigned *enable)
 {
-        unsigned int val;
+        unsigned val;
+        void *addr = GPIO_CONFIG_ADDR(gpio);
 
 	if (gpio_not_valid(gpio))
 		return;
 
-        unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio);
 	val = readl(addr);
 
 	*pull = (val >> GPIO_CFG_PULL_SHIFT) & GPIO_CFG_PULL_MASK;
@@ -108,52 +108,47 @@ void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func,
 }
 
 /*******************************************************
-Function description: configure GPIO IO functinality
+Function description: get GPIO IO functinality details
 Arguments :
 gpio_t gpio - Gpio number
-unsigned int out - Controls value of GPIO output
+unsigned *in - Value of GPIO input
+unsigned *out - Value of GPIO output
 
 Return : None
 *******************************************************/
-
-void gpio_io_config_set(gpio_t gpio, unsigned int out)
+int gpio_get_in_value(gpio_t gpio)
 {
-        unsigned int val;
-
 	if (gpio_not_valid(gpio))
-		return;
-
-	unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio);
+		return -1;
 
-	val = readl(addr);
-	if (out)
-		val |= (1 << GPIO_IO_OUT_SHIFT);
-	else
-		val &= (~(1 << GPIO_IO_OUT_SHIFT));
 
-	writel(val,addr);
+	return (readl(GPIO_IN_OUT_ADDR(gpio)) >> GPIO_IO_IN_SHIFT) &
+		GPIO_IO_IN_MASK;
 }
 
-/*******************************************************
-Function description: get GPIO IO functinality details
-Arguments :
-gpio_t gpio - Gpio number
-unsigned int *in - Value of GPIO input
-unsigned int *out - Value of GPIO output
-
-Return : None
-*******************************************************/
-
-void gpio_io_config_get(gpio_t gpio, unsigned int *in, unsigned int *out)
+void gpio_set_out_value(gpio_t gpio, int value)
 {
-        unsigned int val;
-
 	if (gpio_not_valid(gpio))
 		return;
 
-	unsigned int *addr = (unsigned int *)GPIO_CONFIG_ADDR(gpio);
+	writel((value & 1) << GPIO_IO_OUT_SHIFT, GPIO_IN_OUT_ADDR(gpio));
+}
 
-	val = readl(addr);
-	*in = (val >> GPIO_IO_IN_SHIFT)  & GPIO_IO_IN_MASK;
-	*out = (val >> GPIO_IO_OUT_SHIFT) & GPIO_IO_OUT_MASK;
+void gpio_input_pulldown(gpio_t gpio)
+{
+	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
+			     GPIO_PULL_DOWN, GPIO_2MA, GPIO_DISABLE);
 }
+
+void gpio_input_pullup(gpio_t gpio)
+{
+	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
+			     GPIO_PULL_UP, GPIO_2MA, GPIO_DISABLE);
+}
+
+void gpio_input(gpio_t gpio)
+{
+	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
+			     GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE);
+}
+
diff --git a/src/soc/qualcomm/ipq806x/include/gpio.h b/src/soc/qualcomm/ipq806x/include/gpio.h
index 1f35aa7..276022c 100644
--- a/src/soc/qualcomm/ipq806x/include/gpio.h
+++ b/src/soc/qualcomm/ipq806x/include/gpio.h
@@ -64,8 +64,8 @@
 #define GPIO_16MA       7
 
 /* GPIO TLMM: Status */
-#define GPIO_ENABLE     0
-#define GPIO_DISABLE    1
+#define GPIO_DISABLE    0
+#define GPIO_ENABLE     1
 
 /* GPIO MAX Valid # */
 #define GPIO_MAX_NUM  68
@@ -99,7 +99,6 @@ void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func,
 			  unsigned int *enable);
 
 void gpio_io_config_set(gpio_t gpio, unsigned int out);
-void gpio_io_config_get(gpio_t gpio, unsigned int *in, unsigned int *out);
 
 /* Keep this to maintain backwards compatibility with the vendor API. */
 static inline void gpio_tlmm_config(unsigned int gpio, unsigned int func,
diff --git a/src/soc/qualcomm/ipq806x/include/iomap.h b/src/soc/qualcomm/ipq806x/include/iomap.h
index 69744bc..c9c8fc4 100644
--- a/src/soc/qualcomm/ipq806x/include/iomap.h
+++ b/src/soc/qualcomm/ipq806x/include/iomap.h
@@ -81,9 +81,9 @@
 #define DGT_CLEAR            DGT_REG(0x000C)
 #define DGT_CLK_CTL          DGT_REG(0x0010)
 
-#define TLMM_BASE_ADDR      0x00800000
+#define TLMM_BASE_ADDR      ((char *)0x00800000)
 #define GPIO_CONFIG_ADDR(x) (TLMM_BASE_ADDR + 0x1000 + (x)*0x10)
-#define GPIO_IN_OUT_ADDR(x) (TLMM_BASE_ADDR + 0x1004 + (x)*0x10)
+#define GPIO_IN_OUT_ADDR(x) (GPIO_CONFIG_ADDR(x) + 4)
 
 /* Yes, this is not a typo... host2 is actually mapped before host1. */
 #define USB_HOST2_XHCI_BASE	0x10000000
diff --git a/src/soc/qualcomm/ipq806x/spi.c b/src/soc/qualcomm/ipq806x/spi.c
index 2c16cb6..54d54b2 100644
--- a/src/soc/qualcomm/ipq806x/spi.c
+++ b/src/soc/qualcomm/ipq806x/spi.c
@@ -279,13 +279,13 @@ static int check_qup_clk_state(unsigned int core_num, int enable)
 static void CS_change(int port_num, int cs_num, int enable)
 {
 	unsigned int cs_gpio = cs_gpio_array[port_num][cs_num];
-	uint32_t addr = GPIO_IN_OUT_ADDR(cs_gpio);
+	void *addr = GPIO_IN_OUT_ADDR(cs_gpio);
 	uint32_t val = readl_i(addr);
 
 	val &= (~(1 << GPIO_OUTPUT));
 	if (!enable)
 		val |= (1 << GPIO_OUTPUT);
-	writel_i(val, addr);
+	writel(val, addr);
 }
 
 /*



More information about the coreboot-gerrit mailing list