1 /* SPDX-License-Identifier: GPL-2.0-only */
3 #include <acpi/acpi_device.h>
4 #include <acpi/acpigen.h>
5 #include <console/console.h>
6 #include <device/i2c.h>
7 #include <device/device.h>
10 #include <vendorcode/google/dsm_calib.h>
13 #define RT1011_ACPI_HID "10EC1011"
15 #define RT1011_DP_INT(key, val) acpi_dp_add_integer(dp, "realtek," key, (val))
17 static void rt1011_fill_ssdt(const struct device
*dev
)
19 struct drivers_i2c_rt1011_config
*config
= dev
->chip_info
;
20 const char *scope
= acpi_device_scope(dev
);
21 struct acpi_i2c i2c
= {
22 .address
= dev
->path
.i2c
.device
,
23 .mode_10bit
= dev
->path
.i2c
.mode_10bit
,
24 .speed
= I2C_SPEED_FAST
,
28 uint64_t r0_value
, temp_value
;
34 acpigen_write_scope(scope
);
35 acpigen_write_device(acpi_device_name(dev
));
36 acpigen_write_name_string("_HID", RT1011_ACPI_HID
);
37 acpigen_write_name_integer("_UID", config
->uid
);
38 acpigen_write_name_string("_DDN", config
->desc
);
39 acpigen_write_STA(acpi_device_status(dev
));
42 acpigen_write_name("_CRS");
43 acpigen_write_resourcetemplate_header();
44 acpi_device_write_i2c(&i2c
);
45 acpigen_write_resourcetemplate_footer();
47 /* Device Properties */
48 if (CONFIG(GOOGLE_DSM_CALIB
)) {
49 if (get_dsm_calibration_from_key(config
->r0_calib_key
, &r0_value
)
50 || get_dsm_calibration_from_key(config
->temperature_calib_key
,
53 "Failed to get dsm_calib parameters from VPD"
54 " with key %s and %s\n",
55 config
->r0_calib_key
, config
->temperature_calib_key
);
57 dp
= acpi_dp_new_table("_DSD");
58 RT1011_DP_INT("r0_calib", r0_value
);
59 RT1011_DP_INT("temperature_calib", temp_value
);
61 printk(BIOS_INFO
, "set dsm_calib properties\n");
65 acpigen_pop_len(); /* Device */
66 acpigen_pop_len(); /* Scope */
68 printk(BIOS_INFO
, "%s: %s address 0%xh\n", acpi_device_path(dev
), dev
->chip_ops
->name
,
69 dev
->path
.i2c
.device
);
72 static const char *rt1011_acpi_name(const struct device
*dev
)
74 struct drivers_i2c_rt1011_config
*config
= dev
->chip_info
;
80 snprintf(name
, sizeof(name
), "D%03.3X", dev
->path
.i2c
.device
);
84 static struct device_operations rt1011_ops
= {
85 .read_resources
= noop_read_resources
,
86 .set_resources
= noop_set_resources
,
87 .acpi_name
= rt1011_acpi_name
,
88 .acpi_fill_ssdt
= rt1011_fill_ssdt
,
91 static void rt1011_enable(struct device
*dev
)
93 struct drivers_i2c_rt1011_config
*config
= dev
->chip_info
;
98 dev
->ops
= &rt1011_ops
;
100 /* Name the device as per description provided in devicetree */
102 dev
->name
= config
->desc
;
105 struct chip_operations drivers_i2c_rt1011_ops
= {
106 .name
= "Realtek RT1011 Codec",
107 .enable_dev
= rt1011_enable