]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
dm: core: Add a way of overriding the ACPI device path
authorSimon Glass <sjg@chromium.org>
Wed, 8 Jul 2020 03:32:07 +0000 (21:32 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Fri, 17 Jul 2020 06:32:24 +0000 (14:32 +0800)
Some devices such as GPIO need to override the normal path that would be
generated by driver model. Add a device-tree property for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Wolfgang Wallner <wolfgang.wallner@br-automation.com>
doc/device-tree-bindings/device.txt
drivers/core/acpi.c
include/dm/acpi.h

index 7140339623b0e897ef89ba94eee27c31f922c014..2a5736c5981dd3d738e4137421fc6a8183d47b2f 100644 (file)
@@ -17,6 +17,8 @@ the acpi,compatible property.
     System) Device Name)
  - acpi,hid : Contains the string to use as the HID (Hardware ID)
     identifier _HID
+ - acpi,path : Specifies the full ACPI path for a device. This overrides the
+    normal path built from the driver-model hierarchy
  - acpi,name : Provides the ACPI name for a device, which is a string consisting
    of four alphanumeric character (upper case)
  - acpi,uid : _UID value for device
@@ -47,3 +49,24 @@ pcie-a0@14,0 {
                interrupts-extended = <&acpi_gpe 0x3c 0>;
        };
 };
+
+p2sb: p2sb@d,0 {
+       u-boot,dm-pre-reloc;
+       reg = <0x02006810 0 0 0 0>;
+       compatible = "intel,apl-p2sb";
+       early-regs = <IOMAP_P2SB_BAR 0x100000>;
+       pci,no-autoconfig;
+
+       n {
+               compatible = "intel,apl-pinctrl";
+               u-boot,dm-pre-reloc;
+               intel,p2sb-port-id = <PID_GPIO_N>;
+               acpi,path = "\\_SB.GPO0";
+               gpio_n: gpio-n {
+                       compatible = "intel,gpio";
+                       u-boot,dm-pre-reloc;
+                       gpio-controller;
+                       #gpio-cells = <2>;
+                       linux-name = "INT3452:00";
+               };
+       };
index b566f4f18646fc715fd8a4bf06484883c7c1662e..ae692585625680a6958b359e643613fa276b5e34 100644 (file)
@@ -82,6 +82,25 @@ int acpi_get_name(const struct udevice *dev, char *out_name)
        return 0;
 }
 
+int acpi_get_path(const struct udevice *dev, char *out_path, int maxlen)
+{
+       const char *path;
+       int ret;
+
+       path = dev_read_string(dev, "acpi,path");
+       if (path) {
+               if (strlen(path) >= maxlen)
+                       return -E2BIG;
+               strcpy(out_path, path);
+               return 0;
+       }
+       ret = acpi_device_path(dev, out_path, maxlen);
+       if (ret)
+               return log_msg_ret("dev", ret);
+
+       return 0;
+}
+
 /**
  * acpi_add_item() - Add a new item to the list of data collected
  *
index aa1071ae3544ca68a579918d755336a33da8bee4..a58722de737d9a949106d16d86c86bbacc930714 100644 (file)
@@ -187,6 +187,19 @@ int acpi_inject_dsdt(struct acpi_ctx *ctx);
  */
 void acpi_dump_items(enum acpi_dump_option option);
 
+/**
+ * acpi_get_path() - Get the full ACPI path for a device
+ *
+ * This checks for any override in the device tree and calls acpi_device_path()
+ * if not
+ *
+ * @dev: Device to check
+ * @out_path: Buffer to place the path in (should be ACPI_PATH_MAX long)
+ * @maxlen: Size of buffer (typically ACPI_PATH_MAX)
+ * @return 0 if OK, -ve on error
+ */
+int acpi_get_path(const struct udevice *dev, char *out_path, int maxlen);
+
 #endif /* __ACPI__ */
 
 #endif