1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <device/mmio.h>
5 #include <soc/addressmap.h>
11 static void __gpio_input(gpio_t gpio
, u32 pull
)
13 u32 pinmux_config
= PINMUX_INPUT_ENABLE
| pull
;
15 gpio_set_int_enable(gpio
, 0);
16 gpio_set_out_enable(gpio
, 0);
17 gpio_set_mode(gpio
, GPIO_MODE_GPIO
);
18 pinmux_set_config(gpio
>> GPIO_PINMUX_SHIFT
, pinmux_config
);
21 static void __gpio_output(gpio_t gpio
, int value
, u32 od
)
23 gpio_set_int_enable(gpio
, 0);
24 gpio_set(gpio
, value
);
25 gpio_set_out_enable(gpio
, 1);
26 gpio_set_mode(gpio
, GPIO_MODE_GPIO
);
27 pinmux_set_config(gpio
>> GPIO_PINMUX_SHIFT
, PINMUX_PULL_NONE
| od
);
30 static const struct gpio_bank
*gpio_banks
= (void *)TEGRA_GPIO_BASE
;
32 static u32
gpio_read_port(int index
, size_t offset
)
34 int bank
= index
/ GPIO_GPIOS_PER_BANK
;
35 int port
= (index
- bank
* GPIO_GPIOS_PER_BANK
) / GPIO_GPIOS_PER_PORT
;
37 return read32((u8
*)&gpio_banks
[bank
] + offset
+
41 static void gpio_write_port(int index
, size_t offset
, u32 mask
, u32 value
)
43 int bank
= index
/ GPIO_GPIOS_PER_BANK
;
44 int port
= (index
- bank
* GPIO_GPIOS_PER_BANK
) / GPIO_GPIOS_PER_PORT
;
46 u32 reg
= read32((u8
*)&gpio_banks
[bank
] + offset
+
48 u32 new_reg
= (reg
& ~mask
) | (value
& mask
);
51 write32((u8
*)&gpio_banks
[bank
] + offset
+ port
* sizeof(u32
),
56 void gpio_set_mode(gpio_t gpio
, enum gpio_mode mode
)
58 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
59 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
60 offsetof(struct gpio_bank
, config
),
61 1 << bit
, mode
? (1 << bit
) : 0);
64 int gpio_get_mode(gpio_t gpio
)
66 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
67 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
68 offsetof(struct gpio_bank
, config
));
69 return (port
& (1 << bit
)) != 0;
72 void gpio_set_lock(gpio_t gpio
)
74 int bit
= gpio
% GPIO_GPIOS_PER_PORT
+ GPIO_GPIOS_PER_PORT
;
75 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
76 offsetof(struct gpio_bank
, config
),
80 int gpio_get_lock(gpio_t gpio
)
82 int bit
= gpio
% GPIO_GPIOS_PER_PORT
+ GPIO_GPIOS_PER_PORT
;
83 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
84 offsetof(struct gpio_bank
, config
));
85 return (port
& (1 << bit
)) != 0;
88 void gpio_set_out_enable(gpio_t gpio
, int enable
)
90 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
91 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
92 offsetof(struct gpio_bank
, out_enable
),
93 1 << bit
, enable
? (1 << bit
) : 0);
96 int gpio_get_out_enable(gpio_t gpio
)
98 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
99 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
100 offsetof(struct gpio_bank
, out_enable
));
101 return (port
& (1 << bit
)) != 0;
104 void gpio_set(gpio_t gpio
, int value
)
106 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
107 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
108 offsetof(struct gpio_bank
, out_value
),
109 1 << bit
, value
? (1 << bit
) : 0);
112 int gpio_get_out_value(gpio_t gpio
)
114 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
115 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
116 offsetof(struct gpio_bank
, out_value
));
117 return (port
& (1 << bit
)) != 0;
120 int gpio_get(gpio_t gpio
)
122 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
123 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
124 offsetof(struct gpio_bank
, in_value
));
125 return (port
& (1 << bit
)) != 0;
128 int gpio_get_int_status(gpio_t gpio
)
130 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
131 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
132 offsetof(struct gpio_bank
, int_status
));
133 return (port
& (1 << bit
)) != 0;
136 void gpio_set_int_enable(gpio_t gpio
, int enable
)
138 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
139 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
140 offsetof(struct gpio_bank
, int_enable
),
141 1 << bit
, enable
? (1 << bit
) : 0);
144 int gpio_get_int_enable(gpio_t gpio
)
146 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
147 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
148 offsetof(struct gpio_bank
, int_enable
));
149 return (port
& (1 << bit
)) != 0;
152 void gpio_set_int_level(gpio_t gpio
, int high_rise
, int edge
, int delta
)
154 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
155 u32 value
= (high_rise
? (0x000001 << bit
) : 0) |
156 (edge
? (0x000100 << bit
) : 0) |
157 (delta
? (0x010000 << bit
) : 0);
158 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
159 offsetof(struct gpio_bank
, config
),
160 0x010101 << bit
, value
);
163 void gpio_get_int_level(gpio_t gpio
, int *high_rise
, int *edge
, int *delta
)
165 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
166 u32 port
= gpio_read_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
167 offsetof(struct gpio_bank
, int_level
));
168 *high_rise
= ((port
& (0x000001 << bit
)) != 0);
169 *edge
= ((port
& (0x000100 << bit
)) != 0);
170 *delta
= ((port
& (0x010000 << bit
)) != 0);
173 void gpio_set_int_clear(gpio_t gpio
)
175 int bit
= gpio
% GPIO_GPIOS_PER_PORT
;
176 gpio_write_port(gpio
& ((1 << GPIO_PINMUX_SHIFT
) - 1),
177 offsetof(struct gpio_bank
, int_clear
),
181 void gpio_input_pulldown(gpio_t gpio
)
183 __gpio_input(gpio
, PINMUX_PULL_DOWN
);
186 void gpio_input_pullup(gpio_t gpio
)
188 __gpio_input(gpio
, PINMUX_PULL_UP
);
191 void gpio_input(gpio_t gpio
)
193 __gpio_input(gpio
, PINMUX_PULL_NONE
);
196 void gpio_output(gpio_t gpio
, int value
)
198 __gpio_output(gpio
, value
, 0);
201 void gpio_output_open_drain(gpio_t gpio
, int value
)
203 __gpio_output(gpio
, value
, PINMUX_OPEN_DRAIN
);