From 0f06d1e6aa656119f48bd27238789d86f129370a Mon Sep 17 00:00:00 2001 From: Mao Jinlong Date: Wed, 22 Apr 2020 21:17:09 +0800 Subject: [PATCH] tmc-etr: Check if it is mode switch action during disable etr When switch mode with etr being enabled more than one time, it needs to reset all the etr settings for previous mode instead of return busy. Change-Id: I243a6d910bb3dd8ac9ca30dadbd1c6ab3cefd00f Signed-off-by: Mao Jinlong --- drivers/hwtracing/coresight/coresight-tmc-etr.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c index 1149ea5e471c..809f18c764d4 100644 --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c @@ -1925,7 +1925,8 @@ static int tmc_enable_etr_sink(struct coresight_device *csdev, return -EINVAL; } -static int _tmc_disable_etr_sink(struct coresight_device *csdev) +static int _tmc_disable_etr_sink(struct coresight_device *csdev, + bool mode_switch) { unsigned long flags; struct tmc_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); @@ -1937,7 +1938,7 @@ static int _tmc_disable_etr_sink(struct coresight_device *csdev) return -EBUSY; } - if (atomic_dec_return(csdev->refcnt)) { + if (atomic_dec_return(csdev->refcnt) && !mode_switch) { spin_unlock_irqrestore(&drvdata->spinlock, flags); return -EBUSY; } @@ -1985,7 +1986,7 @@ static int tmc_disable_etr_sink(struct coresight_device *csdev) int ret; mutex_lock(&drvdata->mem_lock); - ret = _tmc_disable_etr_sink(csdev); + ret = _tmc_disable_etr_sink(csdev, false); mutex_unlock(&drvdata->mem_lock); return ret; } @@ -2016,7 +2017,7 @@ int tmc_etr_switch_mode(struct tmc_drvdata *drvdata, const char *out_mode) } coresight_disable_all_source_link(); - _tmc_disable_etr_sink(drvdata->csdev); + _tmc_disable_etr_sink(drvdata->csdev, true); old_mode = drvdata->out_mode; drvdata->out_mode = new_mode; if (tmc_enable_etr_sink_sysfs(drvdata->csdev)) {