public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Justin M. Forbes <jforbes@fedoraproject.org>
To: git-commits@fedoraproject.org
Subject: [rpms/kernel] f45: kernel-7.2.5-300
Date: Fri, 11 Sep 2026 13:36:39 GMT [thread overview]
Message-ID: <178913379978.1.16137527068738354857.rpms-kernel-6cf29d2c121f@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/kernel
Branch : f45
Commit : 6cf29d2c121fe8b56fca6680017832ac63b9375d
Author : Justin M. Forbes <jforbes@fedoraproject.org>
Date : 2026-09-11T07:36:23-06:00
Stats : +1258/-44 in 44 file(s)
URL : https://src.fedoraproject.org/rpms/kernel/c/6cf29d2c121fe8b56fca6680017832ac63b9375d?branch=f45
Log:
kernel-7.2.5-300
* Fri Sep 11 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.5-0]
- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
- media: ipu-bridge: Add Sony IMX471 for Lenovo X1 Carbon G14 (Kate Hsuan)
- media: ipu-bridge: Add DMI information of Lenovo X9 to the image upside-down list (Kate Hsuan)
- media: i2c: imx471: Fix uninitialized error value in imx471_set_ctrl() (David Carlier)
- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
- Input: soc_button_array - check btns_desc->package.count (Hans de Goede)
- Input: soc_button_array - fix MS Surface Pro 11 probe failure (Hans de Goede)
- Linux v7.2.5
Resolves:
Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
---
diff --git a/Patchlist.changelog b/Patchlist.changelog
index 6a6f2c3..b721926 100644
--- a/Patchlist.changelog
+++ b/Patchlist.changelog
@@ -1,3 +1,21 @@
+https://gitlab.com/cki-project/kernel-ark/-/commit/1d465dd5a33c5477835471da15f11547a8b5ae5f
+ 1d465dd5a33c5477835471da15f11547a8b5ae5f media: ipu-bridge: Add Sony IMX471 for Lenovo X1 Carbon G14
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/6bacf6aefa05430523eb895588a472f3358cffca
+ 6bacf6aefa05430523eb895588a472f3358cffca media: ipu-bridge: Add DMI information of Lenovo X9 to the image upside-down list
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/598b1ebda96c8c84031813ce3fe265b19cf3fb98
+ 598b1ebda96c8c84031813ce3fe265b19cf3fb98 media: i2c: imx471: Fix uninitialized error value in imx471_set_ctrl()
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/43fc8de53d62ace079572533a1c92c1ce16b3f2a
+ 43fc8de53d62ace079572533a1c92c1ce16b3f2a media: i2c: imx471: Add Sony IMX471 image sensor driver
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/dd9af2ae6de3d3313ef492dae26a14cd4d59ba8e
+ dd9af2ae6de3d3313ef492dae26a14cd4d59ba8e Input: soc_button_array - check btns_desc->package.count
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/3ba796e00e35e1ab65fc0d3644b6c114216a0354
+ 3ba796e00e35e1ab65fc0d3644b6c114216a0354 Input: soc_button_array - fix MS Surface Pro 11 probe failure
+
https://gitlab.com/cki-project/kernel-ark/-/commit/e8406125b1518ccea6da3a6d24c083d1266e86c2
e8406125b1518ccea6da3a6d24c083d1266e86c2 Bluetooth: btusb: limit RTL8761B BROKEN_EXT_SCAN quirk to 0bda:a728
diff --git a/kernel-aarch64-16k-debug-fedora.config b/kernel-aarch64-16k-debug-fedora.config
index c22e074..2578696 100644
--- a/kernel-aarch64-16k-debug-fedora.config
+++ b/kernel-aarch64-16k-debug-fedora.config
@@ -10454,6 +10454,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-16k-fedora.config b/kernel-aarch64-16k-fedora.config
index d0da2d2..e3321fb 100644
--- a/kernel-aarch64-16k-fedora.config
+++ b/kernel-aarch64-16k-fedora.config
@@ -10420,6 +10420,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-64k-debug-rhel.config b/kernel-aarch64-64k-debug-rhel.config
index 0c3e704..803c2bf 100644
--- a/kernel-aarch64-64k-debug-rhel.config
+++ b/kernel-aarch64-64k-debug-rhel.config
@@ -8532,6 +8532,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-64k-rhel.config b/kernel-aarch64-64k-rhel.config
index 5d4c4d4..f7365c0 100644
--- a/kernel-aarch64-64k-rhel.config
+++ b/kernel-aarch64-64k-rhel.config
@@ -8503,6 +8503,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-debug-fedora.config b/kernel-aarch64-debug-fedora.config
index 8c1b52f..b985ecc 100644
--- a/kernel-aarch64-debug-fedora.config
+++ b/kernel-aarch64-debug-fedora.config
@@ -10453,6 +10453,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-debug-rhel.config b/kernel-aarch64-debug-rhel.config
index 0833ee1..4f01a07 100644
--- a/kernel-aarch64-debug-rhel.config
+++ b/kernel-aarch64-debug-rhel.config
@@ -8529,6 +8529,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-fedora.config b/kernel-aarch64-fedora.config
index 70ce8f6..e4a2a02 100644
--- a/kernel-aarch64-fedora.config
+++ b/kernel-aarch64-fedora.config
@@ -10419,6 +10419,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-rhel.config b/kernel-aarch64-rhel.config
index 9dff18b..feca64d 100644
--- a/kernel-aarch64-rhel.config
+++ b/kernel-aarch64-rhel.config
@@ -8500,6 +8500,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-rt-64k-debug-fedora.config b/kernel-aarch64-rt-64k-debug-fedora.config
index fd4b320..7746251 100644
--- a/kernel-aarch64-rt-64k-debug-fedora.config
+++ b/kernel-aarch64-rt-64k-debug-fedora.config
@@ -10469,6 +10469,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-rt-64k-debug-rhel.config b/kernel-aarch64-rt-64k-debug-rhel.config
index 245f2bd..d0ae551 100644
--- a/kernel-aarch64-rt-64k-debug-rhel.config
+++ b/kernel-aarch64-rt-64k-debug-rhel.config
@@ -8579,6 +8579,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-rt-64k-fedora.config b/kernel-aarch64-rt-64k-fedora.config
index 02a81df..29c326a 100644
--- a/kernel-aarch64-rt-64k-fedora.config
+++ b/kernel-aarch64-rt-64k-fedora.config
@@ -10435,6 +10435,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-rt-64k-rhel.config b/kernel-aarch64-rt-64k-rhel.config
index 4f847f2..c10ccf7 100644
--- a/kernel-aarch64-rt-64k-rhel.config
+++ b/kernel-aarch64-rt-64k-rhel.config
@@ -8550,6 +8550,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-rt-debug-fedora.config b/kernel-aarch64-rt-debug-fedora.config
index b00ea7d..78b1cda 100644
--- a/kernel-aarch64-rt-debug-fedora.config
+++ b/kernel-aarch64-rt-debug-fedora.config
@@ -10465,6 +10465,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-rt-debug-rhel.config b/kernel-aarch64-rt-debug-rhel.config
index f527ee6..d7ceb57 100644
--- a/kernel-aarch64-rt-debug-rhel.config
+++ b/kernel-aarch64-rt-debug-rhel.config
@@ -8575,6 +8575,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-aarch64-rt-fedora.config b/kernel-aarch64-rt-fedora.config
index bdf8078..721f01b 100644
--- a/kernel-aarch64-rt-fedora.config
+++ b/kernel-aarch64-rt-fedora.config
@@ -10431,6 +10431,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
CONFIG_VIDEO_IMX7_CSI=m
CONFIG_VIDEO_IMX8_ISI=m
CONFIG_VIDEO_IMX8_ISI_M2M=y
diff --git a/kernel-aarch64-rt-rhel.config b/kernel-aarch64-rt-rhel.config
index 2a8ee18..9b07213 100644
--- a/kernel-aarch64-rt-rhel.config
+++ b/kernel-aarch64-rt-rhel.config
@@ -8546,6 +8546,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_IMX7_CSI is not set
# CONFIG_VIDEO_IMX8_ISI is not set
# CONFIG_VIDEO_IMX8MQ_MIPI_CSI2 is not set
diff --git a/kernel-ppc64le-debug-fedora.config b/kernel-ppc64le-debug-fedora.config
index ad686b0..ee0f334 100644
--- a/kernel-ppc64le-debug-fedora.config
+++ b/kernel-ppc64le-debug-fedora.config
@@ -8446,6 +8446,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-ppc64le-debug-rhel.config b/kernel-ppc64le-debug-rhel.config
index 9795322..efed80e 100644
--- a/kernel-ppc64le-debug-rhel.config
+++ b/kernel-ppc64le-debug-rhel.config
@@ -7913,6 +7913,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-ppc64le-fedora.config b/kernel-ppc64le-fedora.config
index 81445d7..c900433 100644
--- a/kernel-ppc64le-fedora.config
+++ b/kernel-ppc64le-fedora.config
@@ -8411,6 +8411,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-ppc64le-rhel.config b/kernel-ppc64le-rhel.config
index 1467aae..3a5a77c 100644
--- a/kernel-ppc64le-rhel.config
+++ b/kernel-ppc64le-rhel.config
@@ -7886,6 +7886,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-riscv64-debug-fedora.config b/kernel-riscv64-debug-fedora.config
index 5b11306..36c5096 100644
--- a/kernel-riscv64-debug-fedora.config
+++ b/kernel-riscv64-debug-fedora.config
@@ -8625,6 +8625,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-riscv64-debug-rhel.config b/kernel-riscv64-debug-rhel.config
index d3f5a2c..f700dd6 100644
--- a/kernel-riscv64-debug-rhel.config
+++ b/kernel-riscv64-debug-rhel.config
@@ -7995,6 +7995,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-riscv64-fedora.config b/kernel-riscv64-fedora.config
index fb5dc6b..d17aba2 100644
--- a/kernel-riscv64-fedora.config
+++ b/kernel-riscv64-fedora.config
@@ -8590,6 +8590,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-riscv64-rhel.config b/kernel-riscv64-rhel.config
index 701da59..7654aac 100644
--- a/kernel-riscv64-rhel.config
+++ b/kernel-riscv64-rhel.config
@@ -7968,6 +7968,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-riscv64-rt-debug-fedora.config b/kernel-riscv64-rt-debug-fedora.config
index 61b78c8..3710a77 100644
--- a/kernel-riscv64-rt-debug-fedora.config
+++ b/kernel-riscv64-rt-debug-fedora.config
@@ -8637,6 +8637,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-riscv64-rt-fedora.config b/kernel-riscv64-rt-fedora.config
index 6cdcf28..faf9645 100644
--- a/kernel-riscv64-rt-fedora.config
+++ b/kernel-riscv64-rt-fedora.config
@@ -8602,6 +8602,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-s390x-debug-fedora.config b/kernel-s390x-debug-fedora.config
index 849a06d..34cf781 100644
--- a/kernel-s390x-debug-fedora.config
+++ b/kernel-s390x-debug-fedora.config
@@ -8400,6 +8400,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-s390x-debug-rhel.config b/kernel-s390x-debug-rhel.config
index ddbe6d9..fb13656 100644
--- a/kernel-s390x-debug-rhel.config
+++ b/kernel-s390x-debug-rhel.config
@@ -7905,6 +7905,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-s390x-fedora.config b/kernel-s390x-fedora.config
index 89978a6..1eb8d70 100644
--- a/kernel-s390x-fedora.config
+++ b/kernel-s390x-fedora.config
@@ -8365,6 +8365,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
diff --git a/kernel-s390x-rhel.config b/kernel-s390x-rhel.config
index c5a4bbe..c6f9eb2 100644
--- a/kernel-s390x-rhel.config
+++ b/kernel-s390x-rhel.config
@@ -7878,6 +7878,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-s390x-zfcpdump-rhel.config b/kernel-s390x-zfcpdump-rhel.config
index f063a43..ba07d75 100644
--- a/kernel-s390x-zfcpdump-rhel.config
+++ b/kernel-s390x-zfcpdump-rhel.config
@@ -7898,6 +7898,7 @@ CONFIG_VIDEO_FB_IVTV=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
# CONFIG_VIDEO_INTEL_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-x86_64-debug-fedora.config b/kernel-x86_64-debug-fedora.config
index 4d39a11..9e32572 100644
--- a/kernel-x86_64-debug-fedora.config
+++ b/kernel-x86_64-debug-fedora.config
@@ -9042,6 +9042,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_CVS=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
diff --git a/kernel-x86_64-debug-rhel.config b/kernel-x86_64-debug-rhel.config
index 6dd508a..6c004a7 100644
--- a/kernel-x86_64-debug-rhel.config
+++ b/kernel-x86_64-debug-rhel.config
@@ -8290,6 +8290,7 @@ CONFIG_VIDEO_HI556=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
CONFIG_VIDEO_INTEL_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-x86_64-fedora.config b/kernel-x86_64-fedora.config
index 27ff4f1..20dc527 100644
--- a/kernel-x86_64-fedora.config
+++ b/kernel-x86_64-fedora.config
@@ -9008,6 +9008,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_CVS=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
diff --git a/kernel-x86_64-rhel.config b/kernel-x86_64-rhel.config
index 42edd27..3a37fc6 100644
--- a/kernel-x86_64-rhel.config
+++ b/kernel-x86_64-rhel.config
@@ -8262,6 +8262,7 @@ CONFIG_VIDEO_HI556=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
CONFIG_VIDEO_INTEL_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-x86_64-rt-debug-fedora.config b/kernel-x86_64-rt-debug-fedora.config
index 782d6ae..76a7d64 100644
--- a/kernel-x86_64-rt-debug-fedora.config
+++ b/kernel-x86_64-rt-debug-fedora.config
@@ -9054,6 +9054,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_CVS=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
diff --git a/kernel-x86_64-rt-debug-rhel.config b/kernel-x86_64-rt-debug-rhel.config
index c415aec..9f2c159 100644
--- a/kernel-x86_64-rt-debug-rhel.config
+++ b/kernel-x86_64-rt-debug-rhel.config
@@ -8336,6 +8336,7 @@ CONFIG_VIDEO_HI556=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
CONFIG_VIDEO_INTEL_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel-x86_64-rt-fedora.config b/kernel-x86_64-rt-fedora.config
index 3d401d6..9269bed 100644
--- a/kernel-x86_64-rt-fedora.config
+++ b/kernel-x86_64-rt-fedora.config
@@ -9020,6 +9020,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_CVS=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
diff --git a/kernel-x86_64-rt-rhel.config b/kernel-x86_64-rt-rhel.config
index c011d19..bc66561 100644
--- a/kernel-x86_64-rt-rhel.config
+++ b/kernel-x86_64-rt-rhel.config
@@ -8308,6 +8308,7 @@ CONFIG_VIDEO_HI556=m
# CONFIG_VIDEO_IMX355 is not set
# CONFIG_VIDEO_IMX412 is not set
# CONFIG_VIDEO_IMX415 is not set
+# CONFIG_VIDEO_IMX471 is not set
# CONFIG_VIDEO_INTEL_CVS is not set
CONFIG_VIDEO_INTEL_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
diff --git a/kernel.changelog b/kernel.changelog
index 2588181..6dbcfec 100644
--- a/kernel.changelog
+++ b/kernel.changelog
@@ -1,3 +1,14 @@
+* Fri Sep 11 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.5-0]
+- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
+- media: ipu-bridge: Add Sony IMX471 for Lenovo X1 Carbon G14 (Kate Hsuan)
+- media: ipu-bridge: Add DMI information of Lenovo X9 to the image upside-down list (Kate Hsuan)
+- media: i2c: imx471: Fix uninitialized error value in imx471_set_ctrl() (David Carlier)
+- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
+- Input: soc_button_array - check btns_desc->package.count (Hans de Goede)
+- Input: soc_button_array - fix MS Surface Pro 11 probe failure (Hans de Goede)
+- Linux v7.2.5
+Resolves:
+
* Mon Sep 07 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.4-0]
- Remove unnecessary config file for Fedora (Justin M. Forbes)
- Add F43 and F44 to release_targets (Justin M. Forbes)
diff --git a/kernel.spec b/kernel.spec
index bc3bdb2..8d2c27f 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -192,18 +192,18 @@ Summary: The Linux kernel
# the --with-release option overrides this setting.)
%define debugbuildsenabled 1
# define buildid .local
-%define specrpmversion 7.2.4
-%define specversion 7.2.4
+%define specrpmversion 7.2.5
+%define specversion 7.2.5
%define patchversion 7.2
%define pkgrelease 300
%define kversion 7
-%define tarfile_release 7.2.4
+%define tarfile_release 7.2.5
# This is needed to do merge window version magic
%define patchlevel 2
# This allows pkg_release to have configurable %%{?dist} tag
%define specrelease 300%{?buildid}%{?dist}
# This defines the kabi tarball version
-%define kabiversion 7.2.4
+%define kabiversion 7.2.5
# If this variable is set to 1, a bpf selftests build failure will cause a
# fatal kernel package build error
@@ -4964,6 +4964,19 @@ fi\
#
#
%changelog
+* Fri Sep 11 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.5-300]
+- BugsFixed and RHEL config for 7.2.5 (Justin M. Forbes)
+
+* Fri Sep 11 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.5-0]
+- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
+- media: ipu-bridge: Add Sony IMX471 for Lenovo X1 Carbon G14 (Kate Hsuan)
+- media: ipu-bridge: Add DMI information of Lenovo X9 to the image upside-down list (Kate Hsuan)
+- media: i2c: imx471: Fix uninitialized error value in imx471_set_ctrl() (David Carlier)
+- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
+- Input: soc_button_array - check btns_desc->package.count (Hans de Goede)
+- Input: soc_button_array - fix MS Surface Pro 11 probe failure (Hans de Goede)
+- Linux v7.2.5
+
* Mon Sep 07 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.2.4-0]
- Remove unnecessary config file for Fedora (Justin M. Forbes)
- Add F43 and F44 to release_targets (Justin M. Forbes)
diff --git a/patch-7.2-redhat.patch b/patch-7.2-redhat.patch
index 49ad6f5..3b3b478 100644
--- a/patch-7.2-redhat.patch
+++ b/patch-7.2-redhat.patch
@@ -1,59 +1,65 @@
- Documentation/admin-guide/sysctl/crypto.rst | 36 ++++++
- Documentation/crypto/userspace-if.rst | 13 ++-
- Makefile | 30 +++++
+ Documentation/admin-guide/sysctl/crypto.rst | 36 +
+ Documentation/crypto/userspace-if.rst | 13 +-
+ MAINTAINERS | 6 +
+ Makefile | 30 +
arch/arm/Kconfig | 4 +-
arch/arm64/Kconfig | 2 +-
- arch/arm64/kernel/setup.c | 27 +++++
+ arch/arm64/kernel/setup.c | 27 +
arch/s390/include/asm/ipl.h | 1 +
arch/s390/kernel/ipl.c | 5 +
arch/s390/kernel/setup.c | 4 +
- arch/x86/kernel/setup.c | 22 ++--
- crypto/af_alg.c | 76 +++++++++++-
+ arch/x86/kernel/setup.c | 22 +-
+ crypto/af_alg.c | 76 +-
crypto/akcipher.c | 3 +-
- crypto/algif_aead.c | 11 ++
- crypto/algif_hash.c | 24 ++++
- crypto/algif_rng.c | 9 ++
- crypto/algif_skcipher.c | 27 ++++-
- crypto/dh.c | 25 ++++
- crypto/seqiv.c | 15 ++-
+ crypto/algif_aead.c | 11 +
+ crypto/algif_hash.c | 24 +
+ crypto/algif_rng.c | 9 +
+ crypto/algif_skcipher.c | 27 +-
+ crypto/dh.c | 25 +
+ crypto/seqiv.c | 15 +-
crypto/sig.c | 3 +-
crypto/testmgr.c | 6 +-
- drivers/acpi/apei/hest.c | 8 ++
- drivers/acpi/irq.c | 17 ++-
- drivers/acpi/scan.c | 9 ++
- drivers/ata/libahci.c | 18 +++
- drivers/char/ipmi/ipmi_dmi.c | 15 +++
- drivers/char/ipmi/ipmi_msghandler.c | 16 ++-
- drivers/char/random.c | 128 ++++++++++++++++++++-
+ drivers/acpi/apei/hest.c | 8 +
+ drivers/acpi/irq.c | 17 +-
+ drivers/acpi/scan.c | 9 +
+ drivers/ata/libahci.c | 18 +
+ drivers/char/ipmi/ipmi_dmi.c | 15 +
+ drivers/char/ipmi/ipmi_msghandler.c | 16 +-
+ drivers/char/random.c | 128 ++-
drivers/firmware/efi/Makefile | 1 +
- drivers/firmware/efi/efi.c | 124 +++++++++++++++-----
+ drivers/firmware/efi/efi.c | 124 ++-
drivers/firmware/efi/libstub/fdt.c | 5 +
- drivers/firmware/efi/libstub/secureboot.c | 14 ++-
- drivers/firmware/efi/secureboot.c | 38 ++++++
- drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 +++
- drivers/iommu/iommu.c | 22 ++++
+ drivers/firmware/efi/libstub/secureboot.c | 14 +-
+ drivers/firmware/efi/secureboot.c | 38 +
+ drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 +
+ drivers/input/misc/soc_button_array.c | 16 +-
+ drivers/iommu/iommu.c | 22 +
+ drivers/media/i2c/Kconfig | 10 +
+ drivers/media/i2c/Makefile | 1 +
drivers/media/i2c/cvs/core.c | 3 +
drivers/media/i2c/cvs/icvs.h | 2 -
- drivers/media/i2c/cvs/v4l2.c | 17 ++-
- drivers/pci/quirks.c | 24 ++++
- drivers/usb/core/hub.c | 7 ++
- include/crypto/if_alg.h | 42 ++++---
+ drivers/media/i2c/cvs/v4l2.c | 17 +-
+ drivers/media/i2c/imx471.c | 957 +++++++++++++++++++++
+ drivers/media/pci/intel/ipu-bridge.c | 41 +
+ drivers/pci/quirks.c | 24 +
+ drivers/usb/core/hub.c | 7 +
+ include/crypto/if_alg.h | 42 +-
include/linux/crypto.h | 2 +
- include/linux/efi.h | 22 ++--
+ include/linux/efi.h | 22 +-
include/linux/lsm_hook_defs.h | 1 +
- include/linux/random.h | 10 ++
- include/linux/security.h | 9 ++
+ include/linux/random.h | 10 +
+ include/linux/security.h | 9 +
kernel/module/signing.c | 9 +-
net/core/page_pool.c | 3 +-
scripts/Makefile.lib | 3 +
scripts/tags.sh | 2 +
security/integrity/platform_certs/load_uefi.c | 6 +-
- security/lockdown/Kconfig | 13 +++
- security/lockdown/lockdown.c | 11 ++
- tools/testing/selftests/bpf/DENYLIST.rhel | 76 ++++++++++++
+ security/lockdown/Kconfig | 13 +
+ security/lockdown/lockdown.c | 11 +
+ tools/testing/selftests/bpf/DENYLIST.rhel | 76 ++
tools/testing/selftests/bpf/Makefile | 2 +-
- tools/testing/selftests/bpf/prog_tests/ksyms_btf.c | 31 -----
- 55 files changed, 928 insertions(+), 144 deletions(-)
+ tools/testing/selftests/bpf/prog_tests/ksyms_btf.c | 31 -
+ 61 files changed, 1955 insertions(+), 148 deletions(-)
diff --git a/Documentation/admin-guide/sysctl/crypto.rst b/Documentation/admin-guide/sysctl/crypto.rst
index b707bd314a64..9a1bd53287f4 100644
@@ -130,8 +136,25 @@ index ab93300c8e04..d6194346e366 100644
Deprecation
-----------
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 8014b9f8253e..62e6c97ee9b2 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -25262,6 +25262,12 @@ T: git git://linuxtv.org/media.git
+ F: Documentation/devicetree/bindings/media/i2c/sony,imx415.yaml
+ F: drivers/media/i2c/imx415.c
+
++SONY IMX471 SENSOR DRIVER
++M: Kate Hsuan <hpa@redhat.com>
++L: linux-media@vger.kernel.org
++S: Maintained
++F: drivers/media/i2c/imx471.c
++
+ SONY MEMORYSTICK SUBSYSTEM
+ M: Maxim Levitsky <maximlevitsky@gmail.com>
+ M: Alex Dubov <oakad@yahoo.com>
diff --git a/Makefile b/Makefile
-index 91d6e74db4dc..da3ae4b426e4 100644
+index 408e8512b713..f1bdadfd7229 100644
--- a/Makefile
+++ b/Makefile
@@ -358,6 +358,17 @@ ifneq ($(filter install,$(MAKECMDGOALS)),)
@@ -1466,6 +1489,61 @@ index 14bb31bd6a0b..0529359d7440 100644
amba_driver_unregister(&etm4x_amba_driver);
platform_driver_unregister(&etm4_platform_driver);
etm4_pm_clear();
+diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
+index b8cad415c62c..f08e29af531f 100644
+--- a/drivers/input/misc/soc_button_array.c
++++ b/drivers/input/misc/soc_button_array.c
+@@ -16,6 +16,7 @@
+ #include <linux/gpio/consumer.h>
+ #include <linux/gpio_keys.h>
+ #include <linux/gpio.h>
++#include <linux/platform_data/x86/soc.h>
+ #include <linux/platform_device.h>
+
+ static bool use_low_level_irq;
+@@ -160,7 +161,7 @@ soc_button_device_create(struct platform_device *pdev,
+ struct gpio_keys_platform_data *gpio_keys_pdata;
+ const struct dmi_system_id *dmi_id;
+ int invalid_acpi_index = -1;
+- int error, gpio, irq;
++ int error, gpio, irq = 0;
+ int n_buttons = 0;
+
+ for (info = button_info; info->name; info++)
+@@ -191,8 +192,9 @@ soc_button_device_create(struct platform_device *pdev,
+ error = soc_button_lookup_gpio(&pdev->dev, info->acpi_index, &gpio, &irq);
+ if (error || irq < 0) {
+ /*
+- * Skip GPIO if not present. Note we deliberately
+- * ignore -EPROBE_DEFER errors here. On some devices
++ * Propagate -EPROBE_DEFER, skip button on other errors.
++ *
++ * -EPROBE_DEFER is ignored on Bay & Cherry Trail. Here
+ * Intel is using so called virtual GPIOs which are not
+ * GPIOs at all but some way for AML code to check some
+ * random status bits without need a custom opregion.
+@@ -201,6 +203,12 @@ soc_button_device_create(struct platform_device *pdev,
+ * we do not have a driver for these so they will never
+ * show up, therefore we ignore -EPROBE_DEFER.
+ */
++ if ((error == -EPROBE_DEFER || irq == -EPROBE_DEFER) &&
++ !(soc_intel_is_byt() || soc_intel_is_cht())) {
++ error = -EPROBE_DEFER;
++ goto err_free_mem;
++ }
++
+ continue;
+ }
+
+@@ -369,7 +377,7 @@ static struct soc_button_info *soc_button_get_button_info(struct device *dev)
+ }
+ }
+
+- if (!btns_desc) {
++ if (!btns_desc || !btns_desc->package.count) {
+ dev_err(dev, "ACPI Button Descriptors not found\n");
+ button_info = ERR_PTR(-ENODEV);
+ goto out;
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 23a531595835..2f8952a08112 100644
--- a/drivers/iommu/iommu.c
@@ -1506,6 +1584,39 @@ index 23a531595835..2f8952a08112 100644
/**
* iommu_setup_default_domain - Set the default_domain for the group
* @group: Group to change
+diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig
+index 5d173e0ecf42..b7199f9f5a0c 100644
+--- a/drivers/media/i2c/Kconfig
++++ b/drivers/media/i2c/Kconfig
+@@ -287,6 +287,16 @@ config VIDEO_IMX415
+ To compile this driver as a module, choose M here: the
+ module will be called imx415.
+
++config VIDEO_IMX471
++ tristate "Sony IMX471 sensor support"
++ select V4L2_CCI_I2C
++ help
++ This is a Video4Linux2 sensor driver for the Sony
++ IMX471 camera.
++
++ To compile this driver as a module, choose M here: the
++ module will be called imx471.
++
+ config VIDEO_MAX9271_LIB
+ tristate
+
+diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
+index e45359efe0e4..acbd321fc12e 100644
+--- a/drivers/media/i2c/Makefile
++++ b/drivers/media/i2c/Makefile
+@@ -61,6 +61,7 @@ obj-$(CONFIG_VIDEO_IMX335) += imx335.o
+ obj-$(CONFIG_VIDEO_IMX355) += imx355.o
+ obj-$(CONFIG_VIDEO_IMX412) += imx412.o
+ obj-$(CONFIG_VIDEO_IMX415) += imx415.o
++obj-$(CONFIG_VIDEO_IMX471) += imx471.o
+ obj-$(CONFIG_VIDEO_IR_I2C) += ir-kbd-i2c.o
+ obj-$(CONFIG_VIDEO_ISL7998X) += isl7998x.o
+ obj-$(CONFIG_VIDEO_KS0127) += ks0127.o
diff --git a/drivers/media/i2c/cvs/core.c b/drivers/media/i2c/cvs/core.c
index fe9e59ac311c..d4a3b9c3bab1 100644
--- a/drivers/media/i2c/cvs/core.c
@@ -1618,6 +1729,1028 @@ index 3a1ec0059ef7..9fadca7a3bee 100644
cfg->link_freq = freq;
return 0;
+diff --git a/drivers/media/i2c/imx471.c b/drivers/media/i2c/imx471.c
+new file mode 100644
+index 000000000000..4053aed84340
+--- /dev/null
++++ b/drivers/media/i2c/imx471.c
+@@ -0,0 +1,957 @@
++// SPDX-License-Identifier: GPL-2.0
++/*
++ * imx471.c - imx471 sensor driver
++ *
++ * Copyright (C) 2025 Intel Corporation
++ * Copyright (C) 2026 Kate Hsuan <hpa@redhat.com>
++ */
++
++#include <linux/clk.h>
++#include <linux/delay.h>
++#include <linux/i2c.h>
++#include <linux/module.h>
++#include <linux/pm_runtime.h>
++#include <linux/regulator/consumer.h>
++#include <media/v4l2-cci.h>
++#include <media/v4l2-ctrls.h>
++#include <media/v4l2-subdev.h>
++#include <media/v4l2-fwnode.h>
++
++#define IMX471_REG_MODE_SELECT CCI_REG8(0x0100)
++#define IMX471_MODE_STANDBY 0x00
++#define IMX471_MODE_STREAMING 0x01
++
++/* Chip ID */
++#define IMX471_REG_CHIP_ID CCI_REG16(0x0016)
++#define IMX471_CHIP_ID 0x0471
++
++/* V_TIMING internal */
++#define IMX471_REG_FLL CCI_REG16(0x0340)
++#define IMX471_FLL_MAX 0xffff
++
++/* Exposure control */
++#define IMX471_REG_EXPOSURE CCI_REG16(0x0202)
++#define IMX471_EXPOSURE_MIN 1
++#define IMX471_EXPOSURE_STEP 1
++#define IMX471_EXPOSURE_DEFAULT 1270
++
++/* Default exposure margin */
++#define IMX471_EXPOSURE_MARGIN 18
++
++/* Analog gain control */
++#define IMX471_REG_ANALOG_GAIN CCI_REG16(0x0204)
++#define IMX471_ANA_GAIN_MIN 0
++#define IMX471_ANA_GAIN_MAX 800
++#define IMX471_ANA_GAIN_STEP 1
++#define IMX471_ANA_GAIN_DEFAULT 0
++
++/* Digital gain control */
++#define IMX471_REG_DPGA_USE_GLOBAL_GAIN CCI_REG16(0x3ff9)
++#define IMX471_REG_DIG_GAIN_GLOBAL CCI_REG16(0x020e)
++#define IMX471_DGTL_GAIN_MIN 256
++#define IMX471_DGTL_GAIN_MAX 4095
++#define IMX471_DGTL_GAIN_STEP 1
++#define IMX471_DGTL_GAIN_DEFAULT 256
++
++/* HFLIP and VFLIP control */
++#define IMX471_REG_ORIENTATION CCI_REG8(0x0101)
++
++/* Test Pattern Control */
++#define IMX471_REG_TEST_PATTERN CCI_REG8(0x0600)
++
++/* default link frequency and external clock */
++#define IMX471_LINK_FREQ_DEFAULT 200000000LL
++#define IMX471_EXT_CLK 19200000
++
++/* PLL */
++#define IMX471_REG_VTPXCK_DIV CCI_REG8(0x0301)
++#define IMX471_REG_VTSYCK_DIV CCI_REG8(0x0303)
++#define IMX471_REG_PREPLLCK_VT_DIV CCI_REG8(0x0305)
++#define IMX471_REG_PLL_VT_MPY CCI_REG16(0x0306)
++#define IMX471_REG_OPPXCK_DIV CCI_REG8(0x0309)
++#define IMX471_REG_OPSYCK_DIV CCI_REG8(0x030b)
++#define IMX471_REG_PLL_MULT_DRIV CCI_REG8(0x0310)
++#define IMX471_PLL_SINGLE 0
++#define IMX471_PLL_DUAL 1
++
++/* IMX471 native and active pixel array size */
++#define IMX471_NATIVE_WIDTH 4672
++#define IMX471_NATIVE_HEIGHT 3512
++#define IMX471_PIXEL_ARRAY_LEFT 8
++#define IMX471_PIXEL_ARRAY_TOP 8
++#define IMX471_PIXEL_ARRAY_WIDTH 4656
++#define IMX471_PIXEL_ARRAY_HEIGHT 3496
++
++#define IMX471_REG_EXCK_FREQ CCI_REG16(0x0136)
++
++#define IMX471_REG_CSI_DATA_FORMAT CCI_REG16(0x0112)
++#define IMX471_CSI_DATA_FORMAT_RAW10 0x0a0a
++
++#define IMX471_REG_CSI_LANE_MODE CCI_REG8(0x0114)
++#define IMX471_CSI_2_LANE_MODE 1
++#define IMX471_CSI_4_LANE_MODE 3
++
++#define IMX471_REG_X_ADD_STA CCI_REG16(0x0344)
++#define IMX471_REG_Y_ADD_STA CCI_REG16(0x0346)
++#define IMX471_REG_X_ADD_END CCI_REG16(0x0348)
++#define IMX471_REG_Y_ADD_END CCI_REG16(0x034a)
++#define IMX471_REG_X_OUTPUT_SIZE CCI_REG16(0x034c)
++#define IMX471_REG_Y_OUTPUT_SIZE CCI_REG16(0x034e)
++#define IMX471_REG_X_EVEN_INC CCI_REG8(0x0381)
++#define IMX471_REG_X_ODD_INC CCI_REG8(0x0383)
++#define IMX471_REG_Y_EVEN_INC CCI_REG8(0x0385)
++#define IMX471_REG_Y_ODD_INC CCI_REG8(0x0387)
++
++#define IMX471_REG_DIG_CROP_X_OFFSET CCI_REG16(0x0408)
++#define IMX471_REG_DIG_CROP_Y_OFFSET CCI_REG16(0x040a)
++#define IMX471_REG_DIG_CROP_WIDTH CCI_REG16(0x040c)
++#define IMX471_REG_DIG_CROP_HEIGHT CCI_REG16(0x040e)
++
++/* Binning mode */
++#define IMX471_REG_BINNING_MODE CCI_REG8(0x0900)
++#define IMX471_BINNING_NONE 0
++#define IMX471_BINNING_ENABLE 1
++#define IMX471_REG_BINNING_TYPE CCI_REG8(0x0901)
++#define IMX471_REG_BINNING_WEIGHTING CCI_REG8(0x0902)
++
++#define to_imx471(_sd) container_of_const(_sd, struct imx471, sd)
++
++static const char * const imx471_supply_name[] = {
++ "vana",
++};
++
++struct imx471_mode {
++ u32 width;
++ u32 height;
++
++ /* V-timing */
++ u32 fll_def;
++ u32 fll_min;
++
++ /* H-timing */
++ u32 llp;
++
++ const struct cci_reg_sequence *default_mode_regs;
++ unsigned int default_mode_regs_length;
++};
++
++struct imx471 {
++ struct v4l2_subdev sd;
++ struct media_pad pad;
++
++ struct v4l2_ctrl_handler ctrl_handler;
++ struct v4l2_ctrl *vblank;
++ struct v4l2_ctrl *hblank;
++ struct v4l2_ctrl *vflip;
++ struct v4l2_ctrl *hflip;
++ struct v4l2_ctrl *exposure;
++
++ struct gpio_desc *reset_gpio;
++ struct regulator_bulk_data supplies[ARRAY_SIZE(imx471_supply_name)];
++ struct clk *img_clk;
++
++ struct device *dev;
++ struct regmap *regmap;
++};
++
++static const struct cci_reg_sequence imx471_global_regs[] = {
++ { IMX471_REG_EXCK_FREQ, 0x1333 },
++ { CCI_REG8(0x3c7e), 0x08 },
++ { CCI_REG8(0x3c7f), 0x05 },
++ { CCI_REG8(0x3e35), 0x00 },
++ { CCI_REG8(0x3e36), 0x00 },
++ { CCI_REG8(0x3e37), 0x00 },
++ { CCI_REG8(0x3f7f), 0x01 },
++ { CCI_REG8(0x4431), 0x04 },
++ { CCI_REG8(0x531c), 0x01 },
++ { CCI_REG8(0x531d), 0x02 },
++ { CCI_REG8(0x531e), 0x04 },
++ { CCI_REG8(0x5928), 0x00 },
++ { CCI_REG8(0x5929), 0x2f },
++ { CCI_REG8(0x592a), 0x00 },
++ { CCI_REG8(0x592b), 0x85 },
++ { CCI_REG8(0x592c), 0x00 },
++ { CCI_REG8(0x592d), 0x32 },
++ { CCI_REG8(0x592e), 0x00 },
++ { CCI_REG8(0x592f), 0x88 },
++ { CCI_REG8(0x5930), 0x00 },
++ { CCI_REG8(0x5931), 0x3d },
++ { CCI_REG8(0x5932), 0x00 },
++ { CCI_REG8(0x5933), 0x93 },
++ { CCI_REG8(0x5938), 0x00 },
++ { CCI_REG8(0x5939), 0x24 },
++ { CCI_REG8(0x593a), 0x00 },
++ { CCI_REG8(0x593b), 0x7a },
++ { CCI_REG8(0x593c), 0x00 },
++ { CCI_REG8(0x593d), 0x24 },
++ { CCI_REG8(0x593e), 0x00 },
++ { CCI_REG8(0x593f), 0x7a },
++ { CCI_REG8(0x5940), 0x00 },
++ { CCI_REG8(0x5941), 0x2f },
++ { CCI_REG8(0x5942), 0x00 },
++ { CCI_REG8(0x5943), 0x85 },
++ { CCI_REG8(0x5f0e), 0x6e },
++ { CCI_REG8(0x5f11), 0xc6 },
++ { CCI_REG8(0x5f17), 0x5e },
++ { CCI_REG8(0x7990), 0x01 },
++ { CCI_REG8(0x7993), 0x5d },
++ { CCI_REG8(0x7994), 0x5d },
++ { CCI_REG8(0x7995), 0xa1 },
++ { CCI_REG8(0x799a), 0x01 },
++ { CCI_REG8(0x799d), 0x00 },
++ { CCI_REG8(0x8169), 0x01 },
++ { CCI_REG8(0x8359), 0x01 },
++ { CCI_REG8(0x9302), 0x1e },
++ { CCI_REG8(0x9306), 0x1f },
++ { CCI_REG8(0x930a), 0x26 },
++ { CCI_REG8(0x930e), 0x23 },
++ { CCI_REG8(0x9312), 0x23 },
++ { CCI_REG8(0x9316), 0x2c },
++ { CCI_REG8(0x9317), 0x19 },
++ { CCI_REG8(0xb046), 0x01 },
++ { CCI_REG8(0xb048), 0x01 },
++};
++
++static const struct cci_reg_sequence mode_1928x1088_regs[] = {
++ { IMX471_REG_CSI_DATA_FORMAT, IMX471_CSI_DATA_FORMAT_RAW10 },
++ { IMX471_REG_CSI_LANE_MODE, IMX471_CSI_4_LANE_MODE },
++ { IMX471_REG_X_ADD_STA, 8 },
++ { IMX471_REG_Y_ADD_STA, 408 },
++ { IMX471_REG_X_ADD_END, 4647 },
++ { IMX471_REG_Y_ADD_END, 3051 },
++ { IMX471_REG_X_EVEN_INC, 1 },
++ { IMX471_REG_X_ODD_INC, 1 },
++ { IMX471_REG_Y_EVEN_INC, 1 },
++ { IMX471_REG_Y_ODD_INC, 1 },
++ { IMX471_REG_BINNING_MODE, IMX471_BINNING_ENABLE },
++ { IMX471_REG_BINNING_TYPE, 0x22 },
++ { IMX471_REG_BINNING_WEIGHTING, 0x08 },
++ { IMX471_REG_DIG_CROP_X_OFFSET, 208 },
++ { IMX471_REG_DIG_CROP_Y_OFFSET, 108 },
++ { IMX471_REG_DIG_CROP_WIDTH, 1928 },
++ { IMX471_REG_DIG_CROP_HEIGHT, 1088 },
++ { IMX471_REG_X_OUTPUT_SIZE, 1928 },
++ { IMX471_REG_Y_OUTPUT_SIZE, 1088 },
++ { IMX471_REG_VTPXCK_DIV, 0x06 },
++ { IMX471_REG_VTSYCK_DIV, 0x02 },
++ { IMX471_REG_PREPLLCK_VT_DIV, 0x02 },
++ { IMX471_REG_PLL_VT_MPY, 0x0079 },
++ { IMX471_REG_OPSYCK_DIV, 0x01 },
++ { CCI_REG8(0x030d), 0x02 },
++ { CCI_REG8(0x030e), 0x00 },
++ { CCI_REG8(0x030f), 0x53 },
++ { IMX471_REG_PLL_MULT_DRIV, IMX471_PLL_DUAL },
++ { CCI_REG8(0x3f4c), 0x81 },
++ { CCI_REG8(0x3f4d), 0x81 },
++ { CCI_REG8(0x3f78), 0x01 },
++ { CCI_REG8(0x3f79), 0x31 },
++ { CCI_REG8(0x3ffe), 0x00 },
++ { CCI_REG8(0x3fff), 0x8a },
++ { CCI_REG8(0x5f0a), 0xb6 },
++};
++
++static const char * const imx471_test_pattern_menu[] = {
++ "Disabled",
++ "Solid Colour",
++ "Eight Vertical Colour Bars",
++ "Colour Bars With Fade to Grey",
++ "Pseudorandom Sequence (PN9)",
++};
++
++static const s64 link_freq_menu_items[] = {
++ IMX471_LINK_FREQ_DEFAULT,
++};
++
++/*
++ * The Bayer formats for the flipping.
++ * - no flip
++ * - h flip
++ * - v flip
++ * - h and v flips
++ */
++static const u32 imx471_hv_flips_bayer_order[] = {
++ MEDIA_BUS_FMT_SRGGB10_1X10,
++ MEDIA_BUS_FMT_SGRBG10_1X10,
++ MEDIA_BUS_FMT_SGBRG10_1X10,
++ MEDIA_BUS_FMT_SBGGR10_1X10,
++};
++
++static const struct imx471_mode imx471_modes[] = {
++ {
++ .width = 1928,
++ .height = 1088,
++ .fll_def = 1308,
++ .fll_min = 1308,
++ .llp = 2328,
++ .default_mode_regs = mode_1928x1088_regs,
++ .default_mode_regs_length = ARRAY_SIZE(mode_1928x1088_regs),
++ },
++};
++
++static int imx471_get_regulators(struct device *dev, struct imx471 *sensor)
++{
++ for (unsigned int i = 0; i < ARRAY_SIZE(imx471_supply_name); i++)
++ sensor->supplies[i].supply = imx471_supply_name[i];
++
++ return devm_regulator_bulk_get(dev, ARRAY_SIZE(imx471_supply_name),
++ sensor->supplies);
++}
++
++static int imx471_set_ctrl(struct v4l2_ctrl *ctrl)
++{
++ struct imx471 *sensor = container_of_const(ctrl->handler,
++ struct imx471,
++ ctrl_handler);
++ struct v4l2_subdev_state *state =
++ v4l2_subdev_get_locked_active_state(&sensor->sd);
++ const struct v4l2_mbus_framefmt *format =
++ v4l2_subdev_state_get_format(state, 0);
++ int ret;
++
++ if (ctrl->id == V4L2_CID_VBLANK) {
++ s64 exposure_max = format->height + ctrl->val -
++ IMX471_EXPOSURE_MARGIN;
++ ret = __v4l2_ctrl_modify_range(sensor->exposure,
++ sensor->exposure->minimum,
++ exposure_max,
++ sensor->exposure->step,
++ exposure_max);
++ if (ret)
++ return ret;
++ }
++
++ if (!pm_runtime_get_if_in_use(sensor->dev))
++ return 0;
++
++ switch (ctrl->id) {
++ case V4L2_CID_ANALOGUE_GAIN:
++ ret = cci_write(sensor->regmap, IMX471_REG_ANALOG_GAIN,
++ ctrl->val, NULL);
++ break;
++ case V4L2_CID_DIGITAL_GAIN:
++ ret = cci_write(sensor->regmap, IMX471_REG_DIG_GAIN_GLOBAL,
++ ctrl->val, NULL);
++ break;
++ case V4L2_CID_EXPOSURE:
++ ret = cci_write(sensor->regmap, IMX471_REG_EXPOSURE,
++ ctrl->val, NULL);
++ break;
++ case V4L2_CID_VBLANK:
++ /* Update FLL that meets expected vertical blanking */
++ ret = cci_write(sensor->regmap, IMX471_REG_FLL,
++ format->height + ctrl->val, NULL);
++ break;
++ case V4L2_CID_TEST_PATTERN:
++ ret = cci_write(sensor->regmap, IMX471_REG_TEST_PATTERN,
++ ctrl->val, NULL);
++ break;
++ case V4L2_CID_HFLIP:
++ case V4L2_CID_VFLIP:
++ ret = cci_write(sensor->regmap, IMX471_REG_ORIENTATION,
++ sensor->hflip->val | sensor->vflip->val << 1,
++ NULL);
++ break;
++ default:
++ ret = -EINVAL;
++ dev_err(sensor->dev, "ctrl(id:0x%x,val:0x%x) is not handled\n",
++ ctrl->id, ctrl->val);
++ break;
++ }
++
++ pm_runtime_put(sensor->dev);
++
++ return ret;
++}
++
++static const struct v4l2_ctrl_ops imx471_ctrl_ops = {
++ .s_ctrl = imx471_set_ctrl,
++};
++
++static u32 imx471_get_format_code(struct imx471 *sensor)
++{
++ unsigned int i;
++
++ i = (sensor->vflip->val ? 2 : 0) | (sensor->hflip->val ? 1 : 0);
++
++ return imx471_hv_flips_bayer_order[i];
++}
++
++static int imx471_enum_mbus_code(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *sd_state,
++ struct v4l2_subdev_mbus_code_enum *code)
++{
++ struct imx471 *sensor = to_imx471(sd);
++
++ if (code->index >= (ARRAY_SIZE(imx471_hv_flips_bayer_order) / 4))
++ return -EINVAL;
++
++ code->code = imx471_get_format_code(sensor);
++
++ return 0;
++}
++
++static int imx471_enum_frame_size(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *sd_state,
++ struct v4l2_subdev_frame_size_enum *fse)
++{
++ if (fse->index >= ARRAY_SIZE(imx471_modes))
++ return -EINVAL;
++
++ fse->min_width = imx471_modes[fse->index].width;
++ fse->max_width = fse->min_width;
++ fse->min_height = imx471_modes[fse->index].height;
++ fse->max_height = fse->min_height;
++
++ return 0;
++}
++
++static void imx471_update_pad_format(struct imx471 *sensor,
++ const struct imx471_mode *mode,
++ struct v4l2_subdev_format *fmt)
++{
++ fmt->format.code = imx471_get_format_code(sensor);
++ fmt->format.width = mode->width;
++ fmt->format.height = mode->height;
++ fmt->format.field = V4L2_FIELD_NONE;
++}
++
++static int imx471_set_pad_format(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *sd_state,
++ struct v4l2_subdev_format *fmt)
++{
++ struct imx471 *sensor = to_imx471(sd);
++ const struct imx471_mode *mode;
++ int h_blank, ret;
++
++ mode = v4l2_find_nearest_size(imx471_modes, ARRAY_SIZE(imx471_modes),
++ width, height, fmt->format.width,
++ fmt->format.height);
++
++ imx471_update_pad_format(sensor, mode, fmt);
++
++ *v4l2_subdev_state_get_format(sd_state, fmt->pad) = fmt->format;
++
++ if (fmt->which == V4L2_SUBDEV_FORMAT_TRY)
++ return 0;
++
++ if (media_entity_is_streaming(&sensor->sd.entity))
++ return -EBUSY;
++
++ ret = __v4l2_ctrl_modify_range(sensor->vblank,
++ mode->fll_min - mode->height,
++ IMX471_FLL_MAX - mode->height,
++ 1,
++ mode->fll_def - mode->height);
++ if (ret)
++ return ret;
++
++ h_blank = mode->llp - mode->width;
++ /*
++ * Currently hblank is not changeable.
++ * So FPS control is done only by vblank.
++ */
++ return __v4l2_ctrl_modify_range(sensor->hblank, h_blank,
++ h_blank, 1, h_blank);
++}
++
++static int imx471_get_selection(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *sd_state,
++ struct v4l2_subdev_selection *sel)
++{
++ switch (sel->target) {
++ case V4L2_SEL_TGT_CROP:
++ sel->r = *v4l2_subdev_state_get_crop(sd_state, sel->pad);
++ break;
++
++ case V4L2_SEL_TGT_NATIVE_SIZE:
++ sel->r.top = 0;
++ sel->r.left = 0;
++ sel->r.width = IMX471_NATIVE_WIDTH;
++ sel->r.height = IMX471_NATIVE_HEIGHT;
++ return 0;
++
++ case V4L2_SEL_TGT_CROP_DEFAULT:
++ case V4L2_SEL_TGT_CROP_BOUNDS:
++ sel->r.top = IMX471_PIXEL_ARRAY_TOP;
++ sel->r.left = IMX471_PIXEL_ARRAY_LEFT;
++ sel->r.width = IMX471_PIXEL_ARRAY_WIDTH;
++ sel->r.height = IMX471_PIXEL_ARRAY_HEIGHT;
++ return 0;
++ }
++
++ return -EINVAL;
++}
++
++static int imx471_init_state(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *sd_state)
++{
++ struct v4l2_subdev_format fmt = {
++ .which = V4L2_SUBDEV_FORMAT_TRY,
++ .format = {
++ .code = MEDIA_BUS_FMT_SRGGB10_1X10,
++ .width = imx471_modes[0].width,
++ .height = imx471_modes[0].height,
++ },
++ };
++
++ return imx471_set_pad_format(sd, sd_state, &fmt);
++}
++
++static int imx471_identify_module(struct imx471 *sensor)
++{
++ int ret;
++ u64 val;
++
++ ret = cci_read(sensor->regmap, IMX471_REG_CHIP_ID, &val, NULL);
++ if (ret)
++ return dev_err_probe(sensor->dev, ret,
++ "failed to read chip id\n");
++
++ if (val != IMX471_CHIP_ID)
++ return dev_err_probe(sensor->dev, -EIO,
++ "chip id mismatch: %x!=%llx\n",
++ IMX471_CHIP_ID, val);
++
++ return 0;
++}
++
++static int imx471_power_off(struct device *dev)
++{
++ struct v4l2_subdev *sd = dev_get_drvdata(dev);
++ struct imx471 *sensor = to_imx471(sd);
++
++ clk_disable_unprepare(sensor->img_clk);
++ gpiod_set_value_cansleep(sensor->reset_gpio, 1);
++
++ regulator_bulk_disable(ARRAY_SIZE(imx471_supply_name),
++ sensor->supplies);
++
++ return 0;
++}
++
++static int imx471_power_on(struct device *dev)
++{
++ struct v4l2_subdev *sd = dev_get_drvdata(dev);
++ struct imx471 *sensor = to_imx471(sd);
++ int ret;
++
++ ret = regulator_bulk_enable(ARRAY_SIZE(imx471_supply_name),
++ sensor->supplies);
++ if (ret < 0) {
++ dev_err(dev, "failed to enable regulators: %d\n", ret);
++ return ret;
++ }
++
++ ret = clk_prepare_enable(sensor->img_clk);
++ if (ret < 0) {
++ regulator_bulk_disable(ARRAY_SIZE(imx471_supply_name),
++ sensor->supplies);
++ dev_err(dev, "failed to enable imaging clock: %d\n", ret);
++ return ret;
++ }
++
++ gpiod_set_value_cansleep(sensor->reset_gpio, 0);
++
++ usleep_range(10000, 15000);
++
++ return 0;
++}
++
++static int imx471_enable_stream(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *state,
++ u32 pad, u64 streams_mask)
++{
++ struct imx471 *sensor = to_imx471(sd);
++ const struct imx471_mode *mode;
++ struct v4l2_mbus_framefmt *fmt;
++ int ret;
++
++ ret = pm_runtime_resume_and_get(sensor->dev);
++ if (ret)
++ return ret;
++
++ ret = imx471_identify_module(sensor);
++ if (ret)
++ goto error_powerdown;
++
++ ret = cci_multi_reg_write(sensor->regmap, imx471_global_regs,
++ ARRAY_SIZE(imx471_global_regs), NULL);
++ if (ret) {
++ dev_err(sensor->dev, "failed to set global settings: %d\n",
++ ret);
++ goto error_powerdown;
++ }
++
++ fmt = v4l2_subdev_state_get_format(state, 0);
++ mode = v4l2_find_nearest_size(imx471_modes, ARRAY_SIZE(imx471_modes),
++ width, height, fmt->width, fmt->height);
++
++ ret = cci_multi_reg_write(sensor->regmap, mode->default_mode_regs,
++ mode->default_mode_regs_length, NULL);
++ if (ret) {
++ dev_err(sensor->dev, "failed to set mode: %d\n", ret);
++ goto error_powerdown;
++ }
++
++ ret = cci_write(sensor->regmap, IMX471_REG_DPGA_USE_GLOBAL_GAIN, 1,
++ NULL);
++ if (ret)
++ goto error_powerdown;
++
++ ret = __v4l2_ctrl_handler_setup(&sensor->ctrl_handler);
++ if (ret)
++ goto error_powerdown;
++
++ ret = cci_write(sensor->regmap, IMX471_REG_MODE_SELECT,
++ IMX471_MODE_STREAMING, NULL);
++ if (ret)
++ goto error_powerdown;
++
++ __v4l2_ctrl_grab(sensor->vflip, true);
++ __v4l2_ctrl_grab(sensor->hflip, true);
++
++ return ret;
++
++error_powerdown:
++ pm_runtime_put(sensor->dev);
++
++ return ret;
++}
++
++static int imx471_disable_stream(struct v4l2_subdev *sd,
++ struct v4l2_subdev_state *state,
++ u32 pad, u64 streams_mask)
++{
++ struct imx471 *sensor = to_imx471(sd);
++ int ret;
++
++ ret = cci_write(sensor->regmap, IMX471_REG_MODE_SELECT,
++ IMX471_MODE_STANDBY, NULL);
++ pm_runtime_put(sensor->dev);
++
++ if (ret)
++ dev_err(sensor->dev,
++ "failed to disable stream with return value: %d\n",
++ ret);
++
++ __v4l2_ctrl_grab(sensor->vflip, false);
++ __v4l2_ctrl_grab(sensor->hflip, false);
++
++ return 0;
++}
++
++static const struct v4l2_subdev_video_ops imx471_video_ops = {
++ .s_stream = v4l2_subdev_s_stream_helper,
++};
++
++static const struct v4l2_subdev_pad_ops imx471_pad_ops = {
++ .enum_mbus_code = imx471_enum_mbus_code,
++ .get_fmt = v4l2_subdev_get_fmt,
++ .set_fmt = imx471_set_pad_format,
++ .get_selection = imx471_get_selection,
++ .enum_frame_size = imx471_enum_frame_size,
++ .enable_streams = imx471_enable_stream,
++ .disable_streams = imx471_disable_stream,
++};
++
++static const struct v4l2_subdev_ops imx471_subdev_ops = {
++ .video = &imx471_video_ops,
++ .pad = &imx471_pad_ops,
++};
++
++static const struct v4l2_subdev_internal_ops imx471_internal_ops = {
++ .init_state = imx471_init_state,
++};
++
++static int imx471_init_controls(struct imx471 *sensor)
++{
++ const struct imx471_mode *mode = &imx471_modes[0];
++ struct v4l2_fwnode_device_properties props;
++ struct v4l2_ctrl_handler *ctrl_hdlr;
++ struct v4l2_ctrl *link_freq;
++ s64 exposure_max, hblank;
++ u64 pixel_rate;
++ int ret;
++
++ ret = v4l2_fwnode_device_parse(sensor->dev, &props);
++ if (ret) {
++ dev_err(sensor->dev, "failed to parse fwnode: %d\n", ret);
++ return ret;
++ }
++
++ ctrl_hdlr = &sensor->ctrl_handler;
++ v4l2_ctrl_handler_init(ctrl_hdlr, 12);
++
++ v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx471_ctrl_ops, &props);
++
++ link_freq = v4l2_ctrl_new_int_menu(ctrl_hdlr,
++ &imx471_ctrl_ops,
++ V4L2_CID_LINK_FREQ,
++ ARRAY_SIZE(link_freq_menu_items) - 1,
++ 0,
++ link_freq_menu_items);
++
++ /* pixel_rate = link_freq * 2 * nr_of_lanes / bits_per_sample */
++ pixel_rate = div_u64(IMX471_LINK_FREQ_DEFAULT * 2 * 4, 10);
++
++ v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_PIXEL_RATE, pixel_rate,
++ pixel_rate, 1, pixel_rate);
++
++ sensor->vblank = v4l2_ctrl_new_std(ctrl_hdlr,
++ &imx471_ctrl_ops,
++ V4L2_CID_VBLANK,
++ mode->fll_min - mode->height,
++ IMX471_FLL_MAX - mode->height,
++ 1,
++ mode->fll_def - mode->height);
++
++ hblank = mode->llp - mode->width;
++ sensor->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_HBLANK, hblank, hblank,
++ 1, hblank);
++
++ /* fll >= exposure time + adjust parameter (default value is 18) */
++ exposure_max = mode->fll_def - IMX471_EXPOSURE_MARGIN;
++ sensor->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_EXPOSURE,
++ IMX471_EXPOSURE_MIN, exposure_max,
++ IMX471_EXPOSURE_STEP,
++ IMX471_EXPOSURE_DEFAULT);
++
++ v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops, V4L2_CID_ANALOGUE_GAIN,
++ IMX471_ANA_GAIN_MIN, IMX471_ANA_GAIN_MAX,
++ IMX471_ANA_GAIN_STEP, IMX471_ANA_GAIN_DEFAULT);
++
++ v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops, V4L2_CID_DIGITAL_GAIN,
++ IMX471_DGTL_GAIN_MIN, IMX471_DGTL_GAIN_MAX,
++ IMX471_DGTL_GAIN_STEP, IMX471_DGTL_GAIN_DEFAULT);
++
++ v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_TEST_PATTERN,
++ ARRAY_SIZE(imx471_test_pattern_menu) - 1,
++ 0, 0, imx471_test_pattern_menu);
++
++ sensor->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_HFLIP, 0, 1, 1, 0);
++
++ sensor->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx471_ctrl_ops,
++ V4L2_CID_VFLIP, 0, 1, 1, 0);
++
++ if (ctrl_hdlr->error) {
++ dev_err(sensor->dev, "%s control init failed: %d\n",
++ __func__, ctrl_hdlr->error);
++ goto error;
++ }
++
++ link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY;
++ sensor->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY;
++ sensor->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
++ sensor->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT;
++
++ sensor->sd.ctrl_handler = ctrl_hdlr;
++
++ return 0;
++
++error:
++ v4l2_ctrl_handler_free(ctrl_hdlr);
++
++ return ctrl_hdlr->error;
++}
++
++static int imx471_check_hwcfg(struct imx471 *sensor)
++{
++ struct v4l2_fwnode_endpoint bus_cfg = {
++ .bus_type = V4L2_MBUS_CSI2_DPHY,
++ };
++ struct fwnode_handle *ep, *fwnode = dev_fwnode(sensor->dev);
++ unsigned long link_freq_bitmap;
++ struct clk *clk;
++ int ret;
++
++ clk = devm_v4l2_sensor_clk_get(sensor->dev, NULL);
++ if (IS_ERR(clk))
++ return dev_err_probe(sensor->dev, PTR_ERR(clk),
++ "can't get clock frequency\n");
++
++ if (clk_get_rate(clk) != IMX471_EXT_CLK)
++ return dev_err_probe(sensor->dev, -EINVAL,
++ "external clock %lu is not supported\n",
++ clk_get_rate(clk));
++
++ ep = fwnode_graph_get_endpoint_by_id(fwnode, 0, 0, 0);
++ ret = v4l2_fwnode_endpoint_alloc_parse(ep, &bus_cfg);
++ fwnode_handle_put(ep);
++ if (ret)
++ return dev_err_probe(sensor->dev, ret,
++ "parsing endpoint failed\n");
++
++ if (bus_cfg.bus.mipi_csi2.num_data_lanes != 4) {
++ ret = dev_err_probe(sensor->dev, -EINVAL,
++ "number of CSI2 data lanes %u is not supported\n",
++ bus_cfg.bus.mipi_csi2.num_data_lanes);
++ goto done_endpoint_free;
++ }
++
++ ret = v4l2_link_freq_to_bitmap(sensor->dev, bus_cfg.link_frequencies,
++ bus_cfg.nr_of_link_frequencies,
++ link_freq_menu_items,
++ ARRAY_SIZE(link_freq_menu_items),
++ &link_freq_bitmap);
++
++done_endpoint_free:
++ v4l2_fwnode_endpoint_free(&bus_cfg);
++
++ return ret;
++}
++
++static int imx471_probe(struct i2c_client *client)
++{
++ struct imx471 *sensor;
++ int ret;
++
++ sensor = devm_kzalloc(&client->dev, sizeof(*sensor), GFP_KERNEL);
++ if (!sensor)
++ return dev_err_probe(&client->dev, -ENOMEM,
++ "failed to allocate memory\n");
++
++ sensor->dev = &client->dev;
++
++ ret = imx471_check_hwcfg(sensor);
++ if (ret)
++ return dev_err_probe(sensor->dev, ret,
++ "failed to check hwcfg: %d\n", ret);
++
++ ret = imx471_get_regulators(sensor->dev, sensor);
++ if (ret)
++ return dev_err_probe(sensor->dev, ret,
++ "failed to get regulators\n");
++
++ sensor->reset_gpio = devm_gpiod_get_optional(sensor->dev, "reset",
++ GPIOD_OUT_HIGH);
++ if (IS_ERR(sensor->reset_gpio))
++ return dev_err_probe(sensor->dev, PTR_ERR(sensor->reset_gpio),
++ "failed to get reset gpio\n");
++
++ sensor->img_clk = devm_v4l2_sensor_clk_get(sensor->dev, NULL);
++ if (IS_ERR(sensor->img_clk))
++ return dev_err_probe(sensor->dev, PTR_ERR(sensor->img_clk),
++ "failed to get imaging clock\n");
++
++ v4l2_i2c_subdev_init(&sensor->sd, client, &imx471_subdev_ops);
++
++ sensor->regmap = devm_cci_regmap_init_i2c(client, 16);
++ if (IS_ERR(sensor->regmap))
++ return dev_err_probe(sensor->dev, PTR_ERR(sensor->regmap),
++ "failed to initialize CCI\n");
++
++ ret = imx471_power_on(sensor->dev);
++ if (ret)
++ return dev_err_probe(sensor->dev, ret,
++ "failed to power on\n");
++
++ ret = imx471_identify_module(sensor);
++ if (ret) {
++ dev_err_probe(sensor->dev, ret, "failed to find sensor: %d\n",
++ ret);
++ goto error_power_off;
++ }
++
++ ret = imx471_init_controls(sensor);
++ if (ret) {
++ dev_err_probe(sensor->dev, ret, "failed to init controls: %d\n",
++ ret);
++ goto error_power_off;
++ }
++
++ sensor->sd.internal_ops = &imx471_internal_ops;
++ sensor->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
++ sensor->pad.flags = MEDIA_PAD_FL_SOURCE;
++ sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;
++
++ ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad);
++ if (ret) {
++ dev_err_probe(sensor->dev, ret,
++ "failed to init entity pads: %d\n", ret);
++ goto error_v4l2_ctrl_handler_free;
++ }
++
++ sensor->sd.state_lock = sensor->ctrl_handler.lock;
++ ret = v4l2_subdev_init_finalize(&sensor->sd);
++ if (ret < 0) {
++ dev_err_probe(sensor->dev, ret, "failed to init subdev: %d\n",
++ ret);
++ goto error_media_entity_pm;
++ }
++
++ pm_runtime_set_active(sensor->dev);
++ pm_runtime_enable(sensor->dev);
++
++ ret = v4l2_async_register_subdev_sensor(&sensor->sd);
++ if (ret < 0)
++ goto error_v4l2_subdev_cleanup;
++
++ pm_runtime_idle(sensor->dev);
++
++ return 0;
++
++error_v4l2_subdev_cleanup:
++ pm_runtime_disable(sensor->dev);
++ pm_runtime_set_suspended(sensor->dev);
++ v4l2_subdev_cleanup(&sensor->sd);
++
++error_media_entity_pm:
++ media_entity_cleanup(&sensor->sd.entity);
++
++error_v4l2_ctrl_handler_free:
++ v4l2_ctrl_handler_free(sensor->sd.ctrl_handler);
++
++error_power_off:
++ imx471_power_off(sensor->dev);
++
++ return ret;
++}
++
++static void imx471_remove(struct i2c_client *client)
++{
++ struct v4l2_subdev *sd = i2c_get_clientdata(client);
++
++ v4l2_async_unregister_subdev(sd);
++ v4l2_subdev_cleanup(sd);
++ media_entity_cleanup(&sd->entity);
++ v4l2_ctrl_handler_free(sd->ctrl_handler);
++
++ pm_runtime_disable(&client->dev);
++
++ if (!pm_runtime_status_suspended(&client->dev)) {
++ imx471_power_off(&client->dev);
++ pm_runtime_set_suspended(&client->dev);
++ }
++}
++
++static DEFINE_RUNTIME_DEV_PM_OPS(imx471_pm_ops, imx471_power_off,
++ imx471_power_on, NULL);
++
++static const struct acpi_device_id imx471_acpi_ids[] __maybe_unused = {
++ { "SONY471A" },
++ { "TBE20A0" },
++ { /* sentinel */ }
++};
++MODULE_DEVICE_TABLE(acpi, imx471_acpi_ids);
++
++static struct i2c_driver imx471_i2c_driver = {
++ .driver = {
++ .name = "imx471",
++ .acpi_match_table = ACPI_PTR(imx471_acpi_ids),
++ .pm = pm_sleep_ptr(&imx471_pm_ops),
++ },
++ .probe = imx471_probe,
++ .remove = imx471_remove,
++};
++module_i2c_driver(imx471_i2c_driver);
++
++MODULE_AUTHOR("Jimmy Su <jimmy.su@intel.com>");
++MODULE_AUTHOR("Serin Yeh <serin.yeh@intel.com>");
++MODULE_AUTHOR("Kate Hsuan <hpa@redhat.com>");
++MODULE_DESCRIPTION("Sony imx471 sensor driver");
++MODULE_LICENSE("GPL");
+diff --git a/drivers/media/pci/intel/ipu-bridge.c b/drivers/media/pci/intel/ipu-bridge.c
+index ad3ddfb9ccb1..0a6d9a9fc040 100644
+--- a/drivers/media/pci/intel/ipu-bridge.c
++++ b/drivers/media/pci/intel/ipu-bridge.c
+@@ -97,6 +97,8 @@ static const struct ipu_sensor_config ipu_supported_sensors[] = {
+ IPU_SENSOR_CONFIG("OVTI8856", 3, 180000000, 360000000, 720000000),
+ /* Sony IMX471 */
+ IPU_SENSOR_CONFIG("SONY471A", 1, 200000000),
++ /* Sony IMX471 (found on Lenovo X1 Carbon G14) */
++ IPU_SENSOR_CONFIG("TBE20A0", 1, 200000000),
+ /* Toshiba T4KA3 */
+ IPU_SENSOR_CONFIG("XMCC0003", 1, 321468000),
+ };
+@@ -134,6 +136,45 @@ static const struct dmi_system_id upside_down_sensor_dmi_ids[] = {
+ },
+ .driver_data = "OVTI02C1",
+ },
++ /*
++ * The first four characters of DMI_BOARD_NAME identify the Lenovo
++ * machine type/model. For example, a DMI_BOARD_NAME starting with
++ * "21Q6" indicates a ThinkPad X9-15.
++ *
++ * Reference: https://psref.lenovo.com/
++ */
++ {
++ /* Lenovo X9-14 */
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++ DMI_MATCH(DMI_BOARD_NAME, "21QA"),
++ },
++ .driver_data = "SONY471A",
++ },
++ {
++ /* Lenovo X9-14 */
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++ DMI_MATCH(DMI_BOARD_NAME, "21QB"),
++ },
++ .driver_data = "SONY471A",
++ },
++ {
++ /* Lenovo X9-15 */
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++ DMI_MATCH(DMI_BOARD_NAME, "21Q6"),
++ },
++ .driver_data = "SONY471A",
++ },
++ {
++ /* Lenovo X9-15 */
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
++ DMI_MATCH(DMI_BOARD_NAME, "21Q7"),
++ },
++ .driver_data = "SONY471A",
++ },
+ {} /* Terminating entry */
+ };
+
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 0500d5fd4f11..b13589a0860e 100644
--- a/drivers/pci/quirks.c
diff --git a/sources b/sources
index 0485bcf..5e68866 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-SHA512 (linux-7.2.4.tar.xz) = 0db5bf76c0332b29d50d8b4ae584975e2d29d2d29f7f09d429ab3fd90e3ac8b3f0247dc6e4d391cf7b965a432b6ca624d4cd9a6584d9e74872d6e9b15b8f36d2
-SHA512 (kernel-abi-stablelists-7.2.4.tar.xz) = 17baf666323a3e4341ef23216f4757341c4e2f3dd4c5e023a9167401321389a00c4d9abe9dde5ea04609b0ca4171ff8897a818da9f48d5bf00933ca4c57ea3ef
-SHA512 (kernel-kabi-dw-7.2.4.tar.xz) = 5c097f5d8909f4d612f605a12fa25fcbc4d62b643a9266386e3987141b2b0dd9401a9984307ad8b344302408f405697c3a016ad65116668ecc7f56185b6f1999
+SHA512 (linux-7.2.5.tar.xz) = c6faed08719702a8d0bd430e96b7b26887959ba9994a2a9e898e47f1517e3e8e533263dd69442c0cb8d46698b80e83181294f38cc04134376c7c681538e81e3d
+SHA512 (kernel-abi-stablelists-7.2.5.tar.xz) = 6bb62fbc67385079788ee8729d37e1722e1bd8cf49a579096ede9ec0f3e0d1654f167e7e44ccb59acfb017b1ff917ba574f65c154097a8fa55eeac111f205b43
+SHA512 (kernel-kabi-dw-7.2.5.tar.xz) = 45df00897072c23f85912608e35ae1dc1e81df7a3a593387f91b41f515c0e8e8b213346ebd3bbceceb3e5fa29221a686f03a0ffab5c699088673965743084669
reply other threads:[~2026-09-11 13:36 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178913379978.1.16137527068738354857.rpms-kernel-6cf29d2c121f@fedoraproject.org \
--to=jforbes@fedoraproject.org \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox