public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/kernel] f43: kernel-7.1.3-101
@ 2026-07-14  6:10 Justin M. Forbes
  0 siblings, 0 replies; only message in thread
From: Justin M. Forbes @ 2026-07-14  6:10 UTC (permalink / raw)
  To: git-commits

            A new commit has been pushed.

            Repo   : rpms/kernel
            Branch : f43
            Commit : 3e493ef342e05816745108136e83d98d790a68fc
            Author : Justin M. Forbes <jforbes@fedoraproject.org>
            Date   : 2026-07-14T00:10:01-06:00
            Stats  : +1281/-32 in 44 file(s)
            URL    : https://src.fedoraproject.org/rpms/kernel/c/3e493ef342e05816745108136e83d98d790a68fc?branch=f43

            Log:
            kernel-7.1.3-101

* 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 156f713..1521232 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 100
+%define pkgrelease 101
 %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 100%{?buildid}%{?dist}
+%define specrelease 101%{?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 c83c8ea..62a88d7 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) = a680acf8295936642304f1a1fc97e4c8c91dad53b69e7f21b749f31b4f6bb1d1d9c1c56dfd933bf4df7d099d1e7ae3640e23dd5705afcafd7b707265d2ace093
-SHA512 (kernel-kabi-dw-7.1.3.tar.xz) = 68d7d03e0a2ebd073bf2d21c9ae495fa4949963320ae6686f785b84a60587e1154ebf7e5ed7c0fb7165194b5f3b5db22657f76c5ce3091db5e303ea554ec2cf9
+SHA512 (kernel-abi-stablelists-7.1.3.tar.xz) = 282979c2a89094ecf7e4a4c059d9b5e756a0aa9bb98a762e3df0f4718baa9901682bc4748c68bb8e0118c735100ecd31350d78e06d4a50e33a947d7ad0cbe91c
+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:10 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:10 [rpms/kernel] f43: kernel-7.1.3-101 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