coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gpio.c
Go to the documentation of this file.
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
3
#include <
device/mmio.h
>
4
#include <gpio.h>
5
#include <
assert.h
>
6
7
static
void
*
gpio_find_reg_addr
(
gpio_t
gpio
)
8
{
9
void
*reg_addr;
10
switch
(
gpio
.base & 0x0f) {
11
case
0:
12
reg_addr = (
void
*)
IOCFG_RM_BASE
;
13
break
;
14
case
1:
15
reg_addr = (
void
*)
IOCFG_BM_BASE
;
16
break
;
17
case
2:
18
reg_addr = (
void
*)
IOCFG_BL_BASE
;
19
break
;
20
case
3:
21
reg_addr = (
void
*)
IOCFG_BR_BASE
;
22
break
;
23
case
4:
24
reg_addr = (
void
*)
IOCFG_LM_BASE
;
25
break
;
26
case
5:
27
reg_addr = (
void
*)
IOCFG_LB_BASE
;
28
break
;
29
case
6:
30
reg_addr = (
void
*)
IOCFG_RT_BASE
;
31
break
;
32
case
7:
33
reg_addr = (
void
*)
IOCFG_LT_BASE
;
34
break
;
35
case
8:
36
reg_addr = (
void
*)
IOCFG_TL_BASE
;
37
break
;
38
default
:
39
reg_addr =
NULL
;
40
break
;
41
}
42
43
return
reg_addr;
44
}
45
46
static
void
gpio_set_spec_pull_pupd
(
gpio_t
gpio
,
enum
pull_enable
enable,
47
enum
pull_select
select)
48
{
49
void
*reg1;
50
void
*reg2;
51
int
bit =
gpio
.bit;
52
53
reg1 =
gpio_find_reg_addr
(
gpio
) +
gpio
.offset;
54
reg2 = reg1 + (
gpio
.base & 0xf0);
55
56
if
(enable ==
GPIO_PULL_ENABLE
) {
57
if
(select ==
GPIO_PULL_DOWN
)
58
setbits32
(reg1, 1 << bit);
59
else
60
clrbits32
(reg1, 1 << bit);
61
}
62
63
if
(enable ==
GPIO_PULL_ENABLE
)
64
setbits32
(reg2, 1 << bit);
65
else
{
66
clrbits32
(reg2, 1 << bit);
67
clrbits32
(reg2 + 0x010, 1 << bit);
68
}
69
}
70
71
static
void
gpio_set_pull_pu_pd
(
gpio_t
gpio
,
enum
pull_enable
enable,
72
enum
pull_select
select)
73
{
74
void
*reg1;
75
void
*reg2;
76
int
bit =
gpio
.bit;
77
78
reg1 =
gpio_find_reg_addr
(
gpio
) +
gpio
.offset;
79
reg2 = reg1 - (
gpio
.base & 0xf0);
80
81
if
(enable ==
GPIO_PULL_ENABLE
) {
82
if
(select ==
GPIO_PULL_DOWN
) {
83
clrbits32
(reg1, 1 << bit);
84
setbits32
(reg2, 1 << bit);
85
}
else
{
86
clrbits32
(reg2, 1 << bit);
87
setbits32
(reg1, 1 << bit);
88
}
89
}
else
{
90
clrbits32
(reg1, 1 << bit);
91
clrbits32
(reg2, 1 << bit);
92
}
93
}
94
95
void
gpio_set_pull
(
gpio_t
gpio
,
enum
pull_enable
enable,
96
enum
pull_select
select)
97
{
98
if
(
gpio
.flag)
99
gpio_set_spec_pull_pupd
(
gpio
, enable, select);
100
else
101
gpio_set_pull_pu_pd
(
gpio
, enable, select);
102
}
assert.h
mmio.h
setbits32
#define setbits32(addr, set)
Definition:
mmio.h:21
clrbits32
#define clrbits32(addr, clear)
Definition:
mmio.h:26
pull_enable
pull_enable
Definition:
gpio_common.h:11
GPIO_PULL_ENABLE
@ GPIO_PULL_ENABLE
Definition:
gpio_common.h:13
pull_select
pull_select
Definition:
gpio_common.h:16
gpio_set_pull
void gpio_set_pull(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition:
gpio.c:17
IOCFG_LT_BASE
@ IOCFG_LT_BASE
Definition:
addressmap.h:46
IOCFG_LM_BASE
@ IOCFG_LM_BASE
Definition:
addressmap.h:43
IOCFG_TL_BASE
@ IOCFG_TL_BASE
Definition:
addressmap.h:47
IOCFG_BL_BASE
@ IOCFG_BL_BASE
Definition:
addressmap.h:44
IOCFG_RT_BASE
@ IOCFG_RT_BASE
Definition:
addressmap.h:38
IOCFG_RM_BASE
@ IOCFG_RM_BASE
Definition:
addressmap.h:39
IOCFG_LB_BASE
@ IOCFG_LB_BASE
Definition:
addressmap.h:42
gpio_find_reg_addr
static void * gpio_find_reg_addr(gpio_t gpio)
Definition:
gpio.c:7
gpio_set_pull_pu_pd
static void gpio_set_pull_pu_pd(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition:
gpio.c:71
gpio_set_spec_pull_pupd
static void gpio_set_spec_pull_pupd(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition:
gpio.c:46
IOCFG_BR_BASE
@ IOCFG_BR_BASE
Definition:
addressmap.h:70
IOCFG_BM_BASE
@ IOCFG_BM_BASE
Definition:
addressmap.h:68
GPIO_PULL_DOWN
#define GPIO_PULL_DOWN
Definition:
gpio.h:23
NULL
#define NULL
Definition:
stddef.h:19
gpio_t
Definition:
gpio_base.h:7
gpio
Definition:
pinmux.c:36
src
soc
mediatek
mt8192
gpio.c
Generated by
1.9.1