diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index a69de154..12a320d6 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -1393,60 +1393,64 @@ int V4L2Subdevice::getFormat(const Stream &stream, V4L2SubdeviceFormat *format,
  * \param[in] stream The stream the format is to be applied to
  * \param[inout] format The image bus format to apply to the stream
  * \param[in] whence The format to set, \ref V4L2Subdevice::ActiveFormat
  * "ActiveFormat" or \ref V4L2Subdevice::TryFormat "TryFormat"
  *
  * Apply the requested image format to the desired stream and return the
  * actually applied format parameters, as getFormat() would do.
  *
  * \return 0 on success or a negative error code otherwise
  */
 int V4L2Subdevice::setFormat(const Stream &stream, V4L2SubdeviceFormat *format,
 			     Whence whence)
 {
 	struct v4l2_subdev_format subdevFmt = {};
 	subdevFmt.which = whence;
 	subdevFmt.pad = stream.pad;
 	subdevFmt.stream = stream.stream;
 	subdevFmt.format.width = format->size.width;
 	subdevFmt.format.height = format->size.height;
 	subdevFmt.format.code = format->code;
 	subdevFmt.format.field = V4L2_FIELD_NONE;
 	if (format->colorSpace) {
 		fromColorSpace(format->colorSpace, subdevFmt.format);
 
 		/* The CSC flag is only applicable to source pads. */
 		if (entity_->pads()[stream.pad]->flags() & MEDIA_PAD_FL_SOURCE)
 			subdevFmt.format.flags |= V4L2_MBUS_FRAMEFMT_SET_CSC;
 	}
 
 	int ret = ioctl(VIDIOC_SUBDEV_S_FMT, &subdevFmt);
+	/* Fixed-format subdevices may not implement a format setter. */
+	if (ret == -ENOTTY)
+		return getFormat(stream, format, whence);
+
 	if (ret) {
 		LOG(V4L2, Error)
 			<< "Unable to set format on pad " << stream << ": "
 			<< strerror(-ret);
 		return ret;
 	}
 
 	format->size.width = subdevFmt.format.width;
 	format->size.height = subdevFmt.format.height;
 	format->code = subdevFmt.format.code;
 	format->colorSpace = toColorSpace(subdevFmt.format);
 
 	return 0;
 }
 
 /**
  * \fn V4L2Subdevice::setFormat(unsigned int pad, V4L2SubdeviceFormat *format,
  * Whence whence)
  * \brief Set an image format on one of the V4L2 subdevice pads
  * \param[in] pad The 0-indexed pad number the format is to be applied to
  * \param[inout] format The image bus format to apply to the subdevice's pad
  * \param[in] whence The format to set, \ref V4L2Subdevice::ActiveFormat
  * "ActiveFormat" or \ref V4L2Subdevice::TryFormat "TryFormat"
  *
  * Apply the requested image format to the desired media pad and return the
  * actually applied format parameters, as getFormat() would do.
  *
  * \return 0 on success or a negative error code otherwise
  */
 
