coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
mainboard.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi.h>
4 #include <baseboard/variant.h>
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <gpio.h>
8 #include <soc/nhlt.h>
9 #include <variant/gpio.h>
10 #include "ec.h"
11 
12 static const char *oem_id_maxim = "INTEL";
13 static const char *oem_table_id_maxim = "SCRDMAX";
14 
15 static void mainboard_init(struct device *dev)
16 {
18 }
19 
21 {
22 #ifdef AUDIO_DB_ID
23  return gpio_get(AUDIO_DB_ID);
24 #else
25  return 1;
26 #endif
27 }
28 
30 {
31 #ifdef AUDIO_DB_ID
32  return gpio_get(AUDIO_DB_ID) ? 0 : 1;
33 #else
34  return 1;
35 #endif
36 }
37 
38 static unsigned long mainboard_write_acpi_tables(
39  const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
40 {
41  uintptr_t start_addr;
42  uintptr_t end_addr;
43  struct nhlt *nhlt;
44  const char *oem_id = NULL;
45  const char *oem_table_id = NULL;
46 
47  start_addr = current;
48 
49  nhlt = nhlt_init();
50 
51  if (nhlt == NULL)
52  return start_addr;
53 
54  /* 2 Channel DMIC array. */
56  printk(BIOS_ERR, "Couldn't add 2CH DMIC array.\n");
57 
58  /* 4 Channel DMIC array. */
59  if (CONFIG(NHLT_DMIC_4CH))
61  printk(BIOS_ERR, "Couldn't add 4CH DMIC arrays.\n");
62 
63  /* ADI Smart Amps for left and right. */
64  if (CONFIG(NHLT_SSM4567) && adi_codec_enable())
66  printk(BIOS_ERR, "Couldn't add ssm4567.\n");
67 
68  /* MAXIM Smart Amps for left and right. */
69  if (CONFIG(NHLT_MAX98357) && max_codec_enable()) {
71  printk(BIOS_ERR, "Couldn't add max98357.\n");
72 
73  oem_id = oem_id_maxim;
74  oem_table_id = oem_table_id_maxim;
75  }
76 
77  /* NAU88l25 Headset codec. */
79  printk(BIOS_ERR, "Couldn't add headset codec.\n");
80 
81  end_addr = nhlt_soc_serialize_oem_overrides(nhlt, start_addr,
82  oem_id, oem_table_id, 0);
83 
84  if (end_addr != start_addr)
85  acpi_add_table(rsdp, (void *)start_addr);
86 
87  return end_addr;
88 }
89 
90 /*
91  * mainboard_enable is executed as first thing after
92  * enumerate_buses().
93  */
94 static void mainboard_enable(struct device *dev)
95 {
96  dev->ops->init = mainboard_init;
97  dev->ops->write_acpi_tables = mainboard_write_acpi_tables;
98 }
99 
100 static void mainboard_chip_init(void *chip_info)
101 {
102  /* Configure pads prior to SiliconInit() in case there's any
103  * dependencies during hardware initialization. */
105 }
106 
109  .enable_dev = mainboard_enable,
110 };
struct chip_operations mainboard_ops
Definition: mainboard.c:19
void acpi_add_table(acpi_rsdp_t *rsdp, void *table)
Add an ACPI table to the RSDT (and XSDT) structure, recalculate length and checksum.
Definition: acpi.c:49
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
@ CONFIG
Definition: dsi_common.h:201
void mainboard_ec_init(void)
Definition: ec.c:8
static uint8_t adi_codec_enable(void)
Definition: mainboard.c:20
static void mainboard_init(struct device *dev)
Definition: mainboard.c:15
static const char * oem_table_id_maxim
Definition: mainboard.c:13
static unsigned long mainboard_write_acpi_tables(const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
Definition: mainboard.c:38
static uint8_t max_codec_enable(void)
Definition: mainboard.c:29
static void mainboard_chip_init(void *chip_info)
Definition: mainboard.c:100
static const char * oem_id_maxim
Definition: mainboard.c:12
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:94
int gpio_get(gpio_t gpio)
Definition: gpio.c:166
struct nhlt * nhlt_init(void)
Definition: nhlt.c:23
uintptr_t nhlt_soc_serialize_oem_overrides(struct nhlt *nhlt, uintptr_t acpi_addr, const char *oem_id, const char *oem_table_id, uint32_t oem_revision)
Definition: nhlt.c:12
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
static const struct pad_config gpio_table[]
Definition: gpio.h:24
#define AUDIO_DB_ID
Definition: gpio.h:45
void gpio_configure_pads(const struct soc_amd_gpio *gpio_list_ptr, size_t size)
program a particular set of GPIO
Definition: gpio.c:307
int nhlt_soc_add_dmic_array(struct nhlt *nhlt, int num_channels)
Definition: nhlt.c:168
@ AUDIO_LINK_SSP0
Definition: nhlt.h:15
@ AUDIO_LINK_SSP1
Definition: nhlt.h:16
int nhlt_soc_add_max98357(struct nhlt *nhlt, int hwlink)
Definition: nhlt.c:239
int nhlt_soc_add_ssm4567(struct nhlt *nhlt, int hwlink)
Definition: ssm4567.c:52
int nhlt_soc_add_nau88l25(struct nhlt *nhlt, int hwlink)
Definition: nau88l25.c:53
#define NULL
Definition: stddef.h:19
unsigned long uintptr_t
Definition: stdint.h:21
unsigned char uint8_t
Definition: stdint.h:8
Definition: acpi.h:82
void(* init)(void *chip_info)
Definition: device.h:25
void(* init)(struct device *dev)
Definition: device.h:42
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
Definition: nhlt.h:287