static int atomisp_g_input(struct file *file, void *fh, unsigned int *input)
 {
        struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
        struct atomisp_sub_device *asd = atomisp_to_video_pipe(vdev)->asd;
 
-       mutex_lock(&isp->mutex);
        *input = asd->input_curr;
-       mutex_unlock(&isp->mutex);
-
        return 0;
 }
 
        struct v4l2_subdev *motor;
        int ret;
 
-       mutex_lock(&isp->mutex);
-
        ret = atomisp_pipe_check(pipe, true);
        if (ret)
-               goto error;
+               return ret;
 
        if (input >= ATOM_ISP_MAX_INPUTS || input >= isp->input_cnt) {
                dev_dbg(isp->dev, "input_cnt: %d\n", isp->input_cnt);
-               ret = -EINVAL;
-               goto error;
+               return -EINVAL;
        }
 
        /*
                dev_err(isp->dev,
                        "%s, camera is already used by stream: %d\n", __func__,
                        isp->inputs[input].asd->index);
-               ret = -EBUSY;
-               goto error;
+               return -EBUSY;
        }
 
        camera = isp->inputs[input].camera;
        if (!camera) {
                dev_err(isp->dev, "%s, no camera\n", __func__);
-               ret = -EINVAL;
-               goto error;
+               return -EINVAL;
        }
 
        /* power off the current owned sensor, as it is not used this time */
        ret = v4l2_subdev_call(isp->inputs[input].camera, core, s_power, 1);
        if (ret) {
                dev_err(isp->dev, "Failed to power-on sensor\n");
-               goto error;
+               return ret;
        }
        /*
         * Some sensor driver resets the run mode during power-on, thus force
                               0, isp->inputs[input].sensor_index, 0);
        if (ret && (ret != -ENOIOCTLCMD)) {
                dev_err(isp->dev, "Failed to select sensor\n");
-               goto error;
+               return ret;
        }
 
        if (!IS_ISP2401) {
        asd->input_curr = input;
        /* mark this camera is used by the current stream */
        isp->inputs[input].asd = asd;
-       mutex_unlock(&isp->mutex);
 
        return 0;
-
-error:
-       mutex_unlock(&isp->mutex);
-
-       return ret;
 }
 
 static int atomisp_enum_framesizes(struct file *file, void *priv,
                return -EINVAL;
        }
 
-       mutex_lock(&isp->mutex);
-
        rval = v4l2_subdev_call(camera, pad, enum_mbus_code, NULL, &code);
        if (rval == -ENOIOCTLCMD) {
                dev_warn(isp->dev,
                         "enum_mbus_code pad op not supported by %s. Please fix your sensor driver!\n",
                         camera->name);
        }
