The stimulus base for STM device must be listed as the second memory
resource, followed by the programming base address. Add support for
parsing the information for ACPI.

Cc: Mathieu Poirier <[email protected]>
Cc: "Rafael J. Wysocki" <[email protected]>
Signed-off-by: Suzuki K Poulose <[email protected]>
---
 drivers/hwtracing/coresight/coresight-stm.c | 43 +++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/drivers/hwtracing/coresight/coresight-stm.c 
b/drivers/hwtracing/coresight/coresight-stm.c
index d94ae22..995443a 100644
--- a/drivers/hwtracing/coresight/coresight-stm.c
+++ b/drivers/hwtracing/coresight/coresight-stm.c
@@ -16,6 +16,7 @@
  * (C) 2015-2016 Chunyan Zhang <[email protected]>
  */
 #include <asm/local.h>
+#include <linux/acpi.h>
 #include <linux/amba/bus.h>
 #include <linux/bitmap.h>
 #include <linux/clk.h>
@@ -717,10 +718,52 @@ static inline int of_stm_get_stimulus_area(struct device 
*dev,
 }
 #endif
 
+#ifdef CONFIG_ACPI
+static int acpi_stm_get_stimulus_area(struct device *dev, struct resource *res)
+{
+       int rc;
+       bool found_base = false;
+       struct resource_entry *rent;
+       LIST_HEAD(res_list);
+
+       struct acpi_device *adev = ACPI_COMPANION(dev);
+
+       if (!adev)
+               return -ENODEV;
+       rc = acpi_dev_get_resources(adev, &res_list, NULL, NULL);
+       if (rc < 0)
+               return rc;
+
+       rc = -ENOENT;
+       list_for_each_entry(rent, &res_list, node) {
+               if (resource_type(rent->res) != IORESOURCE_MEM)
+                       continue;
+               if (found_base) {
+                       *res = *rent->res;
+                       rc = 0;
+                       break;
+               }
+
+               found_base = true;
+       }
+
+       acpi_dev_free_resource_list(&res_list);
+       return rc;
+}
+#else
+static inline int acpi_stm_get_stimulus_area(struct device *dev,
+                                            struct resource *res)
+{
+       return -ENOENT;
+}
+#endif
+
 static int stm_get_stimulus_area(struct device *dev, struct resource *res)
 {
        if (dev->of_node)
                return of_stm_get_stimulus_area(dev, res);
+       else if (is_acpi_node(dev->fwnode))
+               return acpi_stm_get_stimulus_area(dev, res);
        return -ENOENT;
 }
 
-- 
2.7.4

Reply via email to