|
@@ -132,12 +132,14 @@ static int coresight_enable_sink(struct coresight_device *csdev, u32 mode)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- if (!csdev->enable) {
|
|
|
- if (sink_ops(csdev)->enable) {
|
|
|
- ret = sink_ops(csdev)->enable(csdev, mode);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * We need to make sure the "new" session is compatible with the
|
|
|
+ * existing "mode" of operation.
|
|
|
+ */
|
|
|
+ if (sink_ops(csdev)->enable) {
|
|
|
+ ret = sink_ops(csdev)->enable(csdev, mode);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
csdev->enable = true;
|
|
|
}
|
|
|
|
|
@@ -339,8 +341,14 @@ int coresight_enable_path(struct list_head *path, u32 mode)
|
|
|
switch (type) {
|
|
|
case CORESIGHT_DEV_TYPE_SINK:
|
|
|
ret = coresight_enable_sink(csdev, mode);
|
|
|
+ /*
|
|
|
+ * Sink is the first component turned on. If we
|
|
|
+ * failed to enable the sink, there are no components
|
|
|
+ * that need disabling. Disabling the path here
|
|
|
+ * would mean we could disrupt an existing session.
|
|
|
+ */
|
|
|
if (ret)
|
|
|
- goto err;
|
|
|
+ goto out;
|
|
|
break;
|
|
|
case CORESIGHT_DEV_TYPE_SOURCE:
|
|
|
/* sources are enabled from either sysFS or Perf */
|