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

Commit e34081c6 authored by Shashank Mittal's avatar Shashank Mittal Committed by Kyle Yan
Browse files

coresight-tpdm: add support for configuring patt_type for dsb



DSB_TIER.PATT_TYPE bit can be used to choose a driver for
pattern matching based timestamps for DSB subunit.

Add support to configure this bit.

Change-Id: Id07ee18006c96e9a66cab5f4e7544dda85a692f8
Signed-off-by: default avatarShashank Mittal <mittals@codeaurora.org>
parent 33551e20
Loading
Loading
Loading
Loading
+44 −2
Original line number Diff line number Diff line
@@ -215,6 +215,7 @@ struct dsb_dataset {
	uint32_t		patt_val[TPDM_DSB_MAX_PATT];
	uint32_t		patt_mask[TPDM_DSB_MAX_PATT];
	bool			patt_ts;
	bool			patt_type;
	uint32_t		trig_patt_val[TPDM_DSB_MAX_PATT];
	uint32_t		trig_patt_mask[TPDM_DSB_MAX_PATT];
	bool			trig_ts;
@@ -469,10 +470,15 @@ static void __tpdm_enable_dsb(struct tpdm_drvdata *drvdata)
			    TPDM_DSB_CA_SELECT(i));

	val = tpdm_readl(drvdata, TPDM_DSB_TIER);
	if (drvdata->dsb->patt_ts == true)
	if (drvdata->dsb->patt_ts == true) {
		val = val | BIT(0);
		if (drvdata->dsb->patt_type == true)
			val = val | BIT(2);
		else
			val = val & ~BIT(2);
	} else {
		val = val & ~BIT(0);
	}
	if (drvdata->dsb->trig_ts == true)
		val = val | BIT(1);
	else
@@ -2792,6 +2798,41 @@ static ssize_t tpdm_store_dsb_patt_ts(struct device *dev,
static DEVICE_ATTR(dsb_patt_ts, S_IRUGO | S_IWUSR,
		   tpdm_show_dsb_patt_ts, tpdm_store_dsb_patt_ts);

static ssize_t tpdm_show_dsb_patt_type(struct device *dev,
				       struct device_attribute *attr, char *buf)
{
	struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);

	if (!test_bit(TPDM_DS_DSB, drvdata->datasets))
		return -EPERM;

	return scnprintf(buf, PAGE_SIZE, "%u\n",
			 (unsigned)drvdata->dsb->patt_type);
}

static ssize_t tpdm_store_dsb_patt_type(struct device *dev,
					struct device_attribute *attr,
					const char *buf, size_t size)
{
	struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
	unsigned long val;

	if (kstrtoul(buf, 16, &val))
		return -EINVAL;
	if (!test_bit(TPDM_DS_DSB, drvdata->datasets))
		return -EPERM;

	mutex_lock(&drvdata->lock);
	if (val)
		drvdata->dsb->patt_type = true;
	else
		drvdata->dsb->patt_type = false;
	mutex_unlock(&drvdata->lock);
	return size;
}
static DEVICE_ATTR(dsb_patt_type, S_IRUGO | S_IWUSR,
		   tpdm_show_dsb_patt_type, tpdm_store_dsb_patt_type);

static ssize_t tpdm_show_dsb_trig_patt_val(struct device *dev,
					   struct device_attribute *attr,
					   char *buf)
@@ -3493,6 +3534,7 @@ static struct attribute *tpdm_dsb_attrs[] = {
	&dev_attr_dsb_patt_val.attr,
	&dev_attr_dsb_patt_mask.attr,
	&dev_attr_dsb_patt_ts.attr,
	&dev_attr_dsb_patt_type.attr,
	&dev_attr_dsb_trig_patt_val.attr,
	&dev_attr_dsb_trig_patt_mask.attr,
	&dev_attr_dsb_trig_ts.attr,