coresight-tpdm: Optimize the store function of tpdm simple dataset
Replace spin lock/unlock to avoid forgetting to unlock when the function exits. And refine methods for handling various conditions. Signed-off-by: Tao Zhang <quic_taozha@quicinc.com> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/1707024641-22460-2-git-send-email-quic_taozha@quicinc.com
This commit is contained in:
parent
bcaabb95f0
commit
9f0ea8e834
@ -77,51 +77,50 @@ static ssize_t tpdm_simple_dataset_store(struct device *dev,
|
||||
size_t size)
|
||||
{
|
||||
unsigned long val;
|
||||
ssize_t ret = size;
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
struct tpdm_drvdata *drvdata = dev_get_drvdata(dev->parent);
|
||||
struct tpdm_dataset_attribute *tpdm_attr =
|
||||
container_of(attr, struct tpdm_dataset_attribute, attr);
|
||||
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
return ret;
|
||||
|
||||
spin_lock(&drvdata->spinlock);
|
||||
guard(spinlock)(&drvdata->spinlock);
|
||||
switch (tpdm_attr->mem) {
|
||||
case DSB_TRIG_PATT:
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT)
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) {
|
||||
drvdata->dsb->trig_patt[tpdm_attr->idx] = val;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
case DSB_TRIG_PATT_MASK:
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT)
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) {
|
||||
drvdata->dsb->trig_patt_mask[tpdm_attr->idx] = val;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
case DSB_PATT:
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT)
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) {
|
||||
drvdata->dsb->patt_val[tpdm_attr->idx] = val;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
case DSB_PATT_MASK:
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT)
|
||||
if (tpdm_attr->idx < TPDM_DSB_MAX_PATT) {
|
||||
drvdata->dsb->patt_mask[tpdm_attr->idx] = val;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
case DSB_MSR:
|
||||
if (tpdm_attr->idx < drvdata->dsb_msr_num)
|
||||
if (tpdm_attr->idx < drvdata->dsb_msr_num) {
|
||||
drvdata->dsb->msr[tpdm_attr->idx] = val;
|
||||
else
|
||||
ret = -EINVAL;
|
||||
ret = size;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
spin_unlock(&drvdata->spinlock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user