lkml.org 
[lkml]   [2020]   [Oct]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 25/26] coresight: etm4x: Add support for sysreg only devices
    Date
    Add support for devices with system instruction access only.
    They don't have a memory mapped interface and thus are not
    AMBA devices.

    Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
    Cc: Mike Leach <mike.leach@linaro.org>
    Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
    ---
    .../coresight/coresight-etm4x-core.c | 50 +++++++++++++++++--
    1 file changed, 45 insertions(+), 5 deletions(-)

    diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
    index 25fab5513604..50a574228866 100644
    --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
    +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
    @@ -26,6 +26,7 @@
    #include <linux/seq_file.h>
    #include <linux/uaccess.h>
    #include <linux/perf_event.h>
    +#include <linux/platform_device.h>
    #include <linux/pm_runtime.h>
    #include <linux/property.h>
    #include <asm/sections.h>
    @@ -1623,9 +1624,6 @@ static int etm4_probe(struct device *dev, void __iomem *base)
    return -ENOMEM;
    }

    - if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
    - drvdata->skip_power_up = true;
    -
    drvdata->base = base;

    spin_lock_init(&drvdata->spinlock);
    @@ -1648,6 +1646,11 @@ static int etm4_probe(struct device *dev, void __iomem *base)
    if (!drvdata->arch)
    return -EINVAL;

    + /* Skip programming TRCPDCR for system instructions. */
    + if (!desc.access.io_mem ||
    + fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up"))
    + drvdata->skip_power_up = true;
    +
    etm4_init_trace_id(drvdata);
    etm4_set_default(&drvdata->config);

    @@ -1706,6 +1709,20 @@ static int etm4_probe_amba(struct amba_device *adev, const struct amba_id *id)
    return ret;
    }

    +static int etm4_probe_platform_dev(struct platform_device *pdev)
    +{
    + int ret;
    +
    + pm_runtime_get_noresume(&pdev->dev);
    + pm_runtime_set_active(&pdev->dev);
    + pm_runtime_enable(&pdev->dev);
    +
    + ret = etm4_probe(&pdev->dev, NULL);
    +
    + pm_runtime_put(&pdev->dev);
    + return ret;
    +}
    +
    static struct amba_cs_uci_id uci_id_etm4[] = {
    {
    /* ETMv4 UCI data */
    @@ -1781,6 +1798,20 @@ static struct amba_driver etm4x_amba_driver = {
    .id_table = etm4_ids,
    };

    +static const struct of_device_id etm_sysreg_match[] = {
    + { .compatible = "arm,coresight-etm-sysreg" },
    + {}
    +};
    +
    +static struct platform_driver etm4_platform_driver = {
    + .probe = etm4_probe_platform_dev,
    + .driver = {
    + .name = "coresight-etm4x",
    + .of_match_table = etm_sysreg_match,
    + .suppress_bind_attrs = true,
    + },
    +};
    +
    static int __init etm4x_init(void)
    {
    int ret;
    @@ -1793,10 +1824,19 @@ static int __init etm4x_init(void)

    ret = amba_driver_register(&etm4x_amba_driver);
    if (ret) {
    - pr_err("Error registering etm4x driver\n");
    - etm4_pm_clear();
    + pr_err("Error registering etm4x AMBA driver\n");
    + goto clear_pm;
    }

    + ret = platform_driver_register(&etm4_platform_driver);
    + if (!ret)
    + return 0;
    +
    + pr_err("Error registering etm4x platform driver\n");
    + amba_driver_unregister(&etm4x_amba_driver);
    +
    +clear_pm:
    + etm4_pm_clear();
    return ret;
    }

    --
    2.24.1
    \
     
     \ /
      Last update: 2020-10-28 23:11    [W:4.252 / U:0.292 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site