diff --git a/drivers/hwtracing/coresight/coresight-replicator.c b/drivers/hwtracing/coresight/coresight-replicator.c index b73b9afa513d..ac4797dd80d1 100644 --- a/drivers/hwtracing/coresight/coresight-replicator.c +++ b/drivers/hwtracing/coresight/coresight-replicator.c @@ -94,6 +94,18 @@ static int dynamic_replicator_enable(struct replicator_drvdata *drvdata, return rc; } +static bool is_replicator_disabled(struct coresight_device *csdev) +{ + int i; + + for (i = 0; i < csdev->pdata->nr_outport; i++) { + if (atomic_read(&csdev->refcnt[i]) > 0) + return false; + } + + return true; +} + static int replicator_enable(struct coresight_device *csdev, int inport, int outport) { @@ -103,6 +115,10 @@ static int replicator_enable(struct coresight_device *csdev, int inport, bool first_enable = false; spin_lock_irqsave(&drvdata->spinlock, flags); + + if (is_replicator_disabled(csdev)) + dynamic_replicator_reset(drvdata); + if (atomic_read(&csdev->refcnt[outport]) == 0) { if (drvdata->base) rc = dynamic_replicator_enable(drvdata, inport,