coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
kempld_gpio.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <stdint.h>
4 #include <arch/io.h>
5 
6 #include "chip.h"
7 #include "kempld.h"
8 #include "kempld_internal.h"
9 
13 };
14 
15 static void kempld_gpio_value_set(u8 pin_num, u8 value)
16 {
17  const u8 mask = KEMPLD_GPIO_MASK(pin_num);
18  u8 reg_val = kempld_read8(KEMPLD_GPIO_LVL(pin_num));
19  reg_val = value ? reg_val | mask : reg_val & ~mask;
20  kempld_write8(KEMPLD_GPIO_LVL(pin_num), reg_val);
21 }
22 
23 static void kempld_gpio_direction_set(u8 pin_num, enum kempld_gpio_direction dir)
24 {
25  const u8 mask = KEMPLD_GPIO_MASK(pin_num);
26  u8 reg_val = kempld_read8(KEMPLD_GPIO_DIR(pin_num));
27  reg_val = dir == KEMPLD_GPIO_DIR_OUT ? reg_val | mask : reg_val & ~mask;
28  kempld_write8(KEMPLD_GPIO_DIR(pin_num), reg_val);
29 }
30 
31 static int kempld_configure_gpio(u8 pin_num, enum kempld_gpio_mode mode)
32 {
33  if (kempld_get_mutex(100) < 0)
34  return -1;
35 
36  switch (mode) {
38  break;
39 
40  case KEMPLD_GPIO_INPUT:
42  break;
43 
45  kempld_gpio_value_set(pin_num, 0);
47  break;
48 
50  kempld_gpio_value_set(pin_num, 1);
52  break;
53  }
54 
56  return 0;
57 }
58 
60 {
61  const struct ec_kontron_kempld_config *config = dev->chip_info;
62 
63  if (!config)
64  return -1;
65 
66  for (u8 i = 0; i < KEMPLD_NUM_GPIOS; ++i) {
67  if (kempld_configure_gpio(i, config->gpio[i]) < 0)
68  return -1;
69  }
70  return 0;
71 }
pte_t value
Definition: mmu.c:91
void kempld_write8(const uint8_t addr, const uint8_t data)
Definition: early_kempld.c:11
int kempld_get_mutex(int timeout_ms)
Definition: early_kempld.c:23
void kempld_release_mutex(void)
Definition: early_kempld.c:30
uint8_t kempld_read8(const uint8_t addr)
Definition: early_kempld.c:17
kempld_gpio_mode
Definition: chip.h:9
@ KEMPLD_GPIO_DEFAULT
Definition: chip.h:10
@ KEMPLD_GPIO_INPUT
Definition: chip.h:11
@ KEMPLD_GPIO_OUTPUT_HIGH
Definition: chip.h:13
@ KEMPLD_GPIO_OUTPUT_LOW
Definition: chip.h:12
#define KEMPLD_NUM_GPIOS
Definition: chip.h:7
static void kempld_gpio_direction_set(u8 pin_num, enum kempld_gpio_direction dir)
Definition: kempld_gpio.c:23
static void kempld_gpio_value_set(u8 pin_num, u8 value)
Definition: kempld_gpio.c:15
int kempld_gpio_pads_config(struct device *dev)
Definition: kempld_gpio.c:59
kempld_gpio_direction
Definition: kempld_gpio.c:10
@ KEMPLD_GPIO_DIR_OUT
Definition: kempld_gpio.c:12
@ KEMPLD_GPIO_DIR_IN
Definition: kempld_gpio.c:11
static int kempld_configure_gpio(u8 pin_num, enum kempld_gpio_mode mode)
Definition: kempld_gpio.c:31
#define KEMPLD_GPIO_MASK(pin_num)
#define KEMPLD_GPIO_DIR(pin_num)
#define KEMPLD_GPIO_LVL(pin_num)
enum board_config config
Definition: memory.c:448
static const int mask[4]
Definition: gpio.c:308
uint8_t u8
Definition: stdint.h:45
Definition: device.h:107
DEVTREE_CONST void * chip_info
Definition: device.h:164