diff options
| -rw-r--r-- | drivers/hwtracing/coresight/coresight-tpdm.c | 46 |
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, |
