Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c064d921 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "coresight: tmc: Add usb support for coresight"

parents ee2062bc a9a212a9
Loading
Loading
Loading
Loading
+56 −25
Original line number Diff line number Diff line
@@ -771,6 +771,16 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode)

	mutex_lock(&drvdata->mem_lock);

	spin_lock_irqsave(&drvdata->spinlock, flags);
	if (drvdata->reading) {
		ret = -EBUSY;
		spin_unlock_irqrestore(&drvdata->spinlock, flags);
		mutex_unlock(&drvdata->mem_lock);
		return ret;
	}
	spin_unlock_irqrestore(&drvdata->spinlock, flags);

	if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) {
		/*
		 * ETR DDR memory is not allocated until user enables
		 * tmc at least once. If user specifies different ETR
@@ -787,17 +797,21 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode)
		}
		ret = tmc_etr_alloc_mem(drvdata);
		if (ret) {
		pm_runtime_put(drvdata->dev);
			mutex_unlock(&drvdata->mem_lock);
			return ret;
		}
	} else {
		drvdata->usbch = usb_qdss_open("qdss", drvdata,
					       usb_notifier);
		if (IS_ERR_OR_NULL(drvdata->usbch)) {
			dev_err(drvdata->dev, "usb_qdss_open failed\n");
			ret = PTR_ERR(drvdata->usbch);
			mutex_unlock(&drvdata->mem_lock);
			return ret;
		}
	}

	spin_lock_irqsave(&drvdata->spinlock, flags);
	if (drvdata->reading) {
		ret = -EBUSY;
		goto out;
	}

	val = local_xchg(&drvdata->mode, mode);
	/*
@@ -808,9 +822,14 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev, u32 mode)
	if (val == CS_MODE_SYSFS)
		goto out;

	if (drvdata->out_mode == TMC_ETR_OUT_MODE_MEM)
		tmc_etr_enable_hw(drvdata);

	drvdata->enable = true;
	drvdata->sticky_enable = true;
out:
	spin_unlock_irqrestore(&drvdata->spinlock, flags);
	mutex_unlock(&drvdata->mem_lock);

	if (!ret)
		dev_info(drvdata->dev, "TMC-ETR enabled\n");
@@ -880,8 +899,15 @@ static void tmc_disable_etr_sink(struct coresight_device *csdev)

	val = local_xchg(&drvdata->mode, CS_MODE_DISABLED);
	/* Disable the TMC only if it needs to */
	if (val != CS_MODE_DISABLED)
	if (val != CS_MODE_DISABLED) {
		if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) {
			__tmc_etr_disable_to_bam(drvdata);
			tmc_etr_bam_disable(drvdata);
			usb_qdss_close(drvdata->usbch);
		} else {
			tmc_etr_disable_hw(drvdata);
		}
	}

	spin_unlock_irqrestore(&drvdata->spinlock, flags);

@@ -913,6 +939,11 @@ int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
		goto out;
	}

	if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) {
		ret = -EINVAL;
		goto out;
	}

	val = local_read(&drvdata->mode);
	/* Don't interfere if operated from Perf */
	if (val == CS_MODE_PERF) {
+1 −0
Original line number Diff line number Diff line
@@ -540,6 +540,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
			drvdata->memtype  = TMC_ETR_MEM_TYPE_CONTIG;
		drvdata->mem_size = drvdata->size;
		drvdata->mem_type = drvdata->memtype;
		drvdata->out_mode = TMC_ETR_OUT_MODE_MEM;
	} else {
		drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4;
	}