blob: 8e248c50cdf1323daca3331bd89cf20d1228bb74 [file] [log] [blame]
Patrick Georgi70517072020-05-10 18:47:05 +02001/* SPDX-License-Identifier: BSD-3-Clause */
Varadarajan Narayanana6935c22016-03-02 16:57:10 +05302
Kyösti Mälkki13f66502019-03-03 08:01:05 +02003#include <device/mmio.h>
Varadarajan Narayanana6935c22016-03-02 16:57:10 +05304#include <gpio.h>
5#include <soc/iomap.h>
6
7/*******************************************************
8Function description: check for invalid GPIO #
9Arguments :
10gpio_t gpio - Gpio number
11
12Return : GPIO Valid(0)/Invalid(1)
13*******************************************************/
14
15static inline int gpio_not_valid(gpio_t gpio)
16{
17 return (gpio > GPIO_MAX_NUM);
18}
19
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053020/*******************************************************
Martin Roth26f97f92021-10-01 14:53:22 -060021Function description: configure GPIO functionality
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053022Arguments :
23gpio_t gpio - Gpio number
24unsigned func - Functionality number
25unsigned pull - pull up/down, no pull range(0-3)
26unsigned drvstr - range (0 - 7)-> (2- 16)MA steps of 2
27unsigned enable - 0 Disable, 1 - Enable.
28
29Return : None
30*******************************************************/
31
Martin Roth57e89092019-10-23 21:45:23 -060032void gpio_tlmm_config_set(gpio_t gpio, unsigned int func,
33 unsigned int pull, unsigned int drvstr,
34 unsigned int enable)
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053035{
Martin Roth57e89092019-10-23 21:45:23 -060036 unsigned int val = 0;
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053037
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/*******************************************************
50Function description: Get GPIO configuration
51Arguments :
52gpio_t gpio - Gpio number
53unsigned *func - Functionality number
54unsigned *pull - pull up/down, no pull range(0-3)
55unsigned *drvstr - range (0 - 7)-> (2- 16)MA steps of 2
56unsigned *enable - 0 - Disable, 1- Enable.
57
58Return : None
59*******************************************************/
60
Martin Roth57e89092019-10-23 21:45:23 -060061void gpio_tlmm_config_get(gpio_t gpio, unsigned int *func,
62 unsigned int *pull, unsigned int *drvstr,
63 unsigned int *enable)
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053064{
Martin Roth57e89092019-10-23 21:45:23 -060065 unsigned int val;
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053066 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/*******************************************************
Martin Roth26f97f92021-10-01 14:53:22 -060080Function description: get GPIO IO functionality details
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053081Arguments :
82gpio_t gpio - Gpio number
83unsigned *in - Value of GPIO input
84unsigned *out - Value of GPIO output
85
86Return : None
87*******************************************************/
88int gpio_get(gpio_t gpio)
89{
90 if (gpio_not_valid(gpio))
91 return -1;
92
Varadarajan Narayanana6935c22016-03-02 16:57:10 +053093 return (read32(GPIO_IN_OUT_ADDR(gpio)) >> GPIO_IO_IN_SHIFT) &
94 GPIO_IO_IN_MASK;
95}
96
97void 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
105void 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
111void 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
117void gpio_input(gpio_t gpio)
118{
119 gpio_tlmm_config_set(gpio, GPIO_FUNC_DISABLE,
120 GPIO_NO_PULL, GPIO_2MA, GPIO_DISABLE);
121}