Reviewed-by: Mike Leach mike.leach@linaro.org
On Fri, 11 Sep 2020 at 09:41, Suzuki K Poulose suzuki.poulose@arm.com wrote:
CoreSight ETM with system register access may not have a memory mapped i/o access. Refactor the ETM specific probing into a common routine to allow reusing the code for such ETMs.
Cc: Mathieu Poirier mathieu.poirier@linaro.org Cc: Mike Leach mike.leach@linaro.org Signed-off-by: Suzuki K Poulose suzuki.poulose@arm.com
drivers/hwtracing/coresight/coresight-etm4x.c | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.c b/drivers/hwtracing/coresight/coresight-etm4x.c index dc5ac171db35..7d5f942c2108 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.c +++ b/drivers/hwtracing/coresight/coresight-etm4x.c @@ -1596,14 +1596,11 @@ static void __init etm4_pm_clear(void) } }
-static int etm4_probe(struct amba_device *adev, const struct amba_id *id) +static int etm4_probe(struct device *dev, void __iomem *base) { int ret;
void __iomem *base;
struct device *dev = &adev->dev; struct coresight_platform_data *pdata = NULL; struct etmv4_drvdata *drvdata;
struct resource *res = &adev->res; struct coresight_desc desc = { 0 }; struct etm_init_arg init_arg = { 0 };
@@ -1627,11 +1624,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) if (fwnode_property_present(dev_fwnode(dev), "qcom,skip-power-up")) drvdata->skip_power_up = true;
/* Validity for the resource is already checked by the AMBA core */
base = devm_ioremap_resource(dev, res);
if (IS_ERR(base))
return PTR_ERR(base);
drvdata->base = base; spin_lock_init(&drvdata->spinlock);
@@ -1665,7 +1657,7 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) ret = PTR_ERR(pdata); goto err_arch_supported; }
adev->dev.platform_data = pdata;
dev->platform_data = pdata; desc.type = CORESIGHT_DEV_TYPE_SOURCE; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
@@ -1685,7 +1677,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) goto err_arch_supported; }
pm_runtime_put(&adev->dev); dev_info(&drvdata->csdev->dev, "CPU%d: ETM v%d.%d initialized\n", drvdata->cpu, etm_devarch_arch(drvdata->arch), etm_devarch_rev(drvdata->arch));
@@ -1702,6 +1693,25 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) return ret; }
+static int etm4_probe_amba(struct amba_device *adev, const struct amba_id *id) +{
void __iomem *base;
struct device *dev = &adev->dev;
struct resource *res = &adev->res;
int ret;
/* Validity for the resource is already checked by the AMBA core */
base = devm_ioremap_resource(dev, res);
if (IS_ERR(base))
return PTR_ERR(base);
ret = etm4_probe(dev, base);
if (!ret)
pm_runtime_put(&adev->dev);
return ret;
+}
static struct amba_cs_uci_id uci_id_etm4[] = { { /* ETMv4 UCI data */ @@ -1730,12 +1740,12 @@ static const struct amba_id etm4_ids[] = { {}, };
-static struct amba_driver etm4x_driver = { +static struct amba_driver etm4x_amba_driver = { .drv = { .name = "coresight-etm4x", .suppress_bind_attrs = true, },
.probe = etm4_probe,
.probe = etm4_probe_amba, .id_table = etm4_ids,
};
@@ -1749,7 +1759,7 @@ static int __init etm4x_init(void) if (ret) return ret;
ret = amba_driver_register(&etm4x_driver);
ret = amba_driver_register(&etm4x_amba_driver); if (ret) { pr_err("Error registering etm4x driver\n"); etm4_pm_clear();
-- 2.24.1
-- Mike Leach Principal Engineer, ARM Ltd. Manchester Design Centre. UK