coresight: ultrasoc-smb: Fix uninitialized before use buf_hw_base
[platform/kernel/linux-starfive.git] / drivers / hwtracing / coresight / ultrasoc-smb.c
index e9a32a9..6e32d31 100644 (file)
@@ -99,7 +99,7 @@ static int smb_open(struct inode *inode, struct file *file)
                                        struct smb_drv_data, miscdev);
        int ret = 0;
 
-       mutex_lock(&drvdata->mutex);
+       spin_lock(&drvdata->spinlock);
 
        if (drvdata->reading) {
                ret = -EBUSY;
@@ -115,7 +115,7 @@ static int smb_open(struct inode *inode, struct file *file)
 
        drvdata->reading = true;
 out:
-       mutex_unlock(&drvdata->mutex);
+       spin_unlock(&drvdata->spinlock);
 
        return ret;
 }
@@ -132,10 +132,8 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,
        if (!len)
                return 0;
 
-       mutex_lock(&drvdata->mutex);
-
        if (!sdb->data_size)
-               goto out;
+               return 0;
 
        to_copy = min(sdb->data_size, len);
 
@@ -145,20 +143,15 @@ static ssize_t smb_read(struct file *file, char __user *data, size_t len,
 
        if (copy_to_user(data, sdb->buf_base + sdb->buf_rdptr, to_copy)) {
                dev_dbg(dev, "Failed to copy data to user\n");
-               to_copy = -EFAULT;
-               goto out;
+               return -EFAULT;
        }
 
        *ppos += to_copy;
-
        smb_update_read_ptr(drvdata, to_copy);
-
-       dev_dbg(dev, "%zu bytes copied\n", to_copy);
-out:
        if (!sdb->data_size)
                smb_reset_buffer(drvdata);
-       mutex_unlock(&drvdata->mutex);
 
+       dev_dbg(dev, "%zu bytes copied\n", to_copy);
        return to_copy;
 }
 
@@ -167,9 +160,9 @@ static int smb_release(struct inode *inode, struct file *file)
        struct smb_drv_data *drvdata = container_of(file->private_data,
                                        struct smb_drv_data, miscdev);
 
-       mutex_lock(&drvdata->mutex);
+       spin_lock(&drvdata->spinlock);
        drvdata->reading = false;
-       mutex_unlock(&drvdata->mutex);
+       spin_unlock(&drvdata->spinlock);
 
        return 0;
 }
@@ -262,7 +255,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,
        struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
        int ret = 0;
 
-       mutex_lock(&drvdata->mutex);
+       spin_lock(&drvdata->spinlock);
 
        /* Do nothing, the trace data is reading by other interface now */
        if (drvdata->reading) {
@@ -294,7 +287,7 @@ static int smb_enable(struct coresight_device *csdev, enum cs_mode mode,
 
        dev_dbg(&csdev->dev, "Ultrasoc SMB enabled\n");
 out:
-       mutex_unlock(&drvdata->mutex);
+       spin_unlock(&drvdata->spinlock);
 
        return ret;
 }
@@ -304,7 +297,7 @@ static int smb_disable(struct coresight_device *csdev)
        struct smb_drv_data *drvdata = dev_get_drvdata(csdev->dev.parent);
        int ret = 0;
 
-       mutex_lock(&drvdata->mutex);
+       spin_lock(&drvdata->spinlock);
 
        if (drvdata->reading) {
                ret = -EBUSY;
@@ -327,7 +320,7 @@ static int smb_disable(struct coresight_device *csdev)
 
        dev_dbg(&csdev->dev, "Ultrasoc SMB disabled\n");
 out:
-       mutex_unlock(&drvdata->mutex);
+       spin_unlock(&drvdata->spinlock);
 
        return ret;
 }
@@ -408,7 +401,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
        if (!buf)
                return 0;
 
-       mutex_lock(&drvdata->mutex);
+       spin_lock(&drvdata->spinlock);
 
        /* Don't do anything if another tracer is using this sink. */
        if (atomic_read(&csdev->refcnt) != 1)
@@ -432,7 +425,7 @@ static unsigned long smb_update_buffer(struct coresight_device *csdev,
        if (!buf->snapshot && lost)
                perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
 out:
-       mutex_unlock(&drvdata->mutex);
+       spin_unlock(&drvdata->spinlock);
 
        return data_size;
 }
@@ -484,7 +477,6 @@ static int smb_init_data_buffer(struct platform_device *pdev,
 static void smb_init_hw(struct smb_drv_data *drvdata)
 {
        smb_disable_hw(drvdata);
-       smb_reset_buffer(drvdata);
 
        writel(SMB_LB_CFG_LO_DEFAULT, drvdata->base + SMB_LB_CFG_LO_REG);
        writel(SMB_LB_CFG_HI_DEFAULT, drvdata->base + SMB_LB_CFG_HI_REG);
@@ -590,37 +582,33 @@ static int smb_probe(struct platform_device *pdev)
                return ret;
        }
 
-       mutex_init(&drvdata->mutex);
+       ret = smb_config_inport(dev, true);
+       if (ret)
+               return ret;
+
+       smb_reset_buffer(drvdata);
+       platform_set_drvdata(pdev, drvdata);
+       spin_lock_init(&drvdata->spinlock);
        drvdata->pid = -1;
 
        ret = smb_register_sink(pdev, drvdata);
        if (ret) {
+               smb_config_inport(&pdev->dev, false);
                dev_err(dev, "Failed to register SMB sink\n");
                return ret;
        }
 
-       ret = smb_config_inport(dev, true);
-       if (ret) {
-               smb_unregister_sink(drvdata);
-               return ret;
-       }
-
-       platform_set_drvdata(pdev, drvdata);
-
        return 0;
 }
 
 static int smb_remove(struct platform_device *pdev)
 {
        struct smb_drv_data *drvdata = platform_get_drvdata(pdev);
-       int ret;
-
-       ret = smb_config_inport(&pdev->dev, false);
-       if (ret)
-               return ret;
 
        smb_unregister_sink(drvdata);
 
+       smb_config_inport(&pdev->dev, false);
+
        return 0;
 }