Hi Mike
Sorry for the delay. one minor comment below.
On 02/10/2020 09:39 PM, Mike Leach wrote:
The CoreSight subsystem enables a path of devices from source to sink. Any CTI devices associated with the path devices must be enabled at the same time.
This patch adds an associated coresight_device element to the main coresight device structure, and uses this to create associations between the CTI and other devices based on the device tree data. The associated device element is used to enable CTI in conjunction with the path elements.
CTI devices are reference counted so where a single CTI is associated with multiple elements on the path, it will be enabled on the first associated device enable, and disabled with the last associated device disable.
Signed-off-by: Mike Leach mike.leach@linaro.org Reviewed-by: Mathieu Poirier mathieu.poirier@linaro.org
drivers/hwtracing/coresight/coresight-cti.c | 129 +++++++++++++++++++ drivers/hwtracing/coresight/coresight-cti.h | 1 + drivers/hwtracing/coresight/coresight-priv.h | 12 ++ drivers/hwtracing/coresight/coresight.c | 71 +++++++++- include/linux/coresight.h | 4 + 5 files changed, 212 insertions(+), 5 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-cti.c b/drivers/hwtracing/coresight/coresight-cti.c index 77c2af247917..c4494923d030 100644 --- a/drivers/hwtracing/coresight/coresight-cti.c +++ b/drivers/hwtracing/coresight/coresight-cti.c @@ -4,6 +4,7 @@
- Author: Mike Leach mike.leach@linaro.org
*/ +#include <linux/property.h> #include "coresight-cti.h" /** @@ -440,6 +441,131 @@ int cti_channel_setop(struct device *dev, enum cti_chan_set_op op, return err; } +/*
- Look for a matching connection device name in the list of connections.
- If found then swap in the csdev name, set trig con association pointer
- and return found.
- */
+static bool +cti_match_fixup_csdev(struct cti_device *ctidev, const char *node_name,
struct coresight_device *csdev)
+{
- struct cti_trig_con *tc;
- const char *csdev_name;
- list_for_each_entry(tc, &ctidev->trig_cons, node) {
if (tc->con_dev_name) {
if (!strcmp(node_name, tc->con_dev_name)) {
/* match: so swap in csdev name & dev */
csdev_name = dev_name(&csdev->dev);
tc->con_dev_name =
devm_kstrdup(&csdev->dev, csdev_name,
GFP_KERNEL);
In the extreme rare case of an allocation failure, we may want to check if the allocation was successful or not, rather than silently ignoring it. With that fixed,
Reviewed-by: Suzuki K Poulose suzuki.poulose@arm.com