coresight-tpdm: Optimize the store function of tpdm simple dataset
authorTao Zhang <quic_taozha@quicinc.com>
Sun, 4 Feb 2024 05:30:32 +0000 (13:30 +0800)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Mon, 12 Feb 2024 10:29:46 +0000 (10:29 +0000)
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
drivers/hwtracing/coresight/coresight-tpdm.c

index bd13a548375caad8d0fd09b4fff16c7c76da98e1..0427c0fc0bf33b077c992926ab5447f43bff3563 100644 (file)
@@ -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;
 }