|
@@ -558,6 +558,9 @@ int coresight_enable(struct coresight_device *csdev)
|
|
|
int cpu, ret = 0;
|
|
|
struct coresight_device *sink;
|
|
|
struct list_head *path;
|
|
|
+ enum coresight_dev_subtype_source subtype;
|
|
|
+
|
|
|
+ subtype = csdev->subtype.source_subtype;
|
|
|
|
|
|
mutex_lock(&coresight_mutex);
|
|
|
|
|
@@ -565,8 +568,16 @@ int coresight_enable(struct coresight_device *csdev)
|
|
|
if (ret)
|
|
|
goto out;
|
|
|
|
|
|
- if (csdev->enable)
|
|
|
+ if (csdev->enable) {
|
|
|
+ /*
|
|
|
+ * There could be multiple applications driving the software
|
|
|
+ * source. So keep the refcount for each such user when the
|
|
|
+ * source is already enabled.
|
|
|
+ */
|
|
|
+ if (subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE)
|
|
|
+ atomic_inc(csdev->refcnt);
|
|
|
goto out;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Search for a valid sink for this session but don't reset the
|
|
@@ -593,7 +604,7 @@ int coresight_enable(struct coresight_device *csdev)
|
|
|
if (ret)
|
|
|
goto err_source;
|
|
|
|
|
|
- switch (csdev->subtype.source_subtype) {
|
|
|
+ switch (subtype) {
|
|
|
case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC:
|
|
|
/*
|
|
|
* When working from sysFS it is important to keep track
|