Merge tag 'efi-fixes-for-v6.9-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / hwtracing / coresight / coresight-etm4x-core.c
index ce1995a..c2ca4a0 100644 (file)
@@ -840,14 +840,11 @@ static int etm4_enable(struct coresight_device *csdev, struct perf_event *event,
                       enum cs_mode mode)
 {
        int ret;
-       u32 val;
-       struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
-
-       val = local_cmpxchg(&drvdata->mode, CS_MODE_DISABLED, mode);
 
-       /* Someone is already using the tracer */
-       if (val)
+       if (!coresight_take_mode(csdev, mode)) {
+               /* Someone is already using the tracer */
                return -EBUSY;
+       }
 
        switch (mode) {
        case CS_MODE_SYSFS:
@@ -862,7 +859,7 @@ static int etm4_enable(struct coresight_device *csdev, struct perf_event *event,
 
        /* The tracer didn't start */
        if (ret)
-               local_set(&drvdata->mode, CS_MODE_DISABLED);
+               coresight_set_mode(csdev, CS_MODE_DISABLED);
 
        return ret;
 }
@@ -1004,14 +1001,13 @@ static void etm4_disable(struct coresight_device *csdev,
                         struct perf_event *event)
 {
        enum cs_mode mode;
-       struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
 
        /*
         * For as long as the tracer isn't disabled another entity can't
         * change its status.  As such we can read the status here without
         * fearing it will change under us.
         */
-       mode = local_read(&drvdata->mode);
+       mode = coresight_get_mode(csdev);
 
        switch (mode) {
        case CS_MODE_DISABLED:
@@ -1025,7 +1021,7 @@ static void etm4_disable(struct coresight_device *csdev,
        }
 
        if (mode)
-               local_set(&drvdata->mode, CS_MODE_DISABLED);
+               coresight_set_mode(csdev, CS_MODE_DISABLED);
 }
 
 static const struct coresight_ops_source etm4_source_ops = {
@@ -1200,6 +1196,7 @@ static void etm4_init_arch_data(void *info)
        struct etm4_init_arg *init_arg = info;
        struct etmv4_drvdata *drvdata;
        struct csdev_access *csa;
+       struct device *dev = init_arg->dev;
        int i;
 
        drvdata = dev_get_drvdata(init_arg->dev);
@@ -1213,6 +1210,10 @@ static void etm4_init_arch_data(void *info)
        if (!etm4_init_csdev_access(drvdata, csa))
                return;
 
+       if (!csa->io_mem ||
+           fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
+               drvdata->skip_power_up = true;
+
        /* Detect the support for OS Lock before we actually use it */
        etm_detect_os_lock(drvdata, csa);
 
@@ -1650,7 +1651,7 @@ static int etm4_online_cpu(unsigned int cpu)
                return etm4_probe_cpu(cpu);
 
        if (etmdrvdata[cpu]->boot_enable && !etmdrvdata[cpu]->sticky_enable)
-               coresight_enable(etmdrvdata[cpu]->csdev);
+               coresight_enable_sysfs(etmdrvdata[cpu]->csdev);
        return 0;
 }
 
@@ -1663,7 +1664,7 @@ static int etm4_starting_cpu(unsigned int cpu)
        if (!etmdrvdata[cpu]->os_unlock)
                etm4_os_unlock(etmdrvdata[cpu]);
 
-       if (local_read(&etmdrvdata[cpu]->mode))
+       if (coresight_get_mode(etmdrvdata[cpu]->csdev))
                etm4_enable_hw(etmdrvdata[cpu]);
        spin_unlock(&etmdrvdata[cpu]->spinlock);
        return 0;
@@ -1675,7 +1676,7 @@ static int etm4_dying_cpu(unsigned int cpu)
                return 0;
 
        spin_lock(&etmdrvdata[cpu]->spinlock);
-       if (local_read(&etmdrvdata[cpu]->mode))
+       if (coresight_get_mode(etmdrvdata[cpu]->csdev))
                etm4_disable_hw(etmdrvdata[cpu]);
        spin_unlock(&etmdrvdata[cpu]->spinlock);
        return 0;
@@ -1833,7 +1834,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
         * Save and restore the ETM Trace registers only if
         * the ETM is active.
         */
-       if (local_read(&drvdata->mode) && drvdata->save_state)
+       if (coresight_get_mode(drvdata->csdev) && drvdata->save_state)
                ret = __etm4_cpu_save(drvdata);
        return ret;
 }
@@ -2040,11 +2041,6 @@ static int etm4_add_coresight_dev(struct etm4_init_arg *init_arg)
        if (!drvdata->arch)
                return -EINVAL;
 
-       /* TRCPDCR is not accessible with system instructions. */
-       if (!desc.access.io_mem ||
-           fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
-               drvdata->skip_power_up = true;
-
        major = ETM_ARCH_MAJOR_VERSION(drvdata->arch);
        minor = ETM_ARCH_MINOR_VERSION(drvdata->arch);
 
@@ -2098,7 +2094,7 @@ static int etm4_add_coresight_dev(struct etm4_init_arg *init_arg)
                 drvdata->cpu, type_name, major, minor);
 
        if (boot_enable) {
-               coresight_enable(drvdata->csdev);
+               coresight_enable_sysfs(drvdata->csdev);
                drvdata->boot_enable = true;
        }
 
@@ -2390,7 +2386,7 @@ static const struct of_device_id etm4_sysreg_match[] = {
 
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id etm4x_acpi_ids[] = {
-       {"ARMHC500", 0}, /* ARM CoreSight ETM4x */
+       {"ARMHC500", 0, 0, 0}, /* ARM CoreSight ETM4x */
        {}
 };
 MODULE_DEVICE_TABLE(acpi, etm4x_acpi_ids);