blob: 19d6a724bf239e574754997bff7c34a528ba6fc3 [file] [log] [blame]
Angel Pons60ec3652020-04-03 01:22:13 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Lee Leahyc4210412015-06-29 11:37:56 -07002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Naresh G Solanki06b00982015-12-02 16:21:20 +05304#include <console/console.h>
Lee Leahyc4210412015-06-29 11:37:56 -07005#include <device/device.h>
Naresh G Solanki06b00982015-12-02 16:21:20 +05306#include <gpio.h>
Naresh G Solanki06b00982015-12-02 16:21:20 +05307#include <soc/nhlt.h>
pchandridfdd33e2015-08-24 13:44:19 -07008#include "ec.h"
Naresh G Solanki06b00982015-12-02 16:21:20 +05309#include "gpio.h"
pchandridfdd33e2015-08-24 13:44:19 -070010
Fang, Yang A8a0d2742016-01-28 17:09:17 -080011static const char *oem_id_maxim = "INTEL";
12static const char *oem_table_id_maxim = "SCRDMAX";
13
Elyes HAOUAS4182c802018-05-04 20:46:54 +020014static void mainboard_init(struct device *dev)
pchandridfdd33e2015-08-24 13:44:19 -070015{
16 mainboard_ec_init();
17}
18
Naresh G Solanki06b00982015-12-02 16:21:20 +053019static uint8_t select_audio_codec(void)
20{
21 int audio_db_sel = gpio_get(AUDIO_DB_ID);
22
23 return audio_db_sel;
24}
25
26static unsigned long mainboard_write_acpi_tables(
Furquan Shaikh0f007d82020-04-24 06:41:18 -070027 const struct device *device, unsigned long current, acpi_rsdp_t *rsdp)
Naresh G Solanki06b00982015-12-02 16:21:20 +053028{
29 uintptr_t start_addr;
30 uintptr_t end_addr;
31 struct nhlt *nhlt;
Fang, Yang A8a0d2742016-01-28 17:09:17 -080032 const char *oem_id = NULL;
33 const char *oem_table_id = NULL;
Naresh G Solanki06b00982015-12-02 16:21:20 +053034
35 start_addr = current;
36
37 nhlt = nhlt_init();
38
39 if (nhlt == NULL)
40 return start_addr;
41
42 /* 2 Channel DMIC array. */
43 if (nhlt_soc_add_dmic_array(nhlt, 2))
44 printk(BIOS_ERR, "Couldn't add 2CH DMIC array.\n");
45
Naresh G Solanki06b00982015-12-02 16:21:20 +053046 /* 4 Channel DMIC array. */
47 if (nhlt_soc_add_dmic_array(nhlt, 4))
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. */
52 if (nhlt_soc_add_ssm4567(nhlt, AUDIO_LINK_SSP0))
53 printk(BIOS_ERR, "Couldn't add ssm4567.\n");
54 } else {
55 /* MAXIM Smart Amps for left and right. */
56 if (nhlt_soc_add_max98357(nhlt, AUDIO_LINK_SSP0))
57 printk(BIOS_ERR, "Couldn't add max98357.\n");
Fang, Yang A8a0d2742016-01-28 17:09:17 -080058
59 oem_id = oem_id_maxim;
60 oem_table_id = oem_table_id_maxim;
Naresh G Solanki06b00982015-12-02 16:21:20 +053061 }
62
63 /* NAU88l25 Headset codec. */
64 if (nhlt_soc_add_nau88l25(nhlt, AUDIO_LINK_SSP1))
65 printk(BIOS_ERR, "Couldn't add headset codec.\n");
66
Fang, Yang A8a0d2742016-01-28 17:09:17 -080067 end_addr = nhlt_soc_serialize_oem_overrides(nhlt, start_addr,
Aaron Durbinb4afe3c2016-11-29 23:14:25 -060068 oem_id, oem_table_id, 0);
Naresh G Solanki06b00982015-12-02 16:21:20 +053069
70 if (end_addr != start_addr)
71 acpi_add_table(rsdp, (void *)start_addr);
72
73 return end_addr;
74}
75
Elyes HAOUAS4182c802018-05-04 20:46:54 +020076static void mainboard_enable(struct device *dev)
pchandridfdd33e2015-08-24 13:44:19 -070077{
78 dev->ops->init = mainboard_init;
Naresh G Solanki06b00982015-12-02 16:21:20 +053079 dev->ops->write_acpi_tables = mainboard_write_acpi_tables;
pchandridfdd33e2015-08-24 13:44:19 -070080}
Lee Leahyc4210412015-06-29 11:37:56 -070081
82struct chip_operations mainboard_ops = {
pchandridfdd33e2015-08-24 13:44:19 -070083 .enable_dev = mainboard_enable,
Lee Leahyc4210412015-06-29 11:37:56 -070084};