summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/hwtracing/coresight/coresight-tpdm.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/drivers/hwtracing/coresight/coresight-tpdm.c b/drivers/hwtracing/coresight/coresight-tpdm.c
index 18d0a0b5d8f7..3a11b061e5b0 100644
--- a/drivers/hwtracing/coresight/coresight-tpdm.c
+++ b/drivers/hwtracing/coresight/coresight-tpdm.c
@@ -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);
- else
+ 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,