coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
alc1308.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 alc1308_address = {
16  .manufacturer_id = MIPI_MFG_ID_REALTEK,
17  .part_id = MIPI_DEV_ID_REALTEK_ALC1308,
18  .class = MIPI_CLASS_NONE
19 };
20 
21 static struct soundwire_slave alc1308_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(2) | SOUNDWIRE_PORT(4),
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  9600 * KHz, 4800 * KHz, 2400 * KHz, 1200 * KHz, /* 9.6 MHz */
40  12000 * KHz, 6000 * KHz, 3000 * KHz, 1500 * KHz, /* 12 MHz */
41  12288 * KHz, 6144 * KHz, 3072 * KHz, 1536 * KHz /* 12.288 MHz */
42  },
43  /* Support 16 KHz to 96 KHz sampling frequency */
44  .sampling_frequency_configs_count = 8,
45  .sampling_frequency_configs = {
46  16 * KHz,
47  22.05 * KHz,
48  24 * KHz,
49  32 * KHz,
50  44.1 * KHz,
51  48 * KHz,
52  88.2 * KHz,
53  96 * KHz,
54  },
55  .prepare_channel_behavior = CHANNEL_PREPARE_ANY_FREQUENCY
56 };
57 
58 static struct soundwire_dpn alc1308_dp1 = {
60  .port_wordlength_configs = { 32 },
61  .data_port_type = FULL_DATA_PORT,
62  .max_grouping_supported = BLOCK_GROUP_COUNT_1,
63  .simplified_channelprepare_sm = false,
64  .imp_def_dpn_interrupts_supported = 0,
65  .min_channel_number = 1,
66  .max_channel_number = 2,
67  .modes_supported = MODE_ISOCHRONOUS | MODE_TX_CONTROLLED |
69  .block_packing_mode = true,
70  .port_audio_mode_count = 1,
71  .port_audio_mode_list = { 0 }
72 };
73 
74 static const struct soundwire_codec alc1308_codec = {
75  .slave = &alc1308_slave,
76  .audio_mode = { &alc1308_audio_mode },
77  .dpn = {
78  {
79  /* Data Input for Speaker Path */
80  .port = 1,
81  .sink = &alc1308_dp1
82  },
83  {
84  /* Data out for I.V sensing */
85  .port = 2,
86  .source = &alc1308_dp1
87  },
88  {
89  /* Data out for I.V sensing */
90  .port = 4,
91  .source = &alc1308_dp1
92  }
93  }
94 
95 };
96 
97 static void soundwire_alc1308_fill_ssdt(const struct device *dev)
98 {
100  const char *scope = acpi_device_scope(dev);
101  struct acpi_dp *dsd;
102 
103  if (!dev->enabled || !scope)
104  return;
105 
106  acpigen_write_scope(scope);
108 
109  /* Set codec address IDs. */
112 
114  acpigen_write_name_string("_DDN", config->desc ? : dev->chip_ops->name);
116 
117  dsd = acpi_dp_new_table("_DSD");
119  acpi_dp_write(dsd);
120 
121  acpigen_pop_len(); /* Device */
122  acpigen_pop_len(); /* Scope */
123 }
124 
125 static const char *soundwire_alc1308_acpi_name(const struct device *dev)
126 {
128  static char name[5];
129 
130  if (config->name)
131  return config->name;
132  snprintf(name, sizeof(name), "SW%1X%1X", dev->path.generic.id, dev->path.generic.subid);
133  return name;
134 }
135 
138  .set_resources = noop_set_resources,
139  .acpi_name = soundwire_alc1308_acpi_name,
140  .acpi_fill_ssdt = soundwire_alc1308_fill_ssdt,
141 };
142 
143 static void soundwire_alc1308_enable(struct device *dev)
144 {
145  dev->ops = &soundwire_alc1308_ops;
146 }
147 
149  CHIP_NAME("Realtek ALC1308 SoundWire Codec")
150  .enable_dev = soundwire_alc1308_enable
151 };
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
struct chip_operations drivers_soundwire_alc1308_ops
Definition: alc1308.c:148
static const struct soundwire_codec alc1308_codec
Definition: alc1308.c:74
static void soundwire_alc1308_fill_ssdt(const struct device *dev)
Definition: alc1308.c:97
static struct soundwire_slave alc1308_slave
Definition: alc1308.c:21
static const char * soundwire_alc1308_acpi_name(const struct device *dev)
Definition: alc1308.c:125
static struct soundwire_address alc1308_address
Definition: alc1308.c:14
static void soundwire_alc1308_enable(struct device *dev)
Definition: alc1308.c:143
static struct device_operations soundwire_alc1308_ops
Definition: alc1308.c:136
static struct soundwire_dpn alc1308_dp1
Definition: alc1308.c:58
static struct soundwire_audio_mode alc1308_audio_mode
Definition: alc1308.c:35
const char * name
Definition: mmu.c:92
#define KHz
Definition: helpers.h:79
#define MIPI_MFG_ID_REALTEK
Definition: ids.h:21
#define MIPI_DEV_ID_REALTEK_ALC1308
Definition: ids.h:24
#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 enabled
Definition: device.h:122
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