-       mutex_unlock(&isp->mutex);
 
        if (rval)
                return rval;
                               struct v4l2_format *f)
 {
        struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
        int ret;
 
        /*
        f->fmt.pix.width += pad_w;
        f->fmt.pix.height += pad_h;
 
-       mutex_lock(&isp->mutex);
        ret = atomisp_try_fmt(vdev, &f->fmt.pix, NULL);
-       mutex_unlock(&isp->mutex);
-
        if (ret)
                return ret;
 
                             struct v4l2_format *f)
 {
        struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
        struct atomisp_video_pipe *pipe;
 
-       mutex_lock(&isp->mutex);
        pipe = atomisp_to_video_pipe(vdev);
-       mutex_unlock(&isp->mutex);
 
        f->fmt.pix = pipe->pix;
 
                             struct v4l2_format *f)
 {
        struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
-       int ret;
 
-       mutex_lock(&isp->mutex);
-       ret = atomisp_set_fmt(vdev, f);
-       mutex_unlock(&isp->mutex);
-       return ret;
+       return atomisp_set_fmt(vdev, f);
 }
 
 /*
 int atomisp_reqbufs(struct file *file, void *fh,
                    struct v4l2_requestbuffers *req)
 {
-       struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
-       int ret;
-
-       mutex_lock(&isp->mutex);
-       ret = __atomisp_reqbufs(file, fh, req);
-       mutex_unlock(&isp->mutex);
-
-       return ret;
+       return __atomisp_reqbufs(file, fh, req);
 }
 
 /* application query the status of a buffer */
        u32 pgnr;
        int ret;
 
-       mutex_lock(&isp->mutex);
-
        ret = atomisp_pipe_check(pipe, false);
        if (ret)
-               goto error;
+               return ret;
 
        if (!buf || buf->index >= VIDEO_MAX_FRAME ||
            !pipe->capq.bufs[buf->index]) {
                dev_err(isp->dev, "Invalid index for qbuf.\n");
-               ret = -EINVAL;
-               goto error;
+               return -EINVAL;
        }
 
        /*
        if (buf->memory == V4L2_MEMORY_USERPTR) {
                if (offset_in_page(buf->m.userptr)) {
                        dev_err(isp->dev, "Error userptr is not page aligned.\n");
-                       ret = -EINVAL;
-                       goto error;
+                       return -EINVAL;
                }
 
                vb = pipe->capq.bufs[buf->index];
                vm_mem = vb->priv;
-               if (!vm_mem) {
-                       ret = -EINVAL;
-                       goto error;
-               }
+               if (!vm_mem)
+                       return -EINVAL;
 
                length = vb->bsize;
                pgnr = (length + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
                        goto done;
 
                if (atomisp_get_css_frame_info(asd,
-                                              atomisp_subdev_source_pad(vdev), &frame_info)) {
-                       ret = -EIO;
-                       goto error;
-               }
+                                              atomisp_subdev_source_pad(vdev), &frame_info))
+                       return -EIO;
 
                ret = ia_css_frame_map(&handle, &frame_info,
                                            (void __user *)buf->m.userptr,
                                            pgnr);
                if (ret) {
                        dev_err(isp->dev, "Failed to map user buffer\n");
-                       goto error;
+                       return ret;
                }
 
                if (vm_mem->vaddr) {
        pipe->frame_params[buf->index] = NULL;
 
        mutex_unlock(&isp->mutex);
-
        ret = videobuf_qbuf(&pipe->capq, buf);
        mutex_lock(&isp->mutex);
        if (ret)
-               goto error;
+               return ret;
 
        /* TODO: do this better, not best way to queue to css */
        if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED) {
                        asd->pending_capture_request++;
                        dev_dbg(isp->dev, "Add one pending capture request.\n");
        }
-       mutex_unlock(&isp->mutex);
 
        dev_dbg(isp->dev, "qbuf buffer %d (%s) for asd%d\n", buf->index,
                vdev->name, asd->index);
 
-       return ret;
-
-error:
-       mutex_unlock(&isp->mutex);
-       return ret;
+       return 0;
 }
 
 static int __get_frame_exp_id(struct atomisp_video_pipe *pipe,
        struct atomisp_device *isp = video_get_drvdata(vdev);
        int ret;
 
-       mutex_lock(&isp->mutex);
        ret = atomisp_pipe_check(pipe, false);
-       mutex_unlock(&isp->mutex);
        if (ret)
                return ret;
 
+       mutex_unlock(&isp->mutex);
        ret = videobuf_dqbuf(&pipe->capq, buf, file->f_flags & O_NONBLOCK);
+       mutex_lock(&isp->mutex);
        if (ret) {
                if (ret != -EAGAIN)
                        dev_dbg(isp->dev, "<%s: %d\n", __func__, ret);
                return ret;
        }
-       mutex_lock(&isp->mutex);
+
        buf->bytesused = pipe->pix.sizeimage;
        buf->reserved = asd->frame_status[buf->index];
 
        if (!(buf->flags & V4L2_BUF_FLAG_ERROR))
                buf->reserved |= __get_frame_exp_id(pipe, buf) << 16;
        buf->reserved2 = pipe->frame_config_id[buf->index];
-       mutex_unlock(&isp->mutex);
 
        dev_dbg(isp->dev,
                "dqbuf buffer %d (%s) for asd%d with exp_id %d, isp_config_id %d\n",
                return -EINVAL;
        }
 
-       mutex_lock(&isp->mutex);
        ret = atomisp_pipe_check(pipe, false);
        if (ret)
-               goto out;
+               return ret;
 
        if (pipe->capq.streaming)
-               goto out;
+               return 0;
 
        /* Input system HW workaround */
        atomisp_dma_burst_len_cfg(asd);
        if (list_empty(&pipe->capq.stream)) {
                spin_unlock_irqrestore(&pipe->irq_lock, irqflags);
                dev_dbg(isp->dev, "no buffer in the queue\n");
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
        spin_unlock_irqrestore(&pipe->irq_lock, irqflags);
 
        ret = videobuf_streamon(&pipe->capq);
        if (ret)
-               goto out;
+               return ret;
 
        /* Reset pending capture request count. */
        asd->pending_capture_request = 0;
                        if (asd->delayed_init == ATOMISP_DELAYED_INIT_QUEUED) {
                                flush_work(&asd->delayed_init_work);
                                mutex_unlock(&isp->mutex);
-                               if (wait_for_completion_interruptible(
-                                       &asd->init_done) != 0)
-                                       return -ERESTARTSYS;
+                               ret = wait_for_completion_interruptible(&asd->init_done);
                                mutex_lock(&isp->mutex);
+                               if (ret != 0)
+                                       return -ERESTARTSYS;
                        }
 
                        /* handle per_frame_setting parameter and buffers */
                                        asd->params.offline_parm.num_captures,
                                        asd->params.offline_parm.skip_frames,
                                        asd->params.offline_parm.offset);
-                               if (ret) {
-                                       ret = -EINVAL;
-                                       goto out;
-                               }
+                               if (ret)
+                                       return -EINVAL;
+
                                if (asd->depth_mode->val)
                                        atomisp_pause_buffer_event(isp);
                        }
                }
                atomisp_qbuffers_to_css(asd);
