if (0 != ia_css_pipe_get_info(asd->stream_env[stream_index]
                .pipes[pipe_index], &info)) {
-               dev_err(isp->dev, "ia_css_pipe_get_info FAILED");
+               dev_dbg(isp->dev, "ia_css_pipe_get_info FAILED");
                return -EINVAL;
        }
 
 
        u16 source_pad = atomisp_subdev_source_pad(&pipe->vdev);
        int ret;
 
+       mutex_lock(&pipe->asd->isp->mutex); /* for get_css_frame_info() / set_fmt() */
+
+       /*
+        * When VIDIOC_S_FMT has not been called before VIDIOC_REQBUFS, then
+        * this will fail. Call atomisp_set_fmt() ourselves and try again.
+        */
        ret = atomisp_get_css_frame_info(pipe->asd, source_pad, &pipe->frame_info);
-       if (ret)
-               return ret;
+       if (ret) {
+               struct v4l2_format f = {
+                       .fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420,
+                       .fmt.pix.width = 10000,
+                       .fmt.pix.height = 10000,
+               };
+
+               ret = atomisp_set_fmt(&pipe->vdev, &f);
+               if (ret)
+                       goto out;
+
+               ret = atomisp_get_css_frame_info(pipe->asd, source_pad, &pipe->frame_info);
+               if (ret)
+                       goto out;
+       }
 
        atomisp_alloc_css_stat_bufs(pipe->asd, ATOMISP_INPUT_STREAM_GENERAL);
 
        *nplanes = 1;
        sizes[0] = PAGE_ALIGN(pipe->pix.sizeimage);
 
+out:
+       mutex_unlock(&pipe->asd->isp->mutex);
        return 0;
 }