From 485329fc6d1a98007d99f42286796bb1d640f65b Mon Sep 17 00:00:00 2001 From: Tingwei Zhang Date: Thu, 12 Sep 2019 13:11:11 +0800 Subject: [PATCH] coresight: csr: Add multiple CSR devices support Add a CSR device list in CSR driver to support multiple CSR devices. CSR device structure is initialized in probe and added to the list. Add CSR device structure as parameter of CSR function. Change the caller of CSR functions to align with this change. Change-Id: I15e979a517204ac37dbcc5defd78a0214f44ade8 Signed-off-by: Tingwei Zhang --- drivers/hwtracing/coresight/coresight-common.h | 10 ++++++++++ drivers/hwtracing/coresight/coresight-csr.c | 15 +++++++++++++++ drivers/hwtracing/coresight/coresight-tmc.c | 13 ++++++++++++- drivers/hwtracing/coresight/coresight-tmc.h | 2 ++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/drivers/hwtracing/coresight/coresight-common.h b/drivers/hwtracing/coresight/coresight-common.h index 5fa45c1c1d95..99f427d2d302 100644 --- a/drivers/hwtracing/coresight/coresight-common.h +++ b/drivers/hwtracing/coresight/coresight-common.h @@ -23,6 +23,14 @@ extern int coresight_csr_hwctrl_set(struct coresight_csr *csr, uint64_t addr, extern void coresight_csr_set_byte_cntr(struct coresight_csr *csr, uint32_t count); extern struct coresight_csr *coresight_csr_get(const char *name); +#if IS_ENABLED(CONFIG_OF) +extern int of_get_coresight_csr_name(struct device_node *node, + const char **csr_name); +#else +static inline int of_get_coresight_csr_name(struct device_node *node, + const char **csr_name){ return -EINVAL; } +#endif + #else static inline void msm_qdss_csr_enable_bam_to_usb(struct coresight_csr *csr) {} static inline void msm_qdss_csr_disable_bam_to_usb(struct coresight_csr *csr) {} @@ -33,6 +41,8 @@ static inline void coresight_csr_set_byte_cntr(struct coresight_csr *csr, uint32_t count) {} static inline struct coresight_csr *coresight_csr_get(const char *name) { return NULL; } +static inline int of_get_coresight_csr_name(struct device_node *node, + const char **csr_name){ return -EINVAL; } #endif #endif diff --git a/drivers/hwtracing/coresight/coresight-csr.c b/drivers/hwtracing/coresight/coresight-csr.c index 6b2a4aa76c62..3f48fe4ed1b2 100644 --- a/drivers/hwtracing/coresight/coresight-csr.c +++ b/drivers/hwtracing/coresight/coresight-csr.c @@ -248,6 +248,21 @@ struct coresight_csr *coresight_csr_get(const char *name) } EXPORT_SYMBOL(coresight_csr_get); +int of_get_coresight_csr_name(struct device_node *node, const char **csr_name) +{ + int ret; + struct device_node *csr_node; + + csr_node = of_parse_phandle(node, "coresight-csr", 0); + if (!csr_node) + return -EINVAL; + + ret = of_property_read_string(csr_node, "coresight-name", csr_name); + of_node_put(csr_node); + return ret; +} +EXPORT_SYMBOL(of_get_coresight_csr_name); + static ssize_t timestamp_show(struct device *dev, struct device_attribute *attr, char *buf) diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c index be37aff573b4..2c67d489ea29 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.c +++ b/drivers/hwtracing/coresight/coresight-tmc.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 -/* Copyright (c) 2012, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012,2017,2019 The Linux Foundation. All rights reserved. * * Description: CoreSight Trace Memory Controller driver */ @@ -432,6 +432,17 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) else drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4; + ret = of_get_coresight_csr_name(adev->dev.of_node, &drvdata->csr_name); + if (ret) + dev_dbg(dev, "No csr data\n"); + else { + drvdata->csr = coresight_csr_get(drvdata->csr_name); + if (IS_ERR(drvdata->csr)) { + dev_dbg(dev, "failed to get csr, defer probe\n"); + return -EPROBE_DEFER; + } + } + desc.dev = dev; desc.groups = coresight_tmc_groups; diff --git a/drivers/hwtracing/coresight/coresight-tmc.h b/drivers/hwtracing/coresight/coresight-tmc.h index 1ed50411cc3c..ac129cfe3487 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.h +++ b/drivers/hwtracing/coresight/coresight-tmc.h @@ -203,6 +203,8 @@ struct tmc_drvdata { struct mutex idr_mutex; struct etr_buf *sysfs_buf; void *perf_data; + struct coresight_csr *csr; + const char *csr_name; }; struct etr_buf_operations {