coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
max98373.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpigen.h>
4 #include <acpi/acpi_device.h>
5 #include <acpi/acpi_soundwire.h>
6 #include <device/device.h>
7 #include <device/path.h>
8 #include <device/soundwire.h>
9 #include <mipi/ids.h>
10 #include <stdio.h>
11 
12 #include "chip.h"
13 
14 static struct soundwire_address max98373_address = {
16  .manufacturer_id = MIPI_MFG_ID_MAXIM,
17  .part_id = MIPI_DEV_ID_MAXIM_MAX98373,
18  .class = MIPI_CLASS_NONE
19 };
20 
21 static struct soundwire_slave max98373_slave = {
22  .wake_up_unavailable = false,
23  .test_mode_supported = false,
24  .clock_stop_mode1_supported = true,
25  .simplified_clockstopprepare_sm_supported = true,
26  .clockstopprepare_hard_reset_behavior = false,
27  .highPHY_capable = false,
28  .paging_supported = false,
29  .bank_delay_supported = false,
30  .port15_read_behavior = false,
31  .source_port_list = SOUNDWIRE_PORT(3),
32  .sink_port_list = SOUNDWIRE_PORT(1),
33 };
34 
36  /* Bus frequency must be 1/2/4/8 divider of supported input frequencies. */
38  .bus_frequency_configs = {
39  7680 * KHz, 3840 * KHz, 1920 * KHz, 960 * KHz, /* 7.68 MHz */
40  8400 * KHz, 4200 * KHz, 2100 * KHz, 1050 * KHz, /* 8.4 MHz */
41  9600 * KHz, 4800 * KHz, 2400 * KHz, 1200 * KHz, /* 9.6 MHz */
42  11289600, 5644800, 2822400, 1411200, /* 11.2896 MHz */
43  12000 * KHz, 6000 * KHz, 3000 * KHz, 1500 * KHz, /* 12 MHz */
44  12288 * KHz, 6144 * KHz, 3072 * KHz, 1536 * KHz, /* 12.288 MHz */
45  13000 * KHz, 6500 * KHz, 3250 * KHz /* 13 MHz (no /8) */
46  },
47  /* Support 16 KHz to 96 KHz sampling frequency */
48  .sampling_frequency_configs_count = 8,
49  .sampling_frequency_configs = {
50  16 * KHz,
51  22.05 * KHz,
52  24 * KHz,
53  32 * KHz,
54  44.1 * KHz,
55  48 * KHz,
56  88.2 * KHz,
57  96 * KHz,
58  },
59  .prepare_channel_behavior = CHANNEL_PREPARE_ANY_FREQUENCY
60 };
61 
62 static struct soundwire_dpn max98373_dp1 = {
64  .port_wordlength_configs = { 32 },
65  .data_port_type = FULL_DATA_PORT,
66  .max_grouping_supported = BLOCK_GROUP_COUNT_1,
67  .simplified_channelprepare_sm = false,
68  .imp_def_dpn_interrupts_supported = 0,
69  .min_channel_number = 1,
70  .max_channel_number = 2,
71  .modes_supported = MODE_ISOCHRONOUS | MODE_TX_CONTROLLED |
73  .block_packing_mode = true,
74  .port_audio_mode_count = 1,
75  .port_audio_mode_list = { 0 }
76 };
77 
78 static struct soundwire_dpn max98373_dp3 = {
80  .port_wordlength_configs = { 16 },
81  .data_port_type = FULL_DATA_PORT,
82  .max_grouping_supported = BLOCK_GROUP_COUNT_1,
83  .simplified_channelprepare_sm = false,
84  .imp_def_dpn_interrupts_supported = 0,
85  .min_channel_number = 1,
86  .max_channel_number = 2,
87  .modes_supported = MODE_ISOCHRONOUS | MODE_TX_CONTROLLED |
89  .block_packing_mode = true,
90  .port_audio_mode_count = 1,
91  .port_audio_mode_list = { 0 }
92 };
93 
94 static const struct soundwire_codec max98373_codec = {
96  .audio_mode = { &max98373_audio_mode },
97  .dpn = {
98  {
99  /* Data Input for Speaker Path */
100  .port = 1,
101  .sink = &max98373_dp1
102  },
103  {
104  /* Data Output for I/V Sense ADC Path */
105  .port = 3,
106  .source = &max98373_dp3,
107  }
108  }
109 };
110 
111 static void soundwire_max98373_fill_ssdt(const struct device *dev)
112 {
114  const char *scope = acpi_device_scope(dev);
115  struct acpi_dp *dsd;
116 
117  if (!scope)
118  return;
119 
120  acpigen_write_scope(scope);
122 
123  /* Set codec address IDs. */
126 
128  acpigen_write_name_string("_DDN", config->desc ? : dev->chip_ops->name);
130 
131  dsd = acpi_dp_new_table("_DSD");
133  acpi_dp_write(dsd);
134 
135  acpigen_pop_len(); /* Device */
136  acpigen_pop_len(); /* Scope */
137 }
138 
139 static const char *soundwire_max98373_acpi_name(const struct device *dev)
140 {
142  static char name[5];
143 
144  if (config->name)
145  return config->name;
146  snprintf(name, sizeof(name), "SW%1X%1X", dev->path.generic.id, dev->path.generic.subid);
147  return name;
148 }
149 
152  .set_resources = noop_set_resources,
153  .acpi_name = soundwire_max98373_acpi_name,
154  .acpi_fill_ssdt = soundwire_max98373_fill_ssdt,
155 };
156 
157 static void soundwire_max98373_enable(struct device *dev)
158 {
159  dev->ops = &soundwire_max98373_ops;
160 }
161 
163  CHIP_NAME("Maxim MAX98373 SoundWire Codec")
164  .enable_dev = soundwire_max98373_enable
165 };
void acpi_dp_write(struct acpi_dp *table)
Definition: device.c:898
int acpi_device_status(const struct device *dev)
Definition: device.c:193
const char * acpi_device_name(const struct device *dev)
Definition: device.c:49
struct acpi_dp * acpi_dp_new_table(const char *name)
Definition: device.c:930
const char * acpi_device_scope(const struct device *dev)
Definition: device.c:158
void soundwire_gen_codec(struct acpi_dp *dsd, const struct soundwire_codec *codec, soundwire_dp_prop_cb dp_prop_cb)
soundwire_gen_codec() - Generate SoundWire properties for codec device.
Definition: soundwire.c:338
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_STA(uint8_t status)
Definition: acpigen.c:783
void acpigen_write_ADR_soundwire_device(const struct soundwire_address *address)
acpigen_write_ADR_soundwire_device() - SoundWire ACPI Device Address Encoding.
Definition: acpigen.c:2144
void acpigen_write_device(const char *name)
Definition: acpigen.c:769
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
const char * name
Definition: mmu.c:92
#define KHz
Definition: helpers.h:79
static struct soundwire_dpn max98373_dp3
Definition: max98373.c:78
static const struct soundwire_codec max98373_codec
Definition: max98373.c:94
static struct soundwire_dpn max98373_dp1
Definition: max98373.c:62
static struct device_operations soundwire_max98373_ops
Definition: max98373.c:150
static void soundwire_max98373_enable(struct device *dev)
Definition: max98373.c:157
static struct soundwire_slave max98373_slave
Definition: max98373.c:21
static const char * soundwire_max98373_acpi_name(const struct device *dev)
Definition: max98373.c:139
static void soundwire_max98373_fill_ssdt(const struct device *dev)
Definition: max98373.c:111
struct chip_operations drivers_soundwire_max98373_ops
Definition: max98373.c:162
static struct soundwire_address max98373_address
Definition: max98373.c:14
static struct soundwire_audio_mode max98373_audio_mode
Definition: max98373.c:35
#define MIPI_MFG_ID_MAXIM
Definition: ids.h:26
#define MIPI_DEV_ID_MAXIM_MAX98373
Definition: ids.h:27
#define CHIP_NAME(X)
Definition: device.h:32
static void noop_read_resources(struct device *dev)
Standard device operations function pointers shims.
Definition: device.h:73
static void noop_set_resources(struct device *dev)
Definition: device.h:74
#define SOUNDWIRE_PORT(port)
Definition: soundwire.h:133
@ BLOCK_GROUP_COUNT_1
Definition: soundwire.h:265
@ MIPI_CLASS_NONE
Definition: soundwire.h:70
@ CHANNEL_PREPARE_ANY_FREQUENCY
Definition: soundwire.h:222
@ MODE_ISOCHRONOUS
Definition: soundwire.h:273
@ MODE_RX_CONTROLLED
Definition: soundwire.h:275
@ MODE_TX_CONTROLLED
Definition: soundwire.h:274
@ MODE_FULL_ASYNCHRONOUS
Definition: soundwire.h:276
@ FULL_DATA_PORT
Definition: soundwire.h:258
@ SOUNDWIRE_VERSION_1_1
Definition: soundwire.h:57
enum board_config config
Definition: memory.c:448
#define NULL
Definition: stddef.h:19
const char * name
Definition: device.h:29
void(* read_resources)(struct device *dev)
Definition: device.h:39
struct generic_path generic
Definition: path.h:125
Definition: device.h:107
struct chip_operations * chip_ops
Definition: device.h:144
struct device_path path
Definition: device.h:115
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST void * chip_info
Definition: device.h:164
unsigned int subid
Definition: path.h:97
unsigned int id
Definition: path.h:96
uint8_t link_id
Definition: soundwire.h:85
enum soundwire_version version
Definition: soundwire.h:84
uint8_t unique_id
Definition: soundwire.h:86
struct soundwire_audio_mode - Properties for each supported Audio Mode.
Definition: soundwire.h:243
size_t bus_frequency_configs_count
Definition: soundwire.h:246
struct soundwire_codec - Contains all configuration for a SoundWire codec slave device.
Definition: soundwire.h:419
struct soundwire_slave * slave
Definition: soundwire.h:420
struct soundwire_dpn - Configuration properties for SoundWire DPn Data Ports.
Definition: soundwire.h:318
size_t port_wordlength_configs_count
Definition: soundwire.h:321
struct soundwire_slave - SoundWire slave device properties.
Definition: soundwire.h:156
bool wake_up_unavailable
Definition: soundwire.h:157
int snprintf(char *buf, size_t size, const char *fmt,...)
Note: This file is only for POSIX compatibility, and is meant to be chain-included via string....
Definition: vsprintf.c:35