Commit 9f0ea8e8 authored by Tao Zhang's avatar Tao Zhang Committed by Suzuki K Poulose
Browse files

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: default avatarTao Zhang <quic_taozha@quicinc.com>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/1707024641-22460-2-git-send-email-quic_taozha@quicinc.com
parent bcaabb95
Loading
Loading
Loading
Loading
+19 −20
Original line number Diff line number Diff line
@@ -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;
}