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 <console/console.h>
5 #include <device/device.h>
6 #include <gpio.h>
7 #include <soc/nhlt.h>
8 #include "ec.h"
9 #include "gpio.h"
10 
11 static const char *oem_id_maxim = "INTEL";
12 static const char *oem_table_id_maxim = "SCRDMAX";
13 
14 static void mainboard_init(struct device *dev)
15 {
17 }
18 
20 {
21  int audio_db_sel = gpio_get(AUDIO_DB_ID);
22 
23  return audio_db_sel;
24 }
25 
26 static unsigned long mainboard_write_acpi_tables(
27  const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
28 {
29  uintptr_t start_addr;
30  uintptr_t end_addr;
31  struct nhlt *nhlt;
32  const char *oem_id = NULL;
33  const char *oem_table_id = NULL;
34 
35  start_addr = current;
36 
37  nhlt = nhlt_init();
38 
39  if (nhlt == NULL)
40  return start_addr;
41 
42  /* 2 Channel DMIC array. */
44  printk(BIOS_ERR, "Couldn't add 2CH DMIC array.\n");
45 
46  /* 4 Channel DMIC array. */
48  printk(BIOS_ERR, "Couldn't add 4CH DMIC arrays.\n");
49 
50  if (select_audio_codec()) {
51  /* ADI Smart Amps for left and right. */
53  printk(BIOS_ERR, "Couldn't add ssm4567.\n");
54  } else {
55  /* MAXIM Smart Amps for left and right. */
57  printk(BIOS_ERR, "Couldn't add max98357.\n");
58 
59  oem_id = oem_id_maxim;
60  oem_table_id = oem_table_id_maxim;
61  }
62 
63  /* NAU88l25 Headset codec. */
65  printk(BIOS_ERR, "Couldn't add headset codec.\n");
66 
67  end_addr = nhlt_soc_serialize_oem_overrides(nhlt, start_addr,
68  oem_id, oem_table_id, 0);
69 
70  if (end_addr != start_addr)
71  acpi_add_table(rsdp, (void *)start_addr);
72 
73  return end_addr;
74 }
75 
76 /*
77  * mainboard_enable is executed as first thing after
78  * enumerate_buses().
79  */
80 static void mainboard_enable(struct device *dev)
81 {
82  dev->ops->init = mainboard_init;
83  dev->ops->write_acpi_tables = mainboard_write_acpi_tables;
84 }
85 
88 };
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 printk(level,...)
Definition: stdlib.h:16
void mainboard_ec_init(void)
Definition: ec.c:8
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
static void mainboard_init(struct device *dev)
Definition: mainboard.c:14
static const char * oem_table_id_maxim
Definition: mainboard.c:12
static unsigned long mainboard_write_acpi_tables(const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
Definition: mainboard.c:26
static uint8_t select_audio_codec(void)
Definition: mainboard.c:19
static const char * oem_id_maxim
Definition: mainboard.c:11
static void mainboard_enable(struct device *dev)
Definition: mainboard.c:80
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define AUDIO_DB_ID
Definition: gpio.h:45
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(* enable_dev)(struct device *dev)
Definition: device.h:24
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