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_simple.h>
7 #include <device/device.h>
10 #define MAX98927_ACPI_NAME "MAXI"
11 #define MAX98927_ACPI_HID "MX98927"
13 static void max98927_fill_ssdt(const struct device
*dev
)
15 struct drivers_i2c_max98927_config
*config
= dev
->chip_info
;
16 const char *scope
= acpi_device_scope(dev
);
17 struct acpi_i2c i2c
= {
18 .address
= dev
->path
.i2c
.device
,
19 .mode_10bit
= dev
->path
.i2c
.mode_10bit
,
20 .speed
= config
->bus_speed
? : I2C_SPEED_FAST
,
29 acpigen_write_scope(scope
);
30 acpigen_write_device(acpi_device_name(dev
));
31 acpigen_write_name_string("_HID", MAX98927_ACPI_HID
);
32 acpigen_write_name_integer("_UID", config
->uid
);
34 acpigen_write_name_string("_DDN", config
->desc
);
35 acpigen_write_STA(acpi_device_status(dev
));
38 acpigen_write_name("_CRS");
39 acpigen_write_resourcetemplate_header();
40 acpi_device_write_i2c(&i2c
);
41 acpigen_write_resourcetemplate_footer();
43 /* Device Properties */
44 dp
= acpi_dp_new_table("_DSD");
46 acpi_dp_add_integer(dp
, "interleave_mode", config
->interleave_mode
);
47 acpi_dp_add_integer(dp
, "vmon-slot-no", config
->vmon_slot_no
);
48 acpi_dp_add_integer(dp
, "imon-slot-no", config
->imon_slot_no
);
52 acpigen_pop_len(); /* Device */
53 acpigen_pop_len(); /* Scope */
55 printk(BIOS_INFO
, "%s: %s address 0%xh\n", acpi_device_path(dev
),
56 dev
->chip_ops
->name
, dev
->path
.i2c
.device
);
59 static const char *max98927_acpi_name(const struct device
*dev
)
61 struct drivers_i2c_max98927_config
*config
= dev
->chip_info
;
66 return MAX98927_ACPI_NAME
;
69 static struct device_operations max98927_ops
= {
70 .read_resources
= noop_read_resources
,
71 .set_resources
= noop_set_resources
,
72 .acpi_name
= max98927_acpi_name
,
73 .acpi_fill_ssdt
= max98927_fill_ssdt
,
76 static void max98927_enable(struct device
*dev
)
78 struct drivers_i2c_max98927_config
*config
= dev
->chip_info
;
80 dev
->ops
= &max98927_ops
;
82 if (config
&& config
->desc
) {
83 dev
->name
= config
->desc
;
87 struct chip_operations drivers_i2c_max98927_ops
= {
88 .name
= "Maxim MAX98927 Codec",
89 .enable_dev
= max98927_enable