diff --git a/Patchlist.changelog b/Patchlist.changelog index ed5c919d5..16326e653 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 1dbaaadcb..79d51f982 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 4ae3fa2fc..403d50215 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 194c18306..af342d214 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 8b954943c..050bbb376 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 c772659b0..9e601703e 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 6b37c32f9..74c7fe09f 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 f6152d270..72fc16f98 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 8eec6b2a4..57fdd22dc 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 f0edd581c..47d260757 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 b26647121..0e641e5c1 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 3d2036787..0a76a0b99 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 d9bf0c950..09e23aa14 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 8a1ef7b9e..36200c614 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 5552618f0..0565de6c8 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 59226194b..f2f3dd9cc 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 fa9c9b113..ef0caabaa 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 9c0762aa2..7328d84b7 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 6945bbc32..aa4c57356 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 3fa945b4e..788e27b93 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 19d0b7c05..cdc0fc833 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 362dde754..fe863c249 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 fc02a0fff..6d374993b 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 3c7902187..a35f5371b 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 d2035b208..01389de7b 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 480998d9a..8274716f0 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 dff3a8999..593c37b40 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 ce57bb443..37b905da1 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 dba469ab4..d7838997a 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 cd8f9840f..e0cfa6b28 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 9d4005f41..51844f538 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 741f80f14..6f52604fe 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 cb3df9c16..71856e1a5 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 cd660ee7f..ef85b0da2 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 3ed92ffd6..fe524732f 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 67a998f54..c2ab1980c 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 3b88e4f8c..16018dda8 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 f76436ca4..aeefcdf04 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 32e1a43c3..afead2b1c 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 236dc8038..086c33e10 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 6b0a00bf0..a8e2256e7 100644 --- a/kernel.changelog +++ b/kernel.changelog @@ -1,3 +1,13 @@ +* Tue Jul 14 2026 Justin M. Forbes [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 [7.1.3-1] - Linux v7.1.3 Resolves: diff --git a/kernel.spec b/kernel.spec index b228f8e91..068f8ce53 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 [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 [7.1.3-1] - Linux v7.1.3 diff --git a/patch-7.1-redhat.patch b/patch-7.1-redhat.patch index aec59b7cf..9a45c3407 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 ++L: linux-media@vger.kernel.org ++S: Maintained ++F: drivers/media/i2c/imx471.c ++ + SONY MEMORYSTICK SUBSYSTEM + M: Maxim Levitsky + M: Alex Dubov 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 ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#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 "); ++MODULE_AUTHOR("Serin Yeh "); ++MODULE_AUTHOR("Kate Hsuan "); ++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 5e37e3292..8afea8acf 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