public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/kernel] f44: kernel-7.1.3-201
@ 2026-07-14 6:08 Justin M. Forbes
0 siblings, 0 replies; only message in thread
From: Justin M. Forbes @ 2026-07-14 6:08 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/kernel
Branch : f44
Commit : ca41a29a9d8a8dca611819399f2e03f959aab56e
Author : Justin M. Forbes <jforbes@fedoraproject.org>
Date : 2026-07-14T00:08:20-06:00
Stats : +1281/-32 in 44 file(s)
URL : https://src.fedoraproject.org/rpms/kernel/c/ca41a29a9d8a8dca611819399f2e03f959aab56e?branch=f44
Log:
kernel-7.1.3-201
* Tue Jul 14 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.1.3-1]
- xfs: resample the data fork mapping after cycling ILOCK (Darrick J. Wong)
- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
- platform: int3472: discrete: con_id vana for Sony IMX471 as power enable (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)
- redhat: move ynltool debuginfo to kernel-tools-debuginfo (Augusto Caringi)
Resolves:
Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
---
diff --git a/Patchlist.changelog b/Patchlist.changelog
index ed5c919..16326e6 100644
--- a/Patchlist.changelog
+++ b/Patchlist.changelog
@@ -1,3 +1,18 @@
+https://gitlab.com/cki-project/kernel-ark/-/commit/5585ecd6249f39a050e0abf77338d180faaa9faf
+ 5585ecd6249f39a050e0abf77338d180faaa9faf xfs: resample the data fork mapping after cycling ILOCK
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/9ee4564815c09a7894d23379003702741d7addd2
+ 9ee4564815c09a7894d23379003702741d7addd2 media: i2c: imx471: Add Sony IMX471 image sensor driver
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/c36e6ceaa41224da4cef5e5e62bc3140af744cc4
+ c36e6ceaa41224da4cef5e5e62bc3140af744cc4 platform: int3472: discrete: con_id vana for Sony IMX471 as power enable
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/e58d32db363d78098583b869019adc75096c132e
+ e58d32db363d78098583b869019adc75096c132e media: ipu-bridge: Add Sony IMX471 for Lenovo X1 Carbon G14
+
+https://gitlab.com/cki-project/kernel-ark/-/commit/4b691a6960ed2f621128819dd9e05c024ca37472
+ 4b691a6960ed2f621128819dd9e05c024ca37472 media: ipu-bridge: Add DMI information of Lenovo X9 to the image upside-down list
+
https://gitlab.com/cki-project/kernel-ark/-/commit/7a09b757ef198b2dfc48dad4a1d3e908e26af396
7a09b757ef198b2dfc48dad4a1d3e908e26af396 ipv6: account for fraggap on the paged allocation path
diff --git a/kernel-aarch64-16k-debug-fedora.config b/kernel-aarch64-16k-debug-fedora.config
index 1dbaaad..79d51f9 100644
--- a/kernel-aarch64-16k-debug-fedora.config
+++ b/kernel-aarch64-16k-debug-fedora.config
@@ -10369,6 +10369,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 4ae3fa2..403d502 100644
--- a/kernel-aarch64-16k-fedora.config
+++ b/kernel-aarch64-16k-fedora.config
@@ -10335,6 +10335,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 194c183..af342d2 100644
--- a/kernel-aarch64-64k-debug-rhel.config
+++ b/kernel-aarch64-64k-debug-rhel.config
@@ -8448,6 +8448,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 8b95494..050bbb3 100644
--- a/kernel-aarch64-64k-rhel.config
+++ b/kernel-aarch64-64k-rhel.config
@@ -8419,6 +8419,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 c772659..9e60170 100644
--- a/kernel-aarch64-debug-fedora.config
+++ b/kernel-aarch64-debug-fedora.config
@@ -10368,6 +10368,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 6b37c32..74c7fe0 100644
--- a/kernel-aarch64-debug-rhel.config
+++ b/kernel-aarch64-debug-rhel.config
@@ -8445,6 +8445,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 f6152d2..72fc16f 100644
--- a/kernel-aarch64-fedora.config
+++ b/kernel-aarch64-fedora.config
@@ -10334,6 +10334,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 8eec6b2..57fdd22 100644
--- a/kernel-aarch64-rhel.config
+++ b/kernel-aarch64-rhel.config
@@ -8416,6 +8416,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 f0edd58..47d2607 100644
--- a/kernel-aarch64-rt-64k-debug-fedora.config
+++ b/kernel-aarch64-rt-64k-debug-fedora.config
@@ -10384,6 +10384,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 b266471..0e641e5 100644
--- a/kernel-aarch64-rt-64k-debug-rhel.config
+++ b/kernel-aarch64-rt-64k-debug-rhel.config
@@ -8495,6 +8495,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 3d20367..0a76a0b 100644
--- a/kernel-aarch64-rt-64k-fedora.config
+++ b/kernel-aarch64-rt-64k-fedora.config
@@ -10350,6 +10350,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 d9bf0c9..09e23aa 100644
--- a/kernel-aarch64-rt-64k-rhel.config
+++ b/kernel-aarch64-rt-64k-rhel.config
@@ -8466,6 +8466,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 8a1ef7b..36200c6 100644
--- a/kernel-aarch64-rt-debug-fedora.config
+++ b/kernel-aarch64-rt-debug-fedora.config
@@ -10380,6 +10380,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 5552618..0565de6 100644
--- a/kernel-aarch64-rt-debug-rhel.config
+++ b/kernel-aarch64-rt-debug-rhel.config
@@ -8491,6 +8491,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 5922619..f2f3dd9 100644
--- a/kernel-aarch64-rt-fedora.config
+++ b/kernel-aarch64-rt-fedora.config
@@ -10346,6 +10346,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 fa9c9b1..ef0caab 100644
--- a/kernel-aarch64-rt-rhel.config
+++ b/kernel-aarch64-rt-rhel.config
@@ -8462,6 +8462,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 9c0762a..7328d84 100644
--- a/kernel-ppc64le-debug-fedora.config
+++ b/kernel-ppc64le-debug-fedora.config
@@ -8382,6 +8382,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
CONFIG_VIDEO_ISL7998X=m
diff --git a/kernel-ppc64le-debug-rhel.config b/kernel-ppc64le-debug-rhel.config
index 6945bbc..aa4c573 100644
--- a/kernel-ppc64le-debug-rhel.config
+++ b/kernel-ppc64le-debug-rhel.config
@@ -7825,6 +7825,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-ppc64le-fedora.config b/kernel-ppc64le-fedora.config
index 3fa945b..788e27b 100644
--- a/kernel-ppc64le-fedora.config
+++ b/kernel-ppc64le-fedora.config
@@ -8347,6 +8347,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
CONFIG_VIDEO_ISL7998X=m
diff --git a/kernel-ppc64le-rhel.config b/kernel-ppc64le-rhel.config
index 19d0b7c..cdc0fc8 100644
--- a/kernel-ppc64le-rhel.config
+++ b/kernel-ppc64le-rhel.config
@@ -7798,6 +7798,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-debug-fedora.config b/kernel-riscv64-debug-fedora.config
index 362dde7..fe863c2 100644
--- a/kernel-riscv64-debug-fedora.config
+++ b/kernel-riscv64-debug-fedora.config
@@ -8559,6 +8559,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-debug-rhel.config b/kernel-riscv64-debug-rhel.config
index fc02a0f..6d37499 100644
--- a/kernel-riscv64-debug-rhel.config
+++ b/kernel-riscv64-debug-rhel.config
@@ -7906,6 +7906,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-fedora.config b/kernel-riscv64-fedora.config
index 3c79021..a35f537 100644
--- a/kernel-riscv64-fedora.config
+++ b/kernel-riscv64-fedora.config
@@ -8524,6 +8524,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-rhel.config b/kernel-riscv64-rhel.config
index d2035b2..01389de 100644
--- a/kernel-riscv64-rhel.config
+++ b/kernel-riscv64-rhel.config
@@ -7879,6 +7879,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-rt-debug-fedora.config b/kernel-riscv64-rt-debug-fedora.config
index 480998d..8274716 100644
--- a/kernel-riscv64-rt-debug-fedora.config
+++ b/kernel-riscv64-rt-debug-fedora.config
@@ -8571,6 +8571,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-riscv64-rt-fedora.config b/kernel-riscv64-rt-fedora.config
index dff3a89..593c37b 100644
--- a/kernel-riscv64-rt-fedora.config
+++ b/kernel-riscv64-rt-fedora.config
@@ -8536,6 +8536,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-s390x-debug-fedora.config b/kernel-s390x-debug-fedora.config
index ce57bb4..37b905d 100644
--- a/kernel-s390x-debug-fedora.config
+++ b/kernel-s390x-debug-fedora.config
@@ -8338,6 +8338,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
CONFIG_VIDEO_ISL7998X=m
diff --git a/kernel-s390x-debug-rhel.config b/kernel-s390x-debug-rhel.config
index dba469a..d783899 100644
--- a/kernel-s390x-debug-rhel.config
+++ b/kernel-s390x-debug-rhel.config
@@ -7819,6 +7819,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-s390x-fedora.config b/kernel-s390x-fedora.config
index cd8f984..e0cfa6b 100644
--- a/kernel-s390x-fedora.config
+++ b/kernel-s390x-fedora.config
@@ -8303,6 +8303,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_IPU3_CIO2 is not set
CONFIG_VIDEO_IR_I2C=m
CONFIG_VIDEO_ISL7998X=m
diff --git a/kernel-s390x-rhel.config b/kernel-s390x-rhel.config
index 9d4005f..51844f5 100644
--- a/kernel-s390x-rhel.config
+++ b/kernel-s390x-rhel.config
@@ -7792,6 +7792,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-s390x-zfcpdump-rhel.config b/kernel-s390x-zfcpdump-rhel.config
index 741f80f..6f52604 100644
--- a/kernel-s390x-zfcpdump-rhel.config
+++ b/kernel-s390x-zfcpdump-rhel.config
@@ -7813,6 +7813,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_IPU6 is not set
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-x86_64-debug-fedora.config b/kernel-x86_64-debug-fedora.config
index cb3df9c..71856e1 100644
--- a/kernel-x86_64-debug-fedora.config
+++ b/kernel-x86_64-debug-fedora.config
@@ -8980,6 +8980,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
CONFIG_VIDEO_IPU3_CIO2=m
diff --git a/kernel-x86_64-debug-rhel.config b/kernel-x86_64-debug-rhel.config
index cd660ee..ef85b0d 100644
--- a/kernel-x86_64-debug-rhel.config
+++ b/kernel-x86_64-debug-rhel.config
@@ -8205,6 +8205,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_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-x86_64-fedora.config b/kernel-x86_64-fedora.config
index 3ed92ff..fe52473 100644
--- a/kernel-x86_64-fedora.config
+++ b/kernel-x86_64-fedora.config
@@ -8946,6 +8946,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
CONFIG_VIDEO_IPU3_CIO2=m
diff --git a/kernel-x86_64-rhel.config b/kernel-x86_64-rhel.config
index 67a998f..c2ab198 100644
--- a/kernel-x86_64-rhel.config
+++ b/kernel-x86_64-rhel.config
@@ -8177,6 +8177,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_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-x86_64-rt-debug-fedora.config b/kernel-x86_64-rt-debug-fedora.config
index 3b88e4f..16018dd 100644
--- a/kernel-x86_64-rt-debug-fedora.config
+++ b/kernel-x86_64-rt-debug-fedora.config
@@ -8992,6 +8992,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
CONFIG_VIDEO_IPU3_CIO2=m
diff --git a/kernel-x86_64-rt-debug-rhel.config b/kernel-x86_64-rt-debug-rhel.config
index f76436c..aeefcdf 100644
--- a/kernel-x86_64-rt-debug-rhel.config
+++ b/kernel-x86_64-rt-debug-rhel.config
@@ -8251,6 +8251,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_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel-x86_64-rt-fedora.config b/kernel-x86_64-rt-fedora.config
index 32e1a43..afead2b 100644
--- a/kernel-x86_64-rt-fedora.config
+++ b/kernel-x86_64-rt-fedora.config
@@ -8958,6 +8958,7 @@ CONFIG_VIDEO_IMX335=m
CONFIG_VIDEO_IMX355=m
CONFIG_VIDEO_IMX412=m
CONFIG_VIDEO_IMX415=m
+CONFIG_VIDEO_IMX471=m
CONFIG_VIDEO_INTEL_IPU6=m
CONFIG_VIDEO_INTEL_IPU7=m
CONFIG_VIDEO_IPU3_CIO2=m
diff --git a/kernel-x86_64-rt-rhel.config b/kernel-x86_64-rt-rhel.config
index 236dc80..086c33e 100644
--- a/kernel-x86_64-rt-rhel.config
+++ b/kernel-x86_64-rt-rhel.config
@@ -8223,6 +8223,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_IPU6=m
# CONFIG_VIDEO_IPU3_CIO2 is not set
# CONFIG_VIDEO_ISL7998X is not set
diff --git a/kernel.changelog b/kernel.changelog
index 6b0a00b..a8e2256 100644
--- a/kernel.changelog
+++ b/kernel.changelog
@@ -1,3 +1,13 @@
+* Tue Jul 14 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.1.3-1]
+- xfs: resample the data fork mapping after cycling ILOCK (Darrick J. Wong)
+- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
+- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
+- platform: int3472: discrete: con_id vana for Sony IMX471 as power enable (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)
+- redhat: move ynltool debuginfo to kernel-tools-debuginfo (Augusto Caringi)
+Resolves:
+
* Sat Jul 04 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.1.3-1]
- Linux v7.1.3
Resolves:
diff --git a/kernel.spec b/kernel.spec
index b228f8e..068f8ce 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -190,13 +190,13 @@ Summary: The Linux kernel
%define specrpmversion 7.1.3
%define specversion 7.1.3
%define patchversion 7.1
-%define pkgrelease 200
+%define pkgrelease 201
%define kversion 7
%define tarfile_release 7.1.3
# This is needed to do merge window version magic
%define patchlevel 1
# This allows pkg_release to have configurable %%{?dist} tag
-%define specrelease 200%{?buildid}%{?dist}
+%define specrelease 201%{?buildid}%{?dist}
# This defines the kabi tarball version
%define kabiversion 7.1.3
@@ -1448,7 +1448,7 @@ This package provides debug information for package %{name}-tools.
# symlinks because of the trailing nonmatching alternation and
# the leading .*, because of find-debuginfo.sh's buggy handling
# of matching the pattern against the symlinks file.
-%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_bindir}/bootconfig(\.debug)?|.*%%{_bindir}/centrino-decode(\.debug)?|.*%%{_bindir}/powernow-k8-decode(\.debug)?|.*%%{_bindir}/cpupower(\.debug)?|.*%%{_libdir}/libcpupower.*|.*%%{python3_sitearch}/_raw_pylibcpupower.*|.*%%{_bindir}/turbostat(\.debug)?|.*%%{_bindir}/x86_energy_perf_policy(\.debug)?|.*%%{_bindir}/tmon(\.debug)?|.*%%{_bindir}/lsgpio(\.debug)?|.*%%{_bindir}/gpio-hammer(\.debug)?|.*%%{_bindir}/gpio-event-mon(\.debug)?|.*%%{_bindir}/gpio-watch(\.debug)?|.*%%{_bindir}/iio_event_monitor(\.debug)?|.*%%{_bindir}/iio_generic_buffer(\.debug)?|.*%%{_bindir}/lsiio(\.debug)?|.*%%{_bindir}/intel-speed-select(\.debug)?|.*%%{_bindir}/page_owner_sort(\.debug)?|.*%%{_bindir}/slabinfo(\.debug)?|.*%%{_sbindir}/intel_sdsi(\.debug)?|XXX' -o %{name}-tools-debuginfo.list}
+%{expand:%%global _find_debuginfo_opts %{?_find_debuginfo_opts} -p '.*%%{_bindir}/bootconfig(\.debug)?|.*%%{_bindir}/centrino-decode(\.debug)?|.*%%{_bindir}/powernow-k8-decode(\.debug)?|.*%%{_bindir}/cpupower(\.debug)?|.*%%{_libdir}/libcpupower.*|.*%%{python3_sitearch}/_raw_pylibcpupower.*|.*%%{_bindir}/turbostat(\.debug)?|.*%%{_bindir}/x86_energy_perf_policy(\.debug)?|.*%%{_bindir}/tmon(\.debug)?|.*%%{_bindir}/lsgpio(\.debug)?|.*%%{_bindir}/gpio-hammer(\.debug)?|.*%%{_bindir}/gpio-event-mon(\.debug)?|.*%%{_bindir}/gpio-watch(\.debug)?|.*%%{_bindir}/iio_event_monitor(\.debug)?|.*%%{_bindir}/iio_generic_buffer(\.debug)?|.*%%{_bindir}/lsiio(\.debug)?|.*%%{_bindir}/intel-speed-select(\.debug)?|.*%%{_bindir}/page_owner_sort(\.debug)?|.*%%{_bindir}/slabinfo(\.debug)?|.*%%{_sbindir}/intel_sdsi(\.debug)?|.*%%{_bindir}/ynltool(\.debug)?|XXX' -o %{name}-tools-debuginfo.list}
%if %{with_tools} && %{with_ynl}
%package -n python3-%{name}-tools
@@ -4857,6 +4857,15 @@ fi\
#
#
%changelog
+* Tue Jul 14 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.1.3-1]
+- xfs: resample the data fork mapping after cycling ILOCK (Darrick J. Wong)
+- redhat: configs: fedora: Enable Sony IMX471 image sensor (Kate Hsuan)
+- media: i2c: imx471: Add Sony IMX471 image sensor driver (Kate Hsuan)
+- platform: int3472: discrete: con_id vana for Sony IMX471 as power enable (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)
+- redhat: move ynltool debuginfo to kernel-tools-debuginfo (Augusto Caringi)
+
* Sat Jul 04 2026 Justin M. Forbes <jforbes@fedoraproject.org> [7.1.3-1]
- Linux v7.1.3
diff --git a/patch-7.1-redhat.patch b/patch-7.1-redhat.patch
index aec59b7..9a45c34 100644
--- a/patch-7.1-redhat.patch
+++ b/patch-7.1-redhat.patch
@@ -1,53 +1,77 @@
- Makefile | 30 ++++
+ 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 ++-
+ arch/x86/kernel/setup.c | 22 +-
crypto/akcipher.c | 3 +-
- crypto/dh.c | 25 ++++
- crypto/drbg.c | 18 ++-
- crypto/rng.c | 155 ++++++++++++++++++---
+ crypto/dh.c | 25 +
+ crypto/drbg.c | 18 +-
+ crypto/rng.c | 155 +++-
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 | 126 ++++++++++++++++-
+ 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 | 126 ++-
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/firmware/efi/secureboot.c | 38 +
drivers/gpu/drm/i915/display/intel_ddi.c | 11 +-
- drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 +++
- drivers/iommu/iommu.c | 22 +++
- drivers/pci/quirks.c | 24 ++++
+ drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 +
+ drivers/iommu/iommu.c | 22 +
+ drivers/media/i2c/Kconfig | 10 +
+ drivers/media/i2c/Makefile | 1 +
+ drivers/media/i2c/imx471.c | 957 +++++++++++++++++++++
+ drivers/media/pci/intel/ipu-bridge.c | 41 +
+ drivers/pci/quirks.c | 24 +
+ drivers/platform/x86/intel/int3472/discrete.c | 18 +
drivers/usb/core/hub.c | 7 +
+ fs/xfs/xfs_reflink.c | 36 +
include/linux/crypto.h | 3 +
- 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 +-
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 ++
- sound/soc/codecs/rt722-sdca.c | 77 ++++++++--
+ security/lockdown/Kconfig | 13 +
+ security/lockdown/lockdown.c | 11 +
+ sound/soc/codecs/rt722-sdca.c | 77 +-
sound/soc/codecs/rt722-sdca.h | 4 +
- tools/testing/selftests/bpf/DENYLIST.rhel | 76 ++++++++++
+ tools/testing/selftests/bpf/DENYLIST.rhel | 76 ++
tools/testing/selftests/bpf/Makefile | 2 +-
- tools/testing/selftests/bpf/prog_tests/ksyms_btf.c | 31 -----
- 48 files changed, 931 insertions(+), 142 deletions(-)
+ tools/testing/selftests/bpf/prog_tests/ksyms_btf.c | 31 -
+ 55 files changed, 2000 insertions(+), 142 deletions(-)
+diff --git a/MAINTAINERS b/MAINTAINERS
+index c8d4b913f26c..d0ad37bae20d 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -24965,6 +24965,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 9e405218162b..44f47144ebf6 100644
--- a/Makefile
@@ -1452,6 +1476,1061 @@ index d1a9e713d3a0..940458370730 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 8f2ba4121586..e1143579ae3d 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 90b276a7417a..f5c9fa93dc47 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/imx471.c b/drivers/media/i2c/imx471.c
+new file mode 100644
+index 000000000000..6d358b11e96d
+--- /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, &ret);
++ break;
++ case V4L2_CID_VBLANK:
++ /* Update FLL that meets expected vertical blanking */
++ ret = cci_write(sensor->regmap, IMX471_REG_FLL,
++ format->height + ctrl->val, &ret);
++ 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 fc6608e33de4..8cfa3282bf08 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 caaed1a01dc0..ec7b94de5515 100644
--- a/drivers/pci/quirks.c
@@ -1487,6 +2566,35 @@ index caaed1a01dc0..ec7b94de5515 100644
/*
* Intersil/Techwell TW686[4589]-based video capture cards have an empty (zero)
* class code. Fix it.
+diff --git a/drivers/platform/x86/intel/int3472/discrete.c b/drivers/platform/x86/intel/int3472/discrete.c
+index 115bb37577a1..adff564bf3fd 100644
+--- a/drivers/platform/x86/intel/int3472/discrete.c
++++ b/drivers/platform/x86/intel/int3472/discrete.c
+@@ -164,6 +164,24 @@ static const struct int3472_gpio_map int3472_gpio_map[] = {
+ .con_id = "dvdd",
+ .enable_time_us = 45 * USEC_PER_MSEC,
+ },
++ { /* imx471 expects "vana" as con_id for power enable */
++ .hid = "SONY471A",
++ .type_from = INT3472_GPIO_TYPE_POWER_ENABLE,
++ .type_to = INT3472_GPIO_TYPE_POWER_ENABLE,
++ .con_id = "vana",
++ .enable_time_us = GPIO_REGULATOR_ENABLE_TIME,
++ },
++ {
++ /*
++ * imx471 (on Lenovo ThinkPads X1 G14) expects "vana" as con_id
++ * for power enable
++ */
++ .hid = "TBE20A0",
++ .type_from = INT3472_GPIO_TYPE_POWER_ENABLE,
++ .type_to = INT3472_GPIO_TYPE_POWER_ENABLE,
++ .con_id = "vana",
++ .enable_time_us = GPIO_REGULATOR_ENABLE_TIME,
++ },
+ };
+
+ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3472, u8 *type,
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 24960ba9caa9..32597cdb72ef 100644
--- a/drivers/usb/core/hub.c
@@ -1505,6 +2613,74 @@ index 24960ba9caa9..32597cdb72ef 100644
/* Lock the device, then check to see if we were
* disconnected while waiting for the lock to succeed. */
usb_lock_device(hdev);
+diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
+index 251dec48f0e3..e7db02579f28 100644
+--- a/fs/xfs/xfs_reflink.c
++++ b/fs/xfs/xfs_reflink.c
+@@ -440,6 +440,7 @@ xfs_reflink_fill_cow_hole(
+ struct xfs_mount *mp = ip->i_mount;
+ struct xfs_trans *tp;
+ xfs_filblks_t resaligned;
++ unsigned int seq_before = READ_ONCE(ip->i_df.if_seq);
+ unsigned int dblocks = 0, rblocks = 0;
+ int nimaps;
+ int error;
+@@ -465,6 +466,22 @@ xfs_reflink_fill_cow_hole(
+
+ *lockmode = XFS_ILOCK_EXCL;
+
++ /*
++ * The data fork mapping may have changed while we dropped the ILOCK
++ * (a racing O_DIRECT writer under IOLOCK_SHARED can complete a full
++ * CoW cycle including xfs_reflink_end_cow(), which remaps this offset
++ * and drops the refcount of the old shared block). Re-read it so the
++ * shared-status recheck below and the caller's in-place iomap both
++ * operate on the current mapping rather than a stale physical block.
++ */
++ if (seq_before != READ_ONCE(ip->i_df.if_seq)) {
++ nimaps = 1;
++ error = xfs_bmapi_read(ip, imap->br_startoff,
++ imap->br_blockcount, imap, &nimaps, 0);
++ if (error)
++ goto out_trans_cancel;
++ }
++
+ error = xfs_find_trim_cow_extent(ip, imap, cmap, shared, &found);
+ if (error || !*shared)
+ goto out_trans_cancel;
+@@ -511,6 +528,8 @@ xfs_reflink_fill_delalloc(
+ bool found;
+
+ do {
++ unsigned int seq_before = READ_ONCE(ip->i_df.if_seq);
++
+ xfs_iunlock(ip, *lockmode);
+ *lockmode = 0;
+
+@@ -521,6 +540,23 @@ xfs_reflink_fill_delalloc(
+
+ *lockmode = XFS_ILOCK_EXCL;
+
++ /*
++ * The data fork mapping may have changed while we dropped the
++ * ILOCK (a racing O_DIRECT writer under IOLOCK_SHARED can
++ * complete a full CoW cycle including xfs_reflink_end_cow(),
++ * which remaps this offset and drops the refcount of the old
++ * shared block). Re-read it so the shared-status recheck
++ * below and the caller's in-place iomap both operate on the
++ * current mapping rather than a stale physical block.
++ */
++ if (seq_before != READ_ONCE(ip->i_df.if_seq)) {
++ nimaps = 1;
++ error = xfs_bmapi_read(ip, imap->br_startoff,
++ imap->br_blockcount, imap, &nimaps, 0);
++ if (error)
++ goto out_trans_cancel;
++ }
++
+ error = xfs_find_trim_cow_extent(ip, imap, cmap, shared,
+ &found);
+ if (error || !*shared)
diff --git a/include/linux/crypto.h b/include/linux/crypto.h
index a2137e19be7d..df268ca70170 100644
--- a/include/linux/crypto.h
diff --git a/sources b/sources
index 5e37e32..8afea8a 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
SHA512 (linux-7.1.3.tar.xz) = 8c2471239ff082532d0813d797a137ad353822a0d5bdbe48c9d981668977167ce2ae9d86a912d111bb4523eebfbc4b17379eb6c6ec7d17ec6503b675f32f7da3
-SHA512 (kernel-abi-stablelists-7.1.3.tar.xz) = 471a30f68a4d56aefd95931d7d86afc50232741a44a428944085fe9fb886e13964e18aed7d510d2960eb15db391c953f70b1040708835beb624b354af651ccd6
-SHA512 (kernel-kabi-dw-7.1.3.tar.xz) = 68d7d03e0a2ebd073bf2d21c9ae495fa4949963320ae6686f785b84a60587e1154ebf7e5ed7c0fb7165194b5f3b5db22657f76c5ce3091db5e303ea554ec2cf9
+SHA512 (kernel-abi-stablelists-7.1.3.tar.xz) = 438cba62baf4f659bebac5fcb6f5b9edaeeca20df3be3ca812074ecb90bee91a3753491c5f9cac2562a3a0de0feedbdf7425982d68c79f13a3e00ea43ed5b349
+SHA512 (kernel-kabi-dw-7.1.3.tar.xz) = 3f1dcad0b9e39b7415e90d8a29ac6678304422389e1cec322e6af4bb179c632524674d906e22b93f4e16f0573261dab05ba85c6d05a7a896c1156cedd5c893ee
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-14 6:08 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-07-14 6:08 [rpms/kernel] f44: kernel-7.1.3-201 Justin M. Forbes
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox