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 
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 
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 
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 }
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrbits32(addr, clear)
Definition: mmio.h:26
pull_enable
Definition: gpio_common.h:11
@ GPIO_PULL_ENABLE
Definition: gpio_common.h:13
pull_select
Definition: gpio_common.h:16
void gpio_set_pull(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition: gpio.c:17
@ IOCFG_LT_BASE
Definition: addressmap.h:46
@ IOCFG_LM_BASE
Definition: addressmap.h:43
@ IOCFG_TL_BASE
Definition: addressmap.h:47
@ IOCFG_BL_BASE
Definition: addressmap.h:44
@ IOCFG_RT_BASE
Definition: addressmap.h:38
@ IOCFG_RM_BASE
Definition: addressmap.h:39
@ IOCFG_LB_BASE
Definition: addressmap.h:42
static void * gpio_find_reg_addr(gpio_t gpio)
Definition: gpio.c:7
static void gpio_set_pull_pu_pd(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition: gpio.c:71
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
Definition: addressmap.h:70
@ IOCFG_BM_BASE
Definition: addressmap.h:68
#define GPIO_PULL_DOWN
Definition: gpio.h:23
#define NULL
Definition: stddef.h:19
Definition: pinmux.c:36