diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h
index bea52badaff7..a8d980e3b439 100644
--- a/include/libcamera/internal/camera_sensor.h
+++ b/include/libcamera/internal/camera_sensor.h
@@ -17,6 +17,7 @@
 #include <libcamera/control_ids.h>
 #include <libcamera/controls.h>
 #include <libcamera/geometry.h>
+#include <libcamera/transform.h>

 #include <libcamera/ipa/core_ipa_interface.h>

@@ -29,8 +30,6 @@ class BayerFormat;
 class CameraLens;
 class MediaEntity;

-enum class Transform;
-
 struct CameraSensorProperties;

 class CameraSensor : protected Loggable
@@ -55,7 +54,8 @@ public:

 	V4L2SubdeviceFormat getFormat(const std::vector<unsigned int> &mbusCodes,
 				      const Size &size) const;
-	int setFormat(V4L2SubdeviceFormat *format);
+	int setFormat(V4L2SubdeviceFormat *format,
+		      const Transform transform = Transform::Identity);

 	const ControlInfoMap &controls() const;
 	ControlList getControls(const std::vector<uint32_t> &ids);
diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
index 576faf971a05..69862de0585a 100644
--- a/include/libcamera/internal/v4l2_subdevice.h
+++ b/include/libcamera/internal/v4l2_subdevice.h
@@ -20,7 +20,6 @@

 #include <libcamera/color_space.h>
 #include <libcamera/geometry.h>
-#include <libcamera/transform.h>

 #include "libcamera/internal/formats.h"
 #include "libcamera/internal/media_object.h"
@@ -45,7 +44,6 @@ struct V4L2SubdeviceFormat {
 	uint32_t mbus_code;
 	Size size;
 	std::optional<ColorSpace> colorSpace;
-	Transform transform = Transform::Identity;

 	const std::string toString() const;
 	uint8_t bitsPerPixel() const;
diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp
index 274ed419ddfd..19f0ce6a47bb 100644
--- a/src/libcamera/camera_sensor.cpp
+++ b/src/libcamera/camera_sensor.cpp
@@ -16,7 +16,6 @@
 #include <string.h>

 #include <libcamera/property_ids.h>
-#include <libcamera/transform.h>

 #include <libcamera/base/utils.h>

@@ -751,7 +750,6 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
 		.mbus_code = bestCode,
 		.size = *bestSize,
 		.colorSpace = ColorSpace::Raw,
-		.transform = Transform::Identity,
 	};

 	return format;
@@ -760,6 +758,7 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
 /**
  * \brief Set the sensor output format
  * \param[in] format The desired sensor output format
+ * \param[in] transform The transform to be applied on the sensor. Defaults to Identity.
  *
  * If flips are writable they are configured according to the desired Transform.
  * Transform::Identity always corresponds to H/V flip being disabled if the
@@ -770,18 +769,16 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu
  *
  * \return 0 on success or a negative error code otherwise
  */
-int CameraSensor::setFormat(V4L2SubdeviceFormat *format)
+int CameraSensor::setFormat(V4L2SubdeviceFormat *format, const Transform transform)
 {
 	/* Configure flips if the sensor supports that. */
 	if (supportFlips_) {
 		ControlList flipCtrls(subdev_->controls());

 		flipCtrls.set(V4L2_CID_HFLIP,
-			      static_cast<int32_t>(!!(format->transform &
-						      Transform::HFlip)));
+			      static_cast<int32_t>(!!(transform & Transform::HFlip)));
 		flipCtrls.set(V4L2_CID_VFLIP,
-			      static_cast<int32_t>(!!(format->transform &
-						      Transform::VFlip)));
+			      static_cast<int32_t>(!!(transform & Transform::VFlip)));

 		int ret = subdev_->setControls(&flipCtrls);
 		if (ret)
diff --git a/src/libcamera/pipeline/ipu3/cio2.cpp b/src/libcamera/pipeline/ipu3/cio2.cpp
index a819884f762d..7400cb0b644c 100644
--- a/src/libcamera/pipeline/ipu3/cio2.cpp
+++ b/src/libcamera/pipeline/ipu3/cio2.cpp
@@ -194,8 +194,7 @@ int CIO2Device::configure(const Size &size, const Transform &transform,
 	 */
 	std::vector<unsigned int> mbusCodes = utils::map_keys(mbusCodesToPixelFormat);
 	sensorFormat = getSensorFormat(mbusCodes, size);
-	sensorFormat.transform = transform;
-	ret = sensor_->setFormat(&sensorFormat);
+	ret = sensor_->setFormat(&sensorFormat, transform);
 	if (ret)
 		return ret;

diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
index 77e860ab0e72..c0dd95513583 100644
--- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
+++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
@@ -832,13 +832,14 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)
 		}
 	}

-	/* First calculate the best sensor mode we can use based on the user request. */
+	/*
+	 * Calculate the best sensor mode we can use based on the user's
+	 * request, and apply it to the sensor with the cached transform, if
+	 * any.
+	 */
 	V4L2SubdeviceFormat sensorFormat = findBestFormat(data->sensorFormats_, rawStream ? sensorSize : maxSize, bitDepth);
-	/* Apply any cached transform. */
 	const RPiCameraConfiguration *rpiConfig = static_cast<const RPiCameraConfiguration *>(config);
-	sensorFormat.transform = rpiConfig->combinedTransform_;
-	/* Finally apply the format on the sensor. */
-	ret = data->sensor_->setFormat(&sensorFormat);
+	ret = data->sensor_->setFormat(&sensorFormat, rpiConfig->combinedTransform_);
 	if (ret)
 		return ret;

diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
index 5f22a29d02c6..8a30fe061d04 100644
--- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
+++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
@@ -125,6 +125,7 @@ public:
 	Status validate() override;

 	const V4L2SubdeviceFormat &sensorFormat() { return sensorFormat_; }
+	const Transform &combinedTransform() { return combinedTransform_; }

 private:
 	bool fitsAllPaths(const StreamConfiguration &cfg);
@@ -138,6 +139,7 @@ private:
 	const RkISP1CameraData *data_;

 	V4L2SubdeviceFormat sensorFormat_;
+	Transform combinedTransform_;
 };

 class PipelineHandlerRkISP1 : public PipelineHandler
@@ -591,7 +593,7 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate()
 	if (sensorFormat_.size.isNull())
 		sensorFormat_.size = sensor->resolution();

-	sensorFormat_.transform = combined;
+	combinedTransform_ = combined;

 	return status;
 }
@@ -720,7 +722,7 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)
 	V4L2SubdeviceFormat format = config->sensorFormat();
 	LOG(RkISP1, Debug) << "Configuring sensor with " << format;

-	ret = sensor->setFormat(&format);
+	ret = sensor->setFormat(&format, config->combinedTransform());
 	if (ret < 0)
 		return ret;

diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 38ff8b0c605b..15e8206a915c 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -216,13 +216,6 @@ const std::map<uint32_t, V4L2SubdeviceFormatInfo> formatInfoMap = {
  * resulting color space is acceptable.
  */

-/**
- * \var V4L2SubdeviceFormat::transform
- * \brief The transform (vertical/horizontal flips) to be applied on the subdev
- *
- * Default initialized to Identity (no transform).
- */
-
 /**
  * \brief Assemble and return a string describing the format
  * \return A string describing the V4L2SubdeviceFormat
