blob: be7fd2033f00ec29a10fb3c9eec11fde4b76635e [file] [log] [blame]
Angel Pons0612b272020-04-05 15:46:56 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2/* This file is part of the coreboot project. */
Bora Guvendik94ee3282017-05-04 13:06:43 -07003
Furquan Shaikh76cedd22020-05-02 10:24:23 -07004#include <acpi/acpigen.h>
Bora Guvendik94ee3282017-05-04 13:06:43 -07005#include <device/pci.h>
6#include <device/pci_ids.h>
7#include <intelblocks/sd.h>
8
Julius Wernercd49cce2019-03-05 16:53:33 -08009#if CONFIG(HAVE_ACPI_TABLES)
Furquan Shaikh7536a392020-04-24 21:59:21 -070010static void sd_fill_ssdt(const struct device *dev)
Bora Guvendik94ee3282017-05-04 13:06:43 -070011{
12 const char *path;
13 struct acpi_gpio default_gpio = { 0 };
14 struct acpi_dp *dp;
15
16 if (!dev->enabled)
17 return;
18
19 if (sd_fill_soc_gpio_info(&default_gpio, dev) != 0)
20 return;
21
22 /* Use device path as the Scope for the SSDT */
23 path = acpi_device_path(dev);
24 if (!path)
25 return;
26 acpigen_write_scope(path);
27 acpigen_write_name("_CRS");
28
29 /* Write GpioInt() as default (if set) or custom from devicetree */
30 acpigen_write_resourcetemplate_header();
31 acpi_device_write_gpio(&default_gpio);
32 acpigen_write_resourcetemplate_footer();
33
34 /* Bind the cd-gpio name to the GpioInt() resource */
35 dp = acpi_dp_new_table("_DSD");
36 if (!dp)
37 return;
38 acpi_dp_add_gpio(dp, "cd-gpio", path, 0, 0, 1);
39 acpi_dp_write(dp);
40
41 acpigen_pop_len();
42}
43#endif
44
45static struct device_operations dev_ops = {
Nico Huber68680dd2020-03-31 17:34:52 +020046 .read_resources = pci_dev_read_resources,
47 .set_resources = pci_dev_set_resources,
48 .enable_resources = pci_dev_enable_resources,
Julius Wernercd49cce2019-03-05 16:53:33 -080049#if CONFIG(HAVE_ACPI_TABLES)
Nico Huber68680dd2020-03-31 17:34:52 +020050 .acpi_fill_ssdt = sd_fill_ssdt,
Bora Guvendik94ee3282017-05-04 13:06:43 -070051#endif
Nico Huber68680dd2020-03-31 17:34:52 +020052 .ops_pci = &pci_dev_ops_pci,
Bora Guvendik94ee3282017-05-04 13:06:43 -070053};
54
55static const unsigned short pci_device_ids[] = {
56 PCI_DEVICE_ID_INTEL_APL_SD,
Lijian Zhaobbedef92017-07-29 16:38:38 -070057 PCI_DEVICE_ID_INTEL_CNL_SD,
Bora Guvendik94ee3282017-05-04 13:06:43 -070058 PCI_DEVICE_ID_INTEL_GLK_SD,
59 PCI_DEVICE_ID_INTEL_SKL_SD,
praveen hodagatta praneshe26c4a42018-09-20 03:49:45 +080060 PCI_DEVICE_ID_INTEL_CNP_H_SD,
Aamir Bohra9eac0392018-06-30 12:07:04 +053061 PCI_DEVICE_ID_INTEL_ICL_SD,
Ronak Kanabarda7ffb482019-02-05 01:51:13 +053062 PCI_DEVICE_ID_INTEL_CMP_SD,
Gaggery Tsai12a651c2019-12-05 11:23:20 -080063 PCI_DEVICE_ID_INTEL_CMP_H_SD,
Tan, Lean Sheng26136092020-01-20 19:13:56 -080064 PCI_DEVICE_ID_INTEL_MCC_SD,
Meera Ravindranath3f4af0d2020-02-12 16:01:22 +053065 PCI_DEVICE_ID_INTEL_JSP_SD,
Bora Guvendik94ee3282017-05-04 13:06:43 -070066 0
67};
68
69static const struct pci_driver pch_sd __pci_driver = {
70 .ops = &dev_ops,
71 .vendor = PCI_VENDOR_ID_INTEL,
72 .devices = pci_device_ids
73};