• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 
3 #include <device/mmio.h>
4 #include <gpio.h>
5 #include <soc/iomap.h>
6 
7 /*******************************************************
8 Function description: check for invalid GPIO #
9 Arguments :
10 gpio_t gpio - Gpio number
11 
12 Return : GPIO Valid(0)/Invalid(1)
13 *******************************************************/
14 
gpio_not_valid(gpio_t gpio)15 static inline int gpio_not_valid(gpio_t gpio)
16 {
17 	return (gpio > GPIO_MAX_NUM);
18 }
19 
20 /*******************************************************
21 Function description: configure GPIO functionality
22 Arguments :
23 gpio_t gpio - Gpio number
24 unsigned func - Functionality number
25 unsigned pull - pull up/down, no pull range(0-3)
26 unsigned drvstr - range (0 - 7)-> (2- 16)MA steps of 2
27 unsigned enable - 0 Disable, 1 - Enable.
28 
29 Return : None
30 *******************************************************/
31 
gpio_tlmm_config_set(gpio_t gpio,unsigned int func,unsigned int pull,unsigned int drvstr,unsigned int enable)32 void gpio_tlmm_config_set(gpio_t gpio, unsigned int func,
33 			  unsigned int pull, unsigned int drvstr,
34 			  unsigned int enable)
35 {
36 	unsigned int val = 0;
37 
38 	if (gpio_not_valid(gpio))
39 		return;
40 
41 	val |= (pull & GPIO_CFG_PULL_MASK) << GPIO_CFG_PULL_SHIFT;
42 	val |= (func & GPIO_CFG_FUNC_MASK) << GPIO_CFG_FUNC_SHIFT;
43 	val |= (drvstr & GPIO_CFG_DRV_MASK) << GPIO_CFG_DRV_SHIFT;
44 	val |= (enable & GPIO_CFG_OE_MASK) << GPIO_CFG_OE_SHIFT;
45 
46 	write32(GPIO_CONFIG_ADDR(gpio), val);
47 }
48 
49 /*******************************************************
50 Function description: Get GPIO configuration
51 Arguments :
52 gpio_t gpio - Gpio number
53 unsigned *func - Functionality number
54 unsigned *pull - pull up/down, no pull range(0-3)
55 unsigned *drvstr - range (0 - 7)-> (2- 16)MA steps of 2
56 unsigned *enable - 0 - Disable, 1- Enable.
57 
58 Return : None
59 *******************************************************/
60 
gpio_tlmm_config_get(gpio_t gpio,unsigned int * func,unsigned int * pull,unsigned int * drvstr,unsigned int * enable)61 void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func,
62 			  unsigned int *pull, unsigned int *drvstr,
63 			  unsigned int *enable)
64 {
65 	unsigned int val;
66 	void *addr = GPIO_CONFIG_ADDR(gpio);
67 
68 	if (gpio_not_valid(gpio))
69 		return;
70 
71 	val = read32(addr);
72 
73 	*pull = (val >> GPIO_CFG_PULL_SHIFT) & GPIO_CFG_PULL_MASK;
74 	*func = (val >> GPIO_CFG_FUNC_SHIFT) & GPIO_CFG_FUNC_MASK;
75 	*drvstr = (val >> GPIO_CFG_DRV_SHIFT) & GPIO_CFG_DRV_MASK;
76 	*enable = (val >> GPIO_CFG_OE_SHIFT) & GPIO_CFG_OE_MASK;
77 }
78 
79 /*******************************************************
80 Function description: get GPIO IO functionality details
81 Arguments :
82 gpio_t gpio - Gpio number
83 unsigned *in - Value of GPIO input
84 unsigned *out - Value of GPIO output
85 
86 Return : None
87 *******************************************************/
gpio_get(gpio_t gpio)88 int gpio_get(gpio_t gpio)
89 {
90 	if (gpio_not_valid(gpio))
91 		return -1;
92 
93 	return (read32(GPIO_IN_OUT_ADDR(gpio)) >> GPIO_IO_IN_SHIFT) &
94 		GPIO_IO_IN_MASK;
95 }
96 
gpio_set(gpio_t gpio,int value)97 void gpio_set(gpio_t gpio, int value)
98 {
99 	if (gpio_not_valid(gpio))
100 		return;
101 
102 	write32(GPIO_IN_OUT_ADDR(gpio), (value & 1) << GPIO_IO_OUT_SHIFT);
103 }
104 
gpio_input_pulldown(gpio_t gpio)105 void gpio_input_pulldown(gpio_t gpio)
106 {
107 	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
108 			     GPIO_PULL_DOWN, GPIO_2MA, GPIO_DISABLE);
109 }
110 
gpio_input_pullup(gpio_t gpio)111 void gpio_input_pullup(gpio_t gpio)
112 {
113 	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
114 			     GPIO_PULL_UP, GPIO_2MA, GPIO_DISABLE);
115 }
116 
gpio_input(gpio_t gpio)117 void gpio_input(gpio_t gpio)
118 {
119 	gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
120 			     GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE);
121 }
122