alc1015.c
1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #include <acpi/acpi_device.h> 4 #include <acpi/acpigen.h> 5 #include <console/console.h> 6 #include <device/device.h> 7 #include "chip.h" 8 9 static void alc1015_fill_ssdt(const struct device *dev) 10 { 11 struct drivers_generic_alc1015_config *config = dev->chip_info; 12 const char *path; 13 struct acpi_dp *dp; 14 15 if (!config) 16 return; 17 18 const char *scope = acpi_device_scope(dev); 19 const char *name = acpi_device_name(dev); 20 if (!scope || !name) 21 return; 22 23 /* Device */ 24 acpigen_write_scope(scope); 25 acpigen_write_device(name); 26 27 if (config->hid) 28 acpigen_write_name_string("_HID", config->hid); 29 else 30 acpigen_write_name_string("_HID", "RTL1015"); 31 acpigen_write_name_integer("_UID", 0); 32 acpigen_write_name_string("_DDN", dev->chip_ops->name); 33 acpigen_write_STA(acpi_device_status(dev)); 34 35 /* Resources */ 36 acpigen_write_name("_CRS"); 37 acpigen_write_resourcetemplate_header(); 38 acpi_device_write_gpio(&config->sdb); 39 acpigen_write_resourcetemplate_footer(); 40 41 /* _DSD for devicetree properties */ 42 /* This points to the first pin in the first gpio entry in _CRS */ 43 path = acpi_device_path(dev); 44 dp = acpi_dp_new_table("_DSD"); 45 acpi_dp_add_gpio(dp, "sdb-gpios", path, 0, 0, config->sdb.active_low); 46 acpi_dp_write(dp); 47 48 acpigen_pop_len(); /* Device */ 49 acpigen_pop_len(); /* Scope */ 50 51 printk(BIOS_INFO, "%s: %s\n", path, dev->chip_ops->name); 52 } 53 54 static const char *alc1015_acpi_name(const struct device *dev) 55 { 56 return "ALCP"; 57 } 58 59 static struct device_operations alc1015_ops = { 60 .read_resources = noop_read_resources, 61 .set_resources = noop_set_resources, 62 .acpi_name = alc1015_acpi_name, 63 .acpi_fill_ssdt = alc1015_fill_ssdt, 64 }; 65 66 static void alc1015_enable(struct device *dev) 67 { 68 dev->ops = &alc1015_ops; 69 } 70 71 struct chip_operations drivers_generic_alc1015_ops = { 72 .name = "ASoC RT1015P Amplifier driver", 73 .enable_dev = alc1015_enable 74 };