diff --git a/include/libcamera/internal/matrix.h b/include/libcamera/internal/matrix.h
index 7a71028c473a..a055e6926c94 100644
--- a/include/libcamera/internal/matrix.h
+++ b/include/libcamera/internal/matrix.h
@@ -66,6 +66,8 @@ public:
 		return out.str();
 	}
 
+	Span<const T, Rows * Cols> data() const { return data_; }
+
 	Span<const T, Cols> operator[](size_t i) const
 	{
 		return Span<const T, Cols>{ &data_.data()[i * Cols], Cols };
diff --git a/src/ipa/rkisp1/algorithms/ccm.cpp b/src/ipa/rkisp1/algorithms/ccm.cpp
index e2b5cf4d313e..eb8ca39e56a8 100644
--- a/src/ipa/rkisp1/algorithms/ccm.cpp
+++ b/src/ipa/rkisp1/algorithms/ccm.cpp
@@ -120,12 +120,7 @@ void Ccm::process([[maybe_unused]] IPAContext &context,
 		  [[maybe_unused]] const rkisp1_stat_buffer *stats,
 		  ControlList &metadata)
 {
-	float m[9];
-	for (unsigned int i = 0; i < 3; i++) {
-		for (unsigned int j = 0; j < 3; j++)
-			m[i * 3 + j] = frameContext.ccm.ccm[i][j];
-	}
-	metadata.set(controls::ColourCorrectionMatrix, m);
+	metadata.set(controls::ColourCorrectionMatrix, frameContext.ccm.ccm.data());
 }
 
 REGISTER_IPA_ALGORITHM(Ccm, "Ccm")
diff --git a/src/libcamera/matrix.cpp b/src/libcamera/matrix.cpp
index 4d95a19bfbb9..d9d34867b0a3 100644
--- a/src/libcamera/matrix.cpp
+++ b/src/libcamera/matrix.cpp
@@ -52,6 +52,12 @@ LOG_DEFINE_CATEGORY(Matrix)
  * \return A string describing the matrix
  */
 
+/**
+ * \fn Matrix::data()
+ * \brief Access the internal data as a linear array
+ * \return A span referencing the internal data as a linear array
+ */
+
 /**
  * \fn Span<const T, Cols> Matrix::operator[](size_t i) const
  * \brief Index to a row in the matrix