-               goto out;
+               return 0;
        }
 
        if (asd->streaming == ATOMISP_DEVICE_STREAMING_ENABLED) {
 
        ret = atomisp_css_start(asd, css_pipe_id, false);
        if (ret)
-               goto out;
+               return ret;
 
        spin_lock_irqsave(&isp->lock, irqflags);
        asd->streaming = ATOMISP_DEVICE_STREAMING_ENABLED;
 
        /* Only start sensor when the last streaming instance started */
        if (atomisp_subdev_streaming_count(asd) < sensor_start_stream)
-               goto out;
+               return 0;
 
 start_sensor:
        if (isp->flash) {
                ret = atomisp_stream_on_master_slave_sensor(isp, false);
                if (ret) {
                        dev_err(isp->dev, "master slave sensor stream on failed!\n");
-                       goto out;
+                       return ret;
                }
                goto start_delay_wq;
        } else if (asd->depth_mode->val && (atomisp_streaming_count(isp) <
                spin_lock_irqsave(&isp->lock, irqflags);
                asd->streaming = ATOMISP_DEVICE_STREAMING_DISABLED;
                spin_unlock_irqrestore(&isp->lock, irqflags);
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
 start_delay_wq:
        } else {
                asd->delayed_init = ATOMISP_DELAYED_INIT_NOT_QUEUED;
        }
-out:
-       mutex_unlock(&isp->mutex);
-       return ret;
+
+       return 0;
 }
 
 int __atomisp_streamoff(struct file *file, void *fh, enum v4l2_buf_type type)
 static int atomisp_streamoff(struct file *file, void *fh,
                             enum v4l2_buf_type type)
 {
-       struct video_device *vdev = video_devdata(file);
-       struct atomisp_device *isp = video_get_drvdata(vdev);
-       int rval;
-
-       mutex_lock(&isp->mutex);
-       rval = __atomisp_streamoff(file, fh, type);
-       mutex_unlock(&isp->mutex);
-
-       return rval;
+       return __atomisp_streamoff(file, fh, type);
 }
 
 /*
        if (ret)
                return ret;
 
-       mutex_lock(&isp->mutex);
-
        switch (control->id) {
        case V4L2_CID_IRIS_ABSOLUTE:
        case V4L2_CID_EXPOSURE_ABSOLUTE:
        case V4L2_CID_TEST_PATTERN_COLOR_GR:
        case V4L2_CID_TEST_PATTERN_COLOR_GB:
        case V4L2_CID_TEST_PATTERN_COLOR_B:
-               mutex_unlock(&isp->mutex);
                return v4l2_g_ctrl(isp->inputs[asd->input_curr].camera->
                                   ctrl_handler, control);
        case V4L2_CID_COLORFX:
                break;
        }
 
-       mutex_unlock(&isp->mutex);
        return ret;
 }
 
        if (ret)
                return ret;
 
-       mutex_lock(&isp->mutex);
        switch (control->id) {
        case V4L2_CID_AUTO_N_PRESET_WHITE_BALANCE:
        case V4L2_CID_EXPOSURE:
        case V4L2_CID_TEST_PATTERN_COLOR_GR:
        case V4L2_CID_TEST_PATTERN_COLOR_GB:
        case V4L2_CID_TEST_PATTERN_COLOR_B:
-               mutex_unlock(&isp->mutex);
                return v4l2_s_ctrl(NULL,
                                   isp->inputs[asd->input_curr].camera->
                                   ctrl_handler, control);
                ret = -EINVAL;
                break;
        }
-       mutex_unlock(&isp->mutex);
        return ret;
 }
 
                                                &ctrl);
                        break;
                case V4L2_CID_ZOOM_ABSOLUTE:
-                       mutex_lock(&isp->mutex);
                        ret = atomisp_digital_zoom(asd, 0, &ctrl.value);
-                       mutex_unlock(&isp->mutex);
                        break;
                case V4L2_CID_G_SKIP_FRAMES:
                        ret = v4l2_subdev_call(
                case V4L2_CID_FLASH_STROBE:
                case V4L2_CID_FLASH_MODE:
                case V4L2_CID_FLASH_STATUS_REGISTER:
-                       mutex_lock(&isp->mutex);
                        if (isp->flash) {
                                ret =
                                    v4l2_s_ctrl(NULL, isp->flash->ctrl_handler,
                                        asd->params.num_flash_frames = 0;
                                }
                        }
-                       mutex_unlock(&isp->mutex);
                        break;
                case V4L2_CID_ZOOM_ABSOLUTE:
-                       mutex_lock(&isp->mutex);
                        ret = atomisp_digital_zoom(asd, 1, &ctrl.value);
-                       mutex_unlock(&isp->mutex);
                        break;
                default:
                        ctr = v4l2_ctrl_find(&asd->ctrl_handler, ctrl.id);
                return -EINVAL;
        }
 
-       mutex_lock(&isp->mutex);
        parm->parm.capture.capturemode = asd->run_mode->val;
-       mutex_unlock(&isp->mutex);
 
        return 0;
 }
                return -EINVAL;
        }
 
-       mutex_lock(&isp->mutex);
-
        asd->high_speed_mode = false;
        switch (parm->parm.capture.capturemode) {
        case CI_MODE_NONE: {
                                asd->high_speed_mode = true;
                }
 
-               goto out;
+               return rval == -ENOIOCTLCMD ? 0 : rval;
        }
        case CI_MODE_VIDEO:
                mode = ATOMISP_RUN_MODE_VIDEO;
                mode = ATOMISP_RUN_MODE_PREVIEW;
                break;
        default:
-               rval = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        rval = v4l2_ctrl_s_ctrl(asd->run_mode, mode);
 
-out:
-       mutex_unlock(&isp->mutex);
-
        return rval == -ENOIOCTLCMD ? 0 : rval;
 }
 
        else
                motor = isp->motor;
 
-       switch (cmd) {
-       case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:
-       case ATOMISP_IOC_S_EXPOSURE:
-       case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:
-       case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:
-       case ATOMISP_IOC_EXT_ISP_CTRL:
-       case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_INFO:
-       case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_MODE:
-       case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_MODE:
-       case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT:
-       case ATOMISP_IOC_S_SENSOR_EE_CONFIG:
-       case ATOMISP_IOC_G_UPDATE_EXPOSURE:
-               /* we do not need take isp->mutex for these IOCTLs */
-               break;
-       default:
-               mutex_lock(&isp->mutex);
-               break;
-       }
        switch (cmd) {
        case ATOMISP_IOC_S_SENSOR_RUNMODE:
                if (IS_ISP2401)
                break;
        }
 
-       switch (cmd) {
-       case ATOMISP_IOC_G_MOTOR_PRIV_INT_DATA:
-       case ATOMISP_IOC_S_EXPOSURE:
-       case ATOMISP_IOC_G_SENSOR_CALIBRATION_GROUP:
-       case ATOMISP_IOC_G_SENSOR_PRIV_INT_DATA:
-       case ATOMISP_IOC_EXT_ISP_CTRL:
-       case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_INFO:
-       case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_MODE:
-       case ATOMISP_IOC_G_SENSOR_AE_BRACKETING_MODE:
-       case ATOMISP_IOC_S_SENSOR_AE_BRACKETING_LUT:
-       case ATOMISP_IOC_G_UPDATE_EXPOSURE:
-               break;
-       default:
-               mutex_unlock(&isp->mutex);
-               break;
-       }
        return err;
 }