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 #include <soc/spi.h>
7 
8 enum {
9  EN_OFFSET = 0x60,
10  SEL_OFFSET = 0x80,
14 };
15 
16 static void gpio_set_pull_pupd(gpio_t gpio, enum pull_enable enable,
17  enum pull_select select)
18 {
19  void *reg = GPIO_TO_IOCFG_BASE(gpio.base) + gpio.offset;
20  int bit = gpio.bit;
21 
22  if (enable == GPIO_PULL_ENABLE) {
23  if (select == GPIO_PULL_DOWN)
24  setbits32(reg, 1 << (bit + 2));
25  else
26  clrbits32(reg, 1 << (bit + 2));
27  }
28 
29  if (enable == GPIO_PULL_ENABLE)
30  clrsetbits32(reg, 3 << bit, 1 << bit);
31  else
32  clrbits32(reg, 3 << bit);
33 }
34 
35 static void gpio_set_pull_en_sel(gpio_t gpio, enum pull_enable enable,
36  enum pull_select select)
37 {
38  void *reg = GPIO_TO_IOCFG_BASE(gpio.base) + gpio.offset;
39  int bit = gpio.bit;
40 
41  if (enable == GPIO_PULL_ENABLE) {
42  if (select == GPIO_PULL_DOWN)
43  clrbits32(reg + SEL_OFFSET, 1 << bit);
44  else
45  setbits32(reg + SEL_OFFSET, 1 << bit);
46  }
47 
48  if (enable == GPIO_PULL_ENABLE)
49  setbits32(reg + EN_OFFSET, 1 << bit);
50  else
51  clrbits32(reg + EN_OFFSET, 1 << bit);
52 }
53 
55  enum pull_select select)
56 {
57  if (gpio.flag)
58  gpio_set_pull_pupd(gpio, enable, select);
59  else
60  gpio_set_pull_en_sel(gpio, enable, select);
61 }
62 
63 enum {
64  EH_VAL = 0x0,
65  RSEL_VAL = 0x3,
66  EH_MASK = 0x7,
67  RSEL_MASK = 0x3,
68  SCL0_EH = 19,
69  SCL0_RSEL = 15,
70  SDA0_EH = 9,
71  SDA0_RSEL = 5,
72  SCL1_EH = 22,
73  SCL1_RSEL = 17,
74  SDA1_EH = 12,
75  SDA1_RSEL = 7,
76  SCL2_EH = 24,
77  SCL2_RSEL = 20,
78  SDA2_EH = 14,
79  SDA2_RSEL = 10,
80  SCL3_EH = 12,
81  SCL3_RSEL = 10,
82  SDA3_EH = 7,
83  SDA3_RSEL = 5,
84  SCL4_EH = 27,
85  SCL4_RSEL = 22,
86  SDA4_EH = 17,
87  SDA4_RSEL = 12,
88  SCL5_EH = 20,
89  SCL5_RSEL = 18,
90  SDA5_EH = 15,
91  SDA5_RSEL = 13,
92 };
93 
94 #define I2C_EH_RSL_MASK(name) \
95  (EH_MASK << name##_EH | RSEL_MASK << name##_RSEL)
96 
97 #define I2C_EH_RSL_VAL(name) \
98  (EH_VAL << name##_EH | RSEL_VAL << name##_RSEL)
99 
101 {
103  I2C_EH_RSL_MASK(SCL0) | I2C_EH_RSL_MASK(SDA0) |
104  I2C_EH_RSL_MASK(SCL1) | I2C_EH_RSL_MASK(SDA1),
105  I2C_EH_RSL_VAL(SCL0) | I2C_EH_RSL_VAL(SDA0) |
106  I2C_EH_RSL_VAL(SCL1) | I2C_EH_RSL_VAL(SDA1));
107 
109  I2C_EH_RSL_MASK(SCL2) | I2C_EH_RSL_MASK(SDA2) |
110  I2C_EH_RSL_MASK(SCL4) | I2C_EH_RSL_MASK(SDA4),
111  I2C_EH_RSL_VAL(SCL2) | I2C_EH_RSL_VAL(SDA2) |
112  I2C_EH_RSL_VAL(SCL4) | I2C_EH_RSL_VAL(SDA4));
113 
115  I2C_EH_RSL_MASK(SCL3) | I2C_EH_RSL_MASK(SDA3),
116  I2C_EH_RSL_VAL(SCL3) | I2C_EH_RSL_VAL(SDA3));
117 
119  I2C_EH_RSL_MASK(SCL5) | I2C_EH_RSL_MASK(SDA5),
120  I2C_EH_RSL_VAL(SCL5) | I2C_EH_RSL_VAL(SDA5));
121 }
122 
123 void gpio_set_spi_driving(unsigned int bus, enum spi_pad_mask pad_select,
124  unsigned int milliamps)
125 {
126  void *reg = NULL;
127  unsigned int reg_val = milliamps / 2 - 1, offset = 0;
128 
130  assert(milliamps >= 2 && milliamps <= 16);
131  assert(pad_select <= SPI_PAD1_MASK);
132 
133  switch (bus) {
134  case 0:
135  reg = (void *)(IOCFG_RB_BASE + GPIO_DRV1_OFFSET);
136  offset = 0;
137  break;
138  case 1:
139  if (pad_select == SPI_PAD0_MASK) {
140  reg = (void *)(IOCFG_LM_BASE + GPIO_DRV0_OFFSET);
141  offset = 0;
142  } else if (pad_select == SPI_PAD1_MASK) {
143  clrsetbits32((void *)IOCFG_RM_BASE +
144  GPIO_DRV0_OFFSET, 0xf | 0xf << 20,
145  reg_val | reg_val << 20);
146  clrsetbits32((void *)IOCFG_RM_BASE +
147  GPIO_DRV1_OFFSET, 0xf << 16,
148  reg_val << 16);
149  return;
150  }
151  break;
152  case 2:
154  0xf << 8 | 0xf << 12,
155  reg_val << 8 | reg_val << 12);
156  return;
157  case 3:
158  reg = (void *)(IOCFG_LM_BASE + GPIO_DRV0_OFFSET);
159  offset = 16;
160  break;
161  case 4:
162  reg = (void *)(IOCFG_LM_BASE + GPIO_DRV0_OFFSET);
163  offset = 12;
164  break;
165  case 5:
166  reg = (void *)(IOCFG_LM_BASE + GPIO_DRV0_OFFSET);
167  offset = 8;
168  break;
169  }
170 
171  clrsetbits32(reg, 0xf << offset, reg_val << offset);
172 }
#define assert(statement)
Definition: assert.h:74
static size_t offset
Definition: flashconsole.c:16
#define setbits32(addr, set)
Definition: mmio.h:21
#define clrsetbits32(addr, clear, set)
Definition: mmio.h:16
#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
#define SPI_BUS_NUMBER
Definition: spi.h:8
void gpio_set_spi_driving(unsigned int bus, enum spi_pad_mask pad_select, unsigned int milliamps)
Definition: gpio.c:123
#define I2C_EH_RSL_VAL(name)
Definition: gpio.c:97
#define I2C_EH_RSL_MASK(name)
Definition: gpio.c:94
void gpio_set_i2c_eh_rsel(void)
Definition: gpio.c:100
static void gpio_set_pull_pupd(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition: gpio.c:16
static void gpio_set_pull_en_sel(gpio_t gpio, enum pull_enable enable, enum pull_select select)
Definition: gpio.c:35
@ SEL_OFFSET
Definition: gpio.c:10
@ GPIO_DRV0_OFFSET
Definition: gpio.c:12
@ GPIO_DRV1_OFFSET
Definition: gpio.c:13
@ EN_OFFSET
Definition: gpio.c:9
@ EH_RSEL_OFFSET
Definition: gpio.c:11
@ SCL5_EH
Definition: gpio.c:88
@ SCL4_RSEL
Definition: gpio.c:85
@ SDA4_RSEL
Definition: gpio.c:87
@ SDA3_EH
Definition: gpio.c:82
@ SCL4_EH
Definition: gpio.c:84
@ SDA3_RSEL
Definition: gpio.c:83
@ SCL3_EH
Definition: gpio.c:80
@ SCL2_RSEL
Definition: gpio.c:77
@ SCL1_EH
Definition: gpio.c:72
@ EH_VAL
Definition: gpio.c:64
@ SDA2_RSEL
Definition: gpio.c:79
@ SDA0_EH
Definition: gpio.c:70
@ SCL5_RSEL
Definition: gpio.c:89
@ EH_MASK
Definition: gpio.c:66
@ SDA0_RSEL
Definition: gpio.c:71
@ SDA1_EH
Definition: gpio.c:74
@ SCL1_RSEL
Definition: gpio.c:73
@ SDA5_EH
Definition: gpio.c:90
@ SDA2_EH
Definition: gpio.c:78
@ RSEL_VAL
Definition: gpio.c:65
@ SCL2_EH
Definition: gpio.c:76
@ SDA4_EH
Definition: gpio.c:86
@ SDA1_RSEL
Definition: gpio.c:75
@ SCL3_RSEL
Definition: gpio.c:81
@ SCL0_RSEL
Definition: gpio.c:69
@ RSEL_MASK
Definition: gpio.c:67
@ SDA5_RSEL
Definition: gpio.c:91
@ SCL0_EH
Definition: gpio.c:68
@ IOCFG_LM_BASE
Definition: addressmap.h:43
@ IOCFG_RB_BASE
Definition: addressmap.h:40
@ IOCFG_BL_BASE
Definition: addressmap.h:44
@ IOCFG_RM_BASE
Definition: addressmap.h:39
@ IOCFG_LB_BASE
Definition: addressmap.h:42
#define GPIO_TO_IOCFG_BASE(x)
Definition: gpio.h:18
#define GPIO_PULL_DOWN
Definition: gpio.h:23
spi_pad_mask
Definition: spi_common.h:45
@ SPI_PAD1_MASK
Definition: spi_common.h:47
@ SPI_PAD0_MASK
Definition: spi_common.h:46
#define NULL
Definition: stddef.h:19
Definition: device.h:76
Definition: pinmux.c:36