coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
soundwire.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 <commonlib/helpers.h>
7 #include <device/device.h>
8 #include <device/path.h>
9 #include <device/soundwire.h>
10 #include <stdbool.h>
11 
12 #include "soundwire.h"
13 #include "chip.h"
14 
16 {
17  return -1;
18 }
19 
20 static bool link_enabled(const struct device *dev, unsigned int link)
21 {
22  struct device *child;
23 
24  for (child = dev->link_list->children; child; child = child->sibling) {
25  if (child->enabled && child->path.type == DEVICE_PATH_GENERIC &&
26  child->path.generic.id == link)
27  return true;
28  }
29  return false;
30 }
31 
32 static void intel_soundwire_link_prop_cb(struct acpi_dp *dsd, unsigned int id,
33  const struct soundwire_controller *controller)
34 {
36  container_of(controller, struct intel_soundwire_controller, sdw);
37  unsigned int quirk_mask = intel_controller->quirk_mask;
38 
39  /* Disable link if no are children enabled on this link device. */
42 
43  acpi_dp_add_integer(dsd, "intel-sdw-ip-clock", intel_controller->ip_clock);
44  acpi_dp_add_integer(dsd, "intel-quirk-mask", quirk_mask);
45 }
46 
47 static void intel_soundwire_fill_ssdt(const struct device *dev)
48 {
49  struct acpi_dp *dsd;
50  struct intel_soundwire_controller *controller;
51  const char *scope = acpi_device_scope(dev);
52 
53  if (!scope)
54  return;
55 
56  if (soc_fill_soundwire_controller(&controller) < 0 || !controller)
57  return;
58 
59  /* Provide device pointer for link property callback function. */
60  controller->dev = dev;
61 
62  acpigen_write_scope(scope);
65  acpigen_write_name_integer("_ADR", controller->acpi_address);
67 
69 
70  dsd = acpi_dp_new_table("_DSD");
72  acpi_dp_write(dsd);
73 
74  acpigen_pop_len(); /* Device */
75  acpigen_pop_len(); /* Scope */
76 }
77 
78 static const char *intel_soundwire_acpi_name(const struct device *dev)
79 {
80  return "SNDW";
81 }
82 
83 static struct device_operations intel_soundwire_ops = {
85  .set_resources = noop_set_resources,
86  .acpi_name = intel_soundwire_acpi_name,
87  .acpi_fill_ssdt = intel_soundwire_fill_ssdt,
88  .scan_bus = scan_static_bus,
89 };
90 
91 static void intel_soundwire_enable(struct device *dev)
92 {
93  dev->ops = &intel_soundwire_ops;
94 }
95 
97  CHIP_NAME("Intel SoundWire Controller")
98  .enable_dev = intel_soundwire_enable
99 };
struct acpi_dp * acpi_dp_add_integer(struct acpi_dp *dp, const char *name, uint64_t value)
Definition: device.c:977
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_controller(struct acpi_dp *dsd, const struct soundwire_controller *prop, soundwire_link_prop_cb link_prop_cb)
soundwire_gen_controller() - Generate SoundWire properties for master links.
Definition: soundwire.c:318
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_name_integer(const char *name, uint64_t val)
Definition: acpigen.c:170
void acpigen_write_STA(uint8_t status)
Definition: acpigen.c:783
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
static bool link_enabled(const struct device *dev, unsigned int link)
Definition: soundwire.c:20
static const char * intel_soundwire_acpi_name(const struct device *dev)
Definition: soundwire.c:78
static void intel_soundwire_fill_ssdt(const struct device *dev)
Definition: soundwire.c:47
static void intel_soundwire_link_prop_cb(struct acpi_dp *dsd, unsigned int id, const struct soundwire_controller *controller)
Definition: soundwire.c:32
static struct device_operations intel_soundwire_ops
Definition: soundwire.c:83
struct chip_operations drivers_intel_soundwire_ops
Definition: soundwire.c:96
static void intel_soundwire_enable(struct device *dev)
Definition: soundwire.c:91
__weak int soc_fill_soundwire_controller(struct intel_soundwire_controller **controller)
soc_fill_soundwire_controller() - Get SoundWire controller properties from the SoC.
Definition: soundwire.c:15
@ INTEL_SOUNDWIRE_QUIRK_BUS_DISABLE
Definition: soundwire.h:16
#define ACPI_HID_CONTAINER
Definition: acpi.h:151
#define container_of(ptr, type, member)
container_of - cast a member of a structure out to the containing structure
Definition: helpers.h:33
#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
@ DEVICE_PATH_GENERIC
Definition: path.h:18
void scan_static_bus(struct device *bus)
Definition: root_device.c:89
const struct smm_save_state_ops *legacy_ops __weak
Definition: save_state.c:8
static struct intel_soundwire_controller intel_controller
Definition: soundwire.c:36
DEVTREE_CONST struct device * children
Definition: device.h:79
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
enum device_path_type type
Definition: path.h:114
Definition: device.h:107
struct chip_operations * chip_ops
Definition: device.h:144
DEVTREE_CONST struct device * sibling
Definition: device.h:111
struct device_path path
Definition: device.h:115
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST struct bus * link_list
Definition: device.h:139
unsigned int enabled
Definition: device.h:122
unsigned int id
Definition: path.h:96
struct intel_soundwire_controller - SoundWire controller configuration for Intel SoC.
Definition: soundwire.h:28
const struct device * dev
Definition: soundwire.h:29
struct soundwire_controller sdw
Definition: soundwire.h:33
unsigned int quirk_mask
Definition: soundwire.h:32
struct soundwire_controller - SoundWire controller properties.
Definition: soundwire.h:127