From f628822d5e2af0e2d23b01dd0af1e6ed5af4fd9c Mon Sep 17 00:00:00 2001 From: Zheng Zengkai Date: Tue, 19 Oct 2021 20:39:50 +0800 Subject: [PATCH] release 5.10.0-14.0.0 rebuild ci --- 0000-raspberrypi-kernel.patch | 8773 ++++++++++++++++++++++++++------- SOURCE | 2 +- kernel.spec | 2394 ++++++++- raspberrypi-kernel.spec | 2562 +++++++++- 4 files changed, 11911 insertions(+), 1820 deletions(-) diff --git a/0000-raspberrypi-kernel.patch b/0000-raspberrypi-kernel.patch index 8e76b0d..4923cf8 100644 --- a/0000-raspberrypi-kernel.patch +++ b/0000-raspberrypi-kernel.patch @@ -1,7 +1,7 @@ -From aa3be3e4fda76c67513b56f423b0c91d542ca31a Mon Sep 17 00:00:00 2001 +From 8672e1c59dc796553c4782bb3029284c15e80cfc Mon Sep 17 00:00:00 2001 From: Fang Yafen -Date: Sun, 8 Aug 2021 06:09:36 +0800 -Subject: [PATCH 1/2] apply RPi patch of 5.10.52 +Date: Wed, 20 Oct 2021 00:58:36 +0800 +Subject: [PATCH] apply apply RPi patch of 5.10.74 --- .../admin-guide/media/bcm2835-isp.rst | 127 + @@ -18,6 +18,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../devicetree/bindings/media/i2c/imx290.txt | 7 +- .../devicetree/bindings/media/i2c/imx378.yaml | 113 + .../devicetree/bindings/media/i2c/imx477.yaml | 113 + + .../devicetree/bindings/media/i2c/imx519.yaml | 113 + .../devicetree/bindings/media/i2c/irs1125.txt | 48 + .../bindings/media/rpivid_hevc.yaml | 72 + .../bindings/misc/brcm,bcm2835-smi-dev.txt | 17 + @@ -43,7 +44,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../userspace-api/media/v4l/pixfmt-y14p.rst | 54 + .../media/v4l/subdev-formats.rst | 107 + .../userspace-api/media/v4l/yuv-formats.rst | 3 + - MAINTAINERS | 40 + + MAINTAINERS | 48 + Makefile | 3 + arch/arm/boot/dts/Makefile | 28 +- arch/arm/boot/dts/bcm2708-rpi-b-plus.dts | 129 + @@ -59,16 +60,16 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 arch/arm/boot/dts/bcm2709-rpi-2-b.dts | 129 + arch/arm/boot/dts/bcm2709-rpi.dtsi | 5 + arch/arm/boot/dts/bcm2709.dtsi | 22 + - arch/arm/boot/dts/bcm270x-rpi.dtsi | 154 + - arch/arm/boot/dts/bcm270x.dtsi | 216 + + arch/arm/boot/dts/bcm270x-rpi.dtsi | 155 + + arch/arm/boot/dts/bcm270x.dtsi | 217 + arch/arm/boot/dts/bcm2710-rpi-2-b.dts | 129 + arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts | 201 + arch/arm/boot/dts/bcm2710-rpi-3-b.dts | 203 + arch/arm/boot/dts/bcm2710-rpi-cm3.dts | 148 + arch/arm/boot/dts/bcm2710.dtsi | 25 + arch/arm/boot/dts/bcm2711-rpi-4-b.dts | 326 +- - arch/arm/boot/dts/bcm2711-rpi-400.dts | 634 ++ - arch/arm/boot/dts/bcm2711-rpi-cm4.dts | 657 ++ + arch/arm/boot/dts/bcm2711-rpi-400.dts | 636 ++ + arch/arm/boot/dts/bcm2711-rpi-cm4.dts | 659 ++ arch/arm/boot/dts/bcm2711-rpi.dtsi | 205 + arch/arm/boot/dts/bcm2711.dtsi | 72 +- arch/arm/boot/dts/bcm271x-rpi-bt.dtsi | 26 + @@ -96,9 +97,10 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi | 4 + .../boot/dts/bcm283x-rpi-usb-peripheral.dtsi | 7 - arch/arm/boot/dts/bcm283x.dtsi | 34 +- - arch/arm/boot/dts/overlays/Makefile | 243 + - arch/arm/boot/dts/overlays/README | 3476 ++++++++ + arch/arm/boot/dts/overlays/Makefile | 252 + + arch/arm/boot/dts/overlays/README | 3576 +++++++++ .../arm/boot/dts/overlays/act-led-overlay.dts | 27 + + .../dts/overlays/adafruit-st7735r-overlay.dts | 83 + .../boot/dts/overlays/adafruit18-overlay.dts | 55 + .../dts/overlays/adau1977-adc-overlay.dts | 40 + .../dts/overlays/adau7002-simple-overlay.dts | 52 + @@ -139,7 +141,8 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 arch/arm/boot/dts/overlays/draws-overlay.dts | 208 + .../arm/boot/dts/overlays/dwc-otg-overlay.dts | 14 + arch/arm/boot/dts/overlays/dwc2-overlay.dts | 26 + - .../boot/dts/overlays/edt-ft5406-overlay.dts | 42 + + .../boot/dts/overlays/edt-ft5406-overlay.dts | 10 + + arch/arm/boot/dts/overlays/edt-ft5406.dtsi | 55 + .../boot/dts/overlays/enc28j60-overlay.dts | 53 + .../dts/overlays/enc28j60-spi2-overlay.dts | 47 + .../arm/boot/dts/overlays/exc3000-overlay.dts | 48 + @@ -164,7 +167,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../dts/overlays/hifiberry-dac-overlay.dts | 34 + .../overlays/hifiberry-dacplus-overlay.dts | 65 + .../overlays/hifiberry-dacplusadc-overlay.dts | 72 + - .../hifiberry-dacplusadcpro-overlay.dts | 65 + + .../hifiberry-dacplusadcpro-overlay.dts | 70 + .../overlays/hifiberry-dacplusdsp-overlay.dts | 34 + .../overlays/hifiberry-dacplushd-overlay.dts | 106 + .../dts/overlays/hifiberry-digi-overlay.dts | 41 + @@ -178,7 +181,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/overlays/i2c-gpio-overlay.dts | 47 + .../arm/boot/dts/overlays/i2c-mux-overlay.dts | 139 + .../dts/overlays/i2c-pwm-pca9685a-overlay.dts | 26 + - .../arm/boot/dts/overlays/i2c-rtc-common.dtsi | 305 + + .../arm/boot/dts/overlays/i2c-rtc-common.dtsi | 323 + .../dts/overlays/i2c-rtc-gpio-overlay.dts | 31 + .../arm/boot/dts/overlays/i2c-rtc-overlay.dts | 34 + .../boot/dts/overlays/i2c-sensor-overlay.dts | 320 + @@ -196,6 +199,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 arch/arm/boot/dts/overlays/imx378-overlay.dts | 10 + arch/arm/boot/dts/overlays/imx477-overlay.dts | 10 + .../boot/dts/overlays/imx477_378-overlay.dtsi | 110 + + arch/arm/boot/dts/overlays/imx519-overlay.dts | 115 + .../dts/overlays/iqaudio-codec-overlay.dts | 42 + .../boot/dts/overlays/iqaudio-dac-overlay.dts | 46 + .../dts/overlays/iqaudio-dacplus-overlay.dts | 49 + @@ -213,6 +217,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/overlays/mcp23s17-overlay.dts | 732 ++ .../dts/overlays/mcp2515-can0-overlay.dts | 73 + .../dts/overlays/mcp2515-can1-overlay.dts | 73 + + .../arm/boot/dts/overlays/mcp2515-overlay.dts | 156 + .../boot/dts/overlays/mcp251xfd-overlay.dts | 226 + .../arm/boot/dts/overlays/mcp3008-overlay.dts | 205 + .../arm/boot/dts/overlays/mcp3202-overlay.dts | 205 + @@ -221,8 +226,13 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/overlays/merus-amp-overlay.dts | 60 + .../boot/dts/overlays/midi-uart0-overlay.dts | 36 + .../boot/dts/overlays/midi-uart1-overlay.dts | 43 + + .../boot/dts/overlays/midi-uart2-overlay.dts | 37 + + .../boot/dts/overlays/midi-uart3-overlay.dts | 38 + + .../boot/dts/overlays/midi-uart4-overlay.dts | 38 + + .../boot/dts/overlays/midi-uart5-overlay.dts | 38 + .../boot/dts/overlays/minipitft13-overlay.dts | 70 + .../boot/dts/overlays/miniuart-bt-overlay.dts | 93 + + .../boot/dts/overlays/mlx90640-overlay.dts | 22 + arch/arm/boot/dts/overlays/mmc-overlay.dts | 46 + .../arm/boot/dts/overlays/mpu6050-overlay.dts | 29 + .../arm/boot/dts/overlays/mz61581-overlay.dts | 117 + @@ -252,6 +262,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/overlays/pwm-ir-tx-overlay.dts | 40 + arch/arm/boot/dts/overlays/pwm-overlay.dts | 45 + .../arm/boot/dts/overlays/qca7000-overlay.dts | 55 + + .../dts/overlays/qca7000-uart0-overlay.dts | 46 + .../dts/overlays/rotary-encoder-overlay.dts | 59 + .../dts/overlays/rpi-backlight-overlay.dts | 21 + .../overlays/rpi-cirrus-wm5102-overlay.dts | 172 + @@ -259,7 +270,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../boot/dts/overlays/rpi-display-overlay.dts | 91 + .../boot/dts/overlays/rpi-ft5406-overlay.dts | 25 + .../arm/boot/dts/overlays/rpi-poe-overlay.dts | 95 + - .../dts/overlays/rpi-poe-plus-overlay.dts | 19 + + .../dts/overlays/rpi-poe-plus-overlay.dts | 23 + .../boot/dts/overlays/rpi-proto-overlay.dts | 39 + .../boot/dts/overlays/rpi-sense-overlay.dts | 47 + arch/arm/boot/dts/overlays/rpi-tv-overlay.dts | 34 + @@ -321,7 +332,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../dts/overlays/vc4-fkms-v3d-overlay.dts | 40 + .../dts/overlays/vc4-fkms-v3d-pi4-overlay.dts | 44 + .../vc4-kms-dpi-at056tn53v1-overlay.dts | 44 + - .../overlays/vc4-kms-dsi-7inch-overlay.dts | 56 + + .../overlays/vc4-kms-dsi-7inch-overlay.dts | 118 + .../vc4-kms-dsi-lt070me05000-overlay.dts | 69 + .../vc4-kms-dsi-lt070me05000-v2-overlay.dts | 64 + .../overlays/vc4-kms-kippah-7inch-overlay.dts | 43 + @@ -334,9 +345,9 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 arch/arm/boot/dts/overlays/w5500-overlay.dts | 63 + .../arm/boot/dts/overlays/wittypi-overlay.dts | 44 + .../dts/overlays/wm8960-soundcard-overlay.dts | 82 + - arch/arm/configs/bcm2709_defconfig | 1504 ++++ - arch/arm/configs/bcm2711_defconfig | 1543 ++++ - arch/arm/configs/bcmrpi_defconfig | 1517 ++++ + arch/arm/configs/bcm2709_defconfig | 1510 ++++ + arch/arm/configs/bcm2711_defconfig | 1550 ++++ + arch/arm/configs/bcmrpi_defconfig | 1523 ++++ arch/arm/configs/multi_v7_defconfig | 1 + arch/arm/include/asm/cacheflush.h | 21 + arch/arm/include/asm/glue-cache.h | 2 + @@ -364,7 +375,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 arch/arm/mm/proc-macros.S | 2 + arch/arm/mm/proc-syms.c | 3 + arch/arm/mm/proc-v6.S | 15 +- - arch/arm/mm/proc-v7.S | 6 +- + arch/arm/mm/proc-v7.S | 8 + arch/arm/vfp/vfpmodule.c | 25 +- arch/arm64/Kconfig.platforms | 1 + arch/arm64/boot/dts/Makefile | 2 + @@ -379,8 +390,8 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi | 1 + .../dts/broadcom/bcm283x-rpi-lan7515.dtsi | 1 + arch/arm64/boot/dts/overlays | 1 + - arch/arm64/configs/bcm2711_defconfig | 1549 ++++ - arch/arm64/configs/bcmrpi3_defconfig | 1395 ++++ + arch/arm64/configs/bcm2711_defconfig | 1556 ++++ + arch/arm64/configs/bcmrpi3_defconfig | 1402 ++++ arch/arm64/configs/defconfig | 1 + arch/arm64/crypto/aes-cipher-glue.c | 10 + arch/arm64/crypto/aes-glue.c | 4 +- @@ -393,10 +404,10 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/char/broadcom/Kconfig | 49 + drivers/char/broadcom/Makefile | 5 + drivers/char/broadcom/bcm2835-gpiomem.c | 258 + - drivers/char/broadcom/bcm2835_smi_dev.c | 402 + + drivers/char/broadcom/bcm2835_smi_dev.c | 409 + drivers/char/broadcom/rpivid-mem.c | 270 + drivers/char/broadcom/vc_mem.c | 373 + - drivers/char/broadcom/vcio.c | 195 + + drivers/char/broadcom/vcio.c | 186 + drivers/char/hw_random/Kconfig | 2 +- drivers/char/hw_random/bcm2835-rng.c | 6 +- drivers/char/hw_random/iproc-rng200.c | 78 +- @@ -412,15 +423,16 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/dma/Makefile | 1 + drivers/dma/bcm2708-dmaengine.c | 281 + drivers/dma/bcm2835-dma.c | 545 +- - drivers/firmware/raspberrypi.c | 154 +- - drivers/gpio/Kconfig | 15 + - drivers/gpio/Makefile | 2 + + drivers/firmware/raspberrypi.c | 149 +- + drivers/gpio/Kconfig | 23 + + drivers/gpio/Makefile | 3 + drivers/gpio/gpio-bcm-virt.c | 214 + drivers/gpio/gpio-fsm.c | 1210 +++ + drivers/gpio/gpio-pwm.c | 144 + drivers/gpio/gpiolib.c | 10 +- drivers/gpu/drm/Kconfig | 2 + drivers/gpu/drm/Makefile | 1 + - .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 40 +- + .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 42 +- .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 5 +- drivers/gpu/drm/arc/arcpgu_crtc.c | 4 +- .../gpu/drm/arm/display/komeda/komeda_crtc.c | 23 +- @@ -435,6 +447,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/gpu/drm/drm_connector.c | 70 + drivers/gpu/drm/drm_fourcc.c | 3 + drivers/gpu/drm/drm_framebuffer.c | 16 +- + drivers/gpu/drm/drm_probe_helper.c | 111 +- drivers/gpu/drm/drm_simple_kms_helper.c | 14 +- drivers/gpu/drm/exynos/exynos_drm_crtc.c | 16 +- drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c | 8 +- @@ -464,8 +477,8 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/gpu/drm/nouveau/dispnv50/head.c | 9 +- drivers/gpu/drm/omapdrm/omap_crtc.c | 22 +- .../gpu/drm/panel/panel-jdi-lt070me05000.c | 18 +- - .../drm/panel/panel-raspberrypi-touchscreen.c | 31 +- - drivers/gpu/drm/panel/panel-simple.c | 35 + + .../drm/panel/panel-raspberrypi-touchscreen.c | 49 +- + drivers/gpu/drm/panel/panel-simple.c | 63 + drivers/gpu/drm/qxl/qxl_display.c | 6 +- drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 22 +- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 19 +- @@ -485,18 +498,18 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/gpu/drm/vboxvideo/vbox_mode.c | 6 +- drivers/gpu/drm/vc4/Kconfig | 1 + drivers/gpu/drm/vc4/Makefile | 1 + - drivers/gpu/drm/vc4/vc4_crtc.c | 195 +- + drivers/gpu/drm/vc4/vc4_crtc.c | 232 +- drivers/gpu/drm/vc4/vc4_debugfs.c | 7 +- drivers/gpu/drm/vc4/vc4_dpi.c | 14 +- drivers/gpu/drm/vc4/vc4_drv.c | 81 +- drivers/gpu/drm/vc4/vc4_drv.h | 36 +- - drivers/gpu/drm/vc4/vc4_dsi.c | 226 +- + drivers/gpu/drm/vc4/vc4_dsi.c | 277 +- drivers/gpu/drm/vc4/vc4_firmware_kms.c | 1992 +++++ drivers/gpu/drm/vc4/vc4_gem.c | 3 +- - drivers/gpu/drm/vc4/vc4_hdmi.c | 1195 ++- + drivers/gpu/drm/vc4/vc4_hdmi.c | 1216 ++- drivers/gpu/drm/vc4/vc4_hdmi.h | 66 +- drivers/gpu/drm/vc4/vc4_hdmi_phy.c | 8 +- - drivers/gpu/drm/vc4/vc4_hdmi_regs.h | 24 +- + drivers/gpu/drm/vc4/vc4_hdmi_regs.h | 27 +- drivers/gpu/drm/vc4/vc4_hvs.c | 63 +- drivers/gpu/drm/vc4/vc4_kms.c | 178 +- drivers/gpu/drm/vc4/vc4_perfmon.c | 2 +- @@ -530,7 +543,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/input/joystick/Kconfig | 8 + drivers/input/joystick/Makefile | 2 +- drivers/input/joystick/rpisense-js.c | 153 + - drivers/input/touchscreen/edt-ft5x06.c | 51 +- + drivers/input/touchscreen/edt-ft5x06.c | 55 +- drivers/irqchip/irq-bcm2835.c | 104 +- drivers/irqchip/irq-bcm2836.c | 28 +- drivers/leds/leds-gpio.c | 17 +- @@ -541,12 +554,13 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/mailbox/bcm2835-mailbox.c | 18 +- drivers/mailbox/mailbox.c | 12 +- .../media/common/videobuf2/videobuf2-core.c | 21 +- - drivers/media/i2c/Kconfig | 34 + - drivers/media/i2c/Makefile | 3 + + drivers/media/i2c/Kconfig | 45 + + drivers/media/i2c/Makefile | 4 + drivers/media/i2c/adv7180.c | 14 + drivers/media/i2c/imx219.c | 229 +- drivers/media/i2c/imx290.c | 613 +- - drivers/media/i2c/imx477.c | 2276 ++++++ + drivers/media/i2c/imx477.c | 2284 ++++++ + drivers/media/i2c/imx519.c | 2091 +++++ drivers/media/i2c/irs1125.c | 1200 +++ drivers/media/i2c/irs1125.h | 95 + drivers/media/i2c/ov5647.c | 1216 ++- @@ -578,17 +592,18 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/mmc/host/Kconfig | 39 + drivers/mmc/host/Makefile | 2 + drivers/mmc/host/bcm2835-mmc.c | 1576 ++++ - drivers/mmc/host/bcm2835-sdhost.c | 2196 +++++ - drivers/mmc/host/sdhci-iproc.c | 12 + + drivers/mmc/host/bcm2835-sdhost.c | 2208 +++++ + drivers/mmc/host/sdhci-iproc.c | 1 + drivers/mmc/host/sdhci.c | 6 +- .../net/ethernet/broadcom/genet/bcmgenet.c | 31 +- .../net/ethernet/broadcom/genet/bcmgenet.h | 2 +- drivers/net/ethernet/broadcom/genet/bcmmii.c | 2 + drivers/net/phy/broadcom.c | 37 +- drivers/net/phy/microchip.c | 27 + + drivers/net/phy/smsc.c | 4 +- drivers/net/usb/Makefile | 2 +- drivers/net/usb/lan78xx.c | 64 +- - drivers/net/usb/r8152.c | 3851 +++++++-- + drivers/net/usb/r8152.c | 3929 +++++++-- drivers/net/usb/r8153_ecm.c | 162 + drivers/net/usb/smsc95xx.c | 80 +- .../broadcom/brcm80211/brcmfmac/bus.h | 11 +- @@ -616,7 +631,9 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/power/supply/Makefile | 1 + drivers/power/supply/rpi_poe_power.c | 227 + drivers/pps/clients/pps-gpio.c | 2 + + .../regulator/rpi-panel-attiny-regulator.c | 254 +- drivers/rtc/rtc-pcf2123.c | 1 + + drivers/rtc/rtc-pcf85063.c | 2 + drivers/rtc/rtc-pcf8523.c | 25 +- drivers/rtc/rtc-rv3028.c | 17 + drivers/soc/bcm/Kconfig | 1 + @@ -632,15 +649,15 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/staging/media/Makefile | 1 + drivers/staging/media/rpivid/Kconfig | 16 + drivers/staging/media/rpivid/Makefile | 5 + - drivers/staging/media/rpivid/rpivid.c | 448 ++ - drivers/staging/media/rpivid/rpivid.h | 211 + + drivers/staging/media/rpivid/rpivid.c | 447 ++ + drivers/staging/media/rpivid/rpivid.h | 202 + drivers/staging/media/rpivid/rpivid_dec.c | 81 + drivers/staging/media/rpivid/rpivid_dec.h | 19 + - drivers/staging/media/rpivid/rpivid_h265.c | 2640 ++++++ + drivers/staging/media/rpivid/rpivid_h265.c | 2688 +++++++ drivers/staging/media/rpivid/rpivid_hw.c | 366 + drivers/staging/media/rpivid/rpivid_hw.h | 303 + - drivers/staging/media/rpivid/rpivid_video.c | 701 ++ - drivers/staging/media/rpivid/rpivid_video.h | 34 + + drivers/staging/media/rpivid/rpivid_video.c | 708 ++ + drivers/staging/media/rpivid/rpivid_video.h | 33 + drivers/staging/vc04_services/Kconfig | 4 + drivers/staging/vc04_services/Makefile | 3 + .../vc04_services/bcm2835-audio/bcm2835-pcm.c | 10 +- @@ -651,7 +668,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../vc04_services/bcm2835-codec/Kconfig | 11 + .../vc04_services/bcm2835-codec/Makefile | 8 + .../staging/vc04_services/bcm2835-codec/TODO | 1 + - .../bcm2835-codec/bcm2835-v4l2-codec.c | 3242 ++++++++ + .../bcm2835-codec/bcm2835-v4l2-codec.c | 3646 +++++++++ .../staging/vc04_services/bcm2835-isp/Kconfig | 14 + .../vc04_services/bcm2835-isp/Makefile | 8 + .../bcm2835-isp/bcm2835-isp-ctrls.h | 72 + @@ -673,9 +690,9 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 .../staging/vc04_services/vchiq-mmal/Kconfig | 3 +- .../vc04_services/vchiq-mmal/mmal-common.h | 5 + .../vc04_services/vchiq-mmal/mmal-encodings.h | 66 + - .../vc04_services/vchiq-mmal/mmal-msg.h | 35 + - .../vchiq-mmal/mmal-parameters.h | 208 +- - .../vc04_services/vchiq-mmal/mmal-vchiq.c | 266 +- + .../vc04_services/vchiq-mmal/mmal-msg.h | 54 + + .../vchiq-mmal/mmal-parameters.h | 251 +- + .../vc04_services/vchiq-mmal/mmal-vchiq.c | 413 +- .../vc04_services/vchiq-mmal/mmal-vchiq.h | 5 + drivers/thermal/broadcom/bcm2711_thermal.c | 2 +- drivers/thermal/gov_step_wise.c | 33 +- @@ -689,7 +706,6 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/usb/core/message.c | 94 + drivers/usb/core/otg_productlist.h | 114 +- drivers/usb/gadget/file_storage.c | 3676 +++++++++ - drivers/usb/gadget/function/f_hid.c | 20 +- drivers/usb/host/Kconfig | 10 + drivers/usb/host/Makefile | 1 + drivers/usb/host/dwc_common_port/Makefile | 58 + @@ -754,8 +770,8 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 drivers/usb/host/dwc_otg/test/test_sysfs.pl | 193 + drivers/usb/host/xhci-mem.c | 8 +- drivers/usb/host/xhci-pci.c | 5 +- - drivers/usb/host/xhci-ring.c | 36 +- - drivers/usb/host/xhci.c | 98 + + drivers/usb/host/xhci-ring.c | 42 +- + drivers/usb/host/xhci.c | 103 + drivers/usb/host/xhci.h | 6 +- drivers/video/backlight/Kconfig | 7 + drivers/video/backlight/Makefile | 1 + @@ -773,6 +789,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 include/drm/drm_atomic_helper.h | 4 - include/drm/drm_connector.h | 4 + include/drm/drm_modeset_helper_vtables.h | 56 +- + include/drm/drm_probe_helper.h | 1 + include/drm/gud.h | 333 + include/dt-bindings/gpio/gpio-fsm.h | 21 + include/linux/brcmphy.h | 1 + @@ -791,11 +808,11 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 include/linux/usb.h | 2 + include/linux/usb/hcd.h | 7 + include/linux/usb/r8152.h | 37 + - include/media/hevc-ctrls.h | 18 + + include/media/hevc-ctrls.h | 17 + include/media/media-request.h | 12 + include/media/v4l2-mediabus.h | 8 + include/media/videobuf2-core.h | 15 + - include/soc/bcm2835/raspberrypi-firmware.h | 32 +- + include/soc/bcm2835/raspberrypi-firmware.h | 29 +- include/sound/hdmi-codec.h | 17 +- include/sound/pcm_iec958.h | 8 + include/uapi/drm/drm_fourcc.h | 11 + @@ -814,7 +831,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 scripts/Makefile.lib | 19 + scripts/gcc-plugin.sh | 1 + sound/core/pcm_iec958.c | 129 +- - sound/soc/bcm/Kconfig | 297 + + sound/soc/bcm/Kconfig | 298 + sound/soc/bcm/Makefile | 69 +- sound/soc/bcm/allo-boss-dac.c | 456 ++ sound/soc/bcm/allo-boss2-dac.c | 1133 +++ @@ -833,7 +850,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 sound/soc/bcm/googlevoicehat-codec.c | 214 + sound/soc/bcm/hifiberry_dacplus.c | 527 ++ sound/soc/bcm/hifiberry_dacplusadc.c | 398 + - sound/soc/bcm/hifiberry_dacplusadcpro.c | 537 ++ + sound/soc/bcm/hifiberry_dacplusadcpro.c | 605 ++ sound/soc/bcm/hifiberry_dacplusdsp.c | 90 + sound/soc/bcm/hifiberry_dacplushd.c | 238 + sound/soc/bcm/i-sabre-q2m.c | 158 + @@ -862,7 +879,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 sound/soc/soc-core.c | 14 +- sound/usb/quirks-table.h | 9 + sound/usb/quirks.c | 6 + - 858 files changed, 166084 insertions(+), 4344 deletions(-) + 875 files changed, 170418 insertions(+), 4551 deletions(-) create mode 100644 Documentation/admin-guide/media/bcm2835-isp.rst create mode 100644 Documentation/devicetree/bindings/clock/raspberrypi,firmware-clocks.yaml create mode 100644 Documentation/devicetree/bindings/hwmon/rpi-poe-fan.txt @@ -870,6 +887,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 Documentation/devicetree/bindings/media/i2c/imx219.txt create mode 100644 Documentation/devicetree/bindings/media/i2c/imx378.yaml create mode 100644 Documentation/devicetree/bindings/media/i2c/imx477.yaml + create mode 100644 Documentation/devicetree/bindings/media/i2c/imx519.yaml create mode 100644 Documentation/devicetree/bindings/media/i2c/irs1125.txt create mode 100644 Documentation/devicetree/bindings/media/rpivid_hevc.yaml create mode 100644 Documentation/devicetree/bindings/misc/brcm,bcm2835-smi-dev.txt @@ -918,6 +936,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/Makefile create mode 100644 arch/arm/boot/dts/overlays/README create mode 100644 arch/arm/boot/dts/overlays/act-led-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/adafruit18-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/adau7002-simple-overlay.dts @@ -959,6 +978,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/dwc-otg-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/dwc2-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/edt-ft5406-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/edt-ft5406.dtsi create mode 100644 arch/arm/boot/dts/overlays/enc28j60-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/enc28j60-spi2-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/exc3000-overlay.dts @@ -1015,6 +1035,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/imx378-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/imx477-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi + create mode 100644 arch/arm/boot/dts/overlays/imx519-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/iqaudio-codec-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts @@ -1032,6 +1053,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/mcp23s17-overlay.dts create mode 100755 arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mcp2515-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/mcp251xfd-overlay.dts create mode 100755 arch/arm/boot/dts/overlays/mcp3008-overlay.dts create mode 100755 arch/arm/boot/dts/overlays/mcp3202-overlay.dts @@ -1040,8 +1062,13 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/merus-amp-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/midi-uart0-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/midi-uart1-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart2-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart3-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart4-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/midi-uart5-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/minipitft13-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/mlx90640-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/mmc-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/mpu6050-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/mz61581-overlay.dts @@ -1071,6 +1098,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 arch/arm/boot/dts/overlays/pwm-ir-tx-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/pwm-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/qca7000-overlay.dts + create mode 100644 arch/arm/boot/dts/overlays/qca7000-uart0-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/rpi-backlight-overlay.dts create mode 100644 arch/arm/boot/dts/overlays/rpi-cirrus-wm5102-overlay.dts @@ -1187,6 +1215,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 drivers/dma/bcm2708-dmaengine.c create mode 100644 drivers/gpio/gpio-bcm-virt.c create mode 100644 drivers/gpio/gpio-fsm.c + create mode 100644 drivers/gpio/gpio-pwm.c create mode 100644 drivers/gpu/drm/gud/Kconfig create mode 100644 drivers/gpu/drm/gud/Makefile create mode 100644 drivers/gpu/drm/gud/gud_connector.c @@ -1201,6 +1230,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 create mode 100644 drivers/leds/trigger/ledtrig-actpwr.c create mode 100644 drivers/leds/trigger/ledtrig-input.c create mode 100644 drivers/media/i2c/imx477.c + create mode 100644 drivers/media/i2c/imx519.c create mode 100644 drivers/media/i2c/irs1125.c create mode 100644 drivers/media/i2c/irs1125.h create mode 100644 drivers/media/i2c/ov9281.c @@ -1361,7 +1391,7 @@ Subject: [PATCH 1/2] apply RPi patch of 5.10.52 diff --git a/Documentation/admin-guide/media/bcm2835-isp.rst b/Documentation/admin-guide/media/bcm2835-isp.rst new file mode 100644 -index 000000000000..e1c19f78435e +index 0000000000000..e1c19f78435e6 --- /dev/null +++ b/Documentation/admin-guide/media/bcm2835-isp.rst @@ -0,0 +1,127 @@ @@ -1494,7 +1524,7 @@ index 000000000000..e1c19f78435e + bcm2835_isp_dpc_mode bcm2835_isp_dpc diff --git a/Documentation/devicetree/bindings/clock/raspberrypi,firmware-clocks.yaml b/Documentation/devicetree/bindings/clock/raspberrypi,firmware-clocks.yaml new file mode 100644 -index 000000000000..2047e25700c6 +index 0000000000000..2047e25700c67 --- /dev/null +++ b/Documentation/devicetree/bindings/clock/raspberrypi,firmware-clocks.yaml @@ -0,0 +1,32 @@ @@ -1531,7 +1561,7 @@ index 000000000000..2047e25700c6 + +... diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml -index 7ce06f9f9f8e..6e8ac910bdd8 100644 +index 7ce06f9f9f8ee..6e8ac910bdd8d 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2711-hdmi.yaml @@ -53,6 +53,24 @@ properties: @@ -1569,7 +1599,7 @@ index 7ce06f9f9f8e..6e8ac910bdd8 100644 examples: - | diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-dsi0.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-dsi0.yaml -index eb44e072b6e5..90ee069ada8d 100644 +index eb44e072b6e59..90ee069ada8d0 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-dsi0.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-dsi0.yaml @@ -20,6 +20,7 @@ properties: @@ -1581,7 +1611,7 @@ index eb44e072b6e5..90ee069ada8d 100644 reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-hdmi.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-hdmi.yaml -index f54b4e4808f0..899d8cfa1731 100644 +index f54b4e4808f07..899d8cfa17312 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-hdmi.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-hdmi.yaml @@ -11,24 +11,58 @@ maintainers: @@ -1740,7 +1770,7 @@ index f54b4e4808f0..899d8cfa1731 100644 + ... diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml -index 49a5e041aa49..eac739a812f5 100644 +index 49a5e041aa493..eac739a812f57 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-vc4.yaml @@ -21,6 +21,11 @@ properties: @@ -1756,7 +1786,7 @@ index 49a5e041aa49..eac739a812f5 100644 - compatible diff --git a/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml b/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml -index d900cc57b4ec..4d8a6b615e5b 100644 +index d900cc57b4ec9..4d8a6b615e5bb 100644 --- a/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml +++ b/Documentation/devicetree/bindings/display/brcm,bcm2835-vec.yaml @@ -11,7 +11,9 @@ maintainers: @@ -1771,7 +1801,7 @@ index d900cc57b4ec..4d8a6b615e5b 100644 reg: maxItems: 1 diff --git a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml -index edb53ab0d9eb..4d50b22554a4 100644 +index edb53ab0d9eb2..4d50b22554a4c 100644 --- a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml +++ b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml @@ -147,6 +147,8 @@ properties: @@ -1785,7 +1815,7 @@ index edb53ab0d9eb..4d50b22554a4 100644 # Innolux G070Y2-L01 7" WVGA (800x480) TFT LCD panel diff --git a/Documentation/devicetree/bindings/hwmon/rpi-poe-fan.txt b/Documentation/devicetree/bindings/hwmon/rpi-poe-fan.txt new file mode 100644 -index 000000000000..c71f8569a4dc +index 0000000000000..c71f8569a4dc9 --- /dev/null +++ b/Documentation/devicetree/bindings/hwmon/rpi-poe-fan.txt @@ -0,0 +1,55 @@ @@ -1846,7 +1876,7 @@ index 000000000000..c71f8569a4dc + }; diff --git a/Documentation/devicetree/bindings/media/bcm2835-unicam.txt b/Documentation/devicetree/bindings/media/bcm2835-unicam.txt new file mode 100644 -index 000000000000..164d0377dcd2 +index 0000000000000..164d0377dcd24 --- /dev/null +++ b/Documentation/devicetree/bindings/media/bcm2835-unicam.txt @@ -0,0 +1,85 @@ @@ -1937,7 +1967,7 @@ index 000000000000..164d0377dcd2 + }; diff --git a/Documentation/devicetree/bindings/media/i2c/imx219.txt b/Documentation/devicetree/bindings/media/i2c/imx219.txt new file mode 100644 -index 000000000000..a02f1ce1e120 +index 0000000000000..a02f1ce1e1204 --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/imx219.txt @@ -0,0 +1,59 @@ @@ -2001,7 +2031,7 @@ index 000000000000..a02f1ce1e120 + }; + }; diff --git a/Documentation/devicetree/bindings/media/i2c/imx290.txt b/Documentation/devicetree/bindings/media/i2c/imx290.txt -index a3cc21410f7c..294e63650d9e 100644 +index a3cc21410f7c6..294e63650d9e3 100644 --- a/Documentation/devicetree/bindings/media/i2c/imx290.txt +++ b/Documentation/devicetree/bindings/media/i2c/imx290.txt @@ -1,13 +1,14 @@ @@ -2024,7 +2054,7 @@ index a3cc21410f7c..294e63650d9e 100644 - clock-names: Should be "xclk". diff --git a/Documentation/devicetree/bindings/media/i2c/imx378.yaml b/Documentation/devicetree/bindings/media/i2c/imx378.yaml new file mode 100644 -index 000000000000..f832b4bfab93 +index 0000000000000..f832b4bfab936 --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/imx378.yaml @@ -0,0 +1,113 @@ @@ -2143,7 +2173,7 @@ index 000000000000..f832b4bfab93 +... diff --git a/Documentation/devicetree/bindings/media/i2c/imx477.yaml b/Documentation/devicetree/bindings/media/i2c/imx477.yaml new file mode 100644 -index 000000000000..0994e13e67f6 +index 0000000000000..0994e13e67f68 --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/imx477.yaml @@ -0,0 +1,113 @@ @@ -2260,9 +2290,128 @@ index 000000000000..0994e13e67f6 + }; + +... +diff --git a/Documentation/devicetree/bindings/media/i2c/imx519.yaml b/Documentation/devicetree/bindings/media/i2c/imx519.yaml +new file mode 100644 +index 0000000000000..717230a21764c +--- /dev/null ++++ b/Documentation/devicetree/bindings/media/i2c/imx519.yaml +@@ -0,0 +1,113 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/media/i2c/imx519.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Sony 1/2.5-Inch 16Mpixel CMOS Digital Image Sensor ++ ++maintainers: ++ - Lee Jackson ++ ++description: |- ++ The Sony IMX519 is a 1/2.5-inch CMOS active pixel digital image sensor ++ with an active array size of 4656H x 3496V. It is programmable through ++ I2C interface. The I2C address is fixed to 0x1A as per sensor data sheet. ++ Image data is sent through MIPI CSI-2, which is configured as either 2 or ++ 4 data lanes. ++ ++properties: ++ compatible: ++ const: sony,imx519 ++ ++ reg: ++ description: I2C device address ++ maxItems: 1 ++ ++ clocks: ++ maxItems: 1 ++ ++ VDIG-supply: ++ description: ++ Digital I/O voltage supply, 1.05 volts ++ ++ VANA-supply: ++ description: ++ Analog voltage supply, 2.8 volts ++ ++ VDDL-supply: ++ description: ++ Digital core voltage supply, 1.8 volts ++ ++ reset-gpios: ++ description: |- ++ Reference to the GPIO connected to the xclr pin, if any. ++ Must be released (set high) after all supplies and INCK are applied. ++ ++ # See ../video-interfaces.txt for more details ++ port: ++ type: object ++ properties: ++ endpoint: ++ type: object ++ properties: ++ data-lanes: ++ description: |- ++ The sensor supports either two-lane, or four-lane operation. ++ For two-lane operation the property must be set to <1 2>. ++ items: ++ - const: 1 ++ - const: 2 ++ ++ clock-noncontinuous: ++ type: boolean ++ description: |- ++ MIPI CSI-2 clock is non-continuous if this property is present, ++ otherwise it's continuous. ++ ++ link-frequencies: ++ allOf: ++ - $ref: /schemas/types.yaml#/definitions/uint64-array ++ description: ++ Allowed data bus frequencies. ++ ++ required: ++ - link-frequencies ++ ++required: ++ - compatible ++ - reg ++ - clocks ++ - VANA-supply ++ - VDIG-supply ++ - VDDL-supply ++ - port ++ ++additionalProperties: false ++ ++examples: ++ - | ++ i2c0 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ imx519: sensor@1a { ++ compatible = "sony,imx519"; ++ reg = <0x1a>; ++ clocks = <&imx519_clk>; ++ VANA-supply = <&imx519_vana>; /* 2.8v */ ++ VDIG-supply = <&imx519_vdig>; /* 1.05v */ ++ VDDL-supply = <&imx519_vddl>; /* 1.8v */ ++ ++ port { ++ imx519_0: endpoint { ++ remote-endpoint = <&csi1_ep>; ++ data-lanes = <1 2>; ++ clock-noncontinuous; ++ link-frequencies = /bits/ 64 <493500000>; ++ }; ++ }; ++ }; ++ }; ++ ++... diff --git a/Documentation/devicetree/bindings/media/i2c/irs1125.txt b/Documentation/devicetree/bindings/media/i2c/irs1125.txt new file mode 100644 -index 000000000000..25a48028c957 +index 0000000000000..25a48028c9577 --- /dev/null +++ b/Documentation/devicetree/bindings/media/i2c/irs1125.txt @@ -0,0 +1,48 @@ @@ -2316,7 +2465,7 @@ index 000000000000..25a48028c957 + }; diff --git a/Documentation/devicetree/bindings/media/rpivid_hevc.yaml b/Documentation/devicetree/bindings/media/rpivid_hevc.yaml new file mode 100644 -index 000000000000..ce6b81a10303 +index 0000000000000..ce6b81a103030 --- /dev/null +++ b/Documentation/devicetree/bindings/media/rpivid_hevc.yaml @@ -0,0 +1,72 @@ @@ -2394,7 +2543,7 @@ index 000000000000..ce6b81a10303 +... diff --git a/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi-dev.txt b/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi-dev.txt new file mode 100644 -index 000000000000..68cc8ebc3392 +index 0000000000000..68cc8ebc3392d --- /dev/null +++ b/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi-dev.txt @@ -0,0 +1,17 @@ @@ -2417,7 +2566,7 @@ index 000000000000..68cc8ebc3392 + diff --git a/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi.txt b/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi.txt new file mode 100644 -index 000000000000..b76dc694f1ac +index 0000000000000..b76dc694f1ac0 --- /dev/null +++ b/Documentation/devicetree/bindings/misc/brcm,bcm2835-smi.txt @@ -0,0 +1,48 @@ @@ -2470,7 +2619,7 @@ index 000000000000..b76dc694f1ac +}; + diff --git a/Documentation/devicetree/bindings/net/microchip,lan78xx.txt b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt -index 11a679530ae6..104768b85bbc 100644 +index 11a679530ae65..104768b85bbc5 100644 --- a/Documentation/devicetree/bindings/net/microchip,lan78xx.txt +++ b/Documentation/devicetree/bindings/net/microchip,lan78xx.txt @@ -14,6 +14,9 @@ Optional properties of the embedded PHY: @@ -2485,7 +2634,7 @@ index 11a679530ae6..104768b85bbc 100644 diff --git a/Documentation/devicetree/bindings/nvmem/rmem.yaml b/Documentation/devicetree/bindings/nvmem/rmem.yaml new file mode 100644 -index 000000000000..29b53871aa02 +index 0000000000000..29b53871aa02c --- /dev/null +++ b/Documentation/devicetree/bindings/nvmem/rmem.yaml @@ -0,0 +1,49 @@ @@ -2540,7 +2689,7 @@ index 000000000000..29b53871aa02 +... diff --git a/Documentation/devicetree/bindings/pci/brcmstb-pcie.txt b/Documentation/devicetree/bindings/pci/brcmstb-pcie.txt new file mode 100644 -index 000000000000..a1a9ad5e70ca +index 0000000000000..a1a9ad5e70cab --- /dev/null +++ b/Documentation/devicetree/bindings/pci/brcmstb-pcie.txt @@ -0,0 +1,59 @@ @@ -2604,7 +2753,7 @@ index 000000000000..a1a9ad5e70ca + linux,pci-domain = <0>; + }; diff --git a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.txt b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.txt -index 3e56c1b34a4c..76dd7b06e26a 100644 +index 3e56c1b34a4c9..76dd7b06e26a1 100644 --- a/Documentation/devicetree/bindings/power/reset/gpio-poweroff.txt +++ b/Documentation/devicetree/bindings/power/reset/gpio-poweroff.txt @@ -31,6 +31,7 @@ Optional properties: @@ -2616,7 +2765,7 @@ index 3e56c1b34a4c..76dd7b06e26a 100644 Examples: diff --git a/Documentation/devicetree/bindings/serial/pl011.yaml b/Documentation/devicetree/bindings/serial/pl011.yaml -index c23c93b400f0..5e1d6483b2a9 100644 +index c23c93b400f06..5e1d6483b2a92 100644 --- a/Documentation/devicetree/bindings/serial/pl011.yaml +++ b/Documentation/devicetree/bindings/serial/pl011.yaml @@ -98,6 +98,12 @@ properties: @@ -2634,7 +2783,7 @@ index c23c93b400f0..5e1d6483b2a9 100644 - reg diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt new file mode 100644 -index 000000000000..f8d32547195b +index 0000000000000..f8d32547195b3 --- /dev/null +++ b/Documentation/devicetree/bindings/vendor-prefixes.txt @@ -0,0 +1,463 @@ @@ -3102,7 +3251,7 @@ index 000000000000..f8d32547195b +zte ZTE Corp. +zyxel ZyXEL Communications Corp. diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml -index 2735be1a8470..0d306469abd0 100644 +index 2735be1a84709..0d306469abd03 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -159,6 +159,8 @@ patternProperties: @@ -3116,7 +3265,7 @@ index 2735be1a8470..0d306469abd0 100644 "^bosch,.*": diff --git a/Documentation/devicetree/configfs-overlays.txt b/Documentation/devicetree/configfs-overlays.txt new file mode 100644 -index 000000000000..5fa43e064307 +index 0000000000000..5fa43e0643072 --- /dev/null +++ b/Documentation/devicetree/configfs-overlays.txt @@ -0,0 +1,31 @@ @@ -3153,7 +3302,7 @@ index 000000000000..5fa43e064307 +make sense for developers (since it avoids problems with namespaces). diff --git a/Documentation/hwmon/rpi-poe-fan b/Documentation/hwmon/rpi-poe-fan new file mode 100644 -index 000000000000..9182ab633993 +index 0000000000000..9182ab6339933 --- /dev/null +++ b/Documentation/hwmon/rpi-poe-fan @@ -0,0 +1,15 @@ @@ -3173,7 +3322,7 @@ index 000000000000..9182ab633993 +the commands to the board over I2C on the ID_EEPROM pins. The driver exposes +the fan to the user space through the hwmon sysfs interface. diff --git a/Documentation/userspace-api/media/drivers/index.rst b/Documentation/userspace-api/media/drivers/index.rst -index 05a82f8c0c99..df39e6ad40e3 100644 +index 05a82f8c0c993..df39e6ad40e30 100644 --- a/Documentation/userspace-api/media/drivers/index.rst +++ b/Documentation/userspace-api/media/drivers/index.rst @@ -33,6 +33,7 @@ For more details see the file COPYING in the source distribution of Linux. @@ -3185,7 +3334,7 @@ index 05a82f8c0c99..df39e6ad40e3 100644 meye-uapi omap3isp-uapi diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst -index ce728c757eaf..1c6e047bc5af 100644 +index b864869b42bc8..3163f501afb48 100644 --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec.rst @@ -4111,6 +4111,9 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - @@ -3207,7 +3356,7 @@ index ce728c757eaf..1c6e047bc5af 100644 - Applications and drivers must set this to zero. * - struct :c:type:`v4l2_hevc_dpb_entry` - ``dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]`` -@@ -4316,6 +4319,47 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - +@@ -4319,6 +4322,47 @@ enum v4l2_mpeg_video_hevc_size_of_length_field - - ``padding[6]`` - Applications and drivers must set this to zero. @@ -3256,7 +3405,7 @@ index ce728c757eaf..1c6e047bc5af 100644 Specifies the decoding mode to use. Currently exposes slice-based and frame-based decoding but new modes might be added later on. diff --git a/Documentation/userspace-api/media/v4l/meta-formats.rst b/Documentation/userspace-api/media/v4l/meta-formats.rst -index fff25357fe86..c1dd92a2d617 100644 +index fff25357fe860..c1dd92a2d617a 100644 --- a/Documentation/userspace-api/media/v4l/meta-formats.rst +++ b/Documentation/userspace-api/media/v4l/meta-formats.rst @@ -12,9 +12,11 @@ These formats are used for the :ref:`metadata` interface only. @@ -3272,7 +3421,7 @@ index fff25357fe86..c1dd92a2d617 100644 pixfmt-meta-vsp1-hgo pixfmt-meta-vsp1-hgt diff --git a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst -index d585909bc4e2..f817c643761b 100644 +index d585909bc4e21..f817c643761bd 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-compressed.rst @@ -200,6 +200,7 @@ Compressed Formats @@ -3285,7 +3434,7 @@ index d585909bc4e2..f817c643761b 100644 number of macroblocks to decode a full corresponding frame. diff --git a/Documentation/userspace-api/media/v4l/pixfmt-meta-bcm2835-isp-stats.rst b/Documentation/userspace-api/media/v4l/pixfmt-meta-bcm2835-isp-stats.rst new file mode 100644 -index 000000000000..f974774c8252 +index 0000000000000..f974774c82527 --- /dev/null +++ b/Documentation/userspace-api/media/v4l/pixfmt-meta-bcm2835-isp-stats.rst @@ -0,0 +1,41 @@ @@ -3332,7 +3481,7 @@ index 000000000000..f974774c8252 + diff --git a/Documentation/userspace-api/media/v4l/pixfmt-meta-sensor-data.rst b/Documentation/userspace-api/media/v4l/pixfmt-meta-sensor-data.rst new file mode 100644 -index 000000000000..4a67e204d08a +index 0000000000000..4a67e204d08a3 --- /dev/null +++ b/Documentation/userspace-api/media/v4l/pixfmt-meta-sensor-data.rst @@ -0,0 +1,32 @@ @@ -3370,7 +3519,7 @@ index 000000000000..4a67e204d08a + diff --git a/Documentation/userspace-api/media/v4l/pixfmt-nv12-col128.rst b/Documentation/userspace-api/media/v4l/pixfmt-nv12-col128.rst new file mode 100644 -index 000000000000..196ca33a5dff +index 0000000000000..196ca33a5dff8 --- /dev/null +++ b/Documentation/userspace-api/media/v4l/pixfmt-nv12-col128.rst @@ -0,0 +1,215 @@ @@ -3590,7 +3739,7 @@ index 000000000000..196ca33a5dff + + diff --git a/Documentation/userspace-api/media/v4l/pixfmt-nv12.rst b/Documentation/userspace-api/media/v4l/pixfmt-nv12.rst -index dd2f38129fe6..359f7ce67114 100644 +index dd2f38129fe66..359f7ce67114b 100644 --- a/Documentation/userspace-api/media/v4l/pixfmt-nv12.rst +++ b/Documentation/userspace-api/media/v4l/pixfmt-nv12.rst @@ -3,9 +3,9 @@ @@ -3623,7 +3772,7 @@ index dd2f38129fe6..359f7ce67114 100644 diff --git a/Documentation/userspace-api/media/v4l/pixfmt-y12p.rst b/Documentation/userspace-api/media/v4l/pixfmt-y12p.rst new file mode 100644 -index 000000000000..3704f9180fd7 +index 0000000000000..3704f9180fd77 --- /dev/null +++ b/Documentation/userspace-api/media/v4l/pixfmt-y12p.rst @@ -0,0 +1,45 @@ @@ -3674,7 +3823,7 @@ index 000000000000..3704f9180fd7 + diff --git a/Documentation/userspace-api/media/v4l/pixfmt-y14p.rst b/Documentation/userspace-api/media/v4l/pixfmt-y14p.rst new file mode 100644 -index 000000000000..27fe14c9a9eb +index 0000000000000..27fe14c9a9ebd --- /dev/null +++ b/Documentation/userspace-api/media/v4l/pixfmt-y14p.rst @@ -0,0 +1,54 @@ @@ -3733,7 +3882,7 @@ index 000000000000..27fe14c9a9eb + + Y'\ :sub:`02low bits 5--4`\ (bits 1--0) diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst -index eff6727c69d3..8e0ae032411a 100644 +index eff6727c69d30..8e0ae032411a1 100644 --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst @@ -908,6 +908,43 @@ The following tables list existing packed RGB formats. @@ -3862,7 +4011,7 @@ index eff6727c69d3..8e0ae032411a 100644 + `_ + diff --git a/Documentation/userspace-api/media/v4l/yuv-formats.rst b/Documentation/userspace-api/media/v4l/yuv-formats.rst -index 4a05a105a9e6..ba3a5b599362 100644 +index 4a05a105a9e6c..ba3a5b5993623 100644 --- a/Documentation/userspace-api/media/v4l/yuv-formats.rst +++ b/Documentation/userspace-api/media/v4l/yuv-formats.rst @@ -28,7 +28,9 @@ to brightness information. @@ -3884,7 +4033,7 @@ index 4a05a105a9e6..ba3a5b599362 100644 pixfmt-nv16m pixfmt-nv24 diff --git a/MAINTAINERS b/MAINTAINERS -index a032b00f1380..80829bbc789e 100644 +index a12ecc71e1e78..884bd3d2e6972 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3417,6 +3417,29 @@ N: bcm113* @@ -3932,7 +4081,7 @@ index a032b00f1380..80829bbc789e 100644 DRM DRIVER FOR GRAIN MEDIA GM12U320 PROJECTORS M: Hans de Goede S: Maintained -@@ -16350,6 +16381,15 @@ S: Maintained +@@ -16357,6 +16388,23 @@ S: Maintained T: git git://linuxtv.org/media_tree.git F: drivers/media/i2c/imx355.c @@ -3944,15 +4093,23 @@ index a032b00f1380..80829bbc789e 100644 +F: Documentation/devicetree/bindings/media/i2c/imx378.yaml +F: Documentation/devicetree/bindings/media/i2c/imx477.yaml +F: drivers/media/i2c/imx477.c ++ ++SONY IMX519 SENSOR DRIVER ++M: Arducam Kernel Maintenance ++L: linux-media@vger.kernel.org ++S: Maintained ++T: git git://linuxtv.org/media_tree.git ++F: Documentation/devicetree/bindings/media/i2c/imx519.yaml ++F: drivers/media/i2c/imx519.c + SONY MEMORYSTICK SUBSYSTEM M: Maxim Levitsky M: Alex Dubov diff --git a/Makefile b/Makefile -index 2dc2317d564f..11271d9f680b 100644 +index fbd2136f7bf8f..624cb8c91b192 100644 --- a/Makefile +++ b/Makefile -@@ -1353,6 +1353,9 @@ ifneq ($(dtstree),) +@@ -1354,6 +1354,9 @@ ifneq ($(dtstree),) %.dtb: include/config/kernel.release scripts_dtc $(Q)$(MAKE) $(build)=$(dtstree) $(dtstree)/$@ @@ -3963,7 +4120,7 @@ index 2dc2317d564f..11271d9f680b 100644 dtbs: include/config/kernel.release scripts_dtc $(Q)$(MAKE) $(build)=$(dtstree) diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile -index ce66ffd5a1bb..93815985f6e0 100644 +index ce66ffd5a1bbc..12cd8bf582e1b 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -1,4 +1,21 @@ @@ -4008,11 +4165,11 @@ index ce66ffd5a1bb..93815985f6e0 100644 + +# Enable fixups to support overlays on BCM2835 platforms +ifeq ($(CONFIG_ARCH_BCM2835),y) -+ DTC_FLAGS ?= -@ ++ DTC_FLAGS += -@ +endif diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts new file mode 100644 -index 000000000000..76bb3e11ce19 +index 0000000000000..e42cba84ab0e0 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-b-plus.dts @@ -0,0 +1,129 @@ @@ -4108,13 +4265,13 @@ index 000000000000..76bb3e11ce19 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 47 0>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "input"; + gpios = <&gpio 35 0>; @@ -4147,7 +4304,7 @@ index 000000000000..76bb3e11ce19 +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts b/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts new file mode 100644 -index 000000000000..a8a3926ef69f +index 0000000000000..4ea1e68f5e298 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-b-rev1.dts @@ -0,0 +1,132 @@ @@ -4256,7 +4413,7 @@ index 000000000000..a8a3926ef69f +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 16 1>; @@ -4285,7 +4442,7 @@ index 000000000000..a8a3926ef69f +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-b.dts b/arch/arm/boot/dts/bcm2708-rpi-b.dts new file mode 100644 -index 000000000000..5d4b7382e684 +index 0000000000000..a152c1c8e648d --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-b.dts @@ -0,0 +1,119 @@ @@ -4381,7 +4538,7 @@ index 000000000000..5d4b7382e684 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 16 1>; @@ -4410,7 +4567,7 @@ index 000000000000..5d4b7382e684 +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi new file mode 100644 -index 000000000000..a18f80af97d3 +index 0000000000000..a18f80af97d32 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-bt.dtsi @@ -0,0 +1,26 @@ @@ -4442,7 +4599,7 @@ index 000000000000..a18f80af97d3 +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-cm.dts b/arch/arm/boot/dts/bcm2708-rpi-cm.dts new file mode 100644 -index 000000000000..f61e3418425a +index 0000000000000..f61e3418425a9 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dts @@ -0,0 +1,112 @@ @@ -4560,7 +4717,7 @@ index 000000000000..f61e3418425a +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi new file mode 100644 -index 000000000000..dce160f420fd +index 0000000000000..d5572b2d21033 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-cm.dtsi @@ -0,0 +1,18 @@ @@ -4568,7 +4725,7 @@ index 000000000000..dce160f420fd +#include "bcm2708-rpi.dtsi" + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 47 0>; @@ -4584,7 +4741,7 @@ index 000000000000..dce160f420fd +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts new file mode 100644 -index 000000000000..abf490f93b96 +index 0000000000000..75a5b41514f9f --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-zero-w.dts @@ -0,0 +1,169 @@ @@ -4729,7 +4886,7 @@ index 000000000000..abf490f93b96 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "actpwr"; + gpios = <&gpio 47 GPIO_ACTIVE_LOW>; @@ -4759,7 +4916,7 @@ index 000000000000..abf490f93b96 +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi-zero.dts b/arch/arm/boot/dts/bcm2708-rpi-zero.dts new file mode 100644 -index 000000000000..38fcd6e84796 +index 0000000000000..84591bd7d423e --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi-zero.dts @@ -0,0 +1,123 @@ @@ -4858,7 +5015,7 @@ index 000000000000..38fcd6e84796 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "actpwr"; + gpios = <&gpio 47 GPIO_ACTIVE_LOW>; @@ -4888,7 +5045,7 @@ index 000000000000..38fcd6e84796 +}; diff --git a/arch/arm/boot/dts/bcm2708-rpi.dtsi b/arch/arm/boot/dts/bcm2708-rpi.dtsi new file mode 100644 -index 000000000000..e2458b15d64a +index 0000000000000..e2458b15d64ab --- /dev/null +++ b/arch/arm/boot/dts/bcm2708-rpi.dtsi @@ -0,0 +1,36 @@ @@ -4930,7 +5087,7 @@ index 000000000000..e2458b15d64a +}; diff --git a/arch/arm/boot/dts/bcm2708.dtsi b/arch/arm/boot/dts/bcm2708.dtsi new file mode 100644 -index 000000000000..36ec4989403f +index 0000000000000..36ec4989403f5 --- /dev/null +++ b/arch/arm/boot/dts/bcm2708.dtsi @@ -0,0 +1,12 @@ @@ -4948,7 +5105,7 @@ index 000000000000..36ec4989403f +}; diff --git a/arch/arm/boot/dts/bcm2709-rpi-2-b.dts b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts new file mode 100644 -index 000000000000..b0ccd8cd0705 +index 0000000000000..e1381d2b3a2c6 --- /dev/null +++ b/arch/arm/boot/dts/bcm2709-rpi-2-b.dts @@ -0,0 +1,129 @@ @@ -5044,13 +5201,13 @@ index 000000000000..b0ccd8cd0705 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 47 0>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "input"; + gpios = <&gpio 35 0>; @@ -5083,7 +5240,7 @@ index 000000000000..b0ccd8cd0705 +}; diff --git a/arch/arm/boot/dts/bcm2709-rpi.dtsi b/arch/arm/boot/dts/bcm2709-rpi.dtsi new file mode 100644 -index 000000000000..babfa41cd9f7 +index 0000000000000..babfa41cd9f78 --- /dev/null +++ b/arch/arm/boot/dts/bcm2709-rpi.dtsi @@ -0,0 +1,5 @@ @@ -5094,7 +5251,7 @@ index 000000000000..babfa41cd9f7 +}; diff --git a/arch/arm/boot/dts/bcm2709.dtsi b/arch/arm/boot/dts/bcm2709.dtsi new file mode 100644 -index 000000000000..68eafc1b281a +index 0000000000000..68eafc1b281a5 --- /dev/null +++ b/arch/arm/boot/dts/bcm2709.dtsi @@ -0,0 +1,22 @@ @@ -5122,10 +5279,10 @@ index 000000000000..68eafc1b281a +}; diff --git a/arch/arm/boot/dts/bcm270x-rpi.dtsi b/arch/arm/boot/dts/bcm270x-rpi.dtsi new file mode 100644 -index 000000000000..68a7e1c09db1 +index 0000000000000..57e7d5f60d3e9 --- /dev/null +++ b/arch/arm/boot/dts/bcm270x-rpi.dtsi -@@ -0,0 +1,154 @@ +@@ -0,0 +1,155 @@ +/* Downstream modifications to bcm2835-rpi.dtsi */ + +/ { @@ -5193,12 +5350,6 @@ index 000000000000..68a7e1c09db1 + status = "okay"; + }; + -+ vcsm: vcsm { -+ compatible = "raspberrypi,bcm2835-vcsm"; -+ firmware = <&firmware>; -+ status = "okay"; -+ }; -+ + /* External sound card */ + sound: sound { + status = "disabled"; @@ -5276,16 +5427,23 @@ index 000000000000..68a7e1c09db1 + /* Onboard audio */ + audio: bcm2835_audio { + compatible = "brcm,bcm2835-audio"; ++ brcm,firmware = <&firmware>; + brcm,pwm-channels = <8>; + status = "disabled"; + }; +}; ++ ++&firmware { ++ vcio: vcio { ++ compatible = "raspberrypi,vcio"; ++ }; ++}; diff --git a/arch/arm/boot/dts/bcm270x.dtsi b/arch/arm/boot/dts/bcm270x.dtsi new file mode 100644 -index 000000000000..6a865d9f553f +index 0000000000000..badcf341ecd2f --- /dev/null +++ b/arch/arm/boot/dts/bcm270x.dtsi -@@ -0,0 +1,216 @@ +@@ -0,0 +1,217 @@ +/* Downstream bcm283x.dtsi diff */ +#include + @@ -5321,7 +5479,7 @@ index 000000000000..6a865d9f553f + }; +#endif + -+ /delete-node/ sdhci@7e300000; ++ /delete-node/ mmc@7e300000; + + sdhci: mmc: mmc@7e300000 { + compatible = "brcm,bcm2835-mmc", "brcm,bcm2835-sdhci"; @@ -5496,6 +5654,7 @@ index 000000000000..6a865d9f553f + bus-width = <4>; + brcm,overclock-50 = <0>; + brcm,pio-limit = <1>; ++ firmware = <&firmware>; +}; + +&spi0 { @@ -5504,7 +5663,7 @@ index 000000000000..6a865d9f553f +}; diff --git a/arch/arm/boot/dts/bcm2710-rpi-2-b.dts b/arch/arm/boot/dts/bcm2710-rpi-2-b.dts new file mode 100644 -index 000000000000..b870b1cb9b93 +index 0000000000000..ae9db1b1be1b2 --- /dev/null +++ b/arch/arm/boot/dts/bcm2710-rpi-2-b.dts @@ -0,0 +1,129 @@ @@ -5600,13 +5759,13 @@ index 000000000000..b870b1cb9b93 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 47 0>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "input"; + gpios = <&gpio 35 0>; @@ -5639,7 +5798,7 @@ index 000000000000..b870b1cb9b93 +}; diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts new file mode 100644 -index 000000000000..b713eca31221 +index 0000000000000..7e12c05cc28bd --- /dev/null +++ b/arch/arm/boot/dts/bcm2710-rpi-3-b-plus.dts @@ -0,0 +1,201 @@ @@ -5794,13 +5953,13 @@ index 000000000000..b713eca31221 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 29 0>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "default-on"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; @@ -5846,7 +6005,7 @@ index 000000000000..b713eca31221 +}; diff --git a/arch/arm/boot/dts/bcm2710-rpi-3-b.dts b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts new file mode 100644 -index 000000000000..ecab394195a4 +index 0000000000000..d40722ddc286c --- /dev/null +++ b/arch/arm/boot/dts/bcm2710-rpi-3-b.dts @@ -0,0 +1,203 @@ @@ -6016,13 +6175,13 @@ index 000000000000..ecab394195a4 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&virtgpio 0 0>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "input"; + gpios = <&expgpio 7 0>; @@ -6055,7 +6214,7 @@ index 000000000000..ecab394195a4 +}; diff --git a/arch/arm/boot/dts/bcm2710-rpi-cm3.dts b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts new file mode 100644 -index 000000000000..6743c984a316 +index 0000000000000..c386a855cdc3b --- /dev/null +++ b/arch/arm/boot/dts/bcm2710-rpi-cm3.dts @@ -0,0 +1,148 @@ @@ -6184,7 +6343,7 @@ index 000000000000..6743c984a316 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&virtgpio 0 0>; @@ -6209,7 +6368,7 @@ index 000000000000..6743c984a316 +}; diff --git a/arch/arm/boot/dts/bcm2710.dtsi b/arch/arm/boot/dts/bcm2710.dtsi new file mode 100644 -index 000000000000..e7e5c913f1d1 +index 0000000000000..e7e5c913f1d1c --- /dev/null +++ b/arch/arm/boot/dts/bcm2710.dtsi @@ -0,0 +1,25 @@ @@ -6239,7 +6398,7 @@ index 000000000000..e7e5c913f1d1 + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts -index 09a1182c2936..8f5045a33a88 100644 +index 5395e8c2484e0..e0d1128c94394 100644 --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts @@ -2,7 +2,6 @@ @@ -6556,13 +6715,13 @@ index 09a1182c2936..8f5045a33a88 100644 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "default-on"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; @@ -6602,10 +6761,10 @@ index 09a1182c2936..8f5045a33a88 100644 +}; diff --git a/arch/arm/boot/dts/bcm2711-rpi-400.dts b/arch/arm/boot/dts/bcm2711-rpi-400.dts new file mode 100644 -index 000000000000..8e69f0e14c2a +index 0000000000000..c25a97465d2ba --- /dev/null +++ b/arch/arm/boot/dts/bcm2711-rpi-400.dts -@@ -0,0 +1,634 @@ +@@ -0,0 +1,636 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +#include "bcm2711.dtsi" @@ -6636,11 +6795,11 @@ index 000000000000..8e69f0e14c2a + }; + + leds { -+ act { ++ led-act { + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; + }; + -+ pwr { ++ led-pwr { + label = "PWR"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; + default-state = "keep"; @@ -6789,12 +6948,14 @@ index 000000000000..8e69f0e14c2a +&hdmi0 { + clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>; + clock-names = "hdmi", "bvb", "audio", "cec"; ++ wifi-2.4ghz-coexistence; + status = "okay"; +}; + +&hdmi1 { + clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>; + clock-names = "hdmi", "bvb", "audio", "cec"; ++ wifi-2.4ghz-coexistence; + status = "okay"; +}; + @@ -7194,14 +7355,14 @@ index 000000000000..8e69f0e14c2a +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "default-on"; + default-state = "on"; + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "default-on"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; @@ -7242,10 +7403,10 @@ index 000000000000..8e69f0e14c2a +}; diff --git a/arch/arm/boot/dts/bcm2711-rpi-cm4.dts b/arch/arm/boot/dts/bcm2711-rpi-cm4.dts new file mode 100644 -index 000000000000..d9271012a572 +index 0000000000000..1dcbb2173f5d7 --- /dev/null +++ b/arch/arm/boot/dts/bcm2711-rpi-cm4.dts -@@ -0,0 +1,657 @@ +@@ -0,0 +1,659 @@ +// SPDX-License-Identifier: GPL-2.0 +/dts-v1/; +#include "bcm2711.dtsi" @@ -7276,11 +7437,11 @@ index 000000000000..d9271012a572 + }; + + leds { -+ act { ++ led-act { + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; + }; + -+ pwr { ++ led-pwr { + label = "PWR"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; + default-state = "keep"; @@ -7441,12 +7602,14 @@ index 000000000000..d9271012a572 +&hdmi0 { + clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 0>, <&clk_27MHz>; + clock-names = "hdmi", "bvb", "audio", "cec"; ++ wifi-2.4ghz-coexistence; + status = "okay"; +}; + +&hdmi1 { + clocks = <&firmware_clocks 13>, <&firmware_clocks 14>, <&dvp 1>, <&clk_27MHz>; + clock-names = "hdmi", "bvb", "audio", "cec"; ++ wifi-2.4ghz-coexistence; + status = "okay"; +}; + @@ -7845,13 +8008,13 @@ index 000000000000..d9271012a572 +}; + +&leds { -+ act_led: act { ++ act_led: led-act { + label = "led0"; + linux,default-trigger = "mmc0"; + gpios = <&gpio 42 GPIO_ACTIVE_HIGH>; + }; + -+ pwr_led: pwr { ++ pwr_led: led-pwr { + label = "led1"; + linux,default-trigger = "default-on"; + gpios = <&expgpio 2 GPIO_ACTIVE_LOW>; @@ -7905,7 +8068,7 @@ index 000000000000..d9271012a572 +}; diff --git a/arch/arm/boot/dts/bcm2711-rpi.dtsi b/arch/arm/boot/dts/bcm2711-rpi.dtsi new file mode 100644 -index 000000000000..ebf73b789b4a +index 0000000000000..ebf73b789b4af --- /dev/null +++ b/arch/arm/boot/dts/bcm2711-rpi.dtsi @@ -0,0 +1,205 @@ @@ -8115,7 +8278,7 @@ index 000000000000..ebf73b789b4a + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi -index 4847dd305317..b9edf0dee35c 100644 +index 3d040f6e2a20f..2933cf91c27d2 100644 --- a/arch/arm/boot/dts/bcm2711.dtsi +++ b/arch/arm/boot/dts/bcm2711.dtsi @@ -300,6 +300,14 @@ pixelvalve3: pixelvalve@7ec12000 { @@ -8283,7 +8446,7 @@ index 4847dd305317..b9edf0dee35c 100644 -}; diff --git a/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi new file mode 100644 -index 000000000000..6b9b79f74cf3 +index 0000000000000..6b9b79f74cf36 --- /dev/null +++ b/arch/arm/boot/dts/bcm271x-rpi-bt.dtsi @@ -0,0 +1,26 @@ @@ -8314,7 +8477,7 @@ index 000000000000..6b9b79f74cf3 + }; +}; diff --git a/arch/arm/boot/dts/bcm2835-common.dtsi b/arch/arm/boot/dts/bcm2835-common.dtsi -index 4119271c979d..06d8c3882cb7 100644 +index 4119271c979d6..06d8c3882cb7e 100644 --- a/arch/arm/boot/dts/bcm2835-common.dtsi +++ b/arch/arm/boot/dts/bcm2835-common.dtsi @@ -106,6 +106,14 @@ i2c2: i2c@7e805000 { @@ -8349,7 +8512,7 @@ index 4119271c979d..06d8c3882cb7 100644 status = "disabled"; }; diff --git a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts -index 6c8ce39833bf..e82e75ec342a 100644 +index 40b9405f1a8e4..d2384d8e8555f 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts @@ -126,3 +126,8 @@ &uart0 { @@ -8362,7 +8525,7 @@ index 6c8ce39833bf..e82e75ec342a 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-a.dts b/arch/arm/boot/dts/bcm2835-rpi-a.dts -index 17fdd48346ff..d400f88127db 100644 +index 11edb581dbaf0..4ceca674b7526 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-a.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-a.dts @@ -121,3 +121,10 @@ &uart0 { @@ -8377,7 +8540,7 @@ index 17fdd48346ff..d400f88127db 100644 + pinctrl-1 = <&i2c0_gpio0>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts -index b0355c229cdc..57ab4d443493 100644 +index 1b435c64bd9c1..8f2d10d82fa15 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts @@ -128,3 +128,8 @@ &uart0 { @@ -8390,7 +8553,7 @@ index b0355c229cdc..57ab4d443493 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts -index 33b3b5c02521..cb08d5ac0412 100644 +index a23c25c00eea7..547c88a3ae9fe 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts @@ -121,3 +121,10 @@ &uart0 { @@ -8405,7 +8568,7 @@ index 33b3b5c02521..cb08d5ac0412 100644 + pinctrl-1 = <&i2c0_gpio0>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts -index 2b69957e0113..d5b4d9d20424 100644 +index 1b63d6b19750b..073fc99ef8a2b 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-b.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts @@ -116,3 +116,10 @@ &uart0 { @@ -8420,7 +8583,7 @@ index 2b69957e0113..d5b4d9d20424 100644 + pinctrl-1 = <&i2c0_gpio0>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-cm1-io1.dts b/arch/arm/boot/dts/bcm2835-rpi-cm1-io1.dts -index a75c882e6575..95564c93a645 100644 +index a75c882e65751..95564c93a6452 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-cm1-io1.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-cm1-io1.dts @@ -95,3 +95,8 @@ &uart0 { @@ -8433,7 +8596,7 @@ index a75c882e6575..95564c93a645 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts -index f65448c01e31..7de8af65c142 100644 +index 33b2b77aa47db..3ea5c7e6be54f 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-zero-w.dts @@ -149,3 +149,8 @@ &uart1 { @@ -8446,7 +8609,7 @@ index f65448c01e31..7de8af65c142 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi-zero.dts b/arch/arm/boot/dts/bcm2835-rpi-zero.dts -index 6dd93c6f4966..cad16a2df245 100644 +index 6f9b3a908f287..a0eabab12c994 100644 --- a/arch/arm/boot/dts/bcm2835-rpi-zero.dts +++ b/arch/arm/boot/dts/bcm2835-rpi-zero.dts @@ -117,3 +117,8 @@ &uart0 { @@ -8459,7 +8622,7 @@ index 6dd93c6f4966..cad16a2df245 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi -index d94357b21f7e..f71afafbc4b8 100644 +index 87ddcad760834..edc55bba5ff4b 100644 --- a/arch/arm/boot/dts/bcm2835-rpi.dtsi +++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi @@ -19,6 +19,11 @@ firmware: firmware { @@ -8507,7 +8670,7 @@ index d94357b21f7e..f71afafbc4b8 100644 power-domains = <&power RPI_POWER_DOMAIN_VEC>; status = "okay"; diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi -index 0549686134ea..2ea891228ea0 100644 +index 0549686134ea6..2ea891228ea07 100644 --- a/arch/arm/boot/dts/bcm2835.dtsi +++ b/arch/arm/boot/dts/bcm2835.dtsi @@ -19,7 +19,7 @@ cpu@0 { @@ -8520,7 +8683,7 @@ index 0549686134ea..2ea891228ea0 100644 arm-pmu { diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts -index 0455a680394a..f62eff03dae1 100644 +index d8af8eeac7b6f..bf22b74359d8a 100644 --- a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts +++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts @@ -128,3 +128,8 @@ &uart0 { @@ -8533,7 +8696,7 @@ index 0455a680394a..f62eff03dae1 100644 + pinctrl-1 = <&i2c0_gpio28>; +}; diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts -index 28be0332c1c8..495117f2324a 100644 +index 77099a7871b03..9529c04756730 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-3-a-plus.dts @@ -178,3 +178,8 @@ &uart1 { @@ -8546,7 +8709,7 @@ index 28be0332c1c8..495117f2324a 100644 + pinctrl-1 = <&i2c0_gpio44>; +}; diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts -index 37343148643d..8482b40e4117 100644 +index 61010266ca9a3..40cb269aed0fd 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b-plus.dts @@ -181,3 +181,8 @@ &uart1 { @@ -8559,7 +8722,7 @@ index 37343148643d..8482b40e4117 100644 + pinctrl-1 = <&i2c0_gpio44>; +}; diff --git a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts -index 054ecaa355c9..5474f8ab894f 100644 +index dd4a486040971..8f16b6b3fe08b 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-3-b.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-3-b.dts @@ -174,3 +174,8 @@ &sdhost { @@ -8572,7 +8735,7 @@ index 054ecaa355c9..5474f8ab894f 100644 + pinctrl-1 = <&i2c0_gpio44>; +}; diff --git a/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts b/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts -index 588d9411ceb6..dde209ade51b 100644 +index 588d9411ceb61..dde209ade51b9 100644 --- a/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts +++ b/arch/arm/boot/dts/bcm2837-rpi-cm3-io3.dts @@ -94,3 +94,8 @@ &uart0 { @@ -8586,7 +8749,7 @@ index 588d9411ceb6..dde209ade51b 100644 +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-cam1-regulator.dtsi b/arch/arm/boot/dts/bcm283x-rpi-cam1-regulator.dtsi new file mode 100644 -index 000000000000..55237d03ed94 +index 0000000000000..55237d03ed949 --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-cam1-regulator.dtsi @@ -0,0 +1,10 @@ @@ -8602,7 +8765,7 @@ index 000000000000..55237d03ed94 +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi new file mode 100644 -index 000000000000..6e4ce8622b47 +index 0000000000000..6e4ce8622b477 --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-csi0-2lane.dtsi @@ -0,0 +1,4 @@ @@ -8612,7 +8775,7 @@ index 000000000000..6e4ce8622b47 +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi new file mode 100644 -index 000000000000..6938f4daacdc +index 0000000000000..6938f4daacdc2 --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-csi1-2lane.dtsi @@ -0,0 +1,4 @@ @@ -8622,7 +8785,7 @@ index 000000000000..6938f4daacdc +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi b/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi new file mode 100644 -index 000000000000..b37037437bee +index 0000000000000..b37037437beed --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-csi1-4lane.dtsi @@ -0,0 +1,4 @@ @@ -8632,7 +8795,7 @@ index 000000000000..b37037437bee +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi new file mode 100644 -index 000000000000..38f0074bce3f +index 0000000000000..38f0074bce3ff --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_28.dtsi @@ -0,0 +1,4 @@ @@ -8642,7 +8805,7 @@ index 000000000000..38f0074bce3f +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi new file mode 100644 -index 000000000000..119946d878db +index 0000000000000..119946d878dbf --- /dev/null +++ b/arch/arm/boot/dts/bcm283x-rpi-i2c0mux_0_44.dtsi @@ -0,0 +1,4 @@ @@ -8652,7 +8815,7 @@ index 000000000000..119946d878db +}; diff --git a/arch/arm/boot/dts/bcm283x-rpi-usb-peripheral.dtsi b/arch/arm/boot/dts/bcm283x-rpi-usb-peripheral.dtsi deleted file mode 100644 -index 0ff0e9e25327..000000000000 +index 0ff0e9e253272..0000000000000 --- a/arch/arm/boot/dts/bcm283x-rpi-usb-peripheral.dtsi +++ /dev/null @@ -1,7 +0,0 @@ @@ -8664,7 +8827,7 @@ index 0ff0e9e25327..000000000000 - g-tx-fifo-size = <256 256 512 512 512 768 768>; -}; diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi -index b83a864e2e8b..b95e0cf827d3 100644 +index 0f3be55201a5b..06d04cde52b9a 100644 --- a/arch/arm/boot/dts/bcm283x.dtsi +++ b/arch/arm/boot/dts/bcm283x.dtsi @@ -334,7 +334,7 @@ spi: spi@7e204000 { @@ -8724,16 +8887,17 @@ index b83a864e2e8b..b95e0cf827d3 100644 reg = <0x7e980000 0x10000>; diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile new file mode 100644 -index 000000000000..6ab8969f9d85 +index 0000000000000..b36c618b01d08 --- /dev/null +++ b/arch/arm/boot/dts/overlays/Makefile -@@ -0,0 +1,243 @@ +@@ -0,0 +1,252 @@ +# Overlays for the Raspberry Pi platform + +dtb-$(CONFIG_ARCH_BCM2835) += overlay_map.dtb + +dtbo-$(CONFIG_ARCH_BCM2835) += \ + act-led.dtbo \ ++ adafruit-st7735r.dtbo \ + adafruit18.dtbo \ + adau1977-adc.dtbo \ + adau7002-simple.dtbo \ @@ -8828,6 +8992,7 @@ index 000000000000..6ab8969f9d85 + imx290.dtbo \ + imx378.dtbo \ + imx477.dtbo \ ++ imx519.dtbo \ + iqaudio-codec.dtbo \ + iqaudio-dac.dtbo \ + iqaudio-dacplus.dtbo \ @@ -8843,6 +9008,7 @@ index 000000000000..6ab8969f9d85 + mbed-dac.dtbo \ + mcp23017.dtbo \ + mcp23s17.dtbo \ ++ mcp2515.dtbo \ + mcp2515-can0.dtbo \ + mcp2515-can1.dtbo \ + mcp251xfd.dtbo \ @@ -8853,8 +9019,13 @@ index 000000000000..6ab8969f9d85 + merus-amp.dtbo \ + midi-uart0.dtbo \ + midi-uart1.dtbo \ ++ midi-uart2.dtbo \ ++ midi-uart3.dtbo \ ++ midi-uart4.dtbo \ ++ midi-uart5.dtbo \ + minipitft13.dtbo \ + miniuart-bt.dtbo \ ++ mlx90640.dtbo \ + mmc.dtbo \ + mpu6050.dtbo \ + mz61581.dtbo \ @@ -8883,6 +9054,7 @@ index 000000000000..6ab8969f9d85 + pwm-2chan.dtbo \ + pwm-ir-tx.dtbo \ + qca7000.dtbo \ ++ qca7000-uart0.dtbo \ + rotary-encoder.dtbo \ + rpi-backlight.dtbo \ + rpi-cirrus-wm5102.dtbo \ @@ -8973,10 +9145,10 @@ index 000000000000..6ab8969f9d85 +clean-files := *.dtbo diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README new file mode 100644 -index 000000000000..fafec158c1bb +index 0000000000000..5064d8eb20402 --- /dev/null +++ b/arch/arm/boot/dts/overlays/README -@@ -0,0 +1,3476 @@ +@@ -0,0 +1,3576 @@ +Introduction +============ + @@ -9214,7 +9386,7 @@ index 000000000000..fafec158c1bb + sd_debug Enable debug output from SD driver (default off) + + sdio_overclock Clock (in MHz) to use when the MMC framework -+ requests 50MHz for the SDIO/WiFi interface. ++ requests 50MHz for the SDIO/WLAN interface. + + tx_lpi_timer Set the delay in microseconds between going idle + and entering the low power state (default 600). @@ -9278,9 +9450,23 @@ index 000000000000..fafec158c1bb + REQUIRED + + ++Name: adafruit-st7735r ++Info: Overlay for the SPI-connected Adafruit 1.8" 160x128 or 128x128 displays, ++ based on the ST7735R chip. ++ This overlay uses the newer DRM/KMS "Tiny" driver. ++Load: dtoverlay=adafruit-st7735r,= ++Params: 128x128 Select the 128x128 driver (default 160x128) ++ rotate Display rotation {0,90,180,270} (default 90) ++ speed SPI bus speed in Hz (default 4000000) ++ dc_pin GPIO pin for D/C (default 24) ++ reset_pin GPIO pin for RESET (default 25) ++ led_pin GPIO used to control backlight (default 18) ++ ++ +Name: adafruit18 +Info: Overlay for the SPI-connected Adafruit 1.8" display (based on the + ST7735R chip). It includes support for the "green tab" version. ++ This overlay uses the older fbtft driver. +Load: dtoverlay=adafruit18,= +Params: green Use the adafruit18_green variant. + rotate Display rotation {0,90,180,270} @@ -9590,7 +9776,7 @@ index 000000000000..fafec158c1bb + + +Name: balena-fin -+Info: Overlay that enables WiFi, Bluetooth and the GPIO expander on the ++Info: Overlay that enables WLAN, Bluetooth and the GPIO expander on the + balenaFin carrier board for the Raspberry Pi Compute Module 3/3+ Lite. +Load: dtoverlay=balena-fin +Params: @@ -9673,7 +9859,7 @@ index 000000000000..fafec158c1bb + + +Name: disable-wifi -+Info: Disable onboard WiFi on Pi 3B, 3B+, 3A+, 4B and Zero W. ++Info: Disable onboard WLAN on Pi 3B, 3B+, 3A+, 4B and Zero W. +Load: dtoverlay=disable-wifi +Params: + @@ -10369,6 +10555,8 @@ index 000000000000..fafec158c1bb + AB0801, AB0803, AB0804, AB0805, + AB1801, AB1803, AB1804, AB1805 + ++ bq32000 Select the TI BQ32000 device ++ + ds1307 Select the DS1307 device + + ds1339 Select the DS1339 device @@ -10413,6 +10601,9 @@ index 000000000000..fafec158c1bb + device must be configured to use the specified + address. + ++ trickle-diode-disable Do not use the internal trickle charger diode ++ (BQ32000 only) ++ + trickle-diode-type Diode type for trickle charge - "standard" or + "schottky" (ABx80x and RV1805 only) + @@ -10434,6 +10625,8 @@ index 000000000000..fafec158c1bb + AB0801, AB0803, AB0804, AB0805, + AB1801, AB1803, AB1804, AB1805 + ++ bq32000 Select the TI BQ32000 device ++ + ds1307 Select the DS1307 device + + ds1339 Select the DS1339 device @@ -10474,6 +10667,9 @@ index 000000000000..fafec158c1bb + device must be configured to use the specified + address. + ++ trickle-diode-disable Do not use the internal trickle charger diode ++ (BQ32000 only) ++ + trickle-diode-type Diode type for trickle charge - "standard" or + "schottky" (ABx80x and RV1805 only) + @@ -10707,6 +10903,17 @@ index 000000000000..fafec158c1bb + 2 = external, default external) + + ++Name: imx519 ++Info: Sony IMX519 camera module. ++ Uses Unicam 1, which is the standard camera connector on most Pi ++ variants. ++Load: dtoverlay=imx519,= ++Params: rotation Mounting rotation of the camera sensor (0 or ++ 180, default 0) ++ orientation Sensor orientation (0 = front, 1 = rear, ++ 2 = external, default external) ++ ++ +Name: iqaudio-codec +Info: Configures the IQaudio Codec audio card +Load: dtoverlay=iqaudio-codec @@ -10946,6 +11153,21 @@ index 000000000000..fafec158c1bb + or INTB output of MCP23S17 is connected. + + ++Name: mcp2515 ++Info: Configures the MCP2515 CAN controller on spi0/1/2 ++ For devices on spi1 or spi2, the interfaces should be enabled ++ with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays. ++Load: dtoverlay=mcp2515,= ++Params: spi- Configure device at spi, cs ++ (boolean, required) ++ ++ oscillator Clock frequency for the CAN controller (Hz) ++ ++ speed Maximum SPI frequence (Hz) ++ ++ interrupt GPIO for interrupt signal ++ ++ +Name: mcp2515-can0 +Info: Configures the MCP2515 CAN controller on spi0.0 +Load: dtoverlay=mcp2515-can0,= @@ -11067,6 +11289,34 @@ index 000000000000..fafec158c1bb +Params: + + ++Name: midi-uart2 ++Info: Configures UART2 (ttyAMA1) so that a requested 38.4kbaud actually gets ++ 31.25kbaud, the frequency required for MIDI ++Load: dtoverlay=midi-uart2 ++Params: ++ ++ ++Name: midi-uart3 ++Info: Configures UART3 (ttyAMA2) so that a requested 38.4kbaud actually gets ++ 31.25kbaud, the frequency required for MIDI ++Load: dtoverlay=midi-uart3 ++Params: ++ ++ ++Name: midi-uart4 ++Info: Configures UART4 (ttyAMA3) so that a requested 38.4kbaud actually gets ++ 31.25kbaud, the frequency required for MIDI ++Load: dtoverlay=midi-uart4 ++Params: ++ ++ ++Name: midi-uart5 ++Info: Configures UART5 (ttyAMA4) so that a requested 38.4kbaud actually gets ++ 31.25kbaud, the frequency required for MIDI ++Load: dtoverlay=midi-uart5 ++Params: ++ ++ +Name: minipitft13 +Info: Overlay for AdaFruit Mini Pi 1.3" TFT via SPI using fbtft driver. +Load: dtoverlay=minipitft13,= @@ -11093,6 +11343,12 @@ index 000000000000..fafec158c1bb + driver without need of hciattach/btattach + + ++Name: mlx90640 ++Info: Overlay for i2c connected mlx90640 thermal camera ++Load: dtoverlay=mlx90640 ++Params: ++ ++ +Name: mmc +Info: Selects the bcm2835-mmc SD/MMC driver, optionally with overclock +Load: dtoverlay=mmc,= @@ -11445,13 +11701,24 @@ index 000000000000..fafec158c1bb + + +Name: qca7000 -+Info: I2SE's Evaluation Board for PLC Stamp micro ++Info: in-tech's Evaluation Board for PLC Stamp micro ++ This uses spi0 and a separate GPIO interrupt to connect the QCA7000. +Load: dtoverlay=qca7000,= +Params: int_pin GPIO pin for interrupt signal (default 23) + + speed SPI bus speed (default 12 MHz) + + ++Name: qca7000-uart0 ++Info: in-tech's Evaluation Board for PLC Stamp micro (UART) ++ This uses uart0/ttyAMA0 over GPIOs 14 & 15 to connect the QCA7000. ++ But it requires disabling of onboard Bluetooth on ++ Pi 3B, 3B+, 3A+, 4B and Zero W. ++Load: dtoverlay=qca7000-uart0,= ++Params: baudrate Set the baudrate for the UART (default ++ "115200") ++ ++ +Name: rotary-encoder +Info: Overlay for GPIO connected rotary encoder. +Load: dtoverlay=rotary-encoder,= @@ -11653,7 +11920,7 @@ index 000000000000..fafec158c1bb +Info: Selects the bcm2835-sdhost SD/MMC driver, optionally with overclock. + N.B. This overlay is designed for situations where the mmc driver is + the default, so it disables the other (mmc) interface - this will kill -+ WiFi on a Pi3. If this isn't what you want, either use the sdtweak ++ WLAN on a Pi3. If this isn't what you want, either use the sdtweak + overlay or the new sd_* dtparams of the base DTBs. +Load: dtoverlay=sdhost,= +Params: overclock_50 Clock (in MHz) to use when the MMC framework @@ -12295,10 +12562,15 @@ index 000000000000..fafec158c1bb + +Name: vc4-kms-dsi-7inch +Info: Enable the Raspberry Pi DSI 7" screen. -+ Use edt-ft5406 for the touchscreen element. ++ Includes the edt-ft5406 for the touchscreen element. + Requires vc4-kms-v3d to be loaded. -+Load: dtoverlay=vc4-kms-dsi-7inch -+Params: ++Load: dtoverlay=vc4-kms-dsi-7inch,= ++Params: sizex Touchscreen size x (default 800) ++ sizey Touchscreen size y (default 480) ++ invx Touchscreen inverted x axis ++ invy Touchscreen inverted y axis ++ swapxy Touchscreen swapped x y axis ++ disable_touch Disables the touch screen overlay driver + + +Name: vc4-kms-dsi-lt070me05000 @@ -12455,7 +12727,7 @@ index 000000000000..fafec158c1bb +http://www.raspberrypi.org/documentation/configuration/device-tree.md diff --git a/arch/arm/boot/dts/overlays/act-led-overlay.dts b/arch/arm/boot/dts/overlays/act-led-overlay.dts new file mode 100644 -index 000000000000..2f4bbb407f89 +index 0000000000000..2f4bbb407f896 --- /dev/null +++ b/arch/arm/boot/dts/overlays/act-led-overlay.dts @@ -0,0 +1,27 @@ @@ -12486,9 +12758,98 @@ index 000000000000..2f4bbb407f89 + activelow = <&frag0>,"gpios:8"; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts b/arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts +new file mode 100644 +index 0000000000000..bf186811ec5dc +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/adafruit-st7735r-overlay.dts +@@ -0,0 +1,83 @@ ++/* ++ * adafruit-st7735r-overlay.dts ++ * ++ * ST7735R based SPI LCD displays. Either ++ * Adafruit 1.8" 160x128 ++ * or ++ * Okaya 1.44" 128x128 ++ */ ++ ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target = <&spidev0>; ++ __overlay__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&gpio>; ++ __overlay__ { ++ adafruit_pins: adafruit_pins { ++ brcm,pins = <25 24>; ++ brcm,function = <1>; /* out */ ++ }; ++ backlight_pins: backlight_pins { ++ brcm,pins = <18>; ++ brcm,function = <1>; /* out */ ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target-path = "/"; ++ __overlay__ { ++ af18_backlight: backlight { ++ compatible = "gpio-backlight"; ++ gpios = <&gpio 18 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&backlight_pins>; ++ }; ++ }; ++ }; ++ ++ fragment@3 { ++ target = <&spi0>; ++ __overlay__ { ++ /* needed to avoid dtc warning */ ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ af18: adafruit18@0 { ++ compatible = "jianda,jd-t18003-t01"; ++ reg = <0>; ++ spi-max-frequency = <32000000>; ++ dc-gpios = <&gpio 24 GPIO_ACTIVE_HIGH>; ++ reset-gpios = <&gpio 25 GPIO_ACTIVE_HIGH>; ++ rotate = <90>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&adafruit_pins>; ++ backlight = <&af18_backlight>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ 128x128 = <&af18>, "compatible=okaya,rh128128t"; ++ speed = <&af18>,"spi-max-frequency:0"; ++ rotate = <&af18>,"rotate:0"; ++ dc_pin = <&af18>,"dc-gpios:4", <&adafruit_pins>,"brcm,pins:4"; ++ reset_pin = <&af18>,"reset-gpios:4", ++ <&adafruit_pins>,"brcm,pins:0"; ++ led_pin = <&af18_backlight>,"gpios:4", ++ <&backlight_pins>,"brcm,pins:0"; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlays/adafruit18-overlay.dts b/arch/arm/boot/dts/overlays/adafruit18-overlay.dts new file mode 100644 -index 000000000000..e1ce94a8cd3e +index 0000000000000..e1ce94a8cd3e2 --- /dev/null +++ b/arch/arm/boot/dts/overlays/adafruit18-overlay.dts @@ -0,0 +1,55 @@ @@ -12549,7 +12910,7 @@ index 000000000000..e1ce94a8cd3e +}; diff --git a/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts b/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts new file mode 100644 -index 000000000000..298488e19156 +index 0000000000000..298488e191565 --- /dev/null +++ b/arch/arm/boot/dts/overlays/adau1977-adc-overlay.dts @@ -0,0 +1,40 @@ @@ -12595,7 +12956,7 @@ index 000000000000..298488e19156 +}; diff --git a/arch/arm/boot/dts/overlays/adau7002-simple-overlay.dts b/arch/arm/boot/dts/overlays/adau7002-simple-overlay.dts new file mode 100644 -index 000000000000..5fed769d2526 +index 0000000000000..5fed769d25260 --- /dev/null +++ b/arch/arm/boot/dts/overlays/adau7002-simple-overlay.dts @@ -0,0 +1,52 @@ @@ -12653,7 +13014,7 @@ index 000000000000..5fed769d2526 +}; diff --git a/arch/arm/boot/dts/overlays/ads1015-overlay.dts b/arch/arm/boot/dts/overlays/ads1015-overlay.dts new file mode 100644 -index 000000000000..dc1764613a8b +index 0000000000000..dc1764613a8b0 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ads1015-overlay.dts @@ -0,0 +1,98 @@ @@ -12757,7 +13118,7 @@ index 000000000000..dc1764613a8b +}; diff --git a/arch/arm/boot/dts/overlays/ads1115-overlay.dts b/arch/arm/boot/dts/overlays/ads1115-overlay.dts new file mode 100644 -index 000000000000..e44ced704ee2 +index 0000000000000..e44ced704ee2d --- /dev/null +++ b/arch/arm/boot/dts/overlays/ads1115-overlay.dts @@ -0,0 +1,103 @@ @@ -12866,7 +13227,7 @@ index 000000000000..e44ced704ee2 +}; diff --git a/arch/arm/boot/dts/overlays/ads7846-overlay.dts b/arch/arm/boot/dts/overlays/ads7846-overlay.dts new file mode 100644 -index 000000000000..1c5c9b6bb6ff +index 0000000000000..1c5c9b6bb6ffd --- /dev/null +++ b/arch/arm/boot/dts/overlays/ads7846-overlay.dts @@ -0,0 +1,89 @@ @@ -12961,7 +13322,7 @@ index 000000000000..1c5c9b6bb6ff +}; diff --git a/arch/arm/boot/dts/overlays/adv7282m-overlay.dts b/arch/arm/boot/dts/overlays/adv7282m-overlay.dts new file mode 100644 -index 000000000000..5d85dfd0595c +index 0000000000000..5d85dfd0595c9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/adv7282m-overlay.dts @@ -0,0 +1,65 @@ @@ -13032,7 +13393,7 @@ index 000000000000..5d85dfd0595c +}; diff --git a/arch/arm/boot/dts/overlays/adv728x-m-overlay.dts b/arch/arm/boot/dts/overlays/adv728x-m-overlay.dts new file mode 100644 -index 000000000000..ea392e886984 +index 0000000000000..ea392e886984b --- /dev/null +++ b/arch/arm/boot/dts/overlays/adv728x-m-overlay.dts @@ -0,0 +1,37 @@ @@ -13075,7 +13436,7 @@ index 000000000000..ea392e886984 +}; diff --git a/arch/arm/boot/dts/overlays/akkordion-iqdacplus-overlay.dts b/arch/arm/boot/dts/overlays/akkordion-iqdacplus-overlay.dts new file mode 100644 -index 000000000000..82f9b3734fb1 +index 0000000000000..82f9b3734fb12 --- /dev/null +++ b/arch/arm/boot/dts/overlays/akkordion-iqdacplus-overlay.dts @@ -0,0 +1,49 @@ @@ -13130,7 +13491,7 @@ index 000000000000..82f9b3734fb1 +}; diff --git a/arch/arm/boot/dts/overlays/allo-boss-dac-pcm512x-audio-overlay.dts b/arch/arm/boot/dts/overlays/allo-boss-dac-pcm512x-audio-overlay.dts new file mode 100644 -index 000000000000..873cb2fab52b +index 0000000000000..873cb2fab52ba --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-boss-dac-pcm512x-audio-overlay.dts @@ -0,0 +1,59 @@ @@ -13195,7 +13556,7 @@ index 000000000000..873cb2fab52b +}; diff --git a/arch/arm/boot/dts/overlays/allo-boss2-dac-audio-overlay.dts b/arch/arm/boot/dts/overlays/allo-boss2-dac-audio-overlay.dts new file mode 100644 -index 000000000000..a6adfb495eb9 +index 0000000000000..a6adfb495eb90 --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-boss2-dac-audio-overlay.dts @@ -0,0 +1,57 @@ @@ -13258,7 +13619,7 @@ index 000000000000..a6adfb495eb9 + diff --git a/arch/arm/boot/dts/overlays/allo-digione-overlay.dts b/arch/arm/boot/dts/overlays/allo-digione-overlay.dts new file mode 100644 -index 000000000000..ea018ace34d4 +index 0000000000000..ea018ace34d4f --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-digione-overlay.dts @@ -0,0 +1,44 @@ @@ -13308,7 +13669,7 @@ index 000000000000..ea018ace34d4 +}; diff --git a/arch/arm/boot/dts/overlays/allo-katana-dac-audio-overlay.dts b/arch/arm/boot/dts/overlays/allo-katana-dac-audio-overlay.dts new file mode 100644 -index 000000000000..b25fd681f09f +index 0000000000000..b25fd681f09f3 --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-katana-dac-audio-overlay.dts @@ -0,0 +1,57 @@ @@ -13371,7 +13732,7 @@ index 000000000000..b25fd681f09f + diff --git a/arch/arm/boot/dts/overlays/allo-piano-dac-pcm512x-audio-overlay.dts b/arch/arm/boot/dts/overlays/allo-piano-dac-pcm512x-audio-overlay.dts new file mode 100644 -index 000000000000..bfc66da6295a +index 0000000000000..bfc66da6295a8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-piano-dac-pcm512x-audio-overlay.dts @@ -0,0 +1,54 @@ @@ -13431,7 +13792,7 @@ index 000000000000..bfc66da6295a +}; diff --git a/arch/arm/boot/dts/overlays/allo-piano-dac-plus-pcm512x-audio-overlay.dts b/arch/arm/boot/dts/overlays/allo-piano-dac-plus-pcm512x-audio-overlay.dts new file mode 100644 -index 000000000000..d47a35def4f7 +index 0000000000000..d47a35def4f76 --- /dev/null +++ b/arch/arm/boot/dts/overlays/allo-piano-dac-plus-pcm512x-audio-overlay.dts @@ -0,0 +1,57 @@ @@ -13494,7 +13855,7 @@ index 000000000000..d47a35def4f7 +}; diff --git a/arch/arm/boot/dts/overlays/anyspi-overlay.dts b/arch/arm/boot/dts/overlays/anyspi-overlay.dts new file mode 100755 -index 000000000000..87523dcca318 +index 0000000000000..87523dcca318c --- /dev/null +++ b/arch/arm/boot/dts/overlays/anyspi-overlay.dts @@ -0,0 +1,205 @@ @@ -13705,7 +14066,7 @@ index 000000000000..87523dcca318 +}; diff --git a/arch/arm/boot/dts/overlays/apds9960-overlay.dts b/arch/arm/boot/dts/overlays/apds9960-overlay.dts new file mode 100644 -index 000000000000..c216932278ab +index 0000000000000..c216932278ab7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/apds9960-overlay.dts @@ -0,0 +1,57 @@ @@ -13768,7 +14129,7 @@ index 000000000000..c216932278ab + diff --git a/arch/arm/boot/dts/overlays/applepi-dac-overlay.dts b/arch/arm/boot/dts/overlays/applepi-dac-overlay.dts new file mode 100644 -index 000000000000..4769296ec9d6 +index 0000000000000..4769296ec9d6f --- /dev/null +++ b/arch/arm/boot/dts/overlays/applepi-dac-overlay.dts @@ -0,0 +1,57 @@ @@ -13831,7 +14192,7 @@ index 000000000000..4769296ec9d6 +*/ diff --git a/arch/arm/boot/dts/overlays/at86rf233-overlay.dts b/arch/arm/boot/dts/overlays/at86rf233-overlay.dts new file mode 100644 -index 000000000000..5a3f4571ee78 +index 0000000000000..5a3f4571ee789 --- /dev/null +++ b/arch/arm/boot/dts/overlays/at86rf233-overlay.dts @@ -0,0 +1,57 @@ @@ -13894,7 +14255,7 @@ index 000000000000..5a3f4571ee78 +}; diff --git a/arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts b/arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts new file mode 100644 -index 000000000000..57a66eac8e9b +index 0000000000000..57a66eac8e9b2 --- /dev/null +++ b/arch/arm/boot/dts/overlays/audioinjector-addons-overlay.dts @@ -0,0 +1,60 @@ @@ -13960,7 +14321,7 @@ index 000000000000..57a66eac8e9b +}; diff --git a/arch/arm/boot/dts/overlays/audioinjector-isolated-soundcard-overlay.dts b/arch/arm/boot/dts/overlays/audioinjector-isolated-soundcard-overlay.dts new file mode 100644 -index 000000000000..63e05cf9665d +index 0000000000000..63e05cf9665d6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/audioinjector-isolated-soundcard-overlay.dts @@ -0,0 +1,55 @@ @@ -14021,7 +14382,7 @@ index 000000000000..63e05cf9665d +}; diff --git a/arch/arm/boot/dts/overlays/audioinjector-ultra-overlay.dts b/arch/arm/boot/dts/overlays/audioinjector-ultra-overlay.dts new file mode 100644 -index 000000000000..fb4a4678a17a +index 0000000000000..fb4a4678a17ab --- /dev/null +++ b/arch/arm/boot/dts/overlays/audioinjector-ultra-overlay.dts @@ -0,0 +1,71 @@ @@ -14098,7 +14459,7 @@ index 000000000000..fb4a4678a17a +}; diff --git a/arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts b/arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts new file mode 100644 -index 000000000000..68f4427d86c3 +index 0000000000000..68f4427d86c35 --- /dev/null +++ b/arch/arm/boot/dts/overlays/audioinjector-wm8731-audio-overlay.dts @@ -0,0 +1,39 @@ @@ -14143,7 +14504,7 @@ index 000000000000..68f4427d86c3 +}; diff --git a/arch/arm/boot/dts/overlays/audiosense-pi-overlay.dts b/arch/arm/boot/dts/overlays/audiosense-pi-overlay.dts new file mode 100644 -index 000000000000..81af26374d92 +index 0000000000000..81af26374d920 --- /dev/null +++ b/arch/arm/boot/dts/overlays/audiosense-pi-overlay.dts @@ -0,0 +1,82 @@ @@ -14231,7 +14592,7 @@ index 000000000000..81af26374d92 +}; diff --git a/arch/arm/boot/dts/overlays/audremap-overlay.dts b/arch/arm/boot/dts/overlays/audremap-overlay.dts new file mode 100644 -index 000000000000..7324890ead86 +index 0000000000000..7324890ead869 --- /dev/null +++ b/arch/arm/boot/dts/overlays/audremap-overlay.dts @@ -0,0 +1,42 @@ @@ -14279,7 +14640,7 @@ index 000000000000..7324890ead86 +}; diff --git a/arch/arm/boot/dts/overlays/balena-fin-overlay.dts b/arch/arm/boot/dts/overlays/balena-fin-overlay.dts new file mode 100644 -index 000000000000..e7ead7cdf5f5 +index 0000000000000..e7ead7cdf5f5e --- /dev/null +++ b/arch/arm/boot/dts/overlays/balena-fin-overlay.dts @@ -0,0 +1,125 @@ @@ -14410,7 +14771,7 @@ index 000000000000..e7ead7cdf5f5 +}; diff --git a/arch/arm/boot/dts/overlays/cap1106-overlay.dts b/arch/arm/boot/dts/overlays/cap1106-overlay.dts new file mode 100644 -index 000000000000..0a585e725f84 +index 0000000000000..0a585e725f842 --- /dev/null +++ b/arch/arm/boot/dts/overlays/cap1106-overlay.dts @@ -0,0 +1,52 @@ @@ -14468,7 +14829,7 @@ index 000000000000..0a585e725f84 +}; diff --git a/arch/arm/boot/dts/overlays/chipdip-dac-overlay.dts b/arch/arm/boot/dts/overlays/chipdip-dac-overlay.dts new file mode 100644 -index 000000000000..09c7417b4707 +index 0000000000000..09c7417b47076 --- /dev/null +++ b/arch/arm/boot/dts/overlays/chipdip-dac-overlay.dts @@ -0,0 +1,46 @@ @@ -14520,7 +14881,7 @@ index 000000000000..09c7417b4707 +}; diff --git a/arch/arm/boot/dts/overlays/cma-overlay.dts b/arch/arm/boot/dts/overlays/cma-overlay.dts new file mode 100644 -index 000000000000..1d87c599f909 +index 0000000000000..1d87c599f909d --- /dev/null +++ b/arch/arm/boot/dts/overlays/cma-overlay.dts @@ -0,0 +1,36 @@ @@ -14562,7 +14923,7 @@ index 000000000000..1d87c599f909 +}; diff --git a/arch/arm/boot/dts/overlays/dht11-overlay.dts b/arch/arm/boot/dts/overlays/dht11-overlay.dts new file mode 100644 -index 000000000000..6feeeb402493 +index 0000000000000..6feeeb402493e --- /dev/null +++ b/arch/arm/boot/dts/overlays/dht11-overlay.dts @@ -0,0 +1,41 @@ @@ -14609,7 +14970,7 @@ index 000000000000..6feeeb402493 +}; diff --git a/arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts b/arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts new file mode 100644 -index 000000000000..d863e5c167cc +index 0000000000000..d863e5c167cc9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/dionaudio-loco-overlay.dts @@ -0,0 +1,39 @@ @@ -14654,7 +15015,7 @@ index 000000000000..d863e5c167cc +}; diff --git a/arch/arm/boot/dts/overlays/dionaudio-loco-v2-overlay.dts b/arch/arm/boot/dts/overlays/dionaudio-loco-v2-overlay.dts new file mode 100644 -index 000000000000..dfb8922a654b +index 0000000000000..dfb8922a654bb --- /dev/null +++ b/arch/arm/boot/dts/overlays/dionaudio-loco-v2-overlay.dts @@ -0,0 +1,49 @@ @@ -14709,7 +15070,7 @@ index 000000000000..dfb8922a654b +}; diff --git a/arch/arm/boot/dts/overlays/disable-bt-overlay.dts b/arch/arm/boot/dts/overlays/disable-bt-overlay.dts new file mode 100644 -index 000000000000..d5a66e5d76a9 +index 0000000000000..d5a66e5d76a94 --- /dev/null +++ b/arch/arm/boot/dts/overlays/disable-bt-overlay.dts @@ -0,0 +1,64 @@ @@ -14779,7 +15140,7 @@ index 000000000000..d5a66e5d76a9 +}; diff --git a/arch/arm/boot/dts/overlays/disable-wifi-overlay.dts b/arch/arm/boot/dts/overlays/disable-wifi-overlay.dts new file mode 100644 -index 000000000000..75e046463900 +index 0000000000000..75e0464639000 --- /dev/null +++ b/arch/arm/boot/dts/overlays/disable-wifi-overlay.dts @@ -0,0 +1,20 @@ @@ -14805,7 +15166,7 @@ index 000000000000..75e046463900 +}; diff --git a/arch/arm/boot/dts/overlays/dpi18-overlay.dts b/arch/arm/boot/dts/overlays/dpi18-overlay.dts new file mode 100644 -index 000000000000..4abe5be744db +index 0000000000000..4abe5be744db7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/dpi18-overlay.dts @@ -0,0 +1,39 @@ @@ -14850,7 +15211,7 @@ index 000000000000..4abe5be744db +}; diff --git a/arch/arm/boot/dts/overlays/dpi18cpadhi-overlay.dts b/arch/arm/boot/dts/overlays/dpi18cpadhi-overlay.dts new file mode 100644 -index 000000000000..50c88a1ed299 +index 0000000000000..50c88a1ed299b --- /dev/null +++ b/arch/arm/boot/dts/overlays/dpi18cpadhi-overlay.dts @@ -0,0 +1,26 @@ @@ -14882,7 +15243,7 @@ index 000000000000..50c88a1ed299 +}; diff --git a/arch/arm/boot/dts/overlays/dpi24-overlay.dts b/arch/arm/boot/dts/overlays/dpi24-overlay.dts new file mode 100644 -index 000000000000..44335cc81277 +index 0000000000000..44335cc812770 --- /dev/null +++ b/arch/arm/boot/dts/overlays/dpi24-overlay.dts @@ -0,0 +1,39 @@ @@ -14927,7 +15288,7 @@ index 000000000000..44335cc81277 +}; diff --git a/arch/arm/boot/dts/overlays/draws-overlay.dts b/arch/arm/boot/dts/overlays/draws-overlay.dts new file mode 100644 -index 000000000000..d18187d7f343 +index 0000000000000..d18187d7f3437 --- /dev/null +++ b/arch/arm/boot/dts/overlays/draws-overlay.dts @@ -0,0 +1,208 @@ @@ -15141,7 +15502,7 @@ index 000000000000..d18187d7f343 +}; diff --git a/arch/arm/boot/dts/overlays/dwc-otg-overlay.dts b/arch/arm/boot/dts/overlays/dwc-otg-overlay.dts new file mode 100644 -index 000000000000..78c5e9f85048 +index 0000000000000..78c5e9f850484 --- /dev/null +++ b/arch/arm/boot/dts/overlays/dwc-otg-overlay.dts @@ -0,0 +1,14 @@ @@ -15161,7 +15522,7 @@ index 000000000000..78c5e9f85048 +}; diff --git a/arch/arm/boot/dts/overlays/dwc2-overlay.dts b/arch/arm/boot/dts/overlays/dwc2-overlay.dts new file mode 100644 -index 000000000000..0d83e344ad97 +index 0000000000000..0d83e344ad973 --- /dev/null +++ b/arch/arm/boot/dts/overlays/dwc2-overlay.dts @@ -0,0 +1,26 @@ @@ -15193,22 +15554,51 @@ index 000000000000..0d83e344ad97 +}; diff --git a/arch/arm/boot/dts/overlays/edt-ft5406-overlay.dts b/arch/arm/boot/dts/overlays/edt-ft5406-overlay.dts new file mode 100644 -index 000000000000..407af59bf468 +index 0000000000000..f82b4d0e50479 --- /dev/null +++ b/arch/arm/boot/dts/overlays/edt-ft5406-overlay.dts -@@ -0,0 +1,42 @@ +@@ -0,0 +1,10 @@ +/* -+ * Device Tree overlay for RaspberryPi 7" Touchscreen panel ++ * Device Tree overlay for EDT 5406 touchscreen controller, as used on the ++ * Raspberry Pi 7" panel + * + */ + +/dts-v1/; +/plugin/; + ++#include "edt-ft5406.dtsi" +diff --git a/arch/arm/boot/dts/overlays/edt-ft5406.dtsi b/arch/arm/boot/dts/overlays/edt-ft5406.dtsi +new file mode 100644 +index 0000000000000..0473ff17f19fa +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/edt-ft5406.dtsi +@@ -0,0 +1,55 @@ ++/* ++ * Device Tree overlay for an EDT FT5406 touchscreen ++ * ++ * Note that this is included from vc4-kms-dsi-7inch, hence the ++ * fragment numbers not starting at 0. ++ */ ++ +/ { + compatible = "brcm,bcm2835"; + -+ fragment@0 { ++ fragment@10 { ++ target = <&ft5406>; ++ __overlay__ { ++ touchscreen-inverted-x; ++ }; ++ }; ++ ++ fragment@11 { ++ target = <&ft5406>; ++ __overlay__ { ++ touchscreen-inverted-y; ++ }; ++ }; ++ ++ fragment@12 { + target = <&i2c_csi_dsi>; + __overlay__ { + #address-cells = <1>; @@ -15224,7 +15614,7 @@ index 000000000000..407af59bf468 + }; + }; + -+ fragment@1 { ++ fragment@13 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; @@ -15234,14 +15624,14 @@ index 000000000000..407af59bf468 + __overrides__ { + sizex = <&ft5406>,"touchscreen-size-x:0"; + sizey = <&ft5406>,"touchscreen-size-y:0"; -+ invx = <&ft5406>,"touchscreen-inverted-x?"; -+ invy = <&ft5406>,"touchscreen-inverted-y?"; ++ invx = <0>, "-10"; ++ invy = <0>, "-11"; + swapxy = <&ft5406>,"touchscreen-swapped-x-y?"; + }; +}; diff --git a/arch/arm/boot/dts/overlays/enc28j60-overlay.dts b/arch/arm/boot/dts/overlays/enc28j60-overlay.dts new file mode 100644 -index 000000000000..7af5c2e607ea +index 0000000000000..7af5c2e607ea0 --- /dev/null +++ b/arch/arm/boot/dts/overlays/enc28j60-overlay.dts @@ -0,0 +1,53 @@ @@ -15300,7 +15690,7 @@ index 000000000000..7af5c2e607ea +}; diff --git a/arch/arm/boot/dts/overlays/enc28j60-spi2-overlay.dts b/arch/arm/boot/dts/overlays/enc28j60-spi2-overlay.dts new file mode 100644 -index 000000000000..17cb5b8fa485 +index 0000000000000..17cb5b8fa4852 --- /dev/null +++ b/arch/arm/boot/dts/overlays/enc28j60-spi2-overlay.dts @@ -0,0 +1,47 @@ @@ -15353,7 +15743,7 @@ index 000000000000..17cb5b8fa485 +}; diff --git a/arch/arm/boot/dts/overlays/exc3000-overlay.dts b/arch/arm/boot/dts/overlays/exc3000-overlay.dts new file mode 100644 -index 000000000000..6f087fb20661 +index 0000000000000..6f087fb206618 --- /dev/null +++ b/arch/arm/boot/dts/overlays/exc3000-overlay.dts @@ -0,0 +1,48 @@ @@ -15407,7 +15797,7 @@ index 000000000000..6f087fb20661 +}; diff --git a/arch/arm/boot/dts/overlays/fe-pi-audio-overlay.dts b/arch/arm/boot/dts/overlays/fe-pi-audio-overlay.dts new file mode 100644 -index 000000000000..743f14ae5768 +index 0000000000000..743f14ae5768d --- /dev/null +++ b/arch/arm/boot/dts/overlays/fe-pi-audio-overlay.dts @@ -0,0 +1,70 @@ @@ -15483,7 +15873,7 @@ index 000000000000..743f14ae5768 +}; diff --git a/arch/arm/boot/dts/overlays/fsm-demo-overlay.dts b/arch/arm/boot/dts/overlays/fsm-demo-overlay.dts new file mode 100644 -index 000000000000..e9944f5cd258 +index 0000000000000..e9944f5cd2581 --- /dev/null +++ b/arch/arm/boot/dts/overlays/fsm-demo-overlay.dts @@ -0,0 +1,104 @@ @@ -15593,7 +15983,7 @@ index 000000000000..e9944f5cd258 +}; diff --git a/arch/arm/boot/dts/overlays/ghost-amp-overlay.dts b/arch/arm/boot/dts/overlays/ghost-amp-overlay.dts new file mode 100644 -index 000000000000..7509e00679c8 +index 0000000000000..7509e00679c82 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ghost-amp-overlay.dts @@ -0,0 +1,145 @@ @@ -15744,7 +16134,7 @@ index 000000000000..7509e00679c8 +}; diff --git a/arch/arm/boot/dts/overlays/goodix-overlay.dts b/arch/arm/boot/dts/overlays/goodix-overlay.dts new file mode 100644 -index 000000000000..8571527de49a +index 0000000000000..8571527de49a6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/goodix-overlay.dts @@ -0,0 +1,46 @@ @@ -15796,7 +16186,7 @@ index 000000000000..8571527de49a +}; diff --git a/arch/arm/boot/dts/overlays/googlevoicehat-soundcard-overlay.dts b/arch/arm/boot/dts/overlays/googlevoicehat-soundcard-overlay.dts new file mode 100644 -index 000000000000..e443be1f9a0e +index 0000000000000..e443be1f9a0e7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/googlevoicehat-soundcard-overlay.dts @@ -0,0 +1,49 @@ @@ -15851,7 +16241,7 @@ index 000000000000..e443be1f9a0e +}; diff --git a/arch/arm/boot/dts/overlays/gpio-fan-overlay.dts b/arch/arm/boot/dts/overlays/gpio-fan-overlay.dts new file mode 100644 -index 000000000000..77a7bbb41e3b +index 0000000000000..77a7bbb41e3bd --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-fan-overlay.dts @@ -0,0 +1,79 @@ @@ -15936,7 +16326,7 @@ index 000000000000..77a7bbb41e3b +}; diff --git a/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts b/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts new file mode 100644 -index 000000000000..162b6ce07dc9 +index 0000000000000..162b6ce07dc91 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-ir-overlay.dts @@ -0,0 +1,49 @@ @@ -15991,7 +16381,7 @@ index 000000000000..162b6ce07dc9 +}; diff --git a/arch/arm/boot/dts/overlays/gpio-ir-tx-overlay.dts b/arch/arm/boot/dts/overlays/gpio-ir-tx-overlay.dts new file mode 100644 -index 000000000000..3625431b7560 +index 0000000000000..3625431b75604 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-ir-tx-overlay.dts @@ -0,0 +1,36 @@ @@ -16033,7 +16423,7 @@ index 000000000000..3625431b7560 +}; diff --git a/arch/arm/boot/dts/overlays/gpio-key-overlay.dts b/arch/arm/boot/dts/overlays/gpio-key-overlay.dts new file mode 100644 -index 000000000000..2e7253d1d0ab +index 0000000000000..2e7253d1d0abf --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-key-overlay.dts @@ -0,0 +1,48 @@ @@ -16087,7 +16477,7 @@ index 000000000000..2e7253d1d0ab +}; diff --git a/arch/arm/boot/dts/overlays/gpio-led-overlay.dts b/arch/arm/boot/dts/overlays/gpio-led-overlay.dts new file mode 100755 -index 000000000000..d8e9d53f1b61 +index 0000000000000..d8e9d53f1b619 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-led-overlay.dts @@ -0,0 +1,97 @@ @@ -16190,7 +16580,7 @@ index 000000000000..d8e9d53f1b61 + diff --git a/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts b/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts new file mode 100755 -index 000000000000..96cbe80820b7 +index 0000000000000..96cbe80820b72 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-no-bank0-irq-overlay.dts @@ -0,0 +1,14 @@ @@ -16210,7 +16600,7 @@ index 000000000000..96cbe80820b7 +}; diff --git a/arch/arm/boot/dts/overlays/gpio-no-irq-overlay.dts b/arch/arm/boot/dts/overlays/gpio-no-irq-overlay.dts new file mode 100644 -index 000000000000..55f9bff3a8f6 +index 0000000000000..55f9bff3a8f62 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-no-irq-overlay.dts @@ -0,0 +1,14 @@ @@ -16230,7 +16620,7 @@ index 000000000000..55f9bff3a8f6 +}; diff --git a/arch/arm/boot/dts/overlays/gpio-poweroff-overlay.dts b/arch/arm/boot/dts/overlays/gpio-poweroff-overlay.dts new file mode 100644 -index 000000000000..416aa2bc797a +index 0000000000000..416aa2bc797a3 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-poweroff-overlay.dts @@ -0,0 +1,37 @@ @@ -16273,7 +16663,7 @@ index 000000000000..416aa2bc797a +}; diff --git a/arch/arm/boot/dts/overlays/gpio-shutdown-overlay.dts b/arch/arm/boot/dts/overlays/gpio-shutdown-overlay.dts new file mode 100644 -index 000000000000..da148064aedd +index 0000000000000..da148064aedd1 --- /dev/null +++ b/arch/arm/boot/dts/overlays/gpio-shutdown-overlay.dts @@ -0,0 +1,86 @@ @@ -16365,7 +16755,7 @@ index 000000000000..da148064aedd +}; diff --git a/arch/arm/boot/dts/overlays/hd44780-lcd-overlay.dts b/arch/arm/boot/dts/overlays/hd44780-lcd-overlay.dts new file mode 100644 -index 000000000000..ee726669ff51 +index 0000000000000..ee726669ff511 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hd44780-lcd-overlay.dts @@ -0,0 +1,46 @@ @@ -16417,7 +16807,7 @@ index 000000000000..ee726669ff51 +}; diff --git a/arch/arm/boot/dts/overlays/hdmi-backlight-hwhack-gpio-overlay.dts b/arch/arm/boot/dts/overlays/hdmi-backlight-hwhack-gpio-overlay.dts new file mode 100644 -index 000000000000..50b9a2665c80 +index 0000000000000..50b9a2665c80b --- /dev/null +++ b/arch/arm/boot/dts/overlays/hdmi-backlight-hwhack-gpio-overlay.dts @@ -0,0 +1,47 @@ @@ -16470,7 +16860,7 @@ index 000000000000..50b9a2665c80 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-amp-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-amp-overlay.dts new file mode 100644 -index 000000000000..142518ab348b +index 0000000000000..142518ab348b1 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-amp-overlay.dts @@ -0,0 +1,39 @@ @@ -16515,7 +16905,7 @@ index 000000000000..142518ab348b +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-amp100-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-amp100-overlay.dts new file mode 100644 -index 000000000000..ebdef55d6110 +index 0000000000000..ebdef55d61109 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-amp100-overlay.dts @@ -0,0 +1,64 @@ @@ -16585,7 +16975,7 @@ index 000000000000..ebdef55d6110 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts new file mode 100644 -index 000000000000..ea8a6c8f36c0 +index 0000000000000..ea8a6c8f36c0a --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dac-overlay.dts @@ -0,0 +1,34 @@ @@ -16625,7 +17015,7 @@ index 000000000000..ea8a6c8f36c0 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts new file mode 100644 -index 000000000000..ff19015ba656 +index 0000000000000..ff19015ba6561 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dacplus-overlay.dts @@ -0,0 +1,65 @@ @@ -16696,7 +17086,7 @@ index 000000000000..ff19015ba656 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts new file mode 100644 -index 000000000000..540563dec10f +index 0000000000000..540563dec10f2 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dacplusadc-overlay.dts @@ -0,0 +1,72 @@ @@ -16774,10 +17164,10 @@ index 000000000000..540563dec10f +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dacplusadcpro-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dacplusadcpro-overlay.dts new file mode 100644 -index 000000000000..cafa2ccd7ff7 +index 0000000000000..561cd84bbb79c --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dacplusadcpro-overlay.dts -@@ -0,0 +1,65 @@ +@@ -0,0 +1,70 @@ +// Definitions for HiFiBerry DAC+ADC PRO +/dts-v1/; +/plugin/; @@ -16823,6 +17213,11 @@ index 000000000000..cafa2ccd7ff7 + clocks = <&dacpro_osc>; + status = "okay"; + }; ++ hpamp: hpamp@60 { ++ compatible = "ti,tpa6130a2"; ++ reg = <0x60>; ++ status = "disabled"; ++ }; + }; + }; + @@ -16845,7 +17240,7 @@ index 000000000000..cafa2ccd7ff7 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dacplusdsp-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dacplusdsp-overlay.dts new file mode 100644 -index 000000000000..63432e8b983f +index 0000000000000..63432e8b983fe --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dacplusdsp-overlay.dts @@ -0,0 +1,34 @@ @@ -16885,7 +17280,7 @@ index 000000000000..63432e8b983f +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-dacplushd-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-dacplushd-overlay.dts new file mode 100644 -index 000000000000..c5583e010339 +index 0000000000000..c5583e010339e --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-dacplushd-overlay.dts @@ -0,0 +1,106 @@ @@ -16997,7 +17392,7 @@ index 000000000000..c5583e010339 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-digi-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-digi-overlay.dts new file mode 100644 -index 000000000000..a2309a50e8d8 +index 0000000000000..a2309a50e8d86 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-digi-overlay.dts @@ -0,0 +1,41 @@ @@ -17044,7 +17439,7 @@ index 000000000000..a2309a50e8d8 +}; diff --git a/arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts b/arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts new file mode 100644 -index 000000000000..83de602e76ba +index 0000000000000..83de602e76ba1 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts @@ -0,0 +1,43 @@ @@ -17093,7 +17488,7 @@ index 000000000000..83de602e76ba +}; diff --git a/arch/arm/boot/dts/overlays/highperi-overlay.dts b/arch/arm/boot/dts/overlays/highperi-overlay.dts new file mode 100644 -index 000000000000..46cb76c2d34f +index 0000000000000..46cb76c2d34ff --- /dev/null +++ b/arch/arm/boot/dts/overlays/highperi-overlay.dts @@ -0,0 +1,63 @@ @@ -17162,7 +17557,7 @@ index 000000000000..46cb76c2d34f +}; diff --git a/arch/arm/boot/dts/overlays/hy28a-overlay.dts b/arch/arm/boot/dts/overlays/hy28a-overlay.dts new file mode 100644 -index 000000000000..5843a5e9c86a +index 0000000000000..5843a5e9c86a4 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hy28a-overlay.dts @@ -0,0 +1,93 @@ @@ -17261,7 +17656,7 @@ index 000000000000..5843a5e9c86a +}; diff --git a/arch/arm/boot/dts/overlays/hy28b-2017-overlay.dts b/arch/arm/boot/dts/overlays/hy28b-2017-overlay.dts new file mode 100644 -index 000000000000..95bfb1eadc20 +index 0000000000000..95bfb1eadc208 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hy28b-2017-overlay.dts @@ -0,0 +1,152 @@ @@ -17419,7 +17814,7 @@ index 000000000000..95bfb1eadc20 +}; diff --git a/arch/arm/boot/dts/overlays/hy28b-overlay.dts b/arch/arm/boot/dts/overlays/hy28b-overlay.dts new file mode 100644 -index 000000000000..9edd0848d555 +index 0000000000000..9edd0848d5550 --- /dev/null +++ b/arch/arm/boot/dts/overlays/hy28b-overlay.dts @@ -0,0 +1,148 @@ @@ -17573,7 +17968,7 @@ index 000000000000..9edd0848d555 +}; diff --git a/arch/arm/boot/dts/overlays/i-sabre-q2m-overlay.dts b/arch/arm/boot/dts/overlays/i-sabre-q2m-overlay.dts new file mode 100644 -index 000000000000..0c4cff354674 +index 0000000000000..0c4cff354674b --- /dev/null +++ b/arch/arm/boot/dts/overlays/i-sabre-q2m-overlay.dts @@ -0,0 +1,39 @@ @@ -17618,7 +18013,7 @@ index 000000000000..0c4cff354674 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-bcm2708-overlay.dts b/arch/arm/boot/dts/overlays/i2c-bcm2708-overlay.dts new file mode 100644 -index 000000000000..8204b6b3aef8 +index 0000000000000..8204b6b3aef83 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-bcm2708-overlay.dts @@ -0,0 +1,13 @@ @@ -17637,7 +18032,7 @@ index 000000000000..8204b6b3aef8 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts b/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts new file mode 100644 -index 000000000000..63231b5d7c0c +index 0000000000000..63231b5d7c0c1 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-gpio-overlay.dts @@ -0,0 +1,47 @@ @@ -17690,7 +18085,7 @@ index 000000000000..63231b5d7c0c +}; diff --git a/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts new file mode 100644 -index 000000000000..112aed91ecb2 +index 0000000000000..112aed91ecb24 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-mux-overlay.dts @@ -0,0 +1,139 @@ @@ -17835,7 +18230,7 @@ index 000000000000..112aed91ecb2 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-pwm-pca9685a-overlay.dts b/arch/arm/boot/dts/overlays/i2c-pwm-pca9685a-overlay.dts new file mode 100644 -index 000000000000..9bb16465a50e +index 0000000000000..9bb16465a50e7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-pwm-pca9685a-overlay.dts @@ -0,0 +1,26 @@ @@ -17867,10 +18262,10 @@ index 000000000000..9bb16465a50e +}; diff --git a/arch/arm/boot/dts/overlays/i2c-rtc-common.dtsi b/arch/arm/boot/dts/overlays/i2c-rtc-common.dtsi new file mode 100644 -index 000000000000..f51981aafda8 +index 0000000000000..7f749fc2d8023 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-rtc-common.dtsi -@@ -0,0 +1,305 @@ +@@ -0,0 +1,323 @@ +// Definitions for several I2C based Real Time Clocks + +/ { @@ -18129,6 +18524,21 @@ index 000000000000..f51981aafda8 + }; + }; + ++ fragment@19 { ++ target = <&i2cbus>; ++ __dormant__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ bq32000: bq32000@68 { ++ compatible = "ti,bq32000"; ++ trickle-resistor-ohms = <0>; ++ reg = <0x68>; ++ }; ++ }; ++ }; ++ ++ + __overrides__ { + abx80x = <0>,"+0"; + ds1307 = <0>,"+1"; @@ -18149,6 +18559,7 @@ index 000000000000..f51981aafda8 + pcf85063 = <0>,"+15"; + pcf85063a = <0>,"+16"; + s35390a = <0>,"+18"; ++ bq32000 = <0>,"+19"; + + addr = <&abx80x>, "reg:0", + <&ds1307>, "reg:0", @@ -18161,13 +18572,15 @@ index 000000000000..f51981aafda8 + <&m41t62>, "reg:0", + <&rv1805>, "reg:0", + <&s35390a>, "reg:0"; ++ trickle-diode-disable = <&bq32000>,"trickle-diode-disable?"; + trickle-diode-type = <&abx80x>,"abracon,tc-diode", + <&rv1805>,"abracon,tc-diode"; + trickle-resistor-ohms = <&ds1339>,"trickle-resistor-ohms:0", + <&ds1340>,"trickle-resistor-ohms:0", + <&abx80x>,"abracon,tc-resistor:0", + <&rv3028>,"trickle-resistor-ohms:0", -+ <&rv1805>,"abracon,tc-resistor:0"; ++ <&rv1805>,"abracon,tc-resistor:0", ++ <&bq32000>,"abracon,tc-resistor:0"; + backup-switchover-mode = <&rv3028>,"backup-switchover-mode:0"; + wakeup-source = <&ds1339>,"wakeup-source?", + <&ds3231>,"wakeup-source?", @@ -18178,7 +18591,7 @@ index 000000000000..f51981aafda8 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts b/arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts new file mode 100644 -index 000000000000..c83480c1c327 +index 0000000000000..c83480c1c3279 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-rtc-gpio-overlay.dts @@ -0,0 +1,31 @@ @@ -18215,7 +18628,7 @@ index 000000000000..c83480c1c327 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts b/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts new file mode 100644 -index 000000000000..1eae9e1a5c96 +index 0000000000000..1eae9e1a5c967 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-rtc-overlay.dts @@ -0,0 +1,34 @@ @@ -18255,7 +18668,7 @@ index 000000000000..1eae9e1a5c96 +}; diff --git a/arch/arm/boot/dts/overlays/i2c-sensor-overlay.dts b/arch/arm/boot/dts/overlays/i2c-sensor-overlay.dts new file mode 100755 -index 000000000000..b05b0fa91942 +index 0000000000000..b05b0fa919426 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c-sensor-overlay.dts @@ -0,0 +1,320 @@ @@ -18581,7 +18994,7 @@ index 000000000000..b05b0fa91942 +}; diff --git a/arch/arm/boot/dts/overlays/i2c0-overlay.dts b/arch/arm/boot/dts/overlays/i2c0-overlay.dts new file mode 100644 -index 000000000000..46bf1bf2dc5c +index 0000000000000..46bf1bf2dc5cb --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c0-overlay.dts @@ -0,0 +1,83 @@ @@ -18670,7 +19083,7 @@ index 000000000000..46bf1bf2dc5c +}; diff --git a/arch/arm/boot/dts/overlays/i2c1-overlay.dts b/arch/arm/boot/dts/overlays/i2c1-overlay.dts new file mode 100644 -index 000000000000..addaed73e665 +index 0000000000000..addaed73e6656 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c1-overlay.dts @@ -0,0 +1,44 @@ @@ -18720,7 +19133,7 @@ index 000000000000..addaed73e665 +}; diff --git a/arch/arm/boot/dts/overlays/i2c3-overlay.dts b/arch/arm/boot/dts/overlays/i2c3-overlay.dts new file mode 100644 -index 000000000000..e24a1df21f99 +index 0000000000000..e24a1df21f991 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c3-overlay.dts @@ -0,0 +1,36 @@ @@ -18762,7 +19175,7 @@ index 000000000000..e24a1df21f99 +}; diff --git a/arch/arm/boot/dts/overlays/i2c4-overlay.dts b/arch/arm/boot/dts/overlays/i2c4-overlay.dts new file mode 100644 -index 000000000000..14c7f4d1da4c +index 0000000000000..14c7f4d1da4c7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c4-overlay.dts @@ -0,0 +1,36 @@ @@ -18804,7 +19217,7 @@ index 000000000000..14c7f4d1da4c +}; diff --git a/arch/arm/boot/dts/overlays/i2c5-overlay.dts b/arch/arm/boot/dts/overlays/i2c5-overlay.dts new file mode 100644 -index 000000000000..7953621112de +index 0000000000000..7953621112ded --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c5-overlay.dts @@ -0,0 +1,36 @@ @@ -18846,7 +19259,7 @@ index 000000000000..7953621112de +}; diff --git a/arch/arm/boot/dts/overlays/i2c6-overlay.dts b/arch/arm/boot/dts/overlays/i2c6-overlay.dts new file mode 100644 -index 000000000000..555305a7ee1f +index 0000000000000..555305a7ee1fd --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2c6-overlay.dts @@ -0,0 +1,36 @@ @@ -18888,7 +19301,7 @@ index 000000000000..555305a7ee1f +}; diff --git a/arch/arm/boot/dts/overlays/i2s-gpio28-31-overlay.dts b/arch/arm/boot/dts/overlays/i2s-gpio28-31-overlay.dts new file mode 100644 -index 000000000000..cf43094c6ff4 +index 0000000000000..cf43094c6ff45 --- /dev/null +++ b/arch/arm/boot/dts/overlays/i2s-gpio28-31-overlay.dts @@ -0,0 +1,18 @@ @@ -18912,7 +19325,7 @@ index 000000000000..cf43094c6ff4 +}; diff --git a/arch/arm/boot/dts/overlays/ilitek251x-overlay.dts b/arch/arm/boot/dts/overlays/ilitek251x-overlay.dts new file mode 100644 -index 000000000000..551aba591d26 +index 0000000000000..551aba591d263 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ilitek251x-overlay.dts @@ -0,0 +1,45 @@ @@ -18963,7 +19376,7 @@ index 000000000000..551aba591d26 +}; diff --git a/arch/arm/boot/dts/overlays/imx219-overlay.dts b/arch/arm/boot/dts/overlays/imx219-overlay.dts new file mode 100644 -index 000000000000..0c065bf09f54 +index 0000000000000..0c065bf09f54f --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx219-overlay.dts @@ -0,0 +1,115 @@ @@ -19084,7 +19497,7 @@ index 000000000000..0c065bf09f54 +}; diff --git a/arch/arm/boot/dts/overlays/imx290-overlay.dts b/arch/arm/boot/dts/overlays/imx290-overlay.dts new file mode 100644 -index 000000000000..e536aa7f9e33 +index 0000000000000..e536aa7f9e338 --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx290-overlay.dts @@ -0,0 +1,32 @@ @@ -19122,7 +19535,7 @@ index 000000000000..e536aa7f9e33 +}; diff --git a/arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi b/arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi new file mode 100644 -index 000000000000..d4a5ed6dbbcf +index 0000000000000..d4a5ed6dbbcfa --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx290_327-overlay.dtsi @@ -0,0 +1,144 @@ @@ -19272,7 +19685,7 @@ index 000000000000..d4a5ed6dbbcf +}; diff --git a/arch/arm/boot/dts/overlays/imx378-overlay.dts b/arch/arm/boot/dts/overlays/imx378-overlay.dts new file mode 100644 -index 000000000000..74c7288d12f5 +index 0000000000000..74c7288d12f57 --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx378-overlay.dts @@ -0,0 +1,10 @@ @@ -19288,7 +19701,7 @@ index 000000000000..74c7288d12f5 +}; diff --git a/arch/arm/boot/dts/overlays/imx477-overlay.dts b/arch/arm/boot/dts/overlays/imx477-overlay.dts new file mode 100644 -index 000000000000..ca315d120e6b +index 0000000000000..ca315d120e6b0 --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx477-overlay.dts @@ -0,0 +1,10 @@ @@ -19304,7 +19717,7 @@ index 000000000000..ca315d120e6b +}; diff --git a/arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi b/arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi new file mode 100644 -index 000000000000..bb9a9acdbbd7 +index 0000000000000..bb9a9acdbbd76 --- /dev/null +++ b/arch/arm/boot/dts/overlays/imx477_378-overlay.dtsi @@ -0,0 +1,110 @@ @@ -19418,9 +19831,130 @@ index 000000000000..bb9a9acdbbd7 + orientation = <&imx477>,"orientation:0"; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/imx519-overlay.dts b/arch/arm/boot/dts/overlays/imx519-overlay.dts +new file mode 100644 +index 0000000000000..693c267af1f0d +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/imx519-overlay.dts +@@ -0,0 +1,115 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++// Definitions for imx519 camera module on VC I2C bus ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/{ ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target = <&i2c_csi_dsi>; ++ __overlay__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ imx519: imx519@1a { ++ compatible = "sony,imx519"; ++ reg = <0x1a>; ++ status = "okay"; ++ ++ clocks = <&imx519_clk>; ++ clock-names = "xclk"; ++ ++ VANA-supply = <&cam1_reg>; /* 2.8v */ ++ VDIG-supply = <&imx519_vdig>; /* 1.8v */ ++ VDDL-supply = <&imx519_vddl>; /* 1.2v */ ++ ++ rotation = <0>; ++ orientation = <2>; ++ ++ port { ++ imx519_0: endpoint { ++ remote-endpoint = <&csi1_ep>; ++ clock-lanes = <0>; ++ data-lanes = <1 2>; ++ clock-noncontinuous; ++ link-frequencies = ++ /bits/ 64 <493500000>; ++ }; ++ }; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&csi1>; ++ __overlay__ { ++ status = "okay"; ++ ++ port{ ++ csi1_ep: endpoint{ ++ remote-endpoint = <&imx519_0>; ++ clock-lanes = <0>; ++ data-lanes = <1 2>; ++ clock-noncontinuous; ++ }; ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target = <&i2c0if>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++ ++ fragment@3 { ++ target-path="/"; ++ __overlay__ { ++ imx519_vdig: fixedregulator@1 { ++ compatible = "regulator-fixed"; ++ regulator-name = "imx519_vdig"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ }; ++ imx519_vddl: fixedregulator@2 { ++ compatible = "regulator-fixed"; ++ regulator-name = "imx519_vddl"; ++ regulator-min-microvolt = <1200000>; ++ regulator-max-microvolt = <1200000>; ++ }; ++ ++ imx519_clk: camera-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-frequency = <24000000>; ++ }; ++ }; ++ }; ++ ++ fragment@4 { ++ target = <&i2c0mux>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++ ++ fragment@5 { ++ target = <&cam1_reg>; ++ __overlay__ { ++ status = "okay"; ++ regulator-name = "imx519_vana"; ++ regulator-min-microvolt = <2800000>; ++ regulator-max-microvolt = <2800000>; ++ }; ++ }; ++ ++ __overrides__ { ++ rotation = <&imx519>,"rotation:0"; ++ orientation = <&imx519>,"orientation:0"; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlays/iqaudio-codec-overlay.dts b/arch/arm/boot/dts/overlays/iqaudio-codec-overlay.dts new file mode 100644 -index 000000000000..9110f5d34298 +index 0000000000000..9110f5d342988 --- /dev/null +++ b/arch/arm/boot/dts/overlays/iqaudio-codec-overlay.dts @@ -0,0 +1,42 @@ @@ -19468,7 +20002,7 @@ index 000000000000..9110f5d34298 +}; diff --git a/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts b/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts new file mode 100644 -index 000000000000..24073cadd0ef +index 0000000000000..24073cadd0eff --- /dev/null +++ b/arch/arm/boot/dts/overlays/iqaudio-dac-overlay.dts @@ -0,0 +1,46 @@ @@ -19520,7 +20054,7 @@ index 000000000000..24073cadd0ef +}; diff --git a/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts b/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts new file mode 100644 -index 000000000000..7c70b25e58d7 +index 0000000000000..7c70b25e58d75 --- /dev/null +++ b/arch/arm/boot/dts/overlays/iqaudio-dacplus-overlay.dts @@ -0,0 +1,49 @@ @@ -19575,7 +20109,7 @@ index 000000000000..7c70b25e58d7 +}; diff --git a/arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts b/arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts new file mode 100644 -index 000000000000..ee54095c869b +index 0000000000000..ee54095c869be --- /dev/null +++ b/arch/arm/boot/dts/overlays/iqaudio-digi-wm8804-audio-overlay.dts @@ -0,0 +1,47 @@ @@ -19628,7 +20162,7 @@ index 000000000000..ee54095c869b +}; diff --git a/arch/arm/boot/dts/overlays/irs1125-overlay.dts b/arch/arm/boot/dts/overlays/irs1125-overlay.dts new file mode 100644 -index 000000000000..e926e18e71fc +index 0000000000000..e926e18e71fce --- /dev/null +++ b/arch/arm/boot/dts/overlays/irs1125-overlay.dts @@ -0,0 +1,85 @@ @@ -19719,7 +20253,7 @@ index 000000000000..e926e18e71fc +}; diff --git a/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts b/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts new file mode 100644 -index 000000000000..585c7dbcdf7f +index 0000000000000..585c7dbcdf7f5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/jedec-spi-nor-overlay.dts @@ -0,0 +1,309 @@ @@ -20034,7 +20568,7 @@ index 000000000000..585c7dbcdf7f + diff --git a/arch/arm/boot/dts/overlays/justboom-both-overlay.dts b/arch/arm/boot/dts/overlays/justboom-both-overlay.dts new file mode 100644 -index 000000000000..9c42670631c0 +index 0000000000000..9c42670631c0e --- /dev/null +++ b/arch/arm/boot/dts/overlays/justboom-both-overlay.dts @@ -0,0 +1,65 @@ @@ -20105,7 +20639,7 @@ index 000000000000..9c42670631c0 +}; diff --git a/arch/arm/boot/dts/overlays/justboom-dac-overlay.dts b/arch/arm/boot/dts/overlays/justboom-dac-overlay.dts new file mode 100644 -index 000000000000..d00515dca419 +index 0000000000000..d00515dca4193 --- /dev/null +++ b/arch/arm/boot/dts/overlays/justboom-dac-overlay.dts @@ -0,0 +1,46 @@ @@ -20157,7 +20691,7 @@ index 000000000000..d00515dca419 +}; diff --git a/arch/arm/boot/dts/overlays/justboom-digi-overlay.dts b/arch/arm/boot/dts/overlays/justboom-digi-overlay.dts new file mode 100644 -index 000000000000..e73336029c54 +index 0000000000000..e73336029c544 --- /dev/null +++ b/arch/arm/boot/dts/overlays/justboom-digi-overlay.dts @@ -0,0 +1,41 @@ @@ -20204,7 +20738,7 @@ index 000000000000..e73336029c54 +}; diff --git a/arch/arm/boot/dts/overlays/ltc294x-overlay.dts b/arch/arm/boot/dts/overlays/ltc294x-overlay.dts new file mode 100644 -index 000000000000..6d971f3649ca +index 0000000000000..6d971f3649ca5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ltc294x-overlay.dts @@ -0,0 +1,86 @@ @@ -20296,7 +20830,7 @@ index 000000000000..6d971f3649ca +}; diff --git a/arch/arm/boot/dts/overlays/max98357a-overlay.dts b/arch/arm/boot/dts/overlays/max98357a-overlay.dts new file mode 100644 -index 000000000000..9e2afb05b7cb +index 0000000000000..9e2afb05b7cb5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/max98357a-overlay.dts @@ -0,0 +1,84 @@ @@ -20386,7 +20920,7 @@ index 000000000000..9e2afb05b7cb +}; diff --git a/arch/arm/boot/dts/overlays/maxtherm-overlay.dts b/arch/arm/boot/dts/overlays/maxtherm-overlay.dts new file mode 100644 -index 000000000000..9964e246c14f +index 0000000000000..9964e246c14f6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/maxtherm-overlay.dts @@ -0,0 +1,186 @@ @@ -20578,7 +21112,7 @@ index 000000000000..9964e246c14f +}; diff --git a/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts b/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts new file mode 100644 -index 000000000000..840dd9b31db4 +index 0000000000000..840dd9b31db41 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts @@ -0,0 +1,64 @@ @@ -20648,7 +21182,7 @@ index 000000000000..840dd9b31db4 +}; diff --git a/arch/arm/boot/dts/overlays/mcp23017-overlay.dts b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts new file mode 100644 -index 000000000000..c546d8ba7e6d +index 0000000000000..c546d8ba7e6d2 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp23017-overlay.dts @@ -0,0 +1,69 @@ @@ -20723,7 +21257,7 @@ index 000000000000..c546d8ba7e6d + diff --git a/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts b/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts new file mode 100644 -index 000000000000..484d64b225fb +index 0000000000000..484d64b225fb8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp23s17-overlay.dts @@ -0,0 +1,732 @@ @@ -21461,7 +21995,7 @@ index 000000000000..484d64b225fb + diff --git a/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts b/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts new file mode 100755 -index 000000000000..46f143d809cc +index 0000000000000..46f143d809cc8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp2515-can0-overlay.dts @@ -0,0 +1,73 @@ @@ -21540,7 +22074,7 @@ index 000000000000..46f143d809cc +}; diff --git a/arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts b/arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts new file mode 100644 -index 000000000000..0a8dd576818e +index 0000000000000..0a8dd576818e9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp2515-can1-overlay.dts @@ -0,0 +1,73 @@ @@ -21617,9 +22151,171 @@ index 000000000000..0a8dd576818e + interrupt = <&can1_pins>,"brcm,pins:0",<&can1>,"interrupts:0"; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/mcp2515-overlay.dts b/arch/arm/boot/dts/overlays/mcp2515-overlay.dts +new file mode 100644 +index 0000000000000..cda1fb0b11992 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/mcp2515-overlay.dts +@@ -0,0 +1,156 @@ ++// SPDX-License-Identifier: (GPL-2.0 OR MIT) ++ ++/dts-v1/; ++/plugin/; ++ ++#include ++#include ++#include ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target = <&spidev0>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&spidev1>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@2 { ++ target-path = "spi1/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@3 { ++ target-path = "spi1/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@4 { ++ target-path = "spi1/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@5 { ++ target-path = "spi2/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@6 { ++ target-path = "spi2/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@7 { ++ target-path = "spi2/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@8 { ++ target = <&gpio>; ++ __overlay__ { ++ mcp2515_pins: mcp2515_pins { ++ brcm,pins = <25>; ++ brcm,function = ; ++ }; ++ }; ++ }; ++ ++ fragment@9 { ++ target-path = "/clocks"; ++ __overlay__ { ++ clk_mcp2515_osc: mcp2515-osc { ++ #clock-cells = <0>; ++ compatible = "fixed-clock"; ++ clock-frequency = <16000000>; ++ }; ++ }; ++ }; ++ ++ mcp2515_frag: fragment@10 { ++ target = <&spi0>; ++ __overlay__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp2515: mcp2515@0 { ++ compatible = "microchip,mcp2515"; ++ reg = <0>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&mcp2515_pins>; ++ spi-max-frequency = <10000000>; ++ interrupt-parent = <&gpio>; ++ interrupts = <25 IRQ_TYPE_LEVEL_LOW>; ++ clocks = <&clk_mcp2515_osc>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ spi0-0 = <0>, "+0", ++ <&mcp2515_frag>, "target:0=", <&spi0>, ++ <&mcp2515>, "reg:0=0", ++ <&mcp2515_pins>, "name=mcp2515_spi0_0_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi0-0-osc"; ++ spi0-1 = <0>, "+1", ++ <&mcp2515_frag>, "target:0=", <&spi0>, ++ <&mcp2515>, "reg:0=1", ++ <&mcp2515_pins>, "name=mcp2515_spi0_1_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi0-1-osc"; ++ spi1-0 = <0>, "+2", ++ <&mcp2515_frag>, "target:0=", <&spi1>, ++ <&mcp2515>, "reg:0=0", ++ <&mcp2515_pins>, "name=mcp2515_spi1_0_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi1-0-osc"; ++ spi1-1 = <0>, "+3", ++ <&mcp2515_frag>, "target:0=", <&spi1>, ++ <&mcp2515>, "reg:0=1", ++ <&mcp2515_pins>, "name=mcp2515_spi1_1_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi1-1-osc"; ++ spi1-2 = <0>, "+4", ++ <&mcp2515_frag>, "target:0=", <&spi1>, ++ <&mcp2515>, "reg:0=2", ++ <&mcp2515_pins>, "name=mcp2515_spi1_2_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi1-2-osc"; ++ spi2-0 = <0>, "+5", ++ <&mcp2515_frag>, "target:0=", <&spi2>, ++ <&mcp2515>, "reg:0=0", ++ <&mcp2515_pins>, "name=mcp2515_spi2_0_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi2-0-osc"; ++ spi2-1 = <0>, "+6", ++ <&mcp2515_frag>, "target:0=", <&spi2>, ++ <&mcp2515>, "reg:0=1", ++ <&mcp2515_pins>, "name=mcp2515_spi2_1_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi2-1-osc"; ++ spi2-2 = <0>, "+7", ++ <&mcp2515_frag>, "target:0=", <&spi2>, ++ <&mcp2515>, "reg:0=2", ++ <&mcp2515_pins>, "name=mcp2515_spi2_2_pins", ++ <&clk_mcp2515_osc>, "name=mcp2515-spi2-2-osc"; ++ oscillator = <&clk_mcp2515_osc>, "clock-frequency:0"; ++ speed = <&mcp2515>, "spi-max-frequency:0"; ++ interrupt = <&mcp2515_pins>, "brcm,pins:0", ++ <&mcp2515>, "interrupts:0"; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlays/mcp251xfd-overlay.dts b/arch/arm/boot/dts/overlays/mcp251xfd-overlay.dts new file mode 100644 -index 000000000000..65c861bbd340 +index 0000000000000..65c861bbd3401 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp251xfd-overlay.dts @@ -0,0 +1,226 @@ @@ -21851,7 +22547,7 @@ index 000000000000..65c861bbd340 +}; diff --git a/arch/arm/boot/dts/overlays/mcp3008-overlay.dts b/arch/arm/boot/dts/overlays/mcp3008-overlay.dts new file mode 100755 -index 000000000000..957fdb9310af +index 0000000000000..957fdb9310af4 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp3008-overlay.dts @@ -0,0 +1,205 @@ @@ -22062,7 +22758,7 @@ index 000000000000..957fdb9310af +}; diff --git a/arch/arm/boot/dts/overlays/mcp3202-overlay.dts b/arch/arm/boot/dts/overlays/mcp3202-overlay.dts new file mode 100755 -index 000000000000..8e4e9f60f285 +index 0000000000000..8e4e9f60f285f --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp3202-overlay.dts @@ -0,0 +1,205 @@ @@ -22273,7 +22969,7 @@ index 000000000000..8e4e9f60f285 +}; diff --git a/arch/arm/boot/dts/overlays/mcp342x-overlay.dts b/arch/arm/boot/dts/overlays/mcp342x-overlay.dts new file mode 100644 -index 000000000000..714eca5a4b5e +index 0000000000000..714eca5a4b5e0 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mcp342x-overlay.dts @@ -0,0 +1,164 @@ @@ -22443,7 +23139,7 @@ index 000000000000..714eca5a4b5e + diff --git a/arch/arm/boot/dts/overlays/media-center-overlay.dts b/arch/arm/boot/dts/overlays/media-center-overlay.dts new file mode 100644 -index 000000000000..1b56963f4f16 +index 0000000000000..1b56963f4f16b --- /dev/null +++ b/arch/arm/boot/dts/overlays/media-center-overlay.dts @@ -0,0 +1,134 @@ @@ -22583,7 +23279,7 @@ index 000000000000..1b56963f4f16 +}; diff --git a/arch/arm/boot/dts/overlays/merus-amp-overlay.dts b/arch/arm/boot/dts/overlays/merus-amp-overlay.dts new file mode 100644 -index 000000000000..4501fbdc253d +index 0000000000000..4501fbdc253da --- /dev/null +++ b/arch/arm/boot/dts/overlays/merus-amp-overlay.dts @@ -0,0 +1,60 @@ @@ -22649,7 +23345,7 @@ index 000000000000..4501fbdc253d +}; diff --git a/arch/arm/boot/dts/overlays/midi-uart0-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart0-overlay.dts new file mode 100644 -index 000000000000..f7e44d29e101 +index 0000000000000..f7e44d29e1010 --- /dev/null +++ b/arch/arm/boot/dts/overlays/midi-uart0-overlay.dts @@ -0,0 +1,36 @@ @@ -22691,7 +23387,7 @@ index 000000000000..f7e44d29e101 +}; diff --git a/arch/arm/boot/dts/overlays/midi-uart1-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart1-overlay.dts new file mode 100644 -index 000000000000..e0bc410acbff +index 0000000000000..e0bc410acbff3 --- /dev/null +++ b/arch/arm/boot/dts/overlays/midi-uart1-overlay.dts @@ -0,0 +1,43 @@ @@ -22738,9 +23434,184 @@ index 000000000000..e0bc410acbff + }; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/midi-uart2-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart2-overlay.dts +new file mode 100644 +index 0000000000000..66f3092e9a748 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/midi-uart2-overlay.dts +@@ -0,0 +1,37 @@ ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/* ++ * Fake a higher clock rate to get a larger divisor, and thereby a lower ++ * baudrate. The real clock is 48MHz, which we scale so that requesting ++ * 38.4kHz results in an actual 31.25kHz. ++ * ++ * 48000000*38400/31250 = 58982400 ++ */ ++ ++/{ ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target-path = "/"; ++ __overlay__ { ++ midi_clk: midi_clk2 { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "uart2_pclk"; ++ clock-frequency = <58982400>; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&uart2>; ++ __overlay__ { ++ clocks = <&midi_clk>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ }; ++}; ++ +diff --git a/arch/arm/boot/dts/overlays/midi-uart3-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart3-overlay.dts +new file mode 100644 +index 0000000000000..55c6cb94f9632 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/midi-uart3-overlay.dts +@@ -0,0 +1,38 @@ ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/* ++ * Fake a higher clock rate to get a larger divisor, and thereby a lower ++ * baudrate. The real clock is 48MHz, which we scale so that requesting ++ * 38.4kHz results in an actual 31.25kHz. ++ * ++ * 48000000*38400/31250 = 58982400 ++ */ ++ ++/{ ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target-path = "/"; ++ __overlay__ { ++ midi_clk: midi_clk3 { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "uart3_pclk"; ++ clock-frequency = <58982400>; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&uart3>; ++ __overlay__ { ++ clocks = <&midi_clk>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ }; ++}; ++ ++ +diff --git a/arch/arm/boot/dts/overlays/midi-uart4-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart4-overlay.dts +new file mode 100644 +index 0000000000000..5819df1a6b2e2 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/midi-uart4-overlay.dts +@@ -0,0 +1,38 @@ ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/* ++ * Fake a higher clock rate to get a larger divisor, and thereby a lower ++ * baudrate. The real clock is 48MHz, which we scale so that requesting ++ * 38.4kHz results in an actual 31.25kHz. ++ * ++ * 48000000*38400/31250 = 58982400 ++ */ ++ ++/{ ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target-path = "/"; ++ __overlay__ { ++ midi_clk: midi_clk4 { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "uart4_pclk"; ++ clock-frequency = <58982400>; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&uart4>; ++ __overlay__ { ++ clocks = <&midi_clk>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ }; ++}; ++ ++ +diff --git a/arch/arm/boot/dts/overlays/midi-uart5-overlay.dts b/arch/arm/boot/dts/overlays/midi-uart5-overlay.dts +new file mode 100644 +index 0000000000000..a1d37f7103ffe +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/midi-uart5-overlay.dts +@@ -0,0 +1,38 @@ ++/dts-v1/; ++/plugin/; ++ ++#include ++ ++/* ++ * Fake a higher clock rate to get a larger divisor, and thereby a lower ++ * baudrate. The real clock is 48MHz, which we scale so that requesting ++ * 38.4kHz results in an actual 31.25kHz. ++ * ++ * 48000000*38400/31250 = 58982400 ++ */ ++ ++/{ ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target-path = "/"; ++ __overlay__ { ++ midi_clk: midi_clk5 { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ clock-output-names = "uart5_pclk"; ++ clock-frequency = <58982400>; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&uart5>; ++ __overlay__ { ++ clocks = <&midi_clk>, ++ <&clocks BCM2835_CLOCK_VPU>; ++ }; ++ }; ++}; ++ ++ diff --git a/arch/arm/boot/dts/overlays/minipitft13-overlay.dts b/arch/arm/boot/dts/overlays/minipitft13-overlay.dts new file mode 100644 -index 000000000000..b1a0a2a41f72 +index 0000000000000..b1a0a2a41f722 --- /dev/null +++ b/arch/arm/boot/dts/overlays/minipitft13-overlay.dts @@ -0,0 +1,70 @@ @@ -22816,7 +23687,7 @@ index 000000000000..b1a0a2a41f72 +}; diff --git a/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts b/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts new file mode 100644 -index 000000000000..da49f14a0940 +index 0000000000000..da49f14a09401 --- /dev/null +++ b/arch/arm/boot/dts/overlays/miniuart-bt-overlay.dts @@ -0,0 +1,93 @@ @@ -22913,9 +23784,37 @@ index 000000000000..da49f14a0940 + krnbt = <&minibt_frag>,"status"; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/mlx90640-overlay.dts b/arch/arm/boot/dts/overlays/mlx90640-overlay.dts +new file mode 100644 +index 0000000000000..a2655ed825859 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/mlx90640-overlay.dts +@@ -0,0 +1,22 @@ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target = <&i2c_arm>; ++ __overlay__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ clock-frequency = <400000>; ++ ++ mlx90640: mlx90640@33 { ++ compatible = "melexis,mlx90640"; ++ reg = <0x33>; ++ status = "okay"; ++ }; ++ }; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlays/mmc-overlay.dts b/arch/arm/boot/dts/overlays/mmc-overlay.dts new file mode 100644 -index 000000000000..c1a2f691aa1e +index 0000000000000..c1a2f691aa1e7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mmc-overlay.dts @@ -0,0 +1,46 @@ @@ -22967,7 +23866,7 @@ index 000000000000..c1a2f691aa1e +}; diff --git a/arch/arm/boot/dts/overlays/mpu6050-overlay.dts b/arch/arm/boot/dts/overlays/mpu6050-overlay.dts new file mode 100644 -index 000000000000..1b4c06535687 +index 0000000000000..1b4c065356874 --- /dev/null +++ b/arch/arm/boot/dts/overlays/mpu6050-overlay.dts @@ -0,0 +1,29 @@ @@ -23002,7 +23901,7 @@ index 000000000000..1b4c06535687 +}; diff --git a/arch/arm/boot/dts/overlays/mz61581-overlay.dts b/arch/arm/boot/dts/overlays/mz61581-overlay.dts new file mode 100644 -index 000000000000..6e00e8b2ddf2 +index 0000000000000..6e00e8b2ddf2a --- /dev/null +++ b/arch/arm/boot/dts/overlays/mz61581-overlay.dts @@ -0,0 +1,117 @@ @@ -23125,7 +24024,7 @@ index 000000000000..6e00e8b2ddf2 +}; diff --git a/arch/arm/boot/dts/overlays/ov5647-overlay.dts b/arch/arm/boot/dts/overlays/ov5647-overlay.dts new file mode 100644 -index 000000000000..d7ed4703c9b0 +index 0000000000000..d7ed4703c9b0b --- /dev/null +++ b/arch/arm/boot/dts/overlays/ov5647-overlay.dts @@ -0,0 +1,94 @@ @@ -23225,7 +24124,7 @@ index 000000000000..d7ed4703c9b0 +}; diff --git a/arch/arm/boot/dts/overlays/ov7251-overlay.dts b/arch/arm/boot/dts/overlays/ov7251-overlay.dts new file mode 100644 -index 000000000000..09dbeda39d06 +index 0000000000000..09dbeda39d064 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ov7251-overlay.dts @@ -0,0 +1,113 @@ @@ -23344,7 +24243,7 @@ index 000000000000..09dbeda39d06 +}; diff --git a/arch/arm/boot/dts/overlays/ov9281-overlay.dts b/arch/arm/boot/dts/overlays/ov9281-overlay.dts new file mode 100644 -index 000000000000..277236c03358 +index 0000000000000..277236c033584 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ov9281-overlay.dts @@ -0,0 +1,113 @@ @@ -23463,7 +24362,7 @@ index 000000000000..277236c03358 +}; diff --git a/arch/arm/boot/dts/overlays/overlay_map.dts b/arch/arm/boot/dts/overlays/overlay_map.dts new file mode 100644 -index 000000000000..bc6e3bce22c7 +index 0000000000000..bc6e3bce22c72 --- /dev/null +++ b/arch/arm/boot/dts/overlays/overlay_map.dts @@ -0,0 +1,158 @@ @@ -23627,7 +24526,7 @@ index 000000000000..bc6e3bce22c7 +}; diff --git a/arch/arm/boot/dts/overlays/papirus-overlay.dts b/arch/arm/boot/dts/overlays/papirus-overlay.dts new file mode 100644 -index 000000000000..7b6bcfd49c86 +index 0000000000000..7b6bcfd49c86e --- /dev/null +++ b/arch/arm/boot/dts/overlays/papirus-overlay.dts @@ -0,0 +1,89 @@ @@ -23722,7 +24621,7 @@ index 000000000000..7b6bcfd49c86 +}; diff --git a/arch/arm/boot/dts/overlays/pca953x-overlay.dts b/arch/arm/boot/dts/overlays/pca953x-overlay.dts new file mode 100644 -index 000000000000..8b6ee44665ce +index 0000000000000..8b6ee44665cee --- /dev/null +++ b/arch/arm/boot/dts/overlays/pca953x-overlay.dts @@ -0,0 +1,240 @@ @@ -23968,7 +24867,7 @@ index 000000000000..8b6ee44665ce +}; diff --git a/arch/arm/boot/dts/overlays/pcie-32bit-dma-overlay.dts b/arch/arm/boot/dts/overlays/pcie-32bit-dma-overlay.dts new file mode 100644 -index 000000000000..cca3e83721b7 +index 0000000000000..cca3e83721b74 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pcie-32bit-dma-overlay.dts @@ -0,0 +1,18 @@ @@ -23992,7 +24891,7 @@ index 000000000000..cca3e83721b7 +}; diff --git a/arch/arm/boot/dts/overlays/pibell-overlay.dts b/arch/arm/boot/dts/overlays/pibell-overlay.dts new file mode 100644 -index 000000000000..9333a9b09772 +index 0000000000000..9333a9b09772f --- /dev/null +++ b/arch/arm/boot/dts/overlays/pibell-overlay.dts @@ -0,0 +1,81 @@ @@ -24079,7 +24978,7 @@ index 000000000000..9333a9b09772 +}; diff --git a/arch/arm/boot/dts/overlays/pifacedigital-overlay.dts b/arch/arm/boot/dts/overlays/pifacedigital-overlay.dts new file mode 100644 -index 000000000000..532a858683d6 +index 0000000000000..532a858683d6f --- /dev/null +++ b/arch/arm/boot/dts/overlays/pifacedigital-overlay.dts @@ -0,0 +1,144 @@ @@ -24229,7 +25128,7 @@ index 000000000000..532a858683d6 +}; diff --git a/arch/arm/boot/dts/overlays/pifi-40-overlay.dts b/arch/arm/boot/dts/overlays/pifi-40-overlay.dts new file mode 100644 -index 000000000000..51a20e54977f +index 0000000000000..51a20e54977fe --- /dev/null +++ b/arch/arm/boot/dts/overlays/pifi-40-overlay.dts @@ -0,0 +1,50 @@ @@ -24285,7 +25184,7 @@ index 000000000000..51a20e54977f +}; diff --git a/arch/arm/boot/dts/overlays/pifi-dac-hd-overlay.dts b/arch/arm/boot/dts/overlays/pifi-dac-hd-overlay.dts new file mode 100644 -index 000000000000..67f50db7861a +index 0000000000000..67f50db7861ac --- /dev/null +++ b/arch/arm/boot/dts/overlays/pifi-dac-hd-overlay.dts @@ -0,0 +1,49 @@ @@ -24340,7 +25239,7 @@ index 000000000000..67f50db7861a +}; diff --git a/arch/arm/boot/dts/overlays/pifi-dac-zero-overlay.dts b/arch/arm/boot/dts/overlays/pifi-dac-zero-overlay.dts new file mode 100644 -index 000000000000..645ea74cb435 +index 0000000000000..645ea74cb435c --- /dev/null +++ b/arch/arm/boot/dts/overlays/pifi-dac-zero-overlay.dts @@ -0,0 +1,49 @@ @@ -24395,7 +25294,7 @@ index 000000000000..645ea74cb435 +}; diff --git a/arch/arm/boot/dts/overlays/pifi-mini-210-overlay.dts b/arch/arm/boot/dts/overlays/pifi-mini-210-overlay.dts new file mode 100644 -index 000000000000..963597d611b5 +index 0000000000000..963597d611b58 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pifi-mini-210-overlay.dts @@ -0,0 +1,42 @@ @@ -24443,7 +25342,7 @@ index 000000000000..963597d611b5 +}; diff --git a/arch/arm/boot/dts/overlays/piglow-overlay.dts b/arch/arm/boot/dts/overlays/piglow-overlay.dts new file mode 100644 -index 000000000000..075bceef158c +index 0000000000000..075bceef158c8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/piglow-overlay.dts @@ -0,0 +1,97 @@ @@ -24546,7 +25445,7 @@ index 000000000000..075bceef158c +}; diff --git a/arch/arm/boot/dts/overlays/piscreen-overlay.dts b/arch/arm/boot/dts/overlays/piscreen-overlay.dts new file mode 100644 -index 000000000000..1ac75a248fab +index 0000000000000..1ac75a248fab5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/piscreen-overlay.dts @@ -0,0 +1,102 @@ @@ -24654,7 +25553,7 @@ index 000000000000..1ac75a248fab +}; diff --git a/arch/arm/boot/dts/overlays/piscreen2r-overlay.dts b/arch/arm/boot/dts/overlays/piscreen2r-overlay.dts new file mode 100644 -index 000000000000..9d2b51101969 +index 0000000000000..9d2b51101969e --- /dev/null +++ b/arch/arm/boot/dts/overlays/piscreen2r-overlay.dts @@ -0,0 +1,106 @@ @@ -24766,7 +25665,7 @@ index 000000000000..9d2b51101969 + diff --git a/arch/arm/boot/dts/overlays/pisound-overlay.dts b/arch/arm/boot/dts/overlays/pisound-overlay.dts new file mode 100644 -index 000000000000..49efb2b768fb +index 0000000000000..49efb2b768fbc --- /dev/null +++ b/arch/arm/boot/dts/overlays/pisound-overlay.dts @@ -0,0 +1,120 @@ @@ -24892,7 +25791,7 @@ index 000000000000..49efb2b768fb +}; diff --git a/arch/arm/boot/dts/overlays/pitft22-overlay.dts b/arch/arm/boot/dts/overlays/pitft22-overlay.dts new file mode 100644 -index 000000000000..589ad13795b1 +index 0000000000000..589ad13795b18 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pitft22-overlay.dts @@ -0,0 +1,69 @@ @@ -24967,7 +25866,7 @@ index 000000000000..589ad13795b1 +}; diff --git a/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts b/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts new file mode 100644 -index 000000000000..33901ee1db7a +index 0000000000000..33901ee1db7a7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pitft28-capacitive-overlay.dts @@ -0,0 +1,91 @@ @@ -25064,7 +25963,7 @@ index 000000000000..33901ee1db7a +}; diff --git a/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts b/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts new file mode 100644 -index 000000000000..4a4a3f44c29d +index 0000000000000..4a4a3f44c29d5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pitft28-resistive-overlay.dts @@ -0,0 +1,119 @@ @@ -25189,7 +26088,7 @@ index 000000000000..4a4a3f44c29d +}; diff --git a/arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts b/arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts new file mode 100644 -index 000000000000..37629f18a740 +index 0000000000000..37629f18a7400 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pitft35-resistive-overlay.dts @@ -0,0 +1,119 @@ @@ -25314,7 +26213,7 @@ index 000000000000..37629f18a740 +}; diff --git a/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts b/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts new file mode 100644 -index 000000000000..524a1c1d3670 +index 0000000000000..524a1c1d36700 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts @@ -0,0 +1,38 @@ @@ -25358,7 +26257,7 @@ index 000000000000..524a1c1d3670 +}; diff --git a/arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts b/arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts new file mode 100644 -index 000000000000..4ddbbfa04065 +index 0000000000000..4ddbbfa040658 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pwm-2chan-overlay.dts @@ -0,0 +1,49 @@ @@ -25413,7 +26312,7 @@ index 000000000000..4ddbbfa04065 +}; diff --git a/arch/arm/boot/dts/overlays/pwm-ir-tx-overlay.dts b/arch/arm/boot/dts/overlays/pwm-ir-tx-overlay.dts new file mode 100644 -index 000000000000..119caf746b3b +index 0000000000000..119caf746b3b3 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pwm-ir-tx-overlay.dts @@ -0,0 +1,40 @@ @@ -25459,7 +26358,7 @@ index 000000000000..119caf746b3b +}; diff --git a/arch/arm/boot/dts/overlays/pwm-overlay.dts b/arch/arm/boot/dts/overlays/pwm-overlay.dts new file mode 100644 -index 000000000000..92876ab3bc8c +index 0000000000000..92876ab3bc8c5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/pwm-overlay.dts @@ -0,0 +1,45 @@ @@ -25510,12 +26409,12 @@ index 000000000000..92876ab3bc8c +}; diff --git a/arch/arm/boot/dts/overlays/qca7000-overlay.dts b/arch/arm/boot/dts/overlays/qca7000-overlay.dts new file mode 100644 -index 000000000000..9a451202a2eb +index 0000000000000..f695f36024fae --- /dev/null +++ b/arch/arm/boot/dts/overlays/qca7000-overlay.dts @@ -0,0 +1,55 @@ -+// Overlay for the Qualcomm Atheros QCA7000 on I2SE's PLC Stamp micro EVK -+// Visit: https://www.i2se.com/product/plc-stamp-micro-evk for details ++// Overlay for the Qualcomm Atheros QCA7000 on PLC Stamp micro EVK ++// Visit: https://in-tech-smartcharging.com/products/evaluation-tools/plc-stamp-micro-2-evaluation-board for details + +/dts-v1/; +/plugin/; @@ -25569,9 +26468,61 @@ index 000000000000..9a451202a2eb + speed = <ð1>, "spi-max-frequency:0"; + }; +}; +diff --git a/arch/arm/boot/dts/overlays/qca7000-uart0-overlay.dts b/arch/arm/boot/dts/overlays/qca7000-uart0-overlay.dts +new file mode 100644 +index 0000000000000..5dee70853289f +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/qca7000-uart0-overlay.dts +@@ -0,0 +1,46 @@ ++// Overlay for the Qualcomm Atheros QCA7000 on PLC Stamp micro EVK ++// Visit: https://in-tech-smartcharging.com/products/evaluation-tools/plc-stamp-micro-2-evaluation-board for details ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target = <&uart0>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins>; ++ status = "okay"; ++ ++ eth2: qca7000 { ++ compatible = "qca,qca7000"; ++ current-speed = <115200>; ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&gpio>; ++ __overlay__ { ++ uart0_pins: uart0_pins { ++ brcm,pins = <14 15>; ++ brcm,function = <4>; /* alt0 */ ++ brcm,pull = <0 2>; ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target-path = "/aliases"; ++ __overlay__ { ++ serial0 = "/soc/serial@7e201000"; ++ serial1 = "/soc/serial@7e215040"; ++ }; ++ }; ++ ++ __overrides__ { ++ baudrate = <ð2>, "current-speed:0"; ++ }; ++}; diff --git a/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts b/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts new file mode 100644 -index 000000000000..ea1d952734e9 +index 0000000000000..ea1d952734e9f --- /dev/null +++ b/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts @@ -0,0 +1,59 @@ @@ -25636,7 +26587,7 @@ index 000000000000..ea1d952734e9 +}; diff --git a/arch/arm/boot/dts/overlays/rpi-backlight-overlay.dts b/arch/arm/boot/dts/overlays/rpi-backlight-overlay.dts new file mode 100644 -index 000000000000..cac5e44c6ec5 +index 0000000000000..cac5e44c6ec54 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-backlight-overlay.dts @@ -0,0 +1,21 @@ @@ -25663,7 +26614,7 @@ index 000000000000..cac5e44c6ec5 +}; diff --git a/arch/arm/boot/dts/overlays/rpi-cirrus-wm5102-overlay.dts b/arch/arm/boot/dts/overlays/rpi-cirrus-wm5102-overlay.dts new file mode 100644 -index 000000000000..ed0c2745399f +index 0000000000000..ed0c2745399f6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-cirrus-wm5102-overlay.dts @@ -0,0 +1,172 @@ @@ -25841,7 +26792,7 @@ index 000000000000..ed0c2745399f +}; diff --git a/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts b/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts new file mode 100644 -index 000000000000..07a915342702 +index 0000000000000..07a915342702f --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-dac-overlay.dts @@ -0,0 +1,34 @@ @@ -25881,7 +26832,7 @@ index 000000000000..07a915342702 +}; diff --git a/arch/arm/boot/dts/overlays/rpi-display-overlay.dts b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts new file mode 100644 -index 000000000000..de87432ff2be +index 0000000000000..de87432ff2bea --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts @@ -0,0 +1,91 @@ @@ -25978,7 +26929,7 @@ index 000000000000..de87432ff2be +}; diff --git a/arch/arm/boot/dts/overlays/rpi-ft5406-overlay.dts b/arch/arm/boot/dts/overlays/rpi-ft5406-overlay.dts new file mode 100644 -index 000000000000..8483c4f4b2eb +index 0000000000000..8483c4f4b2eb2 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-ft5406-overlay.dts @@ -0,0 +1,25 @@ @@ -26009,7 +26960,7 @@ index 000000000000..8483c4f4b2eb +}; diff --git a/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts b/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts new file mode 100644 -index 000000000000..af812132a8f7 +index 0000000000000..af812132a8f7e --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-poe-overlay.dts @@ -0,0 +1,95 @@ @@ -26110,10 +27061,10 @@ index 000000000000..af812132a8f7 +}; diff --git a/arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts b/arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts new file mode 100644 -index 000000000000..e0138847093b +index 0000000000000..5b12d02c37077 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-poe-plus-overlay.dts -@@ -0,0 +1,19 @@ +@@ -0,0 +1,23 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) +// Overlay for the Raspberry Pi PoE+ HAT. + @@ -26133,9 +27084,13 @@ index 000000000000..e0138847093b + }; + }; +}; ++ ++&fan0 { ++ cooling-levels = <0 32 64 128 255>; ++}; diff --git a/arch/arm/boot/dts/overlays/rpi-proto-overlay.dts b/arch/arm/boot/dts/overlays/rpi-proto-overlay.dts new file mode 100644 -index 000000000000..9cda044a0f62 +index 0000000000000..9cda044a0f62a --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-proto-overlay.dts @@ -0,0 +1,39 @@ @@ -26180,7 +27135,7 @@ index 000000000000..9cda044a0f62 +}; diff --git a/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts b/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts new file mode 100644 -index 000000000000..89d8d2ea6b2e +index 0000000000000..89d8d2ea6b2e7 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-sense-overlay.dts @@ -0,0 +1,47 @@ @@ -26233,7 +27188,7 @@ index 000000000000..89d8d2ea6b2e +}; diff --git a/arch/arm/boot/dts/overlays/rpi-tv-overlay.dts b/arch/arm/boot/dts/overlays/rpi-tv-overlay.dts new file mode 100644 -index 000000000000..3c97a545d820 +index 0000000000000..3c97a545d8207 --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpi-tv-overlay.dts @@ -0,0 +1,34 @@ @@ -26273,7 +27228,7 @@ index 000000000000..3c97a545d820 +}; diff --git a/arch/arm/boot/dts/overlays/rpivid-v4l2-overlay.dts b/arch/arm/boot/dts/overlays/rpivid-v4l2-overlay.dts new file mode 100644 -index 000000000000..bdd1c0e5a915 +index 0000000000000..bdd1c0e5a915d --- /dev/null +++ b/arch/arm/boot/dts/overlays/rpivid-v4l2-overlay.dts @@ -0,0 +1,50 @@ @@ -26329,7 +27284,7 @@ index 000000000000..bdd1c0e5a915 +}; diff --git a/arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts b/arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts new file mode 100644 -index 000000000000..87e9a326eff1 +index 0000000000000..87e9a326eff1f --- /dev/null +++ b/arch/arm/boot/dts/overlays/rra-digidac1-wm8741-audio-overlay.dts @@ -0,0 +1,49 @@ @@ -26384,7 +27339,7 @@ index 000000000000..87e9a326eff1 +}; diff --git a/arch/arm/boot/dts/overlays/sainsmart18-overlay.dts b/arch/arm/boot/dts/overlays/sainsmart18-overlay.dts new file mode 100644 -index 000000000000..c51f1c030a55 +index 0000000000000..c51f1c030a557 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sainsmart18-overlay.dts @@ -0,0 +1,52 @@ @@ -26442,7 +27397,7 @@ index 000000000000..c51f1c030a55 +}; diff --git a/arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts b/arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts new file mode 100644 -index 000000000000..04d74d62897b +index 0000000000000..04d74d62897b9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sc16is750-i2c-overlay.dts @@ -0,0 +1,43 @@ @@ -26491,7 +27446,7 @@ index 000000000000..04d74d62897b +}; diff --git a/arch/arm/boot/dts/overlays/sc16is752-i2c-overlay.dts b/arch/arm/boot/dts/overlays/sc16is752-i2c-overlay.dts new file mode 100644 -index 000000000000..da05e981314c +index 0000000000000..da05e981314c4 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sc16is752-i2c-overlay.dts @@ -0,0 +1,43 @@ @@ -26540,7 +27495,7 @@ index 000000000000..da05e981314c +}; diff --git a/arch/arm/boot/dts/overlays/sc16is752-spi0-overlay.dts b/arch/arm/boot/dts/overlays/sc16is752-spi0-overlay.dts new file mode 100644 -index 000000000000..a49a04722b99 +index 0000000000000..a49a04722b996 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sc16is752-spi0-overlay.dts @@ -0,0 +1,49 @@ @@ -26595,7 +27550,7 @@ index 000000000000..a49a04722b99 +}; diff --git a/arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts b/arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts new file mode 100644 -index 000000000000..730c6e8cd614 +index 0000000000000..730c6e8cd6142 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sc16is752-spi1-overlay.dts @@ -0,0 +1,67 @@ @@ -26668,7 +27623,7 @@ index 000000000000..730c6e8cd614 +}; diff --git a/arch/arm/boot/dts/overlays/sdhost-overlay.dts b/arch/arm/boot/dts/overlays/sdhost-overlay.dts new file mode 100644 -index 000000000000..0b72b4eeac88 +index 0000000000000..0b72b4eeac887 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sdhost-overlay.dts @@ -0,0 +1,38 @@ @@ -26712,7 +27667,7 @@ index 000000000000..0b72b4eeac88 +}; diff --git a/arch/arm/boot/dts/overlays/sdio-overlay.dts b/arch/arm/boot/dts/overlays/sdio-overlay.dts new file mode 100644 -index 000000000000..873e49056379 +index 0000000000000..873e490563797 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sdio-overlay.dts @@ -0,0 +1,77 @@ @@ -26795,7 +27750,7 @@ index 000000000000..873e49056379 +}; diff --git a/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v1-overlay.dts b/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v1-overlay.dts new file mode 100644 -index 000000000000..210d027a073e +index 0000000000000..210d027a073ee --- /dev/null +++ b/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v1-overlay.dts @@ -0,0 +1,138 @@ @@ -26939,7 +27894,7 @@ index 000000000000..210d027a073e +}; diff --git a/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v2-overlay.dts b/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v2-overlay.dts new file mode 100644 -index 000000000000..e843d0b19745 +index 0000000000000..e843d0b197450 --- /dev/null +++ b/arch/arm/boot/dts/overlays/seeed-can-fd-hat-v2-overlay.dts @@ -0,0 +1,117 @@ @@ -27062,7 +28017,7 @@ index 000000000000..e843d0b19745 +}; diff --git a/arch/arm/boot/dts/overlays/sh1106-spi-overlay.dts b/arch/arm/boot/dts/overlays/sh1106-spi-overlay.dts new file mode 100644 -index 000000000000..57a0cc9b1741 +index 0000000000000..57a0cc9b17410 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sh1106-spi-overlay.dts @@ -0,0 +1,84 @@ @@ -27152,7 +28107,7 @@ index 000000000000..57a0cc9b1741 +}; diff --git a/arch/arm/boot/dts/overlays/si446x-spi0-overlay.dts b/arch/arm/boot/dts/overlays/si446x-spi0-overlay.dts new file mode 100644 -index 000000000000..90495f0941fb +index 0000000000000..90495f0941fbb --- /dev/null +++ b/arch/arm/boot/dts/overlays/si446x-spi0-overlay.dts @@ -0,0 +1,53 @@ @@ -27211,7 +28166,7 @@ index 000000000000..90495f0941fb +}; diff --git a/arch/arm/boot/dts/overlays/smi-dev-overlay.dts b/arch/arm/boot/dts/overlays/smi-dev-overlay.dts new file mode 100644 -index 000000000000..bafab6c92506 +index 0000000000000..bafab6c92506d --- /dev/null +++ b/arch/arm/boot/dts/overlays/smi-dev-overlay.dts @@ -0,0 +1,20 @@ @@ -27237,7 +28192,7 @@ index 000000000000..bafab6c92506 +}; diff --git a/arch/arm/boot/dts/overlays/smi-nand-overlay.dts b/arch/arm/boot/dts/overlays/smi-nand-overlay.dts new file mode 100644 -index 000000000000..ae1e50329d66 +index 0000000000000..ae1e50329d660 --- /dev/null +++ b/arch/arm/boot/dts/overlays/smi-nand-overlay.dts @@ -0,0 +1,66 @@ @@ -27309,7 +28264,7 @@ index 000000000000..ae1e50329d66 +}; diff --git a/arch/arm/boot/dts/overlays/smi-overlay.dts b/arch/arm/boot/dts/overlays/smi-overlay.dts new file mode 100644 -index 000000000000..bb8c7830df23 +index 0000000000000..bb8c7830df23f --- /dev/null +++ b/arch/arm/boot/dts/overlays/smi-overlay.dts @@ -0,0 +1,37 @@ @@ -27352,7 +28307,7 @@ index 000000000000..bb8c7830df23 +}; diff --git a/arch/arm/boot/dts/overlays/spi-gpio35-39-overlay.dts b/arch/arm/boot/dts/overlays/spi-gpio35-39-overlay.dts new file mode 100644 -index 000000000000..a132b8637c31 +index 0000000000000..a132b8637c313 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi-gpio35-39-overlay.dts @@ -0,0 +1,31 @@ @@ -27389,7 +28344,7 @@ index 000000000000..a132b8637c31 +}; diff --git a/arch/arm/boot/dts/overlays/spi-gpio40-45-overlay.dts b/arch/arm/boot/dts/overlays/spi-gpio40-45-overlay.dts new file mode 100644 -index 000000000000..9ebcaf1b5ea0 +index 0000000000000..9ebcaf1b5ea07 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi-gpio40-45-overlay.dts @@ -0,0 +1,36 @@ @@ -27431,7 +28386,7 @@ index 000000000000..9ebcaf1b5ea0 +}; diff --git a/arch/arm/boot/dts/overlays/spi-rtc-overlay.dts b/arch/arm/boot/dts/overlays/spi-rtc-overlay.dts new file mode 100644 -index 000000000000..51b7fec281c0 +index 0000000000000..51b7fec281c0b --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi-rtc-overlay.dts @@ -0,0 +1,75 @@ @@ -27512,7 +28467,7 @@ index 000000000000..51b7fec281c0 +}; diff --git a/arch/arm/boot/dts/overlays/spi0-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi0-1cs-overlay.dts new file mode 100644 -index 000000000000..e6eb66e2076a +index 0000000000000..e6eb66e2076aa --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi0-1cs-overlay.dts @@ -0,0 +1,42 @@ @@ -27560,7 +28515,7 @@ index 000000000000..e6eb66e2076a +}; diff --git a/arch/arm/boot/dts/overlays/spi0-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi0-2cs-overlay.dts new file mode 100644 -index 000000000000..df6519537c3a +index 0000000000000..df6519537c3a8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi0-2cs-overlay.dts @@ -0,0 +1,37 @@ @@ -27603,7 +28558,7 @@ index 000000000000..df6519537c3a +}; diff --git a/arch/arm/boot/dts/overlays/spi1-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi1-1cs-overlay.dts new file mode 100644 -index 000000000000..ea2794bc5fd5 +index 0000000000000..ea2794bc5fd5d --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi1-1cs-overlay.dts @@ -0,0 +1,57 @@ @@ -27666,7 +28621,7 @@ index 000000000000..ea2794bc5fd5 +}; diff --git a/arch/arm/boot/dts/overlays/spi1-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi1-2cs-overlay.dts new file mode 100644 -index 000000000000..dab34ee79ae2 +index 0000000000000..dab34ee79ae28 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi1-2cs-overlay.dts @@ -0,0 +1,69 @@ @@ -27741,7 +28696,7 @@ index 000000000000..dab34ee79ae2 +}; diff --git a/arch/arm/boot/dts/overlays/spi1-3cs-overlay.dts b/arch/arm/boot/dts/overlays/spi1-3cs-overlay.dts new file mode 100644 -index 000000000000..bc7e7d04324b +index 0000000000000..bc7e7d04324bd --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi1-3cs-overlay.dts @@ -0,0 +1,81 @@ @@ -27828,7 +28783,7 @@ index 000000000000..bc7e7d04324b +}; diff --git a/arch/arm/boot/dts/overlays/spi2-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi2-1cs-overlay.dts new file mode 100644 -index 000000000000..2a29750462af +index 0000000000000..2a29750462af8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi2-1cs-overlay.dts @@ -0,0 +1,57 @@ @@ -27891,7 +28846,7 @@ index 000000000000..2a29750462af +}; diff --git a/arch/arm/boot/dts/overlays/spi2-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi2-2cs-overlay.dts new file mode 100644 -index 000000000000..642678fc9ddd +index 0000000000000..642678fc9ddd5 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi2-2cs-overlay.dts @@ -0,0 +1,69 @@ @@ -27966,7 +28921,7 @@ index 000000000000..642678fc9ddd +}; diff --git a/arch/arm/boot/dts/overlays/spi2-3cs-overlay.dts b/arch/arm/boot/dts/overlays/spi2-3cs-overlay.dts new file mode 100644 -index 000000000000..28d40c6c3c37 +index 0000000000000..28d40c6c3c379 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi2-3cs-overlay.dts @@ -0,0 +1,81 @@ @@ -28053,7 +29008,7 @@ index 000000000000..28d40c6c3c37 +}; diff --git a/arch/arm/boot/dts/overlays/spi3-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi3-1cs-overlay.dts new file mode 100644 -index 000000000000..335af8637051 +index 0000000000000..335af8637051b --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi3-1cs-overlay.dts @@ -0,0 +1,44 @@ @@ -28103,7 +29058,7 @@ index 000000000000..335af8637051 +}; diff --git a/arch/arm/boot/dts/overlays/spi3-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi3-2cs-overlay.dts new file mode 100644 -index 000000000000..ce65da27f767 +index 0000000000000..ce65da27f7670 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi3-2cs-overlay.dts @@ -0,0 +1,56 @@ @@ -28165,7 +29120,7 @@ index 000000000000..ce65da27f767 +}; diff --git a/arch/arm/boot/dts/overlays/spi4-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi4-1cs-overlay.dts new file mode 100644 -index 000000000000..85d70b40352b +index 0000000000000..85d70b40352b1 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi4-1cs-overlay.dts @@ -0,0 +1,44 @@ @@ -28215,7 +29170,7 @@ index 000000000000..85d70b40352b +}; diff --git a/arch/arm/boot/dts/overlays/spi4-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi4-2cs-overlay.dts new file mode 100644 -index 000000000000..8bc2215a6a7e +index 0000000000000..8bc2215a6a7e9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi4-2cs-overlay.dts @@ -0,0 +1,56 @@ @@ -28277,7 +29232,7 @@ index 000000000000..8bc2215a6a7e +}; diff --git a/arch/arm/boot/dts/overlays/spi5-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi5-1cs-overlay.dts new file mode 100644 -index 000000000000..c0f8cb8510ee +index 0000000000000..c0f8cb8510eee --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi5-1cs-overlay.dts @@ -0,0 +1,44 @@ @@ -28327,7 +29282,7 @@ index 000000000000..c0f8cb8510ee +}; diff --git a/arch/arm/boot/dts/overlays/spi5-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi5-2cs-overlay.dts new file mode 100644 -index 000000000000..7758b9c00b4e +index 0000000000000..7758b9c00b4e9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi5-2cs-overlay.dts @@ -0,0 +1,56 @@ @@ -28389,7 +29344,7 @@ index 000000000000..7758b9c00b4e +}; diff --git a/arch/arm/boot/dts/overlays/spi6-1cs-overlay.dts b/arch/arm/boot/dts/overlays/spi6-1cs-overlay.dts new file mode 100644 -index 000000000000..8c8a953eca01 +index 0000000000000..8c8a953eca01f --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi6-1cs-overlay.dts @@ -0,0 +1,44 @@ @@ -28439,7 +29394,7 @@ index 000000000000..8c8a953eca01 +}; diff --git a/arch/arm/boot/dts/overlays/spi6-2cs-overlay.dts b/arch/arm/boot/dts/overlays/spi6-2cs-overlay.dts new file mode 100644 -index 000000000000..2ff897f21aed +index 0000000000000..2ff897f21aedb --- /dev/null +++ b/arch/arm/boot/dts/overlays/spi6-2cs-overlay.dts @@ -0,0 +1,56 @@ @@ -28501,7 +29456,7 @@ index 000000000000..2ff897f21aed +}; diff --git a/arch/arm/boot/dts/overlays/ssd1306-overlay.dts b/arch/arm/boot/dts/overlays/ssd1306-overlay.dts new file mode 100644 -index 000000000000..84cf10e489d3 +index 0000000000000..84cf10e489d3c --- /dev/null +++ b/arch/arm/boot/dts/overlays/ssd1306-overlay.dts @@ -0,0 +1,36 @@ @@ -28543,7 +29498,7 @@ index 000000000000..84cf10e489d3 +}; diff --git a/arch/arm/boot/dts/overlays/ssd1306-spi-overlay.dts b/arch/arm/boot/dts/overlays/ssd1306-spi-overlay.dts new file mode 100644 -index 000000000000..ffc90c7cecf6 +index 0000000000000..ffc90c7cecf66 --- /dev/null +++ b/arch/arm/boot/dts/overlays/ssd1306-spi-overlay.dts @@ -0,0 +1,84 @@ @@ -28633,7 +29588,7 @@ index 000000000000..ffc90c7cecf6 +}; diff --git a/arch/arm/boot/dts/overlays/ssd1331-spi-overlay.dts b/arch/arm/boot/dts/overlays/ssd1331-spi-overlay.dts new file mode 100644 -index 000000000000..9fd5ebf2feda +index 0000000000000..9fd5ebf2fedae --- /dev/null +++ b/arch/arm/boot/dts/overlays/ssd1331-spi-overlay.dts @@ -0,0 +1,83 @@ @@ -28722,7 +29677,7 @@ index 000000000000..9fd5ebf2feda +}; diff --git a/arch/arm/boot/dts/overlays/ssd1351-spi-overlay.dts b/arch/arm/boot/dts/overlays/ssd1351-spi-overlay.dts new file mode 100644 -index 000000000000..ffc872c60648 +index 0000000000000..ffc872c60648f --- /dev/null +++ b/arch/arm/boot/dts/overlays/ssd1351-spi-overlay.dts @@ -0,0 +1,83 @@ @@ -28811,7 +29766,7 @@ index 000000000000..ffc872c60648 +}; diff --git a/arch/arm/boot/dts/overlays/superaudioboard-overlay.dts b/arch/arm/boot/dts/overlays/superaudioboard-overlay.dts new file mode 100755 -index 000000000000..bad61535981e +index 0000000000000..bad61535981e9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/superaudioboard-overlay.dts @@ -0,0 +1,73 @@ @@ -28890,7 +29845,7 @@ index 000000000000..bad61535981e +}; diff --git a/arch/arm/boot/dts/overlays/sx150x-overlay.dts b/arch/arm/boot/dts/overlays/sx150x-overlay.dts new file mode 100644 -index 000000000000..1d1069345da2 +index 0000000000000..1d1069345da21 --- /dev/null +++ b/arch/arm/boot/dts/overlays/sx150x-overlay.dts @@ -0,0 +1,1706 @@ @@ -30602,7 +31557,7 @@ index 000000000000..1d1069345da2 + diff --git a/arch/arm/boot/dts/overlays/tc358743-audio-overlay.dts b/arch/arm/boot/dts/overlays/tc358743-audio-overlay.dts new file mode 100644 -index 000000000000..047695bb0c71 +index 0000000000000..047695bb0c715 --- /dev/null +++ b/arch/arm/boot/dts/overlays/tc358743-audio-overlay.dts @@ -0,0 +1,52 @@ @@ -30660,7 +31615,7 @@ index 000000000000..047695bb0c71 +}; diff --git a/arch/arm/boot/dts/overlays/tc358743-overlay.dts b/arch/arm/boot/dts/overlays/tc358743-overlay.dts new file mode 100644 -index 000000000000..a1f8af36d2e7 +index 0000000000000..a1f8af36d2e74 --- /dev/null +++ b/arch/arm/boot/dts/overlays/tc358743-overlay.dts @@ -0,0 +1,107 @@ @@ -30773,7 +31728,7 @@ index 000000000000..a1f8af36d2e7 +}; diff --git a/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts b/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts new file mode 100644 -index 000000000000..a102b09e3ab5 +index 0000000000000..a102b09e3ab56 --- /dev/null +++ b/arch/arm/boot/dts/overlays/tinylcd35-overlay.dts @@ -0,0 +1,222 @@ @@ -31001,7 +31956,7 @@ index 000000000000..a102b09e3ab5 +}; diff --git a/arch/arm/boot/dts/overlays/tpm-slb9670-overlay.dts b/arch/arm/boot/dts/overlays/tpm-slb9670-overlay.dts new file mode 100644 -index 000000000000..e69188503ca3 +index 0000000000000..e69188503ca33 --- /dev/null +++ b/arch/arm/boot/dts/overlays/tpm-slb9670-overlay.dts @@ -0,0 +1,44 @@ @@ -31051,7 +32006,7 @@ index 000000000000..e69188503ca3 +}; diff --git a/arch/arm/boot/dts/overlays/uart0-overlay.dts b/arch/arm/boot/dts/overlays/uart0-overlay.dts new file mode 100755 -index 000000000000..73d563bbaabf +index 0000000000000..73d563bbaabfa --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart0-overlay.dts @@ -0,0 +1,32 @@ @@ -31089,7 +32044,7 @@ index 000000000000..73d563bbaabf +}; diff --git a/arch/arm/boot/dts/overlays/uart1-overlay.dts b/arch/arm/boot/dts/overlays/uart1-overlay.dts new file mode 100644 -index 000000000000..986d725a2652 +index 0000000000000..986d725a26529 --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart1-overlay.dts @@ -0,0 +1,38 @@ @@ -31133,7 +32088,7 @@ index 000000000000..986d725a2652 +}; diff --git a/arch/arm/boot/dts/overlays/uart2-overlay.dts b/arch/arm/boot/dts/overlays/uart2-overlay.dts new file mode 100644 -index 000000000000..9face240aca1 +index 0000000000000..9face240aca1f --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart2-overlay.dts @@ -0,0 +1,27 @@ @@ -31166,7 +32121,7 @@ index 000000000000..9face240aca1 +}; diff --git a/arch/arm/boot/dts/overlays/uart3-overlay.dts b/arch/arm/boot/dts/overlays/uart3-overlay.dts new file mode 100644 -index 000000000000..ae9f9fe5ea1d +index 0000000000000..ae9f9fe5ea1db --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart3-overlay.dts @@ -0,0 +1,27 @@ @@ -31199,7 +32154,7 @@ index 000000000000..ae9f9fe5ea1d +}; diff --git a/arch/arm/boot/dts/overlays/uart4-overlay.dts b/arch/arm/boot/dts/overlays/uart4-overlay.dts new file mode 100644 -index 000000000000..ac004ffbadbf +index 0000000000000..ac004ffbadbf8 --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart4-overlay.dts @@ -0,0 +1,27 @@ @@ -31232,7 +32187,7 @@ index 000000000000..ac004ffbadbf +}; diff --git a/arch/arm/boot/dts/overlays/uart5-overlay.dts b/arch/arm/boot/dts/overlays/uart5-overlay.dts new file mode 100644 -index 000000000000..04eaf376effe +index 0000000000000..04eaf376effe6 --- /dev/null +++ b/arch/arm/boot/dts/overlays/uart5-overlay.dts @@ -0,0 +1,27 @@ @@ -31265,7 +32220,7 @@ index 000000000000..04eaf376effe +}; diff --git a/arch/arm/boot/dts/overlays/udrc-overlay.dts b/arch/arm/boot/dts/overlays/udrc-overlay.dts new file mode 100644 -index 000000000000..ae7c37996894 +index 0000000000000..ae7c37996894a --- /dev/null +++ b/arch/arm/boot/dts/overlays/udrc-overlay.dts @@ -0,0 +1,128 @@ @@ -31399,7 +32354,7 @@ index 000000000000..ae7c37996894 +}; diff --git a/arch/arm/boot/dts/overlays/ugreen-dabboard-overlay.dts b/arch/arm/boot/dts/overlays/ugreen-dabboard-overlay.dts new file mode 100644 -index 000000000000..fc8d9b118068 +index 0000000000000..fc8d9b118068f --- /dev/null +++ b/arch/arm/boot/dts/overlays/ugreen-dabboard-overlay.dts @@ -0,0 +1,49 @@ @@ -31454,7 +32409,7 @@ index 000000000000..fc8d9b118068 +}; diff --git a/arch/arm/boot/dts/overlays/upstream-overlay.dts b/arch/arm/boot/dts/overlays/upstream-overlay.dts new file mode 100644 -index 000000000000..7c4071a7cb27 +index 0000000000000..7c4071a7cb270 --- /dev/null +++ b/arch/arm/boot/dts/overlays/upstream-overlay.dts @@ -0,0 +1,101 @@ @@ -31561,7 +32516,7 @@ index 000000000000..7c4071a7cb27 +}; diff --git a/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts b/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts new file mode 100644 -index 000000000000..f4328634542e +index 0000000000000..f4328634542ed --- /dev/null +++ b/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts @@ -0,0 +1,137 @@ @@ -31704,7 +32659,7 @@ index 000000000000..f4328634542e +}; diff --git a/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts new file mode 100644 -index 000000000000..ca344492bed8 +index 0000000000000..ca344492bed86 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts @@ -0,0 +1,40 @@ @@ -31750,7 +32705,7 @@ index 000000000000..ca344492bed8 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-fkms-v3d-pi4-overlay.dts b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-pi4-overlay.dts new file mode 100644 -index 000000000000..7792ead0cbb3 +index 0000000000000..7792ead0cbb31 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-pi4-overlay.dts @@ -0,0 +1,44 @@ @@ -31800,7 +32755,7 @@ index 000000000000..7792ead0cbb3 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dpi-at056tn53v1-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dpi-at056tn53v1-overlay.dts new file mode 100644 -index 000000000000..f7181c9828bf +index 0000000000000..f7181c9828bfe --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dpi-at056tn53v1-overlay.dts @@ -0,0 +1,44 @@ @@ -31850,10 +32805,10 @@ index 000000000000..f7181c9828bf +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-7inch-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-7inch-overlay.dts new file mode 100644 -index 000000000000..086f4ffd633a +index 0000000000000..ecd3bef3d65ab --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-7inch-overlay.dts -@@ -0,0 +1,56 @@ +@@ -0,0 +1,118 @@ +/* + * Device Tree overlay for RaspberryPi 7" Touchscreen panel + * @@ -31862,57 +32817,119 @@ index 000000000000..086f4ffd633a +/dts-v1/; +/plugin/; + ++#include "edt-ft5406.dtsi" ++ +/ { -+ compatible = "brcm,bcm2835"; ++ /* No compatible as it will have come from edt-ft5406.dtsi */ + + fragment@0 { + target = <&dsi1>; + __overlay__ { -+ #address-cells = <1>; size-cells = <0>; -+ status = "okay"; -+ port { -+ dsi_out_port: endpoint { -+ remote-endpoint = <&panel_dsi_port>; -+ }; -+ }; -+ }; -+ }; -+ -+ fragment@1 { -+ target = <&i2c_csi_dsi>; -+ __overlay__ { + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; -+ lcd@45 { -+ compatible = "raspberrypi,7inch-touchscreen-panel"; -+ reg = <0x45>; -+ port { -+ panel_dsi_port: endpoint { -+ remote-endpoint = <&dsi_out_port>; ++ port { ++ dsi_out: endpoint { ++ remote-endpoint = <&bridge_in>; ++ }; ++ }; ++ bridge@0 { ++ reg = <0>; ++ compatible = "toshiba,tc358762"; ++ vddc-supply = <®_bridge>; ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port@0 { ++ reg = <0>; ++ bridge_in: endpoint { ++ remote-endpoint = <&dsi_out>; ++ }; ++ }; ++ ++ port@1 { ++ reg = <1>; ++ bridge_out: endpoint { ++ remote-endpoint = <&panel_in>; ++ }; + }; + }; + }; + }; + }; + ++ fragment@1 { ++ target-path = "/"; ++ __overlay__ { ++ panel_disp1: panel_disp1@0 { ++ reg = <0>; ++ compatible = "raspberrypi,7inch-dsi", "simple-panel"; ++ backlight = <®_display>; ++ power-supply = <®_display>; ++ ++ port { ++ panel_in: endpoint { ++ remote-endpoint = <&bridge_out>; ++ }; ++ }; ++ }; ++ ++ reg_bridge: reg_bridge@0 { ++ reg = <0>; ++ compatible = "regulator-fixed"; ++ regulator-name = "bridge_reg"; ++ gpio = <®_display 0 0>; ++ vin-supply = <®_display>; ++ enable-active-high; ++ }; ++ }; ++ }; ++ + fragment@2 { ++ target = <&i2c_csi_dsi>; ++ __overlay__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ reg_display: reg_display@45 { ++ compatible = "raspberrypi,7inch-touchscreen-panel-regulator"; ++ reg = <0x45>; ++ gpio-controller; ++ #gpio-cells = <2>; ++ }; ++ }; ++ }; ++ ++ fragment@3 { + target = <&i2c0if>; + __overlay__ { + status = "okay"; + }; + }; + -+ fragment@3 { ++ fragment@4 { + target = <&i2c0mux>; + __overlay__ { + status = "okay"; + }; + }; ++ fragment@5 { ++ target = <&ft5406>; ++ __overlay__ { ++ vcc-supply = <®_display>; ++ reset-gpio = <®_display 1 1>; ++ }; ++ }; ++ ++ __overrides__ { ++ disable_touch = <0>, "-10-11-12-13"; ++ }; +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-overlay.dts new file mode 100644 -index 000000000000..d7b8f6713804 +index 0000000000000..d7b8f67138041 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-overlay.dts @@ -0,0 +1,69 @@ @@ -31987,7 +33004,7 @@ index 000000000000..d7b8f6713804 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-v2-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-v2-overlay.dts new file mode 100644 -index 000000000000..5dcd0f2243e2 +index 0000000000000..5dcd0f2243e22 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-dsi-lt070me05000-v2-overlay.dts @@ -0,0 +1,64 @@ @@ -32057,7 +33074,7 @@ index 000000000000..5dcd0f2243e2 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-kippah-7inch-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-kippah-7inch-overlay.dts new file mode 100644 -index 000000000000..b03394844abd +index 0000000000000..b03394844abd9 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-kippah-7inch-overlay.dts @@ -0,0 +1,43 @@ @@ -32106,7 +33123,7 @@ index 000000000000..b03394844abd +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts new file mode 100644 -index 000000000000..5a4efdeed663 +index 0000000000000..5a4efdeed6633 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts @@ -0,0 +1,123 @@ @@ -32235,7 +33252,7 @@ index 000000000000..5a4efdeed663 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts new file mode 100644 -index 000000000000..4285e12a4e53 +index 0000000000000..4285e12a4e538 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts @@ -0,0 +1,197 @@ @@ -32438,7 +33455,7 @@ index 000000000000..4285e12a4e53 +}; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-vga666-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-vga666-overlay.dts new file mode 100644 -index 000000000000..6e787099e861 +index 0000000000000..6e787099e8616 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vc4-kms-vga666-overlay.dts @@ -0,0 +1,100 @@ @@ -32544,7 +33561,7 @@ index 000000000000..6e787099e861 +}; diff --git a/arch/arm/boot/dts/overlays/vga666-overlay.dts b/arch/arm/boot/dts/overlays/vga666-overlay.dts new file mode 100644 -index 000000000000..a4968d180a5d +index 0000000000000..a4968d180a5d0 --- /dev/null +++ b/arch/arm/boot/dts/overlays/vga666-overlay.dts @@ -0,0 +1,30 @@ @@ -32580,7 +33597,7 @@ index 000000000000..a4968d180a5d +}; diff --git a/arch/arm/boot/dts/overlays/w1-gpio-overlay.dts b/arch/arm/boot/dts/overlays/w1-gpio-overlay.dts new file mode 100644 -index 000000000000..f44e325bc1f2 +index 0000000000000..f44e325bc1f2e --- /dev/null +++ b/arch/arm/boot/dts/overlays/w1-gpio-overlay.dts @@ -0,0 +1,40 @@ @@ -32626,7 +33643,7 @@ index 000000000000..f44e325bc1f2 +}; diff --git a/arch/arm/boot/dts/overlays/w1-gpio-pullup-overlay.dts b/arch/arm/boot/dts/overlays/w1-gpio-pullup-overlay.dts new file mode 100644 -index 000000000000..953c6a1aeab9 +index 0000000000000..953c6a1aeab97 --- /dev/null +++ b/arch/arm/boot/dts/overlays/w1-gpio-pullup-overlay.dts @@ -0,0 +1,42 @@ @@ -32674,7 +33691,7 @@ index 000000000000..953c6a1aeab9 +}; diff --git a/arch/arm/boot/dts/overlays/w5500-overlay.dts b/arch/arm/boot/dts/overlays/w5500-overlay.dts new file mode 100644 -index 000000000000..4d3e66296753 +index 0000000000000..4d3e662967530 --- /dev/null +++ b/arch/arm/boot/dts/overlays/w5500-overlay.dts @@ -0,0 +1,63 @@ @@ -32743,7 +33760,7 @@ index 000000000000..4d3e66296753 +}; diff --git a/arch/arm/boot/dts/overlays/wittypi-overlay.dts b/arch/arm/boot/dts/overlays/wittypi-overlay.dts new file mode 100644 -index 000000000000..71ce806186de +index 0000000000000..71ce806186deb --- /dev/null +++ b/arch/arm/boot/dts/overlays/wittypi-overlay.dts @@ -0,0 +1,44 @@ @@ -32793,7 +33810,7 @@ index 000000000000..71ce806186de +}; diff --git a/arch/arm/boot/dts/overlays/wm8960-soundcard-overlay.dts b/arch/arm/boot/dts/overlays/wm8960-soundcard-overlay.dts new file mode 100644 -index 000000000000..289fa4dacdf1 +index 0000000000000..289fa4dacdf1f --- /dev/null +++ b/arch/arm/boot/dts/overlays/wm8960-soundcard-overlay.dts @@ -0,0 +1,82 @@ @@ -32881,10 +33898,10 @@ index 000000000000..289fa4dacdf1 +}; diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig new file mode 100644 -index 000000000000..dcaef9b8c9e7 +index 0000000000000..7b4c28badf910 --- /dev/null +++ b/arch/arm/configs/bcm2709_defconfig -@@ -0,0 +1,1504 @@ +@@ -0,0 +1,1510 @@ +CONFIG_LOCALVERSION="-v7" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -33306,6 +34323,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_CAN_MCP251XFD=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_GS_USB=m ++CONFIG_CAN_PEAK_USB=m +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y @@ -33637,6 +34655,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_REGULATOR_FIXED_VOLTAGE=m +CONFIG_REGULATOR_ARIZONA_LDO1=m +CONFIG_REGULATOR_ARIZONA_MICSUPP=m ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_BPF_LIRC_MODE2=y @@ -33810,6 +34829,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX519=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7640=m @@ -33824,6 +34844,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_SIMPLE_BRIDGE=m ++CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_VC4=m +CONFIG_DRM_VC4_HDMI_CEC=y +CONFIG_TINYDRM_ILI9225=m @@ -33865,6 +34886,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m ++CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_SOC=m +CONFIG_SND_BCM2835_SOC_I2S=m +CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m @@ -34261,6 +35283,7 @@ index 000000000000..dcaef9b8c9e7 +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=y ++CONFIG_F2FS_FS_SECURITY=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FANOTIFY=y +CONFIG_QFMT_V1=m @@ -34391,10 +35414,10 @@ index 000000000000..dcaef9b8c9e7 +# CONFIG_UPROBE_EVENTS is not set diff --git a/arch/arm/configs/bcm2711_defconfig b/arch/arm/configs/bcm2711_defconfig new file mode 100644 -index 000000000000..b0d099ad9f2d +index 0000000000000..a4543d42fc55c --- /dev/null +++ b/arch/arm/configs/bcm2711_defconfig -@@ -0,0 +1,1543 @@ +@@ -0,0 +1,1550 @@ +CONFIG_LOCALVERSION="-v7l" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -34817,6 +35840,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_CAN_MCP251XFD=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_GS_USB=m ++CONFIG_CAN_PEAK_USB=m +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y @@ -34910,6 +35934,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_ENC28J60=m +CONFIG_QCA7000_SPI=m +CONFIG_QCA7000_UART=m ++CONFIG_R8169=m +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5100_SPI=m +CONFIG_MICREL_PHY=y @@ -35161,6 +36186,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_REGULATOR_ARIZONA_LDO1=m +CONFIG_REGULATOR_ARIZONA_MICSUPP=m +CONFIG_REGULATOR_GPIO=y ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_BPF_LIRC_MODE2=y @@ -35334,6 +36360,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX519=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7640=m @@ -35348,6 +36375,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_SIMPLE_BRIDGE=m ++CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_V3D=m +CONFIG_DRM_VC4=m +CONFIG_DRM_VC4_HDMI_CEC=y @@ -35390,6 +36418,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m ++CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_SOC=m +CONFIG_SND_BCM2835_SOC_I2S=m +CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m @@ -35809,6 +36838,7 @@ index 000000000000..b0d099ad9f2d +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=y ++CONFIG_F2FS_FS_SECURITY=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FANOTIFY=y +CONFIG_QFMT_V1=m @@ -35940,10 +36970,10 @@ index 000000000000..b0d099ad9f2d +# CONFIG_UPROBE_EVENTS is not set diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig new file mode 100644 -index 000000000000..fa02f75b2ed8 +index 0000000000000..5f1bd057138d5 --- /dev/null +++ b/arch/arm/configs/bcmrpi_defconfig -@@ -0,0 +1,1517 @@ +@@ -0,0 +1,1523 @@ +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y +CONFIG_POSIX_MQUEUE=y @@ -36359,6 +37389,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_CAN_MCP251XFD=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_GS_USB=m ++CONFIG_CAN_PEAK_USB=m +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y @@ -36689,6 +37720,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_REGULATOR_FIXED_VOLTAGE=m +CONFIG_REGULATOR_ARIZONA_LDO1=m +CONFIG_REGULATOR_ARIZONA_MICSUPP=m ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_BPF_LIRC_MODE2=y @@ -36862,6 +37894,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX519=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7640=m @@ -36876,6 +37909,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_SIMPLE_BRIDGE=m ++CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_VC4=m +CONFIG_DRM_VC4_HDMI_CEC=y +CONFIG_TINYDRM_ILI9225=m @@ -36917,6 +37951,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m ++CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_SOC=m +CONFIG_SND_BCM2835_SOC_I2S=m +CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m @@ -37331,6 +38366,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=y ++CONFIG_F2FS_FS_SECURITY=y +CONFIG_FANOTIFY=y +CONFIG_QFMT_V1=m +CONFIG_QFMT_V2=m @@ -37462,7 +38498,7 @@ index 000000000000..fa02f75b2ed8 +CONFIG_BLK_DEV_IO_TRACE=y +# CONFIG_UPROBE_EVENTS is not set diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig -index a611b0c1e540..ea2715c9f923 100644 +index a611b0c1e540f..ea2715c9f923b 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig @@ -1089,6 +1089,7 @@ CONFIG_ROCKCHIP_EFUSE=m @@ -37474,7 +38510,7 @@ index a611b0c1e540..ea2715c9f923 100644 CONFIG_FSI_MASTER_GPIO=m CONFIG_FSI_MASTER_HUB=m diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h -index 2e24e765e6d3..3c285a257e89 100644 +index 2e24e765e6d3a..3c285a257e890 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h @@ -91,6 +91,21 @@ @@ -37527,7 +38563,7 @@ index 2e24e765e6d3..3c285a257e89 100644 #endif diff --git a/arch/arm/include/asm/glue-cache.h b/arch/arm/include/asm/glue-cache.h -index 724f8dac1e5b..aa74173092dd 100644 +index 724f8dac1e5b1..aa74173092dd8 100644 --- a/arch/arm/include/asm/glue-cache.h +++ b/arch/arm/include/asm/glue-cache.h @@ -155,6 +155,8 @@ static inline void nop_dma_unmap_area(const void *s, size_t l, int f) { } @@ -37540,7 +38576,7 @@ index 724f8dac1e5b..aa74173092dd 100644 #endif diff --git a/arch/arm/include/asm/irqflags.h b/arch/arm/include/asm/irqflags.h -index aeec7f24eb75..a3b186608c60 100644 +index aeec7f24eb75b..a3b186608c609 100644 --- a/arch/arm/include/asm/irqflags.h +++ b/arch/arm/include/asm/irqflags.h @@ -163,13 +163,23 @@ static inline unsigned long arch_local_save_flags(void) @@ -37571,7 +38607,7 @@ index aeec7f24eb75..a3b186608c60 100644 : "r" (flags) : "memory", "cc"); diff --git a/arch/arm/include/asm/string.h b/arch/arm/include/asm/string.h -index 6c607c68f3ad..ba7fc0bc9a15 100644 +index 6c607c68f3ad7..ba7fc0bc9a15d 100644 --- a/arch/arm/include/asm/string.h +++ b/arch/arm/include/asm/string.h @@ -65,4 +65,9 @@ static inline void *memset64(uint64_t *p, uint64_t v, __kernel_size_t n) @@ -37585,7 +38621,7 @@ index 6c607c68f3ad..ba7fc0bc9a15 100644 + #endif diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h -index 476d1a15e669..7ff524ed07d6 100644 +index 476d1a15e6697..7ff524ed07d68 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h @@ -507,6 +507,9 @@ do { \ @@ -37599,7 +38635,7 @@ index 476d1a15e669..7ff524ed07d6 100644 raw_copy_from_user(void *to, const void __user *from, unsigned long n) { diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c -index 91e37dfe0396..6f2cc6978443 100644 +index 91e37dfe0396a..6f2cc69784433 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -63,6 +63,8 @@ @@ -37621,7 +38657,7 @@ index 91e37dfe0396..6f2cc6978443 100644 } diff --git a/arch/arm/kernel/fiqasm.S b/arch/arm/kernel/fiqasm.S -index 8dd26e1a9bd6..eef484756af2 100644 +index 8dd26e1a9bd69..eef484756af21 100644 --- a/arch/arm/kernel/fiqasm.S +++ b/arch/arm/kernel/fiqasm.S @@ -47,3 +47,7 @@ ENTRY(__get_fiq_regs) @@ -37633,7 +38669,7 @@ index 8dd26e1a9bd6..eef484756af2 100644 + mov pc, r8 +ENDPROC(__FIQ_Branch) diff --git a/arch/arm/kernel/reboot.c b/arch/arm/kernel/reboot.c -index 0ce388f15422..63373adab475 100644 +index 0ce388f154226..63373adab4757 100644 --- a/arch/arm/kernel/reboot.c +++ b/arch/arm/kernel/reboot.c @@ -102,9 +102,7 @@ void machine_shutdown(void) @@ -37648,10 +38684,10 @@ index 0ce388f15422..63373adab475 100644 /* diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c -index e37ebb7f1b0b..5894d0e32807 100644 +index d7ae50b32c7b2..fd6e4580d6214 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c -@@ -1255,6 +1255,8 @@ static int c_show(struct seq_file *m, void *v) +@@ -1257,6 +1257,8 @@ static int c_show(struct seq_file *m, void *v) { int i, j; u32 cpuid; @@ -37660,7 +38696,7 @@ index e37ebb7f1b0b..5894d0e32807 100644 for_each_online_cpu(i) { /* -@@ -1314,6 +1316,14 @@ static int c_show(struct seq_file *m, void *v) +@@ -1316,6 +1318,14 @@ static int c_show(struct seq_file *m, void *v) seq_printf(m, "Revision\t: %04x\n", system_rev); seq_printf(m, "Serial\t\t: %s\n", system_serial); @@ -37676,7 +38712,7 @@ index e37ebb7f1b0b..5894d0e32807 100644 } diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile -index 6d2ba454f25b..8271cde92dec 100644 +index 6d2ba454f25b6..8271cde92dec7 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -7,8 +7,8 @@ @@ -37709,7 +38745,7 @@ index 6d2ba454f25b..8271cde92dec 100644 diff --git a/arch/arm/lib/arm-mem.h b/arch/arm/lib/arm-mem.h new file mode 100644 -index 000000000000..5d4bda19ad20 +index 0000000000000..5d4bda19ad207 --- /dev/null +++ b/arch/arm/lib/arm-mem.h @@ -0,0 +1,159 @@ @@ -37873,7 +38909,7 @@ index 000000000000..5d4bda19ad20 +92: +.endm diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S -index f8016e3db65d..ab7bf28dbec0 100644 +index f8016e3db65d7..ab7bf28dbec08 100644 --- a/arch/arm/lib/copy_from_user.S +++ b/arch/arm/lib/copy_from_user.S @@ -107,7 +107,8 @@ @@ -37896,7 +38932,7 @@ index f8016e3db65d..ab7bf28dbec0 100644 .align 0 diff --git a/arch/arm/lib/exports_rpi.c b/arch/arm/lib/exports_rpi.c new file mode 100644 -index 000000000000..1f826047db75 +index 0000000000000..1f826047db754 --- /dev/null +++ b/arch/arm/lib/exports_rpi.c @@ -0,0 +1,37 @@ @@ -37939,7 +38975,7 @@ index 000000000000..1f826047db75 +EXPORT_SYMBOL(memcmp); diff --git a/arch/arm/lib/memcmp_rpi.S b/arch/arm/lib/memcmp_rpi.S new file mode 100644 -index 000000000000..bf6e4edfc9d3 +index 0000000000000..bf6e4edfc9d3b --- /dev/null +++ b/arch/arm/lib/memcmp_rpi.S @@ -0,0 +1,285 @@ @@ -38230,7 +39266,7 @@ index 000000000000..bf6e4edfc9d3 +ENDPROC(memcmp) diff --git a/arch/arm/lib/memcpy_rpi.S b/arch/arm/lib/memcpy_rpi.S new file mode 100644 -index 000000000000..30f8a9089a83 +index 0000000000000..30f8a9089a835 --- /dev/null +++ b/arch/arm/lib/memcpy_rpi.S @@ -0,0 +1,61 @@ @@ -38297,7 +39333,7 @@ index 000000000000..30f8a9089a83 +ENDPROC(mmiocpy) diff --git a/arch/arm/lib/memcpymove.h b/arch/arm/lib/memcpymove.h new file mode 100644 -index 000000000000..d8be5849c860 +index 0000000000000..d8be5849c8609 --- /dev/null +++ b/arch/arm/lib/memcpymove.h @@ -0,0 +1,506 @@ @@ -38809,7 +39845,7 @@ index 000000000000..d8be5849c860 +.endm diff --git a/arch/arm/lib/memmove_rpi.S b/arch/arm/lib/memmove_rpi.S new file mode 100644 -index 000000000000..8b0760c0904c +index 0000000000000..8b0760c0904c5 --- /dev/null +++ b/arch/arm/lib/memmove_rpi.S @@ -0,0 +1,61 @@ @@ -38876,7 +39912,7 @@ index 000000000000..8b0760c0904c +ENDPROC(memmove) diff --git a/arch/arm/lib/memset_rpi.S b/arch/arm/lib/memset_rpi.S new file mode 100644 -index 000000000000..e8469cecabc1 +index 0000000000000..e8469cecabc15 --- /dev/null +++ b/arch/arm/lib/memset_rpi.S @@ -0,0 +1,128 @@ @@ -39009,7 +40045,7 @@ index 000000000000..e8469cecabc1 +ENDPROC(memset) +ENDPROC(mmioset) diff --git a/arch/arm/lib/uaccess_with_memcpy.c b/arch/arm/lib/uaccess_with_memcpy.c -index 106f83a5ea6d..b483e5713039 100644 +index 106f83a5ea6d2..b483e5713039d 100644 --- a/arch/arm/lib/uaccess_with_memcpy.c +++ b/arch/arm/lib/uaccess_with_memcpy.c @@ -19,6 +19,14 @@ @@ -39185,7 +40221,7 @@ index 106f83a5ea6d..b483e5713039 100644 static unsigned long noinline __clear_user_memset(void __user *addr, unsigned long n) diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig -index ae790908fc74..822125c5707a 100644 +index ae790908fc74a..822125c5707a8 100644 --- a/arch/arm/mach-bcm/Kconfig +++ b/arch/arm/mach-bcm/Kconfig @@ -161,9 +161,12 @@ config ARCH_BCM2835 @@ -39216,7 +40252,7 @@ index ae790908fc74..822125c5707a 100644 bool "Broadcom BCM63xx DSL SoC" depends on ARCH_MULTI_V7 diff --git a/arch/arm/mach-bcm/board_bcm2835.c b/arch/arm/mach-bcm/board_bcm2835.c -index bfc556f76720..91a758c61f48 100644 +index bfc556f767203..91a758c61f484 100644 --- a/arch/arm/mach-bcm/board_bcm2835.c +++ b/arch/arm/mach-bcm/board_bcm2835.c @@ -5,13 +5,103 @@ @@ -39350,7 +40386,7 @@ index bfc556f76720..91a758c61f48 100644 + .smp = smp_ops(bcm2836_smp_ops), +MACHINE_END diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S -index f0f65eb073e4..868011801521 100644 +index f0f65eb073e48..8680118015219 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S @@ -198,7 +198,7 @@ ENTRY(v6_flush_kern_dcache_area) @@ -39372,7 +40408,7 @@ index f0f65eb073e4..868011801521 100644 1: #ifdef CONFIG_DMA_CACHE_RWFO diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S -index dc8f152f3556..536df5db66e4 100644 +index dc8f152f35566..536df5db66e43 100644 --- a/arch/arm/mm/cache-v7.S +++ b/arch/arm/mm/cache-v7.S @@ -363,7 +363,8 @@ ENDPROC(v7_flush_kern_dcache_area) @@ -39396,7 +40432,7 @@ index dc8f152f3556..536df5db66e4 100644 sub r3, r2, #1 bic r0, r0, r3 diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S -index e2c743aa2eb2..726c103fe555 100644 +index e2c743aa2eb2b..726c103fe5551 100644 --- a/arch/arm/mm/proc-macros.S +++ b/arch/arm/mm/proc-macros.S @@ -334,6 +334,8 @@ ENTRY(\name\()_cache_fns) @@ -39409,7 +40445,7 @@ index e2c743aa2eb2..726c103fe555 100644 .size \name\()_cache_fns, . - \name\()_cache_fns .endm diff --git a/arch/arm/mm/proc-syms.c b/arch/arm/mm/proc-syms.c -index e21249548e9f..33e4a9b8f1ba 100644 +index e21249548e9fb..33e4a9b8f1ba3 100644 --- a/arch/arm/mm/proc-syms.c +++ b/arch/arm/mm/proc-syms.c @@ -27,6 +27,9 @@ EXPORT_SYMBOL(__cpuc_flush_user_all); @@ -39423,7 +40459,7 @@ index e21249548e9f..33e4a9b8f1ba 100644 EXPORT_SYMBOL(cpu_cache); #endif diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S -index a0618f3e6836..b3a2fce22eac 100644 +index a0618f3e6836b..b3a2fce22eac3 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S @@ -70,10 +70,19 @@ ENDPROC(cpu_v6_reset) @@ -39450,38 +40486,35 @@ index a0618f3e6836..b3a2fce22eac 100644 ENTRY(cpu_v6_dcache_clean_area) diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S -index 28c9d32fa99a..3e77e8982df3 100644 +index a59ddfd7a179d..5820720e53637 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S -@@ -287,6 +287,8 @@ __v7_ca17mp_setup: - mov r10, #0 +@@ -303,7 +303,11 @@ __v7_ca17mp_setup: 1: adr r0, __v7_setup_stack_ptr ldr r12, [r0] -+ tst r12, #0x1f -+ addeq r12, r12, #4 add r12, r12, r0 @ the local stack ++1: stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6 ++ ldr r0, [r12, #(6 * 4)] @ read back the return address ++ teq r0, lr @ confirm it is correct ++ bne 1b @ retrying if not bl v7_invalidate_l1 -@@ -474,6 +476,8 @@ __v7_setup: + ldmia r12, {r1-r6, lr} + #ifdef CONFIG_SMP +@@ -489,7 +493,11 @@ __v7_setup: adr r0, __v7_setup_stack_ptr ldr r12, [r0] add r12, r12, r0 @ the local stack -+ tst r12, #0x1f -+ addeq r12, r12, #4 ++1: stmia r12, {r1-r6, lr} @ v7_invalidate_l1 touches r0-r6 ++ ldr r0, [r12, #(6 * 4)] @ read back the return address ++ teq r0, lr @ confirm it is correct ++ bne 1b @ retrying if not bl v7_invalidate_l1 ldmia r12, {r1-r6, lr} -@@ -557,7 +561,7 @@ ENDPROC(__v7_setup) - .bss - .align 2 - __v7_setup_stack: -- .space 4 * 7 @ 7 registers -+ .space 4 * 8 @ 7 registers + 1 spare - - __INITDATA diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c -index 2cb355c1b5b7..1e2dcf81aefa 100644 +index 2cb355c1b5b71..1e2dcf81aefad 100644 --- a/arch/arm/vfp/vfpmodule.c +++ b/arch/arm/vfp/vfpmodule.c @@ -176,8 +176,11 @@ static int vfp_notifier(struct notifier_block *self, unsigned long cmd, void *v) @@ -39559,7 +40592,7 @@ index 2cb355c1b5b7..1e2dcf81aefa 100644 /* * Save the userland NEON/VFP state. Under UP, diff --git a/arch/arm64/Kconfig.platforms b/arch/arm64/Kconfig.platforms -index dd6b7466fe28..2a7abe568db7 100644 +index dd6b7466fe28a..2a7abe568db7d 100644 --- a/arch/arm64/Kconfig.platforms +++ b/arch/arm64/Kconfig.platforms @@ -39,6 +39,7 @@ config ARCH_BCM2835 @@ -39571,7 +40604,7 @@ index dd6b7466fe28..2a7abe568db7 100644 This enables support for the Broadcom BCM2837 and BCM2711 SoC. These SoCs are used in the Raspberry Pi 3 and 4 devices. diff --git a/arch/arm64/boot/dts/Makefile b/arch/arm64/boot/dts/Makefile -index 9b1170658d60..cc6c25629057 100644 +index 9b1170658d600..cc6c25629057d 100644 --- a/arch/arm64/boot/dts/Makefile +++ b/arch/arm64/boot/dts/Makefile @@ -30,3 +30,5 @@ subdir-y += ti @@ -39581,7 +40614,7 @@ index 9b1170658d60..cc6c25629057 100644 + +subdir-y += overlays diff --git a/arch/arm64/boot/dts/broadcom/Makefile b/arch/arm64/boot/dts/broadcom/Makefile -index cb7de8d99223..2bca736a7197 100644 +index cb7de8d99223d..69809bf2f45df 100644 --- a/arch/arm64/boot/dts/broadcom/Makefile +++ b/arch/arm64/boot/dts/broadcom/Makefile @@ -1,9 +1,20 @@ @@ -39605,38 +40638,38 @@ index cb7de8d99223..2bca736a7197 100644 + +# Enable fixups to support overlays on BCM2835 platforms +ifeq ($(CONFIG_ARCH_BCM2835),y) -+ DTC_FLAGS ?= -@ ++ DTC_FLAGS += -@ +endif diff --git a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts new file mode 100644 -index 000000000000..36ecea71f0ef +index 0000000000000..36ecea71f0ef9 --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-2-b.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2710-rpi-2-b.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts new file mode 100644 -index 000000000000..22fc6a82f2a9 +index 0000000000000..22fc6a82f2a96 --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b-plus.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2710-rpi-3-b-plus.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts new file mode 100644 -index 000000000000..4cacc5b72ae3 +index 0000000000000..4cacc5b72ae3c --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-3-b.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2710-rpi-3-b.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts new file mode 100644 -index 000000000000..e1e13784cff6 +index 0000000000000..e1e13784cff63 --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2710-rpi-cm3.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2710-rpi-cm3.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts -index d24c53682e44..bf69a4b0b172 100644 +index d24c53682e449..bf69a4b0b172a 100644 --- a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts +++ b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dts @@ -1,2 +1 @@ @@ -39645,21 +40678,21 @@ index d24c53682e44..bf69a4b0b172 100644 +#include "../../../../arm/boot/dts/bcm2711-rpi-4-b.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts new file mode 100644 -index 000000000000..90c2b5a195d4 +index 0000000000000..90c2b5a195d48 --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-400.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2711-rpi-400.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4.dts b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4.dts new file mode 100644 -index 000000000000..8064a58155f1 +index 0000000000000..8064a58155f1b --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm2711-rpi-cm4.dts @@ -0,0 +1 @@ +#include "../../../../arm/boot/dts/bcm2711-rpi-cm4.dts" diff --git a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi new file mode 120000 -index 000000000000..e5c400284467 +index 0000000000000..e5c400284467a --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-csi1-2lane.dtsi @@ -0,0 +1 @@ @@ -39667,7 +40700,7 @@ index 000000000000..e5c400284467 \ No newline at end of file diff --git a/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi new file mode 120000 -index 000000000000..fc4c05bbe7fd +index 0000000000000..fc4c05bbe7fd5 --- /dev/null +++ b/arch/arm64/boot/dts/broadcom/bcm283x-rpi-lan7515.dtsi @@ -0,0 +1 @@ @@ -39675,7 +40708,7 @@ index 000000000000..fc4c05bbe7fd \ No newline at end of file diff --git a/arch/arm64/boot/dts/overlays b/arch/arm64/boot/dts/overlays new file mode 120000 -index 000000000000..ded08646b6f6 +index 0000000000000..ded08646b6f66 --- /dev/null +++ b/arch/arm64/boot/dts/overlays @@ -0,0 +1 @@ @@ -39683,10 +40716,10 @@ index 000000000000..ded08646b6f6 \ No newline at end of file diff --git a/arch/arm64/configs/bcm2711_defconfig b/arch/arm64/configs/bcm2711_defconfig new file mode 100644 -index 000000000000..7f254d408ddc +index 0000000000000..88fa0a35d8027 --- /dev/null +++ b/arch/arm64/configs/bcm2711_defconfig -@@ -0,0 +1,1549 @@ +@@ -0,0 +1,1556 @@ +CONFIG_LOCALVERSION="-v8" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -40106,6 +41139,7 @@ index 000000000000..7f254d408ddc +CONFIG_CAN_MCP251XFD=m +CONFIG_CAN_EMS_USB=m +CONFIG_CAN_GS_USB=m ++CONFIG_CAN_PEAK_USB=m +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y @@ -40197,6 +41231,7 @@ index 000000000000..7f254d408ddc +CONFIG_ENC28J60=m +CONFIG_QCA7000_SPI=m +CONFIG_QCA7000_UART=m ++CONFIG_R8169=m +CONFIG_WIZNET_W5100=m +CONFIG_WIZNET_W5100_SPI=m +CONFIG_MICREL_PHY=y @@ -40449,6 +41484,7 @@ index 000000000000..7f254d408ddc +CONFIG_REGULATOR_ARIZONA_LDO1=m +CONFIG_REGULATOR_ARIZONA_MICSUPP=m +CONFIG_REGULATOR_GPIO=y ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_BPF_LIRC_MODE2=y @@ -40627,6 +41663,7 @@ index 000000000000..7f254d408ddc +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX519=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7640=m @@ -40641,6 +41678,7 @@ index 000000000000..7f254d408ddc +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_SIMPLE_BRIDGE=m ++CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_V3D=m +CONFIG_DRM_VC4=m +CONFIG_DRM_VC4_HDMI_CEC=y @@ -40683,6 +41721,7 @@ index 000000000000..7f254d408ddc +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m +CONFIG_SND_USB_HIFACE=m ++CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_SOC=m +CONFIG_SND_BCM2835_SOC_I2S=m +CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m @@ -41108,6 +42147,7 @@ index 000000000000..7f254d408ddc +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=y ++CONFIG_F2FS_FS_SECURITY=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FANOTIFY=y +CONFIG_QFMT_V1=m @@ -41238,10 +42278,10 @@ index 000000000000..7f254d408ddc +# CONFIG_UPROBE_EVENTS is not set diff --git a/arch/arm64/configs/bcmrpi3_defconfig b/arch/arm64/configs/bcmrpi3_defconfig new file mode 100644 -index 000000000000..58a5e0535b6f +index 0000000000000..00352da730098 --- /dev/null +++ b/arch/arm64/configs/bcmrpi3_defconfig -@@ -0,0 +1,1395 @@ +@@ -0,0 +1,1402 @@ +CONFIG_LOCALVERSION="-v8" +# CONFIG_LOCALVERSION_AUTO is not set +CONFIG_SYSVIPC=y @@ -41655,6 +42695,7 @@ index 000000000000..58a5e0535b6f +CONFIG_CAN_MCP251X=m +CONFIG_CAN_MCP251XFD=m +CONFIG_CAN_EMS_USB=m ++CONFIG_CAN_PEAK_USB=m +CONFIG_BT=m +CONFIG_BT_RFCOMM=m +CONFIG_BT_RFCOMM_TTY=y @@ -41961,6 +43002,8 @@ index 000000000000..58a5e0535b6f +CONFIG_MFD_ARIZONA_I2C=m +CONFIG_MFD_ARIZONA_SPI=m +CONFIG_MFD_WM5102=y ++CONFIG_REGULATOR=y ++CONFIG_REGULATOR_RASPBERRYPI_TOUCHSCREEN_ATTINY=m +CONFIG_RC_CORE=y +CONFIG_LIRC=y +CONFIG_BPF_LIRC_MODE2=y @@ -42104,6 +43147,7 @@ index 000000000000..58a5e0535b6f +CONFIG_VIDEO_IMX219=m +CONFIG_VIDEO_IMX290=m +CONFIG_VIDEO_IMX477=m ++CONFIG_VIDEO_IMX519=m +CONFIG_VIDEO_OV5647=m +CONFIG_VIDEO_OV7251=m +CONFIG_VIDEO_OV7640=m @@ -42118,6 +43162,7 @@ index 000000000000..58a5e0535b6f +CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN=m +CONFIG_DRM_DISPLAY_CONNECTOR=m +CONFIG_DRM_SIMPLE_BRIDGE=m ++CONFIG_DRM_TOSHIBA_TC358762=m +CONFIG_DRM_VC4=m +CONFIG_DRM_VC4_HDMI_CEC=y +CONFIG_DRM_GUD=m @@ -42150,6 +43195,7 @@ index 000000000000..58a5e0535b6f +CONFIG_SND_USB_CAIAQ=m +CONFIG_SND_USB_CAIAQ_INPUT=y +CONFIG_SND_USB_6FIRE=m ++CONFIG_SND_USB_TONEPORT=m +CONFIG_SND_SOC=m +CONFIG_SND_BCM2835_SOC_I2S=m +CONFIG_SND_BCM2708_SOC_CHIPDIP_DAC=m @@ -42512,6 +43558,7 @@ index 000000000000..58a5e0535b6f +CONFIG_BTRFS_FS_POSIX_ACL=y +CONFIG_NILFS2_FS=m +CONFIG_F2FS_FS=y ++CONFIG_F2FS_FS_SECURITY=y +CONFIG_FS_ENCRYPTION=y +CONFIG_FANOTIFY=y +CONFIG_QFMT_V1=m @@ -42638,7 +43685,7 @@ index 000000000000..58a5e0535b6f +CONFIG_SCHED_TRACER=y +CONFIG_BLK_DEV_IO_TRACE=y diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig -index 5e7d86cf5dfa..73caaa8ceb96 100644 +index 5e7d86cf5dfa4..73caaa8ceb961 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -1027,6 +1027,7 @@ CONFIG_ROCKCHIP_EFUSE=y @@ -42650,7 +43697,7 @@ index 5e7d86cf5dfa..73caaa8ceb96 100644 CONFIG_FPGA_MGR_STRATIX10_SOC=m CONFIG_FPGA_BRIDGE=m diff --git a/arch/arm64/crypto/aes-cipher-glue.c b/arch/arm64/crypto/aes-cipher-glue.c -index 8caf6dfefce8..2c5772889bdf 100644 +index 8caf6dfefce88..2c5772889bdfe 100644 --- a/arch/arm64/crypto/aes-cipher-glue.c +++ b/arch/arm64/crypto/aes-cipher-glue.c @@ -9,6 +9,16 @@ @@ -42671,7 +43718,7 @@ index 8caf6dfefce8..2c5772889bdf 100644 asmlinkage void __aes_arm64_decrypt(u32 *rk, u8 *out, const u8 *in, int rounds); diff --git a/arch/arm64/crypto/aes-glue.c b/arch/arm64/crypto/aes-glue.c -index cafb5b96be0e..dac587c3e6c5 100644 +index 3de1dc918ad49..d6a1f5d13af0a 100644 --- a/arch/arm64/crypto/aes-glue.c +++ b/arch/arm64/crypto/aes-glue.c @@ -55,17 +55,17 @@ MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions"); @@ -42695,7 +43742,7 @@ index cafb5b96be0e..dac587c3e6c5 100644 MODULE_AUTHOR("Ard Biesheuvel "); MODULE_LICENSE("GPL v2"); diff --git a/arch/arm64/crypto/aes-neonbs-glue.c b/arch/arm64/crypto/aes-neonbs-glue.c -index fb507d569922..cc52829d426a 100644 +index fb507d5699229..cc52829d426a8 100644 --- a/arch/arm64/crypto/aes-neonbs-glue.c +++ b/arch/arm64/crypto/aes-neonbs-glue.c @@ -18,11 +18,6 @@ @@ -42711,7 +43758,7 @@ index fb507d569922..cc52829d426a 100644 asmlinkage void aesbs_ecb_encrypt(u8 out[], u8 const in[], u8 const rk[], diff --git a/arch/arm64/kernel/armv8_deprecated.c b/arch/arm64/kernel/armv8_deprecated.c -index 7e88057269d5..989ea8fe49d0 100644 +index 7e88057269d5c..989ea8fe49d00 100644 --- a/arch/arm64/kernel/armv8_deprecated.c +++ b/arch/arm64/kernel/armv8_deprecated.c @@ -182,10 +182,15 @@ static void __init register_insn_emulation(struct insn_emulation_ops *ops) @@ -42731,7 +43778,7 @@ index 7e88057269d5..989ea8fe49d0 100644 case INSN_OBSOLETE: insn->current_mode = INSN_UNDEF; diff --git a/arch/arm64/kernel/cpuinfo.c b/arch/arm64/kernel/cpuinfo.c -index 1b5ee494488a..a0ce6bd92713 100644 +index 1b5ee494488a0..a0ce6bd927137 100644 --- a/arch/arm64/kernel/cpuinfo.c +++ b/arch/arm64/kernel/cpuinfo.c @@ -17,6 +17,7 @@ @@ -42781,7 +43828,7 @@ index 1b5ee494488a..a0ce6bd92713 100644 } diff --git a/drivers/bluetooth/hci_h5.c b/drivers/bluetooth/hci_h5.c -index 996729e78105..6d179e455721 100644 +index 996729e78105a..6d179e4557214 100644 --- a/drivers/bluetooth/hci_h5.c +++ b/drivers/bluetooth/hci_h5.c @@ -343,7 +343,8 @@ static void h5_handle_internal_rx(struct hci_uart *hu) @@ -42795,7 +43842,7 @@ index 996729e78105..6d179e455721 100644 if (H5_HDR_LEN(hdr) > 2) h5->tx_win = (data[2] & 0x07); diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig -index 4f451477281b..ea3b07016882 100644 +index 4f451477281b3..ea3b070168825 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig @@ -5,6 +5,8 @@ @@ -42808,17 +43855,18 @@ index 4f451477281b..ea3b07016882 100644 config TTY_PRINTK diff --git a/drivers/char/Makefile b/drivers/char/Makefile -index 71d76fd62692..b0c95a957c51 100644 +index 71d76fd62692f..3ad819383e9d9 100644 --- a/drivers/char/Makefile +++ b/drivers/char/Makefile -@@ -48,3 +48,4 @@ obj-$(CONFIG_XILLYBUS) += xillybus/ +@@ -47,4 +47,5 @@ obj-$(CONFIG_PS3_FLASH) += ps3flash.o + obj-$(CONFIG_XILLYBUS) += xillybus/ obj-$(CONFIG_POWERNV_OP_PANEL) += powernv-op-panel.o obj-$(CONFIG_ADI) += adi.o - obj-$(CONFIG_PIN_MEMORY_DEV) += pin_memory.o +obj-$(CONFIG_BRCM_CHAR_DRIVERS) += broadcom/ + obj-$(CONFIG_PIN_MEMORY_DEV) += pin_memory.o diff --git a/drivers/char/broadcom/Kconfig b/drivers/char/broadcom/Kconfig new file mode 100644 -index 000000000000..e555e841b8db +index 0000000000000..e555e841b8db3 --- /dev/null +++ b/drivers/char/broadcom/Kconfig @@ -0,0 +1,49 @@ @@ -42873,7 +43921,7 @@ index 000000000000..e555e841b8db + Raspberry Pi RPiVid video decoder hardware. diff --git a/drivers/char/broadcom/Makefile b/drivers/char/broadcom/Makefile new file mode 100644 -index 000000000000..a302fb3ff91a +index 0000000000000..a302fb3ff91a3 --- /dev/null +++ b/drivers/char/broadcom/Makefile @@ -0,0 +1,5 @@ @@ -42884,7 +43932,7 @@ index 000000000000..a302fb3ff91a +obj-$(CONFIG_RPIVID_MEM) += rpivid-mem.o diff --git a/drivers/char/broadcom/bcm2835-gpiomem.c b/drivers/char/broadcom/bcm2835-gpiomem.c new file mode 100644 -index 000000000000..f5e7f1ba8fb6 +index 0000000000000..f5e7f1ba8fb6f --- /dev/null +++ b/drivers/char/broadcom/bcm2835-gpiomem.c @@ -0,0 +1,258 @@ @@ -43148,10 +44196,10 @@ index 000000000000..f5e7f1ba8fb6 +MODULE_AUTHOR("Luke Wren "); diff --git a/drivers/char/broadcom/bcm2835_smi_dev.c b/drivers/char/broadcom/bcm2835_smi_dev.c new file mode 100644 -index 000000000000..9db8f1e3db0f +index 0000000000000..34976fa4ed591 --- /dev/null +++ b/drivers/char/broadcom/bcm2835_smi_dev.c -@@ -0,0 +1,402 @@ +@@ -0,0 +1,409 @@ +/** + * Character device driver for Broadcom Secondary Memory Interface + * @@ -43345,6 +44393,7 @@ index 000000000000..9db8f1e3db0f + size_t count, loff_t *offs) +{ + int odd_bytes; ++ size_t count_check; + + dev_dbg(inst->dev, "User reading %zu bytes from SMI.", count); + /* We don't want to DMA a number of bytes % 4 != 0 (32 bit FIFO) */ @@ -43353,6 +44402,7 @@ index 000000000000..9db8f1e3db0f + else + odd_bytes = count; + count -= odd_bytes; ++ count_check = count; + if (count) { + struct bcm2835_smi_bounce_info *bounce; + @@ -43363,15 +44413,16 @@ index 000000000000..9db8f1e3db0f + count = dma_bounce_user(DMA_DEV_TO_MEM, user_ptr, + count, bounce); + } -+ if (odd_bytes) { ++ if (odd_bytes && (count == count_check)) { + /* Read from FIFO directly if not using DMA */ + uint8_t buf[DMA_THRESHOLD_BYTES]; ++ unsigned long bytes_not_transferred; + + bcm2835_smi_read_buf(smi_inst, buf, odd_bytes); -+ if (copy_to_user(user_ptr, buf, odd_bytes)) ++ bytes_not_transferred = copy_to_user(user_ptr + count, buf, odd_bytes); ++ if (bytes_not_transferred) + dev_err(inst->dev, "copy_to_user() failed."); -+ count += odd_bytes; -+ ++ count += odd_bytes - bytes_not_transferred; + } + return count; +} @@ -43381,6 +44432,7 @@ index 000000000000..9db8f1e3db0f + size_t count, loff_t *offs) +{ + int odd_bytes; ++ size_t count_check; + + dev_dbg(inst->dev, "User writing %zu bytes to SMI.", count); + if (count > DMA_THRESHOLD_BYTES) @@ -43388,6 +44440,7 @@ index 000000000000..9db8f1e3db0f + else + odd_bytes = count; + count -= odd_bytes; ++ count_check = count; + if (count) { + struct bcm2835_smi_bounce_info *bounce; + @@ -43399,14 +44452,16 @@ index 000000000000..9db8f1e3db0f + (char __user *)user_ptr, + count, bounce); + } -+ if (odd_bytes) { ++ if (odd_bytes && (count == count_check)) { + uint8_t buf[DMA_THRESHOLD_BYTES]; ++ unsigned long bytes_not_transferred; + -+ if (copy_from_user(buf, user_ptr, odd_bytes)) ++ bytes_not_transferred = copy_from_user(buf, user_ptr + count, odd_bytes); ++ if (bytes_not_transferred) + dev_err(inst->dev, "copy_from_user() failed."); + else + bcm2835_smi_write_buf(smi_inst, buf, odd_bytes); -+ count += odd_bytes; ++ count += odd_bytes - bytes_not_transferred; + } + return count; +} @@ -43556,7 +44611,7 @@ index 000000000000..9db8f1e3db0f +MODULE_AUTHOR("Luke Wren "); diff --git a/drivers/char/broadcom/rpivid-mem.c b/drivers/char/broadcom/rpivid-mem.c new file mode 100644 -index 000000000000..9f38083f4cb6 +index 0000000000000..9f38083f4cb65 --- /dev/null +++ b/drivers/char/broadcom/rpivid-mem.c @@ -0,0 +1,270 @@ @@ -43832,7 +44887,7 @@ index 000000000000..9f38083f4cb6 +MODULE_AUTHOR("Jonathan Bell "); diff --git a/drivers/char/broadcom/vc_mem.c b/drivers/char/broadcom/vc_mem.c new file mode 100644 -index 000000000000..195b61a4387c +index 0000000000000..195b61a4387c0 --- /dev/null +++ b/drivers/char/broadcom/vc_mem.c @@ -0,0 +1,373 @@ @@ -44211,13 +45266,14 @@ index 000000000000..195b61a4387c +module_param(mem_base, uint, 0644); diff --git a/drivers/char/broadcom/vcio.c b/drivers/char/broadcom/vcio.c new file mode 100644 -index 000000000000..a39155a94fb7 +index 0000000000000..ac314617229ce --- /dev/null +++ b/drivers/char/broadcom/vcio.c -@@ -0,0 +1,195 @@ +@@ -0,0 +1,186 @@ +/* + * Copyright (C) 2010 Broadcom + * Copyright (C) 2015 Noralf Trønnes ++ * Copyright (C) 2021 Raspberry Pi (Trading) Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as @@ -44225,8 +45281,6 @@ index 000000000000..a39155a94fb7 + * + */ + -+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -+ +#include +#include +#include @@ -44236,24 +45290,22 @@ index 000000000000..a39155a94fb7 +#include +#include +#include ++#include +#include + -+#define MBOX_CHAN_PROPERTY 8 -+ ++#define MODULE_NAME "vcio" +#define VCIO_IOC_MAGIC 100 +#define IOCTL_MBOX_PROPERTY _IOWR(VCIO_IOC_MAGIC, 0, char *) +#ifdef CONFIG_COMPAT +#define IOCTL_MBOX_PROPERTY32 _IOWR(VCIO_IOC_MAGIC, 0, compat_uptr_t) +#endif + -+static struct { -+ dev_t devt; -+ struct cdev cdev; -+ struct class *class; ++struct vcio_data { + struct rpi_firmware *fw; -+} vcio; ++ struct miscdevice misc_dev; ++}; + -+static int vcio_user_property_list(void *user) ++static int vcio_user_property_list(struct vcio_data *vcio, void *user) +{ + u32 *buf, size; + int ret; @@ -44272,7 +45324,7 @@ index 000000000000..a39155a94fb7 + } + + /* Strip off protocol encapsulation */ -+ ret = rpi_firmware_property_list(vcio.fw, &buf[2], size - 12); ++ ret = rpi_firmware_property_list(vcio->fw, &buf[2], size - 12); + if (ret) { + kfree(buf); + return ret; @@ -44304,9 +45356,12 @@ index 000000000000..a39155a94fb7 +static long vcio_device_ioctl(struct file *file, unsigned int ioctl_num, + unsigned long ioctl_param) +{ ++ struct vcio_data *vcio = container_of(file->private_data, ++ struct vcio_data, misc_dev); ++ + switch (ioctl_num) { + case IOCTL_MBOX_PROPERTY: -+ return vcio_user_property_list((void *)ioctl_param); ++ return vcio_user_property_list(vcio, (void *)ioctl_param); + default: + pr_err("unknown ioctl: %x\n", ioctl_num); + return -EINVAL; @@ -44317,9 +45372,12 @@ index 000000000000..a39155a94fb7 +static long vcio_device_compat_ioctl(struct file *file, unsigned int ioctl_num, + unsigned long ioctl_param) +{ ++ struct vcio_data *vcio = container_of(file->private_data, ++ struct vcio_data, misc_dev); ++ + switch (ioctl_num) { + case IOCTL_MBOX_PROPERTY32: -+ return vcio_user_property_list(compat_ptr(ioctl_param)); ++ return vcio_user_property_list(vcio, compat_ptr(ioctl_param)); + default: + pr_err("unknown ioctl: %x\n", ioctl_num); + return -EINVAL; @@ -44336,82 +45394,70 @@ index 000000000000..a39155a94fb7 + .release = vcio_device_release, +}; + -+static int __init vcio_init(void) ++static int vcio_probe(struct platform_device *pdev) +{ -+ struct device_node *np; -+ static struct device *dev; -+ int ret; ++ struct device *dev = &pdev->dev; ++ struct device_node *np = dev->of_node; ++ struct device_node *fw_node; ++ struct rpi_firmware *fw; ++ struct vcio_data *vcio; + -+ np = of_find_compatible_node(NULL, NULL, -+ "raspberrypi,bcm2835-firmware"); -+ if (!of_device_is_available(np)) -+ return -ENODEV; -+ -+ vcio.fw = rpi_firmware_get(np); -+ if (!vcio.fw) -+ return -ENODEV; -+ -+ ret = alloc_chrdev_region(&vcio.devt, 0, 1, "vcio"); -+ if (ret) { -+ pr_err("failed to allocate device number\n"); -+ return ret; ++ fw_node = of_get_parent(np); ++ if (!fw_node) { ++ dev_err(dev, "Missing firmware node\n"); ++ return -ENOENT; + } + -+ cdev_init(&vcio.cdev, &vcio_fops); -+ vcio.cdev.owner = THIS_MODULE; -+ ret = cdev_add(&vcio.cdev, vcio.devt, 1); -+ if (ret) { -+ pr_err("failed to register device\n"); -+ goto err_unregister_chardev; -+ } ++ fw = rpi_firmware_get(fw_node); ++ of_node_put(fw_node); ++ if (!fw) ++ return -EPROBE_DEFER; + -+ /* -+ * Create sysfs entries -+ * 'bcm2708_vcio' is used for backwards compatibility so we don't break -+ * userspace. Raspian has a udev rule that changes the permissions. -+ */ -+ vcio.class = class_create(THIS_MODULE, "bcm2708_vcio"); -+ if (IS_ERR(vcio.class)) { -+ ret = PTR_ERR(vcio.class); -+ pr_err("failed to create class\n"); -+ goto err_cdev_del; -+ } ++ vcio = devm_kzalloc(dev, sizeof(struct vcio_data), GFP_KERNEL); ++ if (!vcio) ++ return -ENOMEM; + -+ dev = device_create(vcio.class, NULL, vcio.devt, NULL, "vcio"); -+ if (IS_ERR(dev)) { -+ ret = PTR_ERR(dev); -+ pr_err("failed to create device\n"); -+ goto err_class_destroy; -+ } ++ vcio->fw = fw; ++ vcio->misc_dev.fops = &vcio_fops; ++ vcio->misc_dev.minor = MISC_DYNAMIC_MINOR; ++ vcio->misc_dev.name = "vcio"; ++ vcio->misc_dev.parent = dev; + ++ return misc_register(&vcio->misc_dev); ++} ++ ++static int vcio_remove(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ ++ misc_deregister(dev_get_drvdata(dev)); + return 0; -+ -+err_class_destroy: -+ class_destroy(vcio.class); -+err_cdev_del: -+ cdev_del(&vcio.cdev); -+err_unregister_chardev: -+ unregister_chrdev_region(vcio.devt, 1); -+ -+ return ret; +} -+module_init(vcio_init); + -+static void __exit vcio_exit(void) -+{ -+ device_destroy(vcio.class, vcio.devt); -+ class_destroy(vcio.class); -+ cdev_del(&vcio.cdev); -+ unregister_chrdev_region(vcio.devt, 1); -+} -+module_exit(vcio_exit); ++static const struct of_device_id vcio_ids[] = { ++ { .compatible = "raspberrypi,vcio" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, vcio_ids); ++ ++static struct platform_driver vcio_driver = { ++ .driver = { ++ .name = MODULE_NAME, ++ .of_match_table = of_match_ptr(vcio_ids), ++ }, ++ .probe = vcio_probe, ++ .remove = vcio_remove, ++}; ++ ++module_platform_driver(vcio_driver); + +MODULE_AUTHOR("Gray Girling"); +MODULE_AUTHOR("Noralf Trønnes"); +MODULE_DESCRIPTION("Mailbox userspace access"); +MODULE_LICENSE("GPL"); ++MODULE_ALIAS("platform:rpi-vcio"); diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig -index 72676f6e2364..65b985197429 100644 +index 72676f6e23649..65b9851974292 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -104,7 +104,7 @@ config HW_RANDOM_IPROC_RNG200 @@ -44424,7 +45470,7 @@ index 72676f6e2364..65b985197429 100644 To compile this driver as a module, choose M here: the module will be called iproc-rng200 diff --git a/drivers/char/hw_random/bcm2835-rng.c b/drivers/char/hw_random/bcm2835-rng.c -index 1a7c43b43c6b..ee47667d0710 100644 +index 1a7c43b43c6b0..ee47667d07101 100644 --- a/drivers/char/hw_random/bcm2835-rng.c +++ b/drivers/char/hw_random/bcm2835-rng.c @@ -102,8 +102,10 @@ static int bcm2835_rng_init(struct hwrng *rng) @@ -44441,7 +45487,7 @@ index 1a7c43b43c6b..ee47667d0710 100644 return ret; } diff --git a/drivers/char/hw_random/iproc-rng200.c b/drivers/char/hw_random/iproc-rng200.c -index 01583faf9893..2a92ea658096 100644 +index 01583faf9893e..2a92ea6580961 100644 --- a/drivers/char/hw_random/iproc-rng200.c +++ b/drivers/char/hw_random/iproc-rng200.c @@ -29,6 +29,7 @@ @@ -44563,7 +45609,7 @@ index 01583faf9893..2a92ea658096 100644 ret = devm_hwrng_register(dev, &priv->rng); if (ret) { diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig -index c715d4681a0b..32f8921307bd 100644 +index c715d4681a0b8..32f8921307bd2 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig @@ -86,6 +86,12 @@ config COMMON_CLK_HI655X @@ -44580,7 +45626,7 @@ index c715d4681a0b..32f8921307bd 100644 tristate "Clock driver controlled via SCMI interface" depends on ARM_SCMI_PROTOCOL || COMPILE_TEST diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile -index da8fcf147eb1..f78099e1d9e7 100644 +index da8fcf147eb13..f78099e1d9e7f 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile @@ -18,6 +18,7 @@ endif @@ -44601,7 +45647,7 @@ index da8fcf147eb1..f78099e1d9e7 100644 obj-$(CONFIG_COMMON_CLK_MAX9485) += clk-max9485.o obj-$(CONFIG_ARCH_MILBEAUT_M10V) += clk-milbeaut.o diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c -index 1ac803e14fa3..20155bb28e3c 100644 +index 1ac803e14fa3e..39fabced602a5 100644 --- a/drivers/clk/bcm/clk-bcm2835.c +++ b/drivers/clk/bcm/clk-bcm2835.c @@ -35,6 +35,7 @@ @@ -44910,7 +45956,7 @@ index 1ac803e14fa3..20155bb28e3c 100644 + fw_node = of_parse_phandle(dev->of_node, "firmware", 0); + if (fw_node) { -+ struct rpi_firmware *fw = rpi_firmware_get(NULL); ++ struct rpi_firmware *fw = rpi_firmware_get(fw_node); + if (!fw) + return -EPROBE_DEFER; + cprman->fw = fw; @@ -44957,7 +46003,7 @@ index 1ac803e14fa3..20155bb28e3c 100644 MODULE_AUTHOR("Eric Anholt "); MODULE_DESCRIPTION("BCM2835 clock driver"); diff --git a/drivers/clk/bcm/clk-raspberrypi.c b/drivers/clk/bcm/clk-raspberrypi.c -index f89b9cfc4309..94ce38a2d5aa 100644 +index f89b9cfc43099..94ce38a2d5aab 100644 --- a/drivers/clk/bcm/clk-raspberrypi.c +++ b/drivers/clk/bcm/clk-raspberrypi.c @@ -97,7 +97,7 @@ static int raspberrypi_clock_property(struct rpi_firmware *firmware, @@ -44979,7 +46025,7 @@ index f89b9cfc4309..94ce38a2d5aa 100644 clks->id); diff --git a/drivers/clk/clk-allo-dac.c b/drivers/clk/clk-allo-dac.c new file mode 100644 -index 000000000000..a9844cb9454b +index 0000000000000..a9844cb9454bd --- /dev/null +++ b/drivers/clk/clk-allo-dac.c @@ -0,0 +1,161 @@ @@ -45146,7 +46192,7 @@ index 000000000000..a9844cb9454b +MODULE_ALIAS("platform:clk-allo-dac"); diff --git a/drivers/clk/clk-hifiberry-dachd.c b/drivers/clk/clk-hifiberry-dachd.c new file mode 100644 -index 000000000000..ec528a0aef36 +index 0000000000000..ec528a0aef36e --- /dev/null +++ b/drivers/clk/clk-hifiberry-dachd.c @@ -0,0 +1,333 @@ @@ -45485,7 +46531,7 @@ index 000000000000..ec528a0aef36 +MODULE_ALIAS("platform:clk-hifiberry-dachd"); diff --git a/drivers/clk/clk-hifiberry-dacpro.c b/drivers/clk/clk-hifiberry-dacpro.c new file mode 100644 -index 000000000000..9e2634465823 +index 0000000000000..9e26344658236 --- /dev/null +++ b/drivers/clk/clk-hifiberry-dacpro.c @@ -0,0 +1,160 @@ @@ -45650,7 +46696,7 @@ index 000000000000..9e2634465823 +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:clk-hifiberry-dacpro"); diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c -index 61c78714c095..f4695bac4cec 100644 +index 61c78714c0957..f4695bac4cecc 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -77,12 +77,14 @@ struct clk_core { @@ -45882,7 +46928,7 @@ index 61c78714c095..f4695bac4cec 100644 /* * Don't call clk_hw_create_clk() here because that would pin the diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig -index f2db761ee548..289905a49228 100644 +index f28bb2334e747..8fbac86be34c2 100644 --- a/drivers/dma/Kconfig +++ b/drivers/dma/Kconfig @@ -652,6 +652,10 @@ config UNIPHIER_XDMAC @@ -45897,7 +46943,7 @@ index f2db761ee548..289905a49228 100644 tristate "APM X-Gene DMA support" depends on ARCH_XGENE || COMPILE_TEST diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile -index 948a8da05f8b..e543c69fa6b5 100644 +index 948a8da05f8b6..e543c69fa6b52 100644 --- a/drivers/dma/Makefile +++ b/drivers/dma/Makefile @@ -21,6 +21,7 @@ obj-$(CONFIG_AT_XDMAC) += at_xdmac.o @@ -45910,7 +46956,7 @@ index 948a8da05f8b..e543c69fa6b5 100644 obj-$(CONFIG_DMA_SA11X0) += sa11x0-dma.o diff --git a/drivers/dma/bcm2708-dmaengine.c b/drivers/dma/bcm2708-dmaengine.c new file mode 100644 -index 000000000000..075da9aadf6d +index 0000000000000..075da9aadf6d6 --- /dev/null +++ b/drivers/dma/bcm2708-dmaengine.c @@ -0,0 +1,281 @@ @@ -46196,7 +47242,7 @@ index 000000000000..075da9aadf6d + +MODULE_LICENSE("GPL"); diff --git a/drivers/dma/bcm2835-dma.c b/drivers/dma/bcm2835-dma.c -index 630dfbb01a40..94a1b40b1645 100644 +index 630dfbb01a40e..94a1b40b16455 100644 --- a/drivers/dma/bcm2835-dma.c +++ b/drivers/dma/bcm2835-dma.c @@ -25,6 +25,7 @@ @@ -47102,10 +48148,10 @@ index 630dfbb01a40..94a1b40b1645 100644 MODULE_ALIAS("platform:bcm2835-dma"); MODULE_DESCRIPTION("BCM2835 DMA engine driver"); diff --git a/drivers/firmware/raspberrypi.c b/drivers/firmware/raspberrypi.c -index 2371d08bdd17..f53f52fa1711 100644 +index 1d965c1252cac..849e63bb426d4 100644 --- a/drivers/firmware/raspberrypi.c +++ b/drivers/firmware/raspberrypi.c -@@ -11,6 +11,7 @@ +@@ -12,6 +12,7 @@ #include #include #include @@ -47113,11 +48159,13 @@ index 2371d08bdd17..f53f52fa1711 100644 #include #include -@@ -27,8 +28,11 @@ struct rpi_firmware { +@@ -28,10 +29,13 @@ struct rpi_firmware { struct mbox_chan *chan; /* The property channel. */ struct completion c; u32 enabled; + u32 get_throttled; + + struct kref consumers; }; +static struct platform_device *g_pdev; @@ -47125,24 +48173,7 @@ index 2371d08bdd17..f53f52fa1711 100644 static DEFINE_MUTEX(transaction_lock); static void response_callback(struct mbox_client *cl, void *msg) -@@ -41,7 +45,7 @@ static void response_callback(struct mbox_client *cl, void *msg) - * Sends a request to the firmware through the BCM2835 mailbox driver, - * and synchronously waits for the reply. - */ --static int -+int - rpi_firmware_transaction(struct rpi_firmware *fw, u32 chan, u32 data) - { - u32 message = MBOX_MSG(chan, data); -@@ -66,6 +70,7 @@ rpi_firmware_transaction(struct rpi_firmware *fw, u32 chan, u32 data) - - return ret; - } -+EXPORT_SYMBOL_GPL(rpi_firmware_transaction); - - /** - * rpi_firmware_property_list - Submit firmware property list -@@ -170,15 +175,92 @@ int rpi_firmware_property(struct rpi_firmware *fw, +@@ -173,15 +177,92 @@ int rpi_firmware_property(struct rpi_firmware *fw, kfree(data); @@ -47235,7 +48266,7 @@ index 2371d08bdd17..f53f52fa1711 100644 int ret = rpi_firmware_property(fw, RPI_FIRMWARE_GET_FIRMWARE_REVISION, &packet, sizeof(packet)); -@@ -188,7 +270,35 @@ rpi_firmware_print_firmware_revision(struct rpi_firmware *fw) +@@ -191,7 +272,35 @@ rpi_firmware_print_firmware_revision(struct rpi_firmware *fw) /* This is not compatible with y2038 */ date_and_time = packet; @@ -47272,7 +48303,7 @@ index 2371d08bdd17..f53f52fa1711 100644 } static void -@@ -203,6 +313,11 @@ rpi_register_hwmon_driver(struct device *dev, struct rpi_firmware *fw) +@@ -206,6 +315,11 @@ rpi_register_hwmon_driver(struct device *dev, struct rpi_firmware *fw) rpi_hwmon = platform_device_register_data(dev, "raspberrypi-hwmon", -1, NULL, 0); @@ -47284,8 +48315,8 @@ index 2371d08bdd17..f53f52fa1711 100644 } static void rpi_register_clk_driver(struct device *dev) -@@ -249,8 +364,10 @@ static int rpi_firmware_probe(struct platform_device *pdev) - init_completion(&fw->c); +@@ -272,8 +386,10 @@ static int rpi_firmware_probe(struct platform_device *pdev) + kref_init(&fw->consumers); platform_set_drvdata(pdev, fw); + g_pdev = pdev; @@ -47295,24 +48326,15 @@ index 2371d08bdd17..f53f52fa1711 100644 rpi_register_hwmon_driver(dev, fw); rpi_register_clk_driver(dev); -@@ -276,6 +393,7 @@ static int rpi_firmware_remove(struct platform_device *pdev) +@@ -298,6 +414,7 @@ static int rpi_firmware_remove(struct platform_device *pdev) + rpi_hwmon = NULL; platform_device_unregister(rpi_clk); rpi_clk = NULL; - mbox_free_channel(fw->chan); + g_pdev = NULL; - return 0; - } -@@ -288,7 +406,7 @@ static int rpi_firmware_remove(struct platform_device *pdev) - */ - struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node) - { -- struct platform_device *pdev = of_find_device_by_node(firmware_node); -+ struct platform_device *pdev = g_pdev; + rpi_firmware_put(fw); - if (!pdev) - return NULL; -@@ -312,7 +430,35 @@ static struct platform_driver rpi_firmware_driver = { +@@ -352,7 +469,35 @@ static struct platform_driver rpi_firmware_driver = { .shutdown = rpi_firmware_shutdown, .remove = rpi_firmware_remove, }; @@ -47350,7 +48372,7 @@ index 2371d08bdd17..f53f52fa1711 100644 MODULE_AUTHOR("Eric Anholt "); MODULE_DESCRIPTION("Raspberry Pi firmware driver"); diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig -index 14751c7ccd1f..630a7dd257b1 100644 +index d1300fc003ed7..d4f77fa37d40f 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -193,6 +193,12 @@ config GPIO_BCM_XGS_IPROC @@ -47366,7 +48388,22 @@ index 14751c7ccd1f..630a7dd257b1 100644 config GPIO_BRCMSTB tristate "BRCMSTB GPIO support" default y if (ARCH_BRCMSTB || BMIPS_GENERIC) -@@ -1158,6 +1164,15 @@ config HTC_EGPIO +@@ -467,6 +473,14 @@ config GPIO_PMIC_EIC_SPRD + help + Say yes here to support Spreadtrum PMIC EIC device. + ++config GPIO_PWM ++ tristate "PWM chip GPIO" ++ depends on OF_GPIO ++ depends on PWM ++ help ++ Turn on support for exposing a PWM chip as a GPIO ++ driver. ++ + config GPIO_PXA + bool "PXA GPIO support" + depends on ARCH_PXA || ARCH_MMP || COMPILE_TEST +@@ -1158,6 +1172,15 @@ config HTC_EGPIO several HTC phones. It provides basic support for input pins, output pins, and irqs. @@ -47383,7 +48420,7 @@ index 14751c7ccd1f..630a7dd257b1 100644 tristate "Janz VMOD-TTL Digital IO Module" depends on MFD_JANZ_CMODIO diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile -index 09dada80ac34..a66b89e3d0c3 100644 +index 09dada80ac34c..71dda8a5625da 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -38,6 +38,7 @@ obj-$(CONFIG_GPIO_ASPEED_SGPIO) += gpio-aspeed-sgpio.o @@ -47402,9 +48439,17 @@ index 09dada80ac34..a66b89e3d0c3 100644 obj-$(CONFIG_GPIO_GE_FPGA) += gpio-ge.o obj-$(CONFIG_GPIO_GPIO_MM) += gpio-gpio-mm.o obj-$(CONFIG_GPIO_GRGPIO) += gpio-grgpio.o +@@ -118,6 +120,7 @@ obj-$(CONFIG_GPIO_PCI_IDIO_16) += gpio-pci-idio-16.o + obj-$(CONFIG_GPIO_PISOSR) += gpio-pisosr.o + obj-$(CONFIG_GPIO_PL061) += gpio-pl061.o + obj-$(CONFIG_GPIO_PMIC_EIC_SPRD) += gpio-pmic-eic-sprd.o ++obj-$(CONFIG_GPIO_PWM) += gpio-pwm.o + obj-$(CONFIG_GPIO_PXA) += gpio-pxa.o + obj-$(CONFIG_GPIO_RASPBERRYPI_EXP) += gpio-raspberrypi-exp.o + obj-$(CONFIG_GPIO_RC5T583) += gpio-rc5t583.o diff --git a/drivers/gpio/gpio-bcm-virt.c b/drivers/gpio/gpio-bcm-virt.c new file mode 100644 -index 000000000000..49e28ad9760e +index 0000000000000..55c40190e88a7 --- /dev/null +++ b/drivers/gpio/gpio-bcm-virt.c @@ -0,0 +1,214 @@ @@ -47459,7 +48504,7 @@ index 000000000000..49e28ad9760e + unsigned v; + gpio = container_of(gc, struct brcmvirt_gpio, gc); + v = readl(gpio->ts_base + off); -+ return (v >> off) & 1; ++ return (s16)((v >> 16) - v) > 0; +} + +static void brcmvirt_gpio_set(struct gpio_chip *gc, unsigned off, int val) @@ -47624,7 +48669,7 @@ index 000000000000..49e28ad9760e +MODULE_ALIAS("platform:brcmvirt-gpio"); diff --git a/drivers/gpio/gpio-fsm.c b/drivers/gpio/gpio-fsm.c new file mode 100644 -index 000000000000..306f5123546c +index 0000000000000..3a348f1c65144 --- /dev/null +++ b/drivers/gpio/gpio-fsm.c @@ -0,0 +1,1210 @@ @@ -48514,7 +49559,7 @@ index 000000000000..306f5123546c + const struct gpio_fsm *gf = dev_get_drvdata(dev); + int jiffies_left; + -+ jiffies_left = gf->delay_jiffies - jiffies; ++ jiffies_left = max((int)(gf->delay_jiffies - jiffies), 0); + return sprintf(buf, + gf->delay_target_state ? "%u\n" : "-\n", + jiffies_to_msecs(jiffies_left)); @@ -48838,8 +49883,158 @@ index 000000000000..306f5123546c +MODULE_AUTHOR("Phil Elwell "); +MODULE_DESCRIPTION("GPIO FSM driver"); +MODULE_ALIAS("platform:gpio-fsm"); +diff --git a/drivers/gpio/gpio-pwm.c b/drivers/gpio/gpio-pwm.c +new file mode 100644 +index 0000000000000..89f5d6b353aba +--- /dev/null ++++ b/drivers/gpio/gpio-pwm.c +@@ -0,0 +1,144 @@ ++// SPDX-License-Identifier: GPL-2.0+ ++/* ++ * GPIO driver wrapping PWM API ++ * ++ * PWM 0% and PWM 100% are equivalent to digital GPIO ++ * outputs, and there are times where it is useful to use ++ * PWM outputs as straight GPIOs (eg outputs of NXP PCA9685 ++ * I2C PWM chip). This driver wraps the PWM API as a GPIO ++ * controller. ++ * ++ * Copyright (C) 2021 Raspberry Pi (Trading) Ltd. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++struct pwm_gpio { ++ struct gpio_chip gc; ++ struct pwm_device **pwm; ++}; ++ ++static int pwm_gpio_get_direction(struct gpio_chip *gc, unsigned int off) ++{ ++ return GPIO_LINE_DIRECTION_OUT; ++} ++ ++static void pwm_gpio_set(struct gpio_chip *gc, unsigned int off, int val) ++{ ++ struct pwm_gpio *pwm_gpio = gpiochip_get_data(gc); ++ struct pwm_state state; ++ ++ pwm_get_state(pwm_gpio->pwm[off], &state); ++ state.duty_cycle = val ? state.period : 0; ++ pwm_apply_state(pwm_gpio->pwm[off], &state); ++} ++ ++static int pwm_gpio_parse_dt(struct pwm_gpio *pwm_gpio, ++ struct device *dev) ++{ ++ struct device_node *node = dev->of_node; ++ struct pwm_state state; ++ int ret = 0, i, num_gpios; ++ const char *pwm_name; ++ ++ if (!node) ++ return -ENODEV; ++ ++ num_gpios = of_property_count_strings(node, "pwm-names"); ++ if (num_gpios <= 0) ++ return 0; ++ ++ pwm_gpio->pwm = devm_kzalloc(dev, ++ sizeof(*pwm_gpio->pwm) * num_gpios, ++ GFP_KERNEL); ++ if (!pwm_gpio->pwm) ++ return -ENOMEM; ++ ++ for (i = 0; i < num_gpios; i++) { ++ ret = of_property_read_string_index(node, "pwm-names", i, ++ &pwm_name); ++ if (ret) { ++ dev_err(dev, "unable to get pwm device index %d, name %s", ++ i, pwm_name); ++ goto error; ++ } ++ ++ pwm_gpio->pwm[i] = devm_pwm_get(dev, pwm_name); ++ if (IS_ERR(pwm_gpio->pwm[i])) { ++ ret = PTR_ERR(pwm_gpio->pwm[i]); ++ if (ret != -EPROBE_DEFER) ++ dev_err(dev, "unable to request PWM\n"); ++ goto error; ++ } ++ ++ /* Sync up PWM state. */ ++ pwm_init_state(pwm_gpio->pwm[i], &state); ++ ++ state.duty_cycle = 0; ++ pwm_apply_state(pwm_gpio->pwm[i], &state); ++ } ++ ++ pwm_gpio->gc.ngpio = num_gpios; ++ ++error: ++ return ret; ++} ++ ++static int pwm_gpio_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct pwm_gpio *pwm_gpio; ++ int ret; ++ ++ pwm_gpio = devm_kzalloc(dev, sizeof(*pwm_gpio), GFP_KERNEL); ++ if (!pwm_gpio) ++ return -ENOMEM; ++ ++ pwm_gpio->gc.parent = dev; ++ pwm_gpio->gc.label = "pwm-gpio"; ++ pwm_gpio->gc.owner = THIS_MODULE; ++ pwm_gpio->gc.of_node = dev->of_node; ++ pwm_gpio->gc.base = -1; ++ ++ pwm_gpio->gc.get_direction = pwm_gpio_get_direction; ++ pwm_gpio->gc.set = pwm_gpio_set; ++ pwm_gpio->gc.can_sleep = true; ++ ++ ret = pwm_gpio_parse_dt(pwm_gpio, dev); ++ if (ret) ++ return ret; ++ ++ if (!pwm_gpio->gc.ngpio) ++ return 0; ++ ++ return devm_gpiochip_add_data(dev, &pwm_gpio->gc, pwm_gpio); ++} ++ ++static int pwm_gpio_remove(struct platform_device *pdev) ++{ ++ return 0; ++} ++ ++static const struct of_device_id pwm_gpio_of_match[] = { ++ { .compatible = "pwm-gpio" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, pwm_gpio_of_match); ++ ++static struct platform_driver pwm_gpio_driver = { ++ .driver = { ++ .name = "pwm-gpio", ++ .of_match_table = of_match_ptr(pwm_gpio_of_match), ++ }, ++ .probe = pwm_gpio_probe, ++ .remove = pwm_gpio_remove, ++}; ++module_platform_driver(pwm_gpio_driver); ++ ++MODULE_LICENSE("GPL"); ++MODULE_AUTHOR("Dave Stevenson "); ++MODULE_DESCRIPTION("PWM GPIO driver"); diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c -index af5bb8fedfea..2bd26c985246 100644 +index af5bb8fedfea7..2bd26c985246d 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -51,6 +51,8 @@ @@ -48874,7 +50069,7 @@ index af5bb8fedfea..2bd26c985246 100644 "%s: tried to flag a GPIO set as output for IRQ\n", __func__); diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig -index ca868271f4c4..74872b157233 100644 +index ca868271f4c43..74872b157233f 100644 --- a/drivers/gpu/drm/Kconfig +++ b/drivers/gpu/drm/Kconfig @@ -392,6 +392,8 @@ source "drivers/gpu/drm/tidss/Kconfig" @@ -48887,7 +50082,7 @@ index ca868271f4c4..74872b157233 100644 menuconfig DRM_LEGACY diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile -index 81569009f884..78dd8e12525d 100644 +index 81569009f8848..78dd8e12525da 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -124,3 +124,4 @@ obj-$(CONFIG_DRM_ASPEED_GFX) += aspeed/ @@ -48896,10 +50091,10 @@ index 81569009f884..78dd8e12525d 100644 obj-y += xlnx/ +obj-y += gud/ diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -index df26c07cb912..e46df7785193 100644 +index bc9df3f216f56..282ee57afe04a 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -4971,7 +4971,6 @@ static void dm_disable_vblank(struct drm_crtc *crtc) +@@ -4988,7 +4988,6 @@ static void dm_disable_vblank(struct drm_crtc *crtc) static const struct drm_crtc_funcs amdgpu_dm_crtc_funcs = { .reset = dm_crtc_reset_state, .destroy = amdgpu_dm_crtc_destroy, @@ -48907,7 +50102,7 @@ index df26c07cb912..e46df7785193 100644 .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, .atomic_duplicate_state = dm_crtc_duplicate_state, -@@ -5455,25 +5454,6 @@ static int fill_hdr_info_packet(const struct drm_connector_state *state, +@@ -5472,25 +5471,6 @@ static int fill_hdr_info_packet(const struct drm_connector_state *state, return 0; } @@ -48933,7 +50128,7 @@ index df26c07cb912..e46df7785193 100644 static int amdgpu_dm_connector_atomic_check(struct drm_connector *conn, struct drm_atomic_state *state) -@@ -5489,7 +5469,7 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn, +@@ -5506,7 +5486,7 @@ amdgpu_dm_connector_atomic_check(struct drm_connector *conn, if (!crtc) return 0; @@ -48942,7 +50137,7 @@ index df26c07cb912..e46df7785193 100644 struct dc_info_packet hdr_infopacket; ret = fill_hdr_info_packet(new_con_state, &hdr_infopacket); -@@ -5584,17 +5564,19 @@ static void dm_update_crtc_active_planes(struct drm_crtc *crtc, +@@ -5601,17 +5581,19 @@ static void dm_update_crtc_active_planes(struct drm_crtc *crtc, } static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, @@ -48966,7 +50161,7 @@ index df26c07cb912..e46df7785193 100644 WARN_ON(1); return ret; } -@@ -5605,8 +5587,8 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, +@@ -5622,8 +5604,8 @@ static int dm_crtc_helper_atomic_check(struct drm_crtc *crtc, * planes are disabled, which is not supported by the hardware. And there is legacy * userspace which stops using the HW cursor altogether in response to the resulting EINVAL. */ @@ -48977,7 +50172,7 @@ index df26c07cb912..e46df7785193 100644 return -EINVAL; /* In some use cases, like reset, no stream is attached */ -@@ -6505,9 +6487,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, +@@ -6522,9 +6504,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, if (connector_type == DRM_MODE_CONNECTOR_HDMIA || connector_type == DRM_MODE_CONNECTOR_DisplayPort || connector_type == DRM_MODE_CONNECTOR_eDP) { @@ -48988,8 +50183,17 @@ index df26c07cb912..e46df7785193 100644 if (!aconnector->mst_port) drm_connector_attach_vrr_capable_property(&aconnector->base); +@@ -7774,7 +7754,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state) + dm_old_crtc_state->abm_level; + + hdr_changed = +- is_hdr_metadata_different(old_con_state, new_con_state); ++ !drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state); + + if (!scaling_changed && !abm_changed && !hdr_changed) + continue; diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c -index 1e448f1b39a1..59882781509d 100644 +index 955a055bd9800..4eccd24757b3c 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c @@ -24,6 +24,7 @@ @@ -49013,7 +50217,7 @@ index 1e448f1b39a1..59882781509d 100644 struct amdgpu_device *adev = drm_to_adev(dev); struct amdgpu_crtc *acrtc = to_amdgpu_crtc(connector_state->crtc); diff --git a/drivers/gpu/drm/arc/arcpgu_crtc.c b/drivers/gpu/drm/arc/arcpgu_crtc.c -index be7c29cec318..042d7b54a6de 100644 +index be7c29cec318d..042d7b54a6dea 100644 --- a/drivers/gpu/drm/arc/arcpgu_crtc.c +++ b/drivers/gpu/drm/arc/arcpgu_crtc.c @@ -116,7 +116,7 @@ static void arc_pgu_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -49035,7 +50239,7 @@ index be7c29cec318..042d7b54a6de 100644 struct arcpgu_drm_private *arcpgu = crtc_to_arcpgu_priv(crtc); diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c -index f33418d6e1a0..00472e15ba0b 100644 +index f33418d6e1a08..00472e15ba0b4 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c @@ -74,16 +74,18 @@ static void komeda_crtc_update_clock_ratio(struct komeda_crtc_state *kcrtc_st) @@ -49106,7 +50310,7 @@ index f33418d6e1a0..00472e15ba0b 100644 .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c -index af67fefed38d..a3234bfb0917 100644 +index af67fefed38dc..a3234bfb09173 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -168,7 +168,7 @@ static void hdlcd_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -49137,7 +50341,7 @@ index af67fefed38d..a3234bfb0917 100644 struct drm_pending_vblank_event *event = crtc->state->event; diff --git a/drivers/gpu/drm/arm/malidp_crtc.c b/drivers/gpu/drm/arm/malidp_crtc.c -index 587d94798f5c..494075ddbef6 100644 +index 587d94798f5c2..494075ddbef68 100644 --- a/drivers/gpu/drm/arm/malidp_crtc.c +++ b/drivers/gpu/drm/arm/malidp_crtc.c @@ -46,7 +46,7 @@ static enum drm_mode_status malidp_crtc_mode_valid(struct drm_crtc *crtc, @@ -49225,7 +50429,7 @@ index 587d94798f5c..494075ddbef6 100644 .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c -index a887b6a5f8bd..f10a063b338c 100644 +index a887b6a5f8bd7..f10a063b338ce 100644 --- a/drivers/gpu/drm/armada/armada_crtc.c +++ b/drivers/gpu/drm/armada/armada_crtc.c @@ -413,21 +413,23 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -49299,7 +50503,7 @@ index a887b6a5f8bd..f10a063b338c 100644 .page_flip = drm_atomic_helper_page_flip, .atomic_duplicate_state = drm_atomic_helper_crtc_duplicate_state, diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c -index a3c2f76668ab..5697eba6c56b 100644 +index a3c2f76668abe..5697eba6c56be 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c @@ -751,24 +751,26 @@ static void ast_crtc_dpms(struct drm_crtc *crtc, int mode) @@ -49364,7 +50568,7 @@ index a3c2f76668ab..5697eba6c56b 100644 .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c -index ce246b96330b..c8471bd4abbb 100644 +index ce246b96330b7..c8471bd4abbb8 100644 --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c @@ -165,7 +165,7 @@ atmel_hlcdc_crtc_mode_valid(struct drm_crtc *c, @@ -49423,7 +50627,7 @@ index ce246b96330b..c8471bd4abbb 100644 int atmel_hlcdc_crtc_create(struct drm_device *dev) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c -index 0c79a9ba48bb..4c4fb4b52b7d 100644 +index 0c79a9ba48bb6..4c4fb4b52b7d1 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c @@ -2395,21 +2395,6 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector) @@ -49468,7 +50672,7 @@ index 0c79a9ba48bb..4c4fb4b52b7d 100644 drm_connector_attach_encoder(connector, hdmi->bridge.encoder); diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c -index 8a871e5c3e26..95addc0070ac 100644 +index 8a871e5c3e26b..95addc0070aca 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -122,7 +122,8 @@ static int handle_conflicting_encoders(struct drm_atomic_state *state, @@ -49685,7 +50889,7 @@ index 8a871e5c3e26..95addc0070ac 100644 * drm_atomic_helper_bridge_propagate_bus_fmt() - Propagate output format to * the input end of a bridge diff --git a/drivers/gpu/drm/drm_color_mgmt.c b/drivers/gpu/drm/drm_color_mgmt.c -index 138ff34b31db..8c225fb7441d 100644 +index 138ff34b31db5..8c225fb7441d5 100644 --- a/drivers/gpu/drm/drm_color_mgmt.c +++ b/drivers/gpu/drm/drm_color_mgmt.c @@ -22,6 +22,7 @@ @@ -49842,7 +51046,7 @@ index 138ff34b31db..8c225fb7441d 100644 out: DRM_MODESET_LOCK_ALL_END(dev, ctx, ret); diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c -index 717c4e7271b0..c0beaa2ea6ee 100644 +index 717c4e7271b04..c0beaa2ea6ee0 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -94,6 +94,7 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] = { @@ -49930,7 +51134,7 @@ index 717c4e7271b0..c0beaa2ea6ee 100644 * drm_connector_set_vrr_capable_property - sets the variable refresh rate * capable property for a connector diff --git a/drivers/gpu/drm/drm_fourcc.c b/drivers/gpu/drm/drm_fourcc.c -index 722c7ebe4e88..bdc7c605f43e 100644 +index 722c7ebe4e889..bdc7c605f43e4 100644 --- a/drivers/gpu/drm/drm_fourcc.c +++ b/drivers/gpu/drm/drm_fourcc.c @@ -286,6 +286,9 @@ const struct drm_format_info *__drm_format_info(u32 format) @@ -49944,7 +51148,7 @@ index 722c7ebe4e88..bdc7c605f43e 100644 unsigned int i; diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c -index 2f5b0c2bb0fe..89ced6af9c5c 100644 +index 2f5b0c2bb0fe3..89ced6af9c5cb 100644 --- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -217,12 +217,16 @@ static int framebuffer_check(struct drm_device *dev, @@ -49970,8 +51174,146 @@ index 2f5b0c2bb0fe..89ced6af9c5c 100644 } if (r->modifier[i] && !(r->flags & DRM_MODE_FB_MODIFIERS)) { +diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c +index e5432dcf69996..f8eb1061a55f4 100644 +--- a/drivers/gpu/drm/drm_probe_helper.c ++++ b/drivers/gpu/drm/drm_probe_helper.c +@@ -794,6 +794,84 @@ void drm_kms_helper_poll_fini(struct drm_device *dev) + } + EXPORT_SYMBOL(drm_kms_helper_poll_fini); + ++static bool ++_drm_connector_helper_hpd_irq_event(struct drm_connector *connector) ++{ ++ struct drm_device *dev = connector->dev; ++ enum drm_connector_status old_status; ++ u64 old_epoch_counter; ++ bool changed = false; ++ ++ /* Only handle HPD capable connectors. */ ++ drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD)); ++ ++ drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex)); ++ ++ old_status = connector->status; ++ old_epoch_counter = connector->epoch_counter; ++ ++ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", ++ connector->base.id, ++ connector->name, ++ old_epoch_counter); ++ ++ connector->status = drm_helper_probe_detect(connector, NULL, ++ false); ++ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", ++ connector->base.id, ++ connector->name, ++ drm_get_connector_status_name(old_status), ++ drm_get_connector_status_name(connector->status)); ++ ++ DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n", ++ connector->base.id, ++ connector->name, ++ connector->epoch_counter); ++ ++ /* ++ * Check if epoch counter had changed, meaning that we need ++ * to send a uevent. ++ */ ++ if (old_epoch_counter != connector->epoch_counter) ++ changed = true; ++ ++ return changed; ++} ++ ++/** ++ * drm_connector_helper_hpd_irq_event - hotplug processing ++ * @connector: drm_connector ++ * ++ * Drivers can use this helper function to run a detect cycle on a connector ++ * which has the DRM_CONNECTOR_POLL_HPD flag set in its &polled member. ++ * ++ * This helper function is useful for drivers which can track hotplug ++ * interrupts for a single connector. ++ * ++ * This function must be called from process context with no mode ++ * setting locks held. ++ * ++ * Note that a connector can be both polled and probed from the hotplug ++ * handler, in case the hotplug interrupt is known to be unreliable. ++ */ ++bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector) ++{ ++ struct drm_device *dev = connector->dev; ++ bool changed; ++ ++ mutex_lock(&dev->mode_config.mutex); ++ changed = _drm_connector_helper_hpd_irq_event(connector); ++ mutex_unlock(&dev->mode_config.mutex); ++ ++ if (changed) { ++ drm_kms_helper_hotplug_event(dev); ++ DRM_DEBUG_KMS("Sent hotplug event\n"); ++ } ++ ++ return changed; ++} ++EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event); ++ + /** + * drm_helper_hpd_irq_event - hotplug processing + * @dev: drm_device +@@ -821,9 +899,7 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev) + { + struct drm_connector *connector; + struct drm_connector_list_iter conn_iter; +- enum drm_connector_status old_status; + bool changed = false; +- u64 old_epoch_counter; + + if (!dev->mode_config.poll_enabled) + return false; +@@ -831,37 +907,8 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev) + mutex_lock(&dev->mode_config.mutex); + drm_connector_list_iter_begin(dev, &conn_iter); + drm_for_each_connector_iter(connector, &conn_iter) { +- /* Only handle HPD capable connectors. */ +- if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) +- continue; +- +- old_status = connector->status; +- +- old_epoch_counter = connector->epoch_counter; +- +- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id, +- connector->name, +- old_epoch_counter); +- +- connector->status = drm_helper_probe_detect(connector, NULL, false); +- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", +- connector->base.id, +- connector->name, +- drm_get_connector_status_name(old_status), +- drm_get_connector_status_name(connector->status)); +- +- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n", +- connector->base.id, +- connector->name, +- connector->epoch_counter); +- +- /* +- * Check if epoch counter had changed, meaning that we need +- * to send a uevent. +- */ +- if (old_epoch_counter != connector->epoch_counter) ++ if (_drm_connector_helper_hpd_irq_event(connector)) + changed = true; +- + } + drm_connector_list_iter_end(&conn_iter); + mutex_unlock(&dev->mode_config.mutex); diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c -index 74946690aba4..743e57c1b44f 100644 +index 74946690aba4e..743e57c1b44f3 100644 --- a/drivers/gpu/drm/drm_simple_kms_helper.c +++ b/drivers/gpu/drm/drm_simple_kms_helper.c @@ -86,20 +86,22 @@ drm_simple_kms_crtc_mode_valid(struct drm_crtc *crtc, @@ -50012,7 +51354,7 @@ index 74946690aba4..743e57c1b44f 100644 struct drm_simple_display_pipe *pipe; diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c -index 1c03485676ef..4153f302de7c 100644 +index 1c03485676efa..4153f302de7c4 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -19,7 +19,7 @@ @@ -50071,7 +51413,7 @@ index 1c03485676ef..4153f302de7c 100644 struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c -index b9ca81a6f80f..2af60d98f48f 100644 +index b9ca81a6f80fb..2af60d98f48f9 100644 --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c @@ -21,7 +21,7 @@ @@ -50106,7 +51448,7 @@ index b9ca81a6f80f..2af60d98f48f 100644 struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; diff --git a/drivers/gpu/drm/gud/Kconfig b/drivers/gpu/drm/gud/Kconfig new file mode 100644 -index 000000000000..1c8601bf4d91 +index 0000000000000..1c8601bf4d91e --- /dev/null +++ b/drivers/gpu/drm/gud/Kconfig @@ -0,0 +1,14 @@ @@ -50126,7 +51468,7 @@ index 000000000000..1c8601bf4d91 + If M is selected the module will be called gud. diff --git a/drivers/gpu/drm/gud/Makefile b/drivers/gpu/drm/gud/Makefile new file mode 100644 -index 000000000000..68a1c622cf33 +index 0000000000000..68a1c622cf332 --- /dev/null +++ b/drivers/gpu/drm/gud/Makefile @@ -0,0 +1,4 @@ @@ -50136,7 +51478,7 @@ index 000000000000..68a1c622cf33 +obj-$(CONFIG_DRM_GUD) += gud.o diff --git a/drivers/gpu/drm/gud/gud_connector.c b/drivers/gpu/drm/gud/gud_connector.c new file mode 100644 -index 000000000000..ae051133e050 +index 0000000000000..ae051133e0507 --- /dev/null +++ b/drivers/gpu/drm/gud/gud_connector.c @@ -0,0 +1,729 @@ @@ -50871,7 +52213,7 @@ index 000000000000..ae051133e050 +} diff --git a/drivers/gpu/drm/gud/gud_drv.c b/drivers/gpu/drm/gud/gud_drv.c new file mode 100644 -index 000000000000..3afad229bb78 +index 0000000000000..3afad229bb78e --- /dev/null +++ b/drivers/gpu/drm/gud/gud_drv.c @@ -0,0 +1,696 @@ @@ -51573,7 +52915,7 @@ index 000000000000..3afad229bb78 +MODULE_LICENSE("Dual MIT/GPL"); diff --git a/drivers/gpu/drm/gud/gud_internal.h b/drivers/gpu/drm/gud/gud_internal.h new file mode 100644 -index 000000000000..2a388e27d5d7 +index 0000000000000..2a388e27d5d7b --- /dev/null +++ b/drivers/gpu/drm/gud/gud_internal.h @@ -0,0 +1,156 @@ @@ -51735,7 +53077,7 @@ index 000000000000..2a388e27d5d7 +#endif diff --git a/drivers/gpu/drm/gud/gud_pipe.c b/drivers/gpu/drm/gud/gud_pipe.c new file mode 100644 -index 000000000000..d04e777ccb37 +index 0000000000000..d04e777ccb376 --- /dev/null +++ b/drivers/gpu/drm/gud/gud_pipe.c @@ -0,0 +1,601 @@ @@ -52341,7 +53683,7 @@ index 000000000000..d04e777ccb37 + drm_dev_exit(idx); +} diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c -index 4d57ec688f82..567f578740bd 100644 +index 4d57ec688f827..567f578740bd2 100644 --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_de.c @@ -172,7 +172,7 @@ static void hibmc_crtc_dpms(struct drm_crtc *crtc, int dpms) @@ -52381,7 +53723,7 @@ index 4d57ec688f82..567f578740bd 100644 { unsigned long flags; diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c -index e1108c1735ad..d84d41f3e78f 100644 +index e1108c1735ad0..d84d41f3e78f5 100644 --- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c +++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_ade.c @@ -436,7 +436,7 @@ static void ade_dump_regs(void __iomem *base) { } @@ -52421,7 +53763,7 @@ index e1108c1735ad..d84d41f3e78f 100644 { struct kirin_crtc *kcrtc = to_kirin_crtc(crtc); diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c -index 86be032bcf96..b18417a393af 100644 +index 86be032bcf965..b18417a393af1 100644 --- a/drivers/gpu/drm/i915/display/intel_atomic.c +++ b/drivers/gpu/drm/i915/display/intel_atomic.c @@ -109,16 +109,6 @@ int intel_digital_connector_atomic_set_property(struct drm_connector *connector, @@ -52452,7 +53794,7 @@ index 86be032bcf96..b18417a393af 100644 return 0; diff --git a/drivers/gpu/drm/i915/display/intel_connector.c b/drivers/gpu/drm/i915/display/intel_connector.c -index 406e96785c76..d1f8c7f3d197 100644 +index 406e96785c763..d1f8c7f3d1970 100644 --- a/drivers/gpu/drm/i915/display/intel_connector.c +++ b/drivers/gpu/drm/i915/display/intel_connector.c @@ -297,6 +297,5 @@ intel_attach_colorspace_property(struct drm_connector *connector) @@ -52464,7 +53806,7 @@ index 406e96785c76..d1f8c7f3d197 100644 + drm_connector_attach_colorspace_property(connector); } diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c -index 45c2556d6395..32f440223bd1 100644 +index 45c2556d63955..32f440223bd10 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -16562,7 +16562,6 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv, @@ -52476,7 +53818,7 @@ index 45c2556d6395..32f440223bd1 100644 .destroy = intel_crtc_destroy, \ .page_flip = drm_atomic_helper_page_flip, \ diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c -index ecaa538b2d35..3e5558def1c5 100644 +index ecaa538b2d357..3e5558def1c56 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c @@ -23,6 +23,7 @@ @@ -52504,7 +53846,7 @@ index ecaa538b2d35..3e5558def1c5 100644 return &intel_dp->mst_encoders[crtc->pipe]->base.base; } diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c -index 1d616da4f165..bf4da68260b9 100644 +index 1d616da4f1657..bf4da68260b9e 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2971,8 +2971,7 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c @@ -52518,7 +53860,7 @@ index 1d616da4f165..bf4da68260b9 100644 if (!HAS_GMCH(dev_priv)) drm_connector_attach_max_bpc_property(connector, 8, 12); diff --git a/drivers/gpu/drm/imx/dcss/dcss-crtc.c b/drivers/gpu/drm/imx/dcss/dcss-crtc.c -index 36abff0890b2..31267c00782f 100644 +index 36abff0890b28..31267c00782fc 100644 --- a/drivers/gpu/drm/imx/dcss/dcss-crtc.c +++ b/drivers/gpu/drm/imx/dcss/dcss-crtc.c @@ -3,6 +3,7 @@ @@ -52570,7 +53912,7 @@ index 36abff0890b2..31267c00782f 100644 base); struct dcss_dev *dcss = dcss_crtc->base.dev->dev_private; diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c -index d412fc265395..7ebd99ee3240 100644 +index d412fc265395e..7ebd99ee32407 100644 --- a/drivers/gpu/drm/imx/ipuv3-crtc.c +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c @@ -47,7 +47,7 @@ static inline struct ipu_crtc *to_ipu_crtc(struct drm_crtc *crtc) @@ -52626,7 +53968,7 @@ index d412fc265395..7ebd99ee3240 100644 spin_lock_irq(&crtc->dev->event_lock); if (crtc->state->event) { diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c -index a3d1617d7c67..13c30e2a0f67 100644 +index b6bb5fc7d183e..0f52e5f4aa2f5 100644 --- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c +++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c @@ -112,7 +112,7 @@ static inline struct ingenic_drm *drm_crtc_get_priv(struct drm_crtc *crtc) @@ -52716,7 +54058,7 @@ index a3d1617d7c67..13c30e2a0f67 100644 spin_lock_irq(&crtc->dev->event_lock); if (drm_crtc_vblank_get(crtc) == 0) -@@ -643,8 +648,6 @@ static const struct drm_crtc_funcs ingenic_drm_crtc_funcs = { +@@ -642,8 +647,6 @@ static const struct drm_crtc_funcs ingenic_drm_crtc_funcs = { .enable_vblank = ingenic_drm_enable_vblank, .disable_vblank = ingenic_drm_disable_vblank, @@ -52726,7 +54068,7 @@ index a3d1617d7c67..13c30e2a0f67 100644 static const struct drm_plane_helper_funcs ingenic_drm_plane_helper_funcs = { diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c -index ac038572164d..ea1bf572d666 100644 +index dfd5ed15a7f4a..3d698cd106265 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -517,7 +517,7 @@ void mtk_drm_crtc_async_update(struct drm_crtc *crtc, struct drm_plane *plane, @@ -52789,7 +54131,7 @@ index ac038572164d..ea1bf572d666 100644 .disable_vblank = mtk_drm_crtc_disable_vblank, }; diff --git a/drivers/gpu/drm/meson/meson_crtc.c b/drivers/gpu/drm/meson/meson_crtc.c -index 2854272dc2d9..d70616da8ce2 100644 +index 2854272dc2d9b..d70616da8ce2f 100644 --- a/drivers/gpu/drm/meson/meson_crtc.c +++ b/drivers/gpu/drm/meson/meson_crtc.c @@ -82,7 +82,7 @@ static const struct drm_crtc_funcs meson_crtc_funcs = { @@ -52847,7 +54189,7 @@ index 2854272dc2d9..d70616da8ce2 100644 struct meson_crtc *meson_crtc = to_meson_crtc(crtc); struct meson_drm *priv = meson_crtc->priv; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c -index f56414a06ec4..5bc1ead269d3 100644 +index f56414a06ec41..5bc1ead269d3a 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -11,6 +11,7 @@ @@ -52965,7 +54307,7 @@ index f56414a06ec4..5bc1ead269d3 100644 DPU_ERROR("crtc%d failed performance check %d\n", crtc->base.id, rc); diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c -index a0253297bc76..34e3186e236d 100644 +index a0253297bc769..34e3186e236de 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c @@ -264,7 +264,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -53013,7 +54355,7 @@ index a0253297bc76..34e3186e236d 100644 struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); struct drm_device *dev = crtc->dev; diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c -index 7d7668998501..baf9f1d550c6 100644 +index 7d7668998501a..baf9f1d550c6c 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c @@ -7,6 +7,7 @@ @@ -53106,10 +54448,10 @@ index 7d7668998501..baf9f1d550c6 100644 struct mdp5_crtc *mdp5_crtc = to_mdp5_crtc(crtc); struct mdp5_crtc_state *mdp5_cstate = to_mdp5_crtc_state(crtc->state); diff --git a/drivers/gpu/drm/mxsfb/mxsfb_kms.c b/drivers/gpu/drm/mxsfb/mxsfb_kms.c -index 9e1224d54729..3e1bb0aefb87 100644 +index b535621f4f78d..d2f747d3695a0 100644 --- a/drivers/gpu/drm/mxsfb/mxsfb_kms.c +++ b/drivers/gpu/drm/mxsfb/mxsfb_kms.c -@@ -270,21 +270,23 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) +@@ -310,21 +310,23 @@ static void mxsfb_crtc_mode_set_nofb(struct mxsfb_drm_private *mxsfb) } static int mxsfb_crtc_atomic_check(struct drm_crtc *crtc, @@ -53138,7 +54480,7 @@ index 9e1224d54729..3e1bb0aefb87 100644 { struct drm_pending_vblank_event *event; -@@ -303,7 +305,7 @@ static void mxsfb_crtc_atomic_flush(struct drm_crtc *crtc, +@@ -343,7 +345,7 @@ static void mxsfb_crtc_atomic_flush(struct drm_crtc *crtc, } static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc, @@ -53147,7 +54489,7 @@ index 9e1224d54729..3e1bb0aefb87 100644 { struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); struct drm_device *drm = mxsfb->drm; -@@ -327,7 +329,7 @@ static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc, +@@ -367,7 +369,7 @@ static void mxsfb_crtc_atomic_enable(struct drm_crtc *crtc, } static void mxsfb_crtc_atomic_disable(struct drm_crtc *crtc, @@ -53157,7 +54499,7 @@ index 9e1224d54729..3e1bb0aefb87 100644 struct mxsfb_drm_private *mxsfb = to_mxsfb_drm_private(crtc->dev); struct drm_device *drm = mxsfb->drm; diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c -index 5b8cabb099eb..c6367035970e 100644 +index c2d34c91e840c..afd2736f040d0 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -32,6 +32,7 @@ @@ -53181,7 +54523,7 @@ index 5b8cabb099eb..c6367035970e 100644 struct drm_crtc *crtc = connector_state->crtc; diff --git a/drivers/gpu/drm/nouveau/dispnv50/head.c b/drivers/gpu/drm/nouveau/dispnv50/head.c -index 841edfaf5b9d..69029e1c7923 100644 +index 61826cac3061a..5f4edb5a77e41 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/head.c +++ b/drivers/gpu/drm/nouveau/dispnv50/head.c @@ -30,6 +30,7 @@ @@ -53192,7 +54534,7 @@ index 841edfaf5b9d..69029e1c7923 100644 #include #include #include -@@ -310,12 +311,14 @@ nv50_head_atomic_check_mode(struct nv50_head *head, struct nv50_head_atom *asyh) +@@ -315,12 +316,14 @@ nv50_head_atomic_check_mode(struct nv50_head *head, struct nv50_head_atom *asyh) } static int @@ -53209,7 +54551,7 @@ index 841edfaf5b9d..69029e1c7923 100644 struct nouveau_conn_atom *asyc = NULL; struct drm_connector_state *conns; struct drm_connector *conn; -@@ -498,7 +501,6 @@ nv50_head_destroy(struct drm_crtc *crtc) +@@ -503,7 +506,6 @@ nv50_head_destroy(struct drm_crtc *crtc) static const struct drm_crtc_funcs nv50_head_func = { .reset = nv50_head_reset, @@ -53217,7 +54559,7 @@ index 841edfaf5b9d..69029e1c7923 100644 .destroy = nv50_head_destroy, .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, -@@ -513,7 +515,6 @@ nv50_head_func = { +@@ -518,7 +520,6 @@ nv50_head_func = { static const struct drm_crtc_funcs nvd9_head_func = { .reset = nv50_head_reset, @@ -53226,7 +54568,7 @@ index 841edfaf5b9d..69029e1c7923 100644 .set_config = drm_atomic_helper_set_config, .page_flip = drm_atomic_helper_page_flip, diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c -index 328a4a74f534..84101e27cfb7 100644 +index 328a4a74f534e..84101e27cfb7d 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -436,7 +436,7 @@ static void omap_crtc_arm_event(struct drm_crtc *crtc) @@ -53302,7 +54644,7 @@ index 328a4a74f534..84101e27cfb7 100644 .atomic_destroy_state = drm_atomic_helper_crtc_destroy_state, .atomic_set_property = omap_crtc_atomic_set_property, diff --git a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c -index 733010b5e4f5..7fb4d98e166d 100644 +index 733010b5e4f53..7fb4d98e166d5 100644 --- a/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c +++ b/drivers/gpu/drm/panel/panel-jdi-lt070me05000.c @@ -205,11 +205,11 @@ static int jdi_panel_unprepare(struct drm_panel *panel) @@ -53353,7 +54695,7 @@ index 733010b5e4f5..7fb4d98e166d 100644 return ret; } diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c -index 5e9ccefb88f6..abb8a8586b6f 100644 +index bbdd086be7f59..3f0c11fa60a50 100644 --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c @@ -219,7 +219,35 @@ static struct rpi_touchscreen *panel_to_ts(struct drm_panel *panel) @@ -53393,16 +54735,61 @@ index 5e9ccefb88f6..abb8a8586b6f 100644 } static void rpi_touchscreen_i2c_write(struct rpi_touchscreen *ts, -@@ -271,6 +299,7 @@ static int rpi_touchscreen_enable(struct drm_panel *panel) - int i; +@@ -229,7 +257,7 @@ static void rpi_touchscreen_i2c_write(struct rpi_touchscreen *ts, + + ret = i2c_smbus_write_byte_data(ts->i2c, reg, val); + if (ret) +- dev_err(&ts->dsi->dev, "I2C write failed: %d\n", ret); ++ dev_err(&ts->i2c->dev, "I2C write failed: %d\n", ret); + } + + static int rpi_touchscreen_write(struct rpi_touchscreen *ts, u16 reg, u32 val) +@@ -265,15 +293,17 @@ static int rpi_touchscreen_noop(struct drm_panel *panel) + return 0; + } + +-static int rpi_touchscreen_enable(struct drm_panel *panel) ++static int rpi_touchscreen_prepare(struct drm_panel *panel) + { + struct rpi_touchscreen *ts = panel_to_ts(panel); +- int i; ++ int i, data; rpi_touchscreen_i2c_write(ts, REG_POWERON, 1); + usleep_range(20000, 25000); /* Wait for nPWRDWN to go low to indicate poweron is done. */ for (i = 0; i < 100; i++) { - if (rpi_touchscreen_i2c_read(ts, REG_PORTB) & 1) +- if (rpi_touchscreen_i2c_read(ts, REG_PORTB) & 1) ++ data = rpi_touchscreen_i2c_read(ts, REG_PORTB); ++ if (data >= 0 && (data & 1)) + break; + } + +@@ -295,6 +325,13 @@ static int rpi_touchscreen_enable(struct drm_panel *panel) + rpi_touchscreen_write(ts, DSI_STARTDSI, 0x01); + msleep(100); + ++ return 0; ++} ++ ++static int rpi_touchscreen_enable(struct drm_panel *panel) ++{ ++ struct rpi_touchscreen *ts = panel_to_ts(panel); ++ + /* Turn on the backlight. */ + rpi_touchscreen_i2c_write(ts, REG_PWM, 255); + +@@ -349,7 +386,7 @@ static int rpi_touchscreen_get_modes(struct drm_panel *panel, + static const struct drm_panel_funcs rpi_touchscreen_funcs = { + .disable = rpi_touchscreen_disable, + .unprepare = rpi_touchscreen_noop, +- .prepare = rpi_touchscreen_noop, ++ .prepare = rpi_touchscreen_prepare, + .enable = rpi_touchscreen_enable, + .get_modes = rpi_touchscreen_get_modes, + }; diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c -index 204674fccd64..b7be0561006d 100644 +index 204674fccd646..8becb0e318140 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -2093,6 +2093,38 @@ static const struct panel_desc innolux_at043tn24 = { @@ -53444,7 +54831,39 @@ index 204674fccd64..b7be0561006d 100644 static const struct drm_display_mode innolux_at070tn92_mode = { .clock = 33333, .hdisplay = 800, -@@ -4075,6 +4107,9 @@ static const struct of_device_id platform_of_match[] = { +@@ -3187,6 +3219,31 @@ static const struct panel_desc qd43003c0_40 = { + .bus_format = MEDIA_BUS_FMT_RGB888_1X24, + }; + ++static const struct drm_display_mode raspberrypi_7inch_mode = { ++ .clock = 25979400 / 1000, ++ .hdisplay = 800, ++ .hsync_start = 800 + 2, ++ .hsync_end = 800 + 2 + 2, ++ .htotal = 800 + 2 + 2 + 46, ++ .vdisplay = 480, ++ .vsync_start = 480 + 7, ++ .vsync_end = 480 + 7 + 2, ++ .vtotal = 480 + 7 + 2 + 21, ++ .flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC, ++}; ++ ++static const struct panel_desc raspberrypi_7inch = { ++ .modes = &raspberrypi_7inch_mode, ++ .num_modes = 1, ++ .bpc = 8, ++ .size = { ++ .width = 154, ++ .height = 86, ++ }, ++ .bus_format = MEDIA_BUS_FMT_RGB888_1X24, ++ .connector_type = DRM_MODE_CONNECTOR_DSI, ++}; ++ + static const struct display_timing rocktech_rk070er9427_timing = { + .pixelclock = { 26400000, 33300000, 46800000 }, + .hactive = { 800, 800, 800 }, +@@ -4075,6 +4132,9 @@ static const struct of_device_id platform_of_match[] = { }, { .compatible = "innolux,at043tn24", .data = &innolux_at043tn24, @@ -53454,8 +54873,18 @@ index 204674fccd64..b7be0561006d 100644 }, { .compatible = "innolux,at070tn92", .data = &innolux_at070tn92, +@@ -4204,6 +4264,9 @@ static const struct of_device_id platform_of_match[] = { + }, { + .compatible = "qiaodian,qd43003c0-40", + .data = &qd43003c0_40, ++ }, { ++ .compatible = "raspberrypi,7inch-dsi", ++ .data = &raspberrypi_7inch, + }, { + .compatible = "rocktech,rk070er9427", + .data = &rocktech_rk070er9427, diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c -index f22a1b776f4b..5c9e28fdb6ad 100644 +index f22a1b776f4ba..5c9e28fdb6ad9 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c @@ -373,7 +373,7 @@ static void qxl_crtc_update_monitors_config(struct drm_crtc *crtc, @@ -53484,7 +54913,7 @@ index f22a1b776f4b..5c9e28fdb6ad 100644 qxl_crtc_update_monitors_config(crtc, "disable"); } diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c -index 1b9738e44909..675ac27eb240 100644 +index 1b9738e44909d..675ac27eb2402 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c @@ -682,20 +682,23 @@ static void rcar_du_crtc_stop(struct rcar_du_crtc *rcrtc) @@ -53563,7 +54992,7 @@ index 1b9738e44909..675ac27eb240 100644 /* ----------------------------------------------------------------------------- diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -index c80f7d9fd13f..a1f29b3c4f5c 100644 +index 0f23144491e40..5a108247ace4f 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -693,7 +693,7 @@ static void rockchip_drm_set_win_enabled(struct drm_crtc *crtc, bool enabled) @@ -53575,7 +55004,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 { struct vop *vop = to_vop(crtc); -@@ -1246,8 +1246,10 @@ static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc, +@@ -1247,8 +1247,10 @@ static void vop_crtc_gamma_set(struct vop *vop, struct drm_crtc *crtc, } static void vop_crtc_atomic_begin(struct drm_crtc *crtc, @@ -53587,7 +55016,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 struct vop *vop = to_vop(crtc); /* -@@ -1260,8 +1262,10 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc, +@@ -1261,8 +1263,10 @@ static void vop_crtc_atomic_begin(struct drm_crtc *crtc, } static void vop_crtc_atomic_enable(struct drm_crtc *crtc, @@ -53599,7 +55028,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 struct vop *vop = to_vop(crtc); const struct vop_data *vop_data = vop->data; struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); -@@ -1413,8 +1417,10 @@ static void vop_wait_for_irq_handler(struct vop *vop) +@@ -1414,8 +1418,10 @@ static void vop_wait_for_irq_handler(struct vop *vop) } static int vop_crtc_atomic_check(struct drm_crtc *crtc, @@ -53611,7 +55040,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 struct vop *vop = to_vop(crtc); struct drm_plane *plane; struct drm_plane_state *plane_state; -@@ -1458,8 +1464,10 @@ static int vop_crtc_atomic_check(struct drm_crtc *crtc, +@@ -1459,8 +1465,10 @@ static int vop_crtc_atomic_check(struct drm_crtc *crtc, } static void vop_crtc_atomic_flush(struct drm_crtc *crtc, @@ -53623,7 +55052,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 struct drm_atomic_state *old_state = old_crtc_state->state; struct drm_plane_state *old_plane_state, *new_plane_state; struct vop *vop = to_vop(crtc); -@@ -1633,7 +1641,6 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { +@@ -1634,7 +1642,6 @@ static const struct drm_crtc_funcs vop_crtc_funcs = { .disable_vblank = vop_crtc_disable_vblank, .set_crc_source = vop_crtc_set_crc_source, .verify_crc_source = vop_crtc_verify_crc_source, @@ -53632,7 +55061,7 @@ index c80f7d9fd13f..a1f29b3c4f5c 100644 static void vop_fb_unref_worker(struct drm_flip_work *work, void *val) diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c -index 6f37c104c46f..409795786f03 100644 +index 6f37c104c46f9..409795786f039 100644 --- a/drivers/gpu/drm/sti/sti_crtc.c +++ b/drivers/gpu/drm/sti/sti_crtc.c @@ -23,7 +23,7 @@ @@ -53663,7 +55092,7 @@ index 6f37c104c46f..409795786f03 100644 struct drm_device *drm_dev = crtc->dev; struct sti_mixer *mixer = to_sti_mixer(crtc); diff --git a/drivers/gpu/drm/stm/ltdc.c b/drivers/gpu/drm/stm/ltdc.c -index 62488ac14923..6f3b523e16e8 100644 +index 62488ac149238..6f3b523e16e8c 100644 --- a/drivers/gpu/drm/stm/ltdc.c +++ b/drivers/gpu/drm/stm/ltdc.c @@ -420,7 +420,7 @@ static void ltdc_crtc_update_clut(struct drm_crtc *crtc) @@ -53702,7 +55131,7 @@ index 62488ac14923..6f3b523e16e8 100644 /* diff --git a/drivers/gpu/drm/sun4i/sun4i_crtc.c b/drivers/gpu/drm/sun4i/sun4i_crtc.c -index 3a153648b369..45d9eb552d86 100644 +index 3a153648b3698..45d9eb552d869 100644 --- a/drivers/gpu/drm/sun4i/sun4i_crtc.c +++ b/drivers/gpu/drm/sun4i/sun4i_crtc.c @@ -15,6 +15,7 @@ @@ -53770,10 +55199,10 @@ index 3a153648b369..45d9eb552d86 100644 struct drm_encoder *encoder = sun4i_crtc_get_encoder(crtc); struct sun4i_crtc *scrtc = drm_crtc_to_sun4i_crtc(crtc); diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c -index 3aa9a7406085..d1fd1ccf455d 100644 +index ceb86338c0039..1e486da92ac31 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c -@@ -1742,7 +1742,7 @@ static int tegra_dc_wait_idle(struct tegra_dc *dc, unsigned long timeout) +@@ -1748,7 +1748,7 @@ static int tegra_dc_wait_idle(struct tegra_dc *dc, unsigned long timeout) } static void tegra_crtc_atomic_disable(struct drm_crtc *crtc, @@ -53782,7 +55211,7 @@ index 3aa9a7406085..d1fd1ccf455d 100644 { struct tegra_dc *dc = to_tegra_dc(crtc); u32 value; -@@ -1799,10 +1799,10 @@ static void tegra_crtc_atomic_disable(struct drm_crtc *crtc, +@@ -1805,10 +1805,10 @@ static void tegra_crtc_atomic_disable(struct drm_crtc *crtc, } static void tegra_crtc_atomic_enable(struct drm_crtc *crtc, @@ -53795,7 +55224,7 @@ index 3aa9a7406085..d1fd1ccf455d 100644 struct tegra_dc *dc = to_tegra_dc(crtc); u32 value; int err; -@@ -1882,7 +1882,7 @@ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc, +@@ -1888,7 +1888,7 @@ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc, tegra_dc_writel(dc, 0, DC_DISP_BORDER_COLOR); /* apply PLL and pixel clock changes */ @@ -53804,7 +55233,7 @@ index 3aa9a7406085..d1fd1ccf455d 100644 /* program display mode */ tegra_dc_set_timings(dc, mode); -@@ -1918,7 +1918,7 @@ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc, +@@ -1924,7 +1924,7 @@ static void tegra_crtc_atomic_enable(struct drm_crtc *crtc, } static void tegra_crtc_atomic_begin(struct drm_crtc *crtc, @@ -53813,7 +55242,7 @@ index 3aa9a7406085..d1fd1ccf455d 100644 { unsigned long flags; -@@ -1937,17 +1937,17 @@ static void tegra_crtc_atomic_begin(struct drm_crtc *crtc, +@@ -1943,17 +1943,17 @@ static void tegra_crtc_atomic_begin(struct drm_crtc *crtc, } static void tegra_crtc_atomic_flush(struct drm_crtc *crtc, @@ -53836,7 +55265,7 @@ index 3aa9a7406085..d1fd1ccf455d 100644 value = tegra_dc_readl(dc, DC_CMD_STATE_CONTROL); } diff --git a/drivers/gpu/drm/tidss/tidss_crtc.c b/drivers/gpu/drm/tidss/tidss_crtc.c -index 3c5744a91d4a..2218da3b3ca3 100644 +index 3c5744a91d4a0..2218da3b3ca34 100644 --- a/drivers/gpu/drm/tidss/tidss_crtc.c +++ b/drivers/gpu/drm/tidss/tidss_crtc.c @@ -85,8 +85,10 @@ void tidss_crtc_error_irq(struct drm_crtc *crtc, u64 irqstatus) @@ -53907,7 +55336,7 @@ index 3c5744a91d4a..2218da3b3ca3 100644 struct tidss_crtc *tcrtc = to_tidss_crtc(crtc); struct drm_device *ddev = crtc->dev; diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c -index 0aaa4a26b5db..c7c1fcc03b32 100644 +index 0aaa4a26b5db5..c7c1fcc03b325 100644 --- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c +++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c @@ -484,7 +484,7 @@ static void tilcdc_crtc_enable(struct drm_crtc *crtc) @@ -53959,7 +55388,7 @@ index 0aaa4a26b5db..c7c1fcc03b32 100644 return -EINVAL; } diff --git a/drivers/gpu/drm/v3d/Kconfig b/drivers/gpu/drm/v3d/Kconfig -index 9a5c44606337..b0e048697964 100644 +index 9a5c44606337e..b0e0486979642 100644 --- a/drivers/gpu/drm/v3d/Kconfig +++ b/drivers/gpu/drm/v3d/Kconfig @@ -1,7 +1,7 @@ @@ -53972,7 +55401,7 @@ index 9a5c44606337..b0e048697964 100644 depends on COMMON_CLK depends on MMU diff --git a/drivers/gpu/drm/v3d/v3d_debugfs.c b/drivers/gpu/drm/v3d/v3d_debugfs.c -index e76b24bb8828..b7b296bb87d0 100644 +index e76b24bb88285..b7b296bb87d06 100644 --- a/drivers/gpu/drm/v3d/v3d_debugfs.c +++ b/drivers/gpu/drm/v3d/v3d_debugfs.c @@ -4,7 +4,6 @@ @@ -54028,7 +55457,7 @@ index e76b24bb8828..b7b296bb87d0 100644 return 0; } diff --git a/drivers/gpu/drm/v3d/v3d_drv.c b/drivers/gpu/drm/v3d/v3d_drv.c -index 9f7c26193831..3237f47a4792 100644 +index 9f7c261938312..3237f47a47927 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.c +++ b/drivers/gpu/drm/v3d/v3d_drv.c @@ -70,7 +70,7 @@ static int v3d_runtime_resume(struct device *dev) @@ -54136,7 +55565,7 @@ index 9f7c26193831..3237f47a4792 100644 }; diff --git a/drivers/gpu/drm/v3d/v3d_drv.h b/drivers/gpu/drm/v3d/v3d_drv.h -index 8a390738d65b..1372e913e765 100644 +index 8a390738d65ba..1372e913e7650 100644 --- a/drivers/gpu/drm/v3d/v3d_drv.h +++ b/drivers/gpu/drm/v3d/v3d_drv.h @@ -51,6 +51,12 @@ struct v3d_dev { @@ -54153,7 +55582,7 @@ index 8a390738d65b..1372e913e765 100644 /* Virtual and DMA addresses of the single shared page table. */ diff --git a/drivers/gpu/drm/v3d/v3d_gem.c b/drivers/gpu/drm/v3d/v3d_gem.c -index 182c586525eb..b4fb899a9409 100644 +index 182c586525eb8..b4fb899a94096 100644 --- a/drivers/gpu/drm/v3d/v3d_gem.c +++ b/drivers/gpu/drm/v3d/v3d_gem.c @@ -4,6 +4,7 @@ @@ -54270,7 +55699,7 @@ index 182c586525eb..b4fb899a9409 100644 * treat 0 as special, such as the occlusion query counters * where 0 means "disabled". diff --git a/drivers/gpu/drm/v3d/v3d_irq.c b/drivers/gpu/drm/v3d/v3d_irq.c -index c88686489b88..0f7a23f051df 100644 +index c88686489b888..0f7a23f051df8 100644 --- a/drivers/gpu/drm/v3d/v3d_irq.c +++ b/drivers/gpu/drm/v3d/v3d_irq.c @@ -177,11 +177,9 @@ v3d_hub_irq(int irq, void *arg) @@ -54313,7 +55742,7 @@ index c88686489b88..0f7a23f051df 100644 return irq1; if (irq1 > 0) { diff --git a/drivers/gpu/drm/v3d/v3d_mmu.c b/drivers/gpu/drm/v3d/v3d_mmu.c -index 5a453532901f..618503f2f2f1 100644 +index 5a453532901f1..618503f2f2f1d 100644 --- a/drivers/gpu/drm/v3d/v3d_mmu.c +++ b/drivers/gpu/drm/v3d/v3d_mmu.c @@ -18,6 +18,8 @@ @@ -54326,7 +55755,7 @@ index 5a453532901f..618503f2f2f1 100644 #include "v3d_regs.h" diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c b/drivers/gpu/drm/vboxvideo/vbox_mode.c -index 4fcc0a542b8a..322bf7133ba1 100644 +index 4fcc0a542b8a6..322bf7133ba12 100644 --- a/drivers/gpu/drm/vboxvideo/vbox_mode.c +++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c @@ -213,17 +213,17 @@ static void vbox_crtc_set_base_and_mode(struct drm_crtc *crtc, @@ -54351,7 +55780,7 @@ index 4fcc0a542b8a..322bf7133ba1 100644 } diff --git a/drivers/gpu/drm/vc4/Kconfig b/drivers/gpu/drm/vc4/Kconfig -index 118e8a426b1a..345a5570a3da 100644 +index 118e8a426b1ab..345a5570a3da7 100644 --- a/drivers/gpu/drm/vc4/Kconfig +++ b/drivers/gpu/drm/vc4/Kconfig @@ -12,6 +12,7 @@ config DRM_VC4 @@ -54363,7 +55792,7 @@ index 118e8a426b1a..345a5570a3da 100644 help Choose this option if you have a system that has a Broadcom diff --git a/drivers/gpu/drm/vc4/Makefile b/drivers/gpu/drm/vc4/Makefile -index d0163e18e9ca..8281a044834f 100644 +index d0163e18e9caa..8281a044834f0 100644 --- a/drivers/gpu/drm/vc4/Makefile +++ b/drivers/gpu/drm/vc4/Makefile @@ -9,6 +9,7 @@ vc4-y := \ @@ -54375,7 +55804,7 @@ index d0163e18e9ca..8281a044834f 100644 vc4_gem.o \ vc4_hdmi.o \ diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c -index 1d2416d466a3..34af13096477 100644 +index f4ccca922e44a..59e10c37b740c 100644 --- a/drivers/gpu/drm/vc4/vc4_crtc.c +++ b/drivers/gpu/drm/vc4/vc4_crtc.c @@ -279,19 +279,15 @@ static u32 vc4_crtc_get_fifo_full_level_bits(struct vc4_crtc *vc4_crtc, @@ -54717,7 +56146,65 @@ index 1d2416d466a3..34af13096477 100644 if (conn_state->crtc != crtc) continue; -@@ -894,7 +968,6 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = { +@@ -695,6 +769,7 @@ struct vc4_async_flip_state { + struct drm_pending_vblank_event *event; + + struct vc4_seqno_cb cb; ++ struct dma_fence_cb fence_cb; + }; + + /* Called when the V3D execution for the BO being flipped to is done, so that +@@ -743,6 +818,39 @@ vc4_async_page_flip_complete(struct vc4_seqno_cb *cb) + up(&vc4->async_modeset); + } + ++static void vc4_async_page_flip_fence_complete(struct dma_fence *fence, ++ struct dma_fence_cb *cb) ++{ ++ struct vc4_async_flip_state *flip_state = ++ container_of(cb, struct vc4_async_flip_state, fence_cb); ++ ++ vc4_async_page_flip_complete(&flip_state->cb); ++ dma_fence_put(fence); ++} ++ ++static int vc4_async_set_fence_cb(struct drm_device *dev, ++ struct vc4_async_flip_state *flip_state) ++{ ++ struct drm_framebuffer *fb = flip_state->fb; ++ struct drm_gem_cma_object *cma_bo = drm_fb_cma_get_gem_obj(fb, 0); ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct dma_fence *fence; ++ ++ if (!vc4->hvs->hvs5) { ++ struct vc4_bo *bo = to_vc4_bo(&cma_bo->base); ++ ++ return vc4_queue_seqno_cb(dev, &flip_state->cb, bo->seqno, ++ vc4_async_page_flip_complete); ++ } ++ ++ fence = dma_fence_get(dma_resv_get_excl(cma_bo->base.resv)); ++ if (dma_fence_add_callback(fence, &flip_state->fence_cb, ++ vc4_async_page_flip_fence_complete)) ++ vc4_async_page_flip_fence_complete(fence, &flip_state->fence_cb); ++ ++ return 0; ++} ++ + /* Implements async (non-vblank-synced) page flips. + * + * The page flip ioctl needs to return immediately, so we grab the +@@ -813,8 +921,7 @@ static int vc4_async_page_flip(struct drm_crtc *crtc, + */ + drm_atomic_set_fb_for_plane(plane->state, fb); + +- vc4_queue_seqno_cb(dev, &flip_state->cb, bo->seqno, +- vc4_async_page_flip_complete); ++ vc4_async_set_fence_cb(dev, flip_state); + + /* Driver takes ownership of state on successful async commit. */ + return 0; +@@ -894,7 +1001,6 @@ static const struct drm_crtc_funcs vc4_crtc_funcs = { .reset = vc4_crtc_reset, .atomic_duplicate_state = vc4_crtc_duplicate_state, .atomic_destroy_state = vc4_crtc_destroy_state, @@ -54726,7 +56213,7 @@ index 1d2416d466a3..34af13096477 100644 .disable_vblank = vc4_disable_vblank, .get_vblank_timestamp = drm_crtc_vblank_helper_get_vblank_timestamp, diff --git a/drivers/gpu/drm/vc4/vc4_debugfs.c b/drivers/gpu/drm/vc4/vc4_debugfs.c -index 4fbbf980a299..a95d88fea8d2 100644 +index 4fbbf980a299f..a95d88fea8d23 100644 --- a/drivers/gpu/drm/vc4/vc4_debugfs.c +++ b/drivers/gpu/drm/vc4/vc4_debugfs.c @@ -7,6 +7,7 @@ @@ -54751,7 +56238,7 @@ index 4fbbf980a299..a95d88fea8d2 100644 list_for_each_entry(entry, &vc4->debugfs_list, link) { drm_debugfs_create_files(&entry->info, 1, diff --git a/drivers/gpu/drm/vc4/vc4_dpi.c b/drivers/gpu/drm/vc4/vc4_dpi.c -index a90f2545baee..dde2c6014748 100644 +index a90f2545baee0..dde2c60147484 100644 --- a/drivers/gpu/drm/vc4/vc4_dpi.c +++ b/drivers/gpu/drm/vc4/vc4_dpi.c @@ -165,10 +165,20 @@ static void vc4_dpi_encoder_enable(struct drm_encoder *encoder) @@ -54787,7 +56274,7 @@ index a90f2545baee..dde2c6014748 100644 if (mode->flags & DRM_MODE_FLAG_NHSYNC) diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c -index 839610f8092a..dec3620bc7c5 100644 +index 839610f8092af..dec3620bc7c58 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.c +++ b/drivers/gpu/drm/vc4/vc4_drv.c @@ -36,6 +36,8 @@ @@ -54923,7 +56410,7 @@ index 839610f8092a..dec3620bc7c5 100644 }; diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h -index c5f2944d5bc6..0f2911dd5c84 100644 +index 9809c3a856c67..7c749e08cb0c4 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -74,12 +74,16 @@ struct vc4_perfmon { @@ -55025,7 +56512,7 @@ index c5f2944d5bc6..0f2911dd5c84 100644 void vc4_hvs_unmask_underrun(struct drm_device *dev, int channel); void vc4_hvs_mask_underrun(struct drm_device *dev, int channel); diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index eaf276978ee7..9861e2d2c05d 100644 +index eaf276978ee7f..1c6939c9c2326 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -181,8 +181,50 @@ @@ -55148,7 +56635,21 @@ index eaf276978ee7..9861e2d2c05d 100644 } vc4_dsi_ulps(dsi, true); -@@ -837,7 +893,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) +@@ -794,11 +850,9 @@ static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder *encoder, + /* Find what divider gets us a faster clock than the requested + * pixel clock. + */ +- for (divider = 1; divider < 8; divider++) { +- if (parent_rate / divider < pll_clock) { +- divider--; ++ for (divider = 1; divider < 7; divider++) { ++ if (parent_rate / (divider + 1) < pll_clock) + break; +- } + } + + /* Now that we've picked a PLL divider, calculate back to its +@@ -837,7 +891,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) ret = pm_runtime_get_sync(dev); if (ret) { @@ -55157,7 +56658,7 @@ index eaf276978ee7..9861e2d2c05d 100644 return; } -@@ -871,7 +927,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) +@@ -871,7 +925,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) DSI_PORT_WRITE(STAT, DSI_PORT_READ(STAT)); /* Set AFE CTR00/CTR1 to release powerdown of analog. */ @@ -55166,7 +56667,7 @@ index eaf276978ee7..9861e2d2c05d 100644 u32 afec0 = (VC4_SET_FIELD(7, DSI_PHY_AFEC0_PTATADJ) | VC4_SET_FIELD(7, DSI_PHY_AFEC0_CTATADJ)); -@@ -883,6 +939,9 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) +@@ -883,6 +937,9 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) DSI_PORT_WRITE(PHY_AFEC0, afec0); @@ -55176,7 +56677,7 @@ index eaf276978ee7..9861e2d2c05d 100644 DSI_PORT_WRITE(PHY_AFEC1, VC4_SET_FIELD(6, DSI0_PHY_AFEC1_IDR_DLANE1) | VC4_SET_FIELD(6, DSI0_PHY_AFEC1_IDR_DLANE0) | -@@ -1017,7 +1076,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) +@@ -1017,7 +1074,7 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) DSI_PORT_BIT(PHYC_CLANE_ENABLE) | ((dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ? 0 : DSI_PORT_BIT(PHYC_HS_CLK_CONTINUOUS)) | @@ -55185,7 +56686,7 @@ index eaf276978ee7..9861e2d2c05d 100644 VC4_SET_FIELD(lpx - 1, DSI0_PHYC_ESC_CLK_LPDT) : VC4_SET_FIELD(lpx - 1, DSI1_PHYC_ESC_CLK_LPDT))); -@@ -1043,18 +1102,15 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) +@@ -1043,18 +1100,15 @@ static void vc4_dsi_encoder_enable(struct drm_encoder *encoder) DSI_DISP1_ENABLE); /* Ungate the block. */ @@ -55208,7 +56709,7 @@ index eaf276978ee7..9861e2d2c05d 100644 vc4_dsi_ulps(dsi, false); -@@ -1173,13 +1229,28 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, +@@ -1173,13 +1227,28 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, /* Enable the appropriate interrupt for the transfer completion. */ dsi->xfer_result = 0; reinit_completion(&dsi->xfer_completion); @@ -55243,7 +56744,7 @@ index eaf276978ee7..9861e2d2c05d 100644 } /* Send the packet. */ -@@ -1196,7 +1267,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, +@@ -1196,7 +1265,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, ret = dsi->xfer_result; } @@ -55252,7 +56753,7 @@ index eaf276978ee7..9861e2d2c05d 100644 if (ret) goto reset_fifo_and_return; -@@ -1242,7 +1313,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, +@@ -1242,7 +1311,7 @@ static ssize_t vc4_dsi_host_transfer(struct mipi_dsi_host *host, DSI_PORT_BIT(CTRL_RESET_FIFOS)); DSI_PORT_WRITE(TXPKT1C, 0); @@ -55261,7 +56762,7 @@ index eaf276978ee7..9861e2d2c05d 100644 return ret; } -@@ -1305,8 +1376,32 @@ static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = { +@@ -1305,8 +1374,32 @@ static const struct drm_encoder_helper_funcs vc4_dsi_encoder_helper_funcs = { .mode_fixup = vc4_dsi_encoder_mode_fixup, }; @@ -55295,7 +56796,7 @@ index eaf276978ee7..9861e2d2c05d 100644 {} }; -@@ -1317,7 +1412,7 @@ static void dsi_handle_error(struct vc4_dsi *dsi, +@@ -1317,7 +1410,7 @@ static void dsi_handle_error(struct vc4_dsi *dsi, if (!(stat & bit)) return; @@ -55304,7 +56805,7 @@ index eaf276978ee7..9861e2d2c05d 100644 *ret = IRQ_HANDLED; } -@@ -1351,26 +1446,28 @@ static irqreturn_t vc4_dsi_irq_handler(int irq, void *data) +@@ -1351,26 +1444,28 @@ static irqreturn_t vc4_dsi_irq_handler(int irq, void *data) DSI_PORT_WRITE(INT_STAT, stat); dsi_handle_error(dsi, &ret, stat, @@ -55343,7 +56844,7 @@ index eaf276978ee7..9861e2d2c05d 100644 complete(&dsi->xfer_completion); dsi->xfer_result = -ETIMEDOUT; ret = IRQ_HANDLED; -@@ -1390,12 +1487,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) +@@ -1390,12 +1485,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) struct device *dev = &dsi->pdev->dev; const char *parent_name = __clk_get_name(dsi->pll_phy_clock); static const struct { @@ -55360,7 +56861,7 @@ index eaf276978ee7..9861e2d2c05d 100644 }; int i; -@@ -1411,8 +1508,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) +@@ -1411,8 +1506,12 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) for (i = 0; i < ARRAY_SIZE(phy_clocks); i++) { struct clk_fixed_factor *fix = &dsi->phy_clocks[i]; struct clk_init_data init; @@ -55373,7 +56874,7 @@ index eaf276978ee7..9861e2d2c05d 100644 /* We just use core fixed factor clock ops for the PHY * clocks. The clocks are actually gated by the * PHY_AFEC0_DDRCLK_EN bits, which we should be -@@ -1429,10 +1530,7 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) +@@ -1429,10 +1528,7 @@ vc4_dsi_init_phy_clocks(struct vc4_dsi *dsi) memset(&init, 0, sizeof(init)); init.parent_names = &parent_name; init.num_parents = 1; @@ -55385,7 +56886,7 @@ index eaf276978ee7..9861e2d2c05d 100644 init.ops = &clk_fixed_factor_ops; ret = devm_clk_hw_register(dev, &fix->hw); -@@ -1451,7 +1549,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1451,7 +1547,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); struct drm_device *drm = dev_get_drvdata(master); @@ -55393,7 +56894,7 @@ index eaf276978ee7..9861e2d2c05d 100644 struct vc4_dsi *dsi = dev_get_drvdata(dev); struct vc4_dsi_encoder *vc4_dsi_encoder; struct drm_panel *panel; -@@ -1463,7 +1560,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1463,7 +1558,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) if (!match) return -ENODEV; @@ -55402,7 +56903,7 @@ index eaf276978ee7..9861e2d2c05d 100644 vc4_dsi_encoder = devm_kzalloc(dev, sizeof(*vc4_dsi_encoder), GFP_KERNEL); -@@ -1471,7 +1568,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1471,7 +1566,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) return -ENOMEM; INIT_LIST_HEAD(&dsi->bridge_chain); @@ -55412,7 +56913,7 @@ index eaf276978ee7..9861e2d2c05d 100644 vc4_dsi_encoder->dsi = dsi; dsi->encoder = &vc4_dsi_encoder->base.base; -@@ -1480,13 +1578,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1480,13 +1576,8 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) return PTR_ERR(dsi->regs); dsi->regset.base = dsi->regs; @@ -55428,7 +56929,7 @@ index eaf276978ee7..9861e2d2c05d 100644 if (DSI_PORT_READ(ID) != DSI_ID_VALUE) { dev_err(dev, "Port returned 0x%08x for ID instead of 0x%08x\n", -@@ -1494,11 +1587,11 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1494,11 +1585,11 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) return -ENODEV; } @@ -55443,17 +56944,98 @@ index eaf276978ee7..9861e2d2c05d 100644 dsi->reg_dma_mem = dma_alloc_coherent(dev, 4, &dsi->reg_dma_paddr, GFP_KERNEL); -@@ -1604,9 +1697,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) - if (ret) - return ret; +@@ -1515,7 +1606,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + if (ret != -EPROBE_DEFER) + DRM_ERROR("Failed to get DMA channel: %d\n", + ret); +- return ret; ++ goto err_free_dma_mem; + } + /* Get the physical address of the device's registers. The +@@ -1544,7 +1635,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + if (ret) { + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get interrupt: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + + dsi->escape_clock = devm_clk_get(dev, "escape"); +@@ -1552,7 +1643,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + ret = PTR_ERR(dsi->escape_clock); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get escape clock: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + + dsi->pll_phy_clock = devm_clk_get(dev, "phy"); +@@ -1560,7 +1651,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + ret = PTR_ERR(dsi->pll_phy_clock); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get phy clock: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + + dsi->pixel_clock = devm_clk_get(dev, "pixel"); +@@ -1568,7 +1659,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + ret = PTR_ERR(dsi->pixel_clock); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get pixel clock: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + + ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, +@@ -1583,29 +1674,28 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + if (ret == -ENODEV) + return 0; + +- return ret; ++ goto err_free_dma; + } + + if (panel) { + dsi->bridge = devm_drm_panel_bridge_add_typed(dev, panel, + DRM_MODE_CONNECTOR_DSI); +- if (IS_ERR(dsi->bridge)) +- return PTR_ERR(dsi->bridge); ++ if (IS_ERR(dsi->bridge)) { ++ ret = PTR_ERR(dsi->bridge); ++ goto err_free_dma; ++ } + } + + /* The esc clock rate is supposed to always be 100Mhz. */ + ret = clk_set_rate(dsi->escape_clock, 100 * 1000000); + if (ret) { + dev_err(dev, "Failed to set esc clock: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + + ret = vc4_dsi_init_phy_clocks(dsi); + if (ret) +- return ret; +- - if (dsi->port == 1) - vc4->dsi1 = dsi; -- ++ goto err_free_dma; + drm_simple_encoder_init(drm, dsi->encoder, DRM_MODE_ENCODER_DSI); drm_encoder_helper_add(dsi->encoder, &vc4_dsi_encoder_helper_funcs); - -@@ -1622,10 +1712,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) +@@ -1613,7 +1703,7 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + ret = drm_bridge_attach(dsi->encoder, dsi->bridge, NULL, 0); + if (ret) { + dev_err(dev, "bridge attach failed: %d\n", ret); +- return ret; ++ goto err_free_dma; + } + /* Disable the atomic helper calls into the bridge. We + * manually call the bridge pre_enable / enable / etc. calls +@@ -1622,21 +1712,29 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) */ list_splice_init(&dsi->encoder->bridge_chain, &dsi->bridge_chain); @@ -55465,7 +57047,22 @@ index eaf276978ee7..9861e2d2c05d 100644 pm_runtime_enable(dev); -@@ -1635,8 +1722,6 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + return 0; ++ ++err_free_dma: ++ if (dsi->reg_dma_chan) { ++ dma_release_channel(dsi->reg_dma_chan); ++ dsi->reg_dma_chan = NULL; ++ } ++err_free_dma_mem: ++ if (dsi->reg_dma_mem) { ++ dma_free_coherent(dev, 4, dsi->reg_dma_mem, dsi->reg_dma_paddr); ++ dsi->reg_dma_mem = NULL; ++ } ++ ++ return ret; + } + static void vc4_dsi_unbind(struct device *dev, struct device *master, void *data) { @@ -55474,19 +57071,27 @@ index eaf276978ee7..9861e2d2c05d 100644 struct vc4_dsi *dsi = dev_get_drvdata(dev); if (dsi->bridge) -@@ -1648,9 +1733,6 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master, - */ +@@ -1649,8 +1747,15 @@ static void vc4_dsi_unbind(struct device *dev, struct device *master, list_splice_init(&dsi->bridge_chain, &dsi->encoder->bridge_chain); drm_encoder_cleanup(dsi->encoder); -- + - if (dsi->port == 1) - vc4->dsi1 = NULL; ++ if (dsi->reg_dma_chan) { ++ dma_release_channel(dsi->reg_dma_chan); ++ dsi->reg_dma_chan = NULL; ++ } ++ ++ if (dsi->reg_dma_mem) { ++ dma_free_coherent(dev, 4, dsi->reg_dma_mem, dsi->reg_dma_paddr); ++ dsi->reg_dma_mem = NULL; ++ } } static const struct component_ops vc4_dsi_ops = { diff --git a/drivers/gpu/drm/vc4/vc4_firmware_kms.c b/drivers/gpu/drm/vc4/vc4_firmware_kms.c new file mode 100644 -index 000000000000..d6d50b5f64dd +index 0000000000000..d6d50b5f64dd0 --- /dev/null +++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c @@ -0,0 +1,1992 @@ @@ -57483,7 +59088,7 @@ index 000000000000..d6d50b5f64dd + }, +}; diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c -index b641252939d8..445d3bab89e0 100644 +index b641252939d87..445d3bab89e0a 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c @@ -1026,7 +1026,6 @@ int vc4_queue_seqno_cb(struct drm_device *dev, @@ -57504,7 +59109,7 @@ index b641252939d8..445d3bab89e0 100644 /* Scheduled when any job has been completed, this walks the list of diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c -index af5f01eff872..6f73fbecfd9c 100644 +index c58b8840090ab..f1adaa9dc5f34 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -35,6 +35,7 @@ @@ -57529,10 +59134,13 @@ index af5f01eff872..6f73fbecfd9c 100644 #include "media/cec.h" #include "vc4_drv.h" #include "vc4_hdmi.h" -@@ -76,11 +80,29 @@ +@@ -76,11 +80,33 @@ #define VC5_HDMI_VERTB_VSPO_SHIFT 16 #define VC5_HDMI_VERTB_VSPO_MASK VC4_MASK(29, 16) ++#define VC5_HDMI_MISC_CONTROL_PIXEL_REP_SHIFT 0 ++#define VC5_HDMI_MISC_CONTROL_PIXEL_REP_MASK VC4_MASK(3, 0) ++ +#define VC5_HDMI_SCRAMBLER_CTL_ENABLE BIT(0) + +#define VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_SHIFT 8 @@ -57549,6 +59157,7 @@ index af5f01eff872..6f73fbecfd9c 100644 # define VC4_HD_M_SW_RST BIT(2) # define VC4_HD_M_ENABLE BIT(0) ++#define HSM_MIN_CLOCK_FREQ 120000000 #define CEC_CLOCK_FREQ 40000 -#define VC4_HSM_MID_CLOCK 149985000 +#define HDMI_14_MAX_TMDS_CLK (340 * 1000 * 1000) @@ -57560,7 +59169,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) { -@@ -90,6 +112,12 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) +@@ -90,6 +116,12 @@ static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) drm_print_regset32(&p, &vc4_hdmi->hdmi_regset); drm_print_regset32(&p, &vc4_hdmi->hd_regset); @@ -57573,7 +59182,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return 0; } -@@ -132,7 +160,7 @@ static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) +@@ -132,7 +164,7 @@ static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) * Set the clock divider: the hsm_clock rate and this divider * setting will give a 40 kHz CEC clock. */ @@ -57582,7 +59191,7 @@ index af5f01eff872..6f73fbecfd9c 100644 value |= clk_cnt << VC4_HDMI_CEC_DIV_CLK_CNT_SHIFT; HDMI_WRITE(HDMI_CEC_CNTRL_1, value); } -@@ -140,12 +168,17 @@ static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) +@@ -140,10 +172,13 @@ static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) static void vc4_hdmi_cec_update_clk_div(struct vc4_hdmi *vc4_hdmi) {} #endif @@ -57595,15 +59204,21 @@ index af5f01eff872..6f73fbecfd9c 100644 + enum drm_connector_status ret = connector_status_disconnected; bool connected = false; -+ WARN_ON(clk_prepare_enable(vc4_hdmi->hsm_clock)); -+ - if (vc4_hdmi->hpd_gpio) { + WARN_ON(pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev)); +@@ -152,8 +187,6 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) if (gpio_get_value_cansleep(vc4_hdmi->hpd_gpio) ^ vc4_hdmi->hpd_active_low) -@@ -167,11 +200,18 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) + connected = true; +- } else if (drm_probe_ddc(vc4_hdmi->ddc)) { +- connected = true; + } else if (HDMI_READ(HDMI_HOTPLUG) & VC4_HDMI_HOTPLUG_CONNECTED) { + connected = true; + } +@@ -169,13 +202,17 @@ vc4_hdmi_connector_detect(struct drm_connector *connector, bool force) } } +- pm_runtime_put(&vc4_hdmi->pdev->dev); - return connector_status_connected; + vc4_hdmi_enable_scrambling(&vc4_hdmi->encoder.base.base); + @@ -57612,16 +59227,15 @@ index af5f01eff872..6f73fbecfd9c 100644 } cec_phys_addr_invalidate(vc4_hdmi->cec_adap); -- return connector_status_disconnected; + +out: -+ clk_disable_unprepare(vc4_hdmi->hsm_clock); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); + pm_runtime_put(&vc4_hdmi->pdev->dev); +- return connector_status_disconnected; + return ret; } static void vc4_hdmi_connector_destroy(struct drm_connector *connector) -@@ -198,26 +238,97 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) +@@ -202,26 +239,97 @@ static int vc4_hdmi_connector_get_modes(struct drm_connector *connector) ret = drm_add_edid_modes(connector, edid); kfree(edid); @@ -57721,7 +59335,7 @@ index af5f01eff872..6f73fbecfd9c 100644 }; static int vc4_hdmi_connector_init(struct drm_device *dev, -@@ -233,18 +344,35 @@ static int vc4_hdmi_connector_init(struct drm_device *dev, +@@ -237,18 +345,35 @@ static int vc4_hdmi_connector_init(struct drm_device *dev, vc4_hdmi->ddc); drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs); @@ -57757,7 +59371,7 @@ index af5f01eff872..6f73fbecfd9c 100644 drm_connector_attach_encoder(connector, encoder); -@@ -252,7 +380,8 @@ static int vc4_hdmi_connector_init(struct drm_device *dev, +@@ -256,7 +381,8 @@ static int vc4_hdmi_connector_init(struct drm_device *dev, } static int vc4_hdmi_stop_packet(struct drm_encoder *encoder, @@ -57767,7 +59381,7 @@ index af5f01eff872..6f73fbecfd9c 100644 { struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); u32 packet_id = type - 0x80; -@@ -260,6 +389,9 @@ static int vc4_hdmi_stop_packet(struct drm_encoder *encoder, +@@ -264,6 +390,9 @@ static int vc4_hdmi_stop_packet(struct drm_encoder *encoder, HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, HDMI_READ(HDMI_RAM_PACKET_CONFIG) & ~BIT(packet_id)); @@ -57777,7 +59391,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return wait_for(!(HDMI_READ(HDMI_RAM_PACKET_STATUS) & BIT(packet_id)), 100); } -@@ -272,9 +404,11 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, +@@ -276,9 +405,11 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, const struct vc4_hdmi_register *ram_packet_start = &vc4_hdmi->variant->registers[HDMI_RAM_PACKET_START]; u32 packet_reg = ram_packet_start->offset + VC4_HDMI_PACKET_STRIDE * packet_id; @@ -57790,7 +59404,7 @@ index af5f01eff872..6f73fbecfd9c 100644 ssize_t len, i; int ret; -@@ -286,7 +420,7 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, +@@ -290,7 +421,7 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, if (len < 0) return; @@ -57799,7 +59413,7 @@ index af5f01eff872..6f73fbecfd9c 100644 if (ret) { DRM_ERROR("Failed to wait for infoframe to go idle: %d\n", ret); return; -@@ -307,6 +441,13 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, +@@ -311,6 +442,13 @@ static void vc4_hdmi_write_infoframe(struct drm_encoder *encoder, packet_reg += 4; } @@ -57813,7 +59427,7 @@ index af5f01eff872..6f73fbecfd9c 100644 HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, HDMI_READ(HDMI_RAM_PACKET_CONFIG) | BIT(packet_id)); ret = wait_for((HDMI_READ(HDMI_RAM_PACKET_STATUS) & -@@ -338,7 +479,7 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) +@@ -342,7 +480,7 @@ static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder) vc4_encoder->limited_rgb_range ? HDMI_QUANTIZATION_RANGE_LIMITED : HDMI_QUANTIZATION_RANGE_FULL); @@ -57822,42 +59436,42 @@ index af5f01eff872..6f73fbecfd9c 100644 drm_hdmi_avi_infoframe_bars(&frame.avi, cstate); vc4_hdmi_write_infoframe(encoder, &frame); -@@ -363,15 +504,28 @@ static void vc4_hdmi_set_spd_infoframe(struct drm_encoder *encoder) +@@ -367,15 +505,28 @@ static void vc4_hdmi_set_spd_infoframe(struct drm_encoder *encoder) static void vc4_hdmi_set_audio_infoframe(struct drm_encoder *encoder) { struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); + struct hdmi_audio_infoframe *audio = &vc4_hdmi->audio.infoframe; -+ union hdmi_infoframe frame; -+ -+ memcpy(&frame.audio, audio, sizeof(*audio)); -+ vc4_hdmi_write_infoframe(encoder, &frame); -+} -+ -+static void vc4_hdmi_set_hdr_infoframe(struct drm_encoder *encoder) -+{ -+ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); -+ struct drm_connector *connector = &vc4_hdmi->connector; -+ struct drm_connector_state *conn_state = connector->state; union hdmi_infoframe frame; - int ret; - ret = hdmi_audio_infoframe_init(&frame.audio); -+ if (!vc4_hdmi->variant->supports_hdr) -+ return; -+ -+ if (!conn_state->hdr_output_metadata) -+ return; ++ memcpy(&frame.audio, audio, sizeof(*audio)); ++ vc4_hdmi_write_infoframe(encoder, &frame); ++} - frame.audio.coding_type = HDMI_AUDIO_CODING_TYPE_STREAM; - frame.audio.sample_frequency = HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; - frame.audio.sample_size = HDMI_AUDIO_SAMPLE_SIZE_STREAM; - frame.audio.channels = vc4_hdmi->audio.channels; ++static void vc4_hdmi_set_hdr_infoframe(struct drm_encoder *encoder) ++{ ++ struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); ++ struct drm_connector *connector = &vc4_hdmi->connector; ++ struct drm_connector_state *conn_state = connector->state; ++ union hdmi_infoframe frame; ++ ++ if (!vc4_hdmi->variant->supports_hdr) ++ return; ++ ++ if (!conn_state->hdr_output_metadata) ++ return; ++ + if (drm_hdmi_infoframe_set_hdr_metadata(&frame.drm, conn_state)) + return; vc4_hdmi_write_infoframe(encoder, &frame); } -@@ -388,34 +542,128 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder) +@@ -392,33 +543,128 @@ static void vc4_hdmi_set_infoframes(struct drm_encoder *encoder) */ if (vc4_hdmi->audio.streaming) vc4_hdmi_set_audio_infoframe(encoder); @@ -57909,7 +59523,7 @@ index af5f01eff872..6f73fbecfd9c 100644 + queue_delayed_work(system_wq, &vc4_hdmi->scrambling_work, + msecs_to_jiffies(SCRAMBLING_POLLING_DELAY_MS)); +} -+ ++ +static void vc4_hdmi_disable_scrambling(struct drm_encoder *encoder) +{ + struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); @@ -57988,14 +59602,13 @@ index af5f01eff872..6f73fbecfd9c 100644 - HDMI_READ(HDMI_VID_CTL) & ~VC4_HD_VID_CTL_ENABLE); - clk_disable_unprepare(vc4_hdmi->pixel_bvb_clock); -- clk_disable_unprepare(vc4_hdmi->hsm_clock); + if (vc4_hdmi->bvb_req) + clk_request_done(vc4_hdmi->bvb_req); + clk_request_done(vc4_hdmi->hsm_req); clk_disable_unprepare(vc4_hdmi->pixel_clock); ret = pm_runtime_put(&vc4_hdmi->pdev->dev); -@@ -502,6 +750,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) +@@ -505,6 +751,7 @@ static void vc5_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) } static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, @@ -58003,7 +59616,7 @@ index af5f01eff872..6f73fbecfd9c 100644 struct drm_display_mode *mode) { bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; -@@ -514,12 +763,12 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, +@@ -517,12 +764,12 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, VC4_HDMI_VERTA_VFP) | VC4_SET_FIELD(mode->crtc_vdisplay, VC4_HDMI_VERTA_VAL)); u32 vertb = (VC4_SET_FIELD(0, VC4_HDMI_VERTB_VSPO) | @@ -58019,7 +59632,7 @@ index af5f01eff872..6f73fbecfd9c 100644 VC4_HDMI_VERTB_VBP)); HDMI_WRITE(HDMI_HORZA, -@@ -545,7 +794,9 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, +@@ -548,7 +795,9 @@ static void vc4_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, HDMI_WRITE(HDMI_VERTB0, vertb_even); HDMI_WRITE(HDMI_VERTB1, vertb); } @@ -58029,7 +59642,7 @@ index af5f01eff872..6f73fbecfd9c 100644 struct drm_display_mode *mode) { bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; -@@ -558,13 +809,16 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, +@@ -561,13 +810,16 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, VC5_HDMI_VERTA_VFP) | VC4_SET_FIELD(mode->crtc_vdisplay, VC5_HDMI_VERTA_VAL)); u32 vertb = (VC4_SET_FIELD(0, VC5_HDMI_VERTB_VSPO) | @@ -58049,7 +59662,7 @@ index af5f01eff872..6f73fbecfd9c 100644 HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021); HDMI_WRITE(HDMI_HORZA, -@@ -590,6 +844,39 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, +@@ -593,6 +845,44 @@ static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, HDMI_WRITE(HDMI_VERTB0, vertb_even); HDMI_WRITE(HDMI_VERTB1, vertb); @@ -58085,11 +59698,16 @@ index af5f01eff872..6f73fbecfd9c 100644 + reg &= ~VC5_HDMI_GCP_CONFIG_GCP_ENABLE; + reg |= gcp_en ? VC5_HDMI_GCP_CONFIG_GCP_ENABLE : 0; + HDMI_WRITE(HDMI_GCP_CONFIG, reg); ++ ++ reg = HDMI_READ(HDMI_MISC_CONTROL); ++ reg &= ~VC5_HDMI_MISC_CONTROL_PIXEL_REP_MASK; ++ reg |= VC4_SET_FIELD(0, VC5_HDMI_MISC_CONTROL_PIXEL_REP); ++ HDMI_WRITE(HDMI_MISC_CONTROL, reg); + HDMI_WRITE(HDMI_CLOCK_STOP, 0); } -@@ -617,52 +904,47 @@ static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi) +@@ -620,11 +910,17 @@ static void vc4_hdmi_recenter_fifo(struct vc4_hdmi *vc4_hdmi) "VC4_HDMI_FIFO_CTL_RECENTER_DONE"); } @@ -58109,10 +59727,8 @@ index af5f01eff872..6f73fbecfd9c 100644 + unsigned long bvb_rate, pixel_rate, hsm_rate; int ret; - ret = pm_runtime_get_sync(&vc4_hdmi->pdev->dev); - if (ret < 0) { - DRM_ERROR("Failed to retain power domain: %d\n", ret); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); + ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); +@@ -633,65 +929,51 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) return; } @@ -58121,15 +59737,15 @@ index af5f01eff872..6f73fbecfd9c 100644 ret = clk_set_rate(vc4_hdmi->pixel_clock, pixel_rate); if (ret) { DRM_ERROR("Failed to set pixel clock rate: %d\n", ret); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); - return; +- return; ++ goto err_runtime_pm; } ret = clk_prepare_enable(vc4_hdmi->pixel_clock); if (ret) { DRM_ERROR("Failed to turn on pixel clock: %d\n", ret); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); - return; +- return; ++ goto err_runtime_pm; } - /* @@ -58152,17 +59768,14 @@ index af5f01eff872..6f73fbecfd9c 100644 - ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate); - if (ret) { - DRM_ERROR("Failed to set HSM clock rate: %d\n", ret); +- return; + hsm_rate = vc4_hdmi->variant->calc_hsm_clock(vc4_hdmi, pixel_rate); + vc4_hdmi->hsm_req = clk_request_start(vc4_hdmi->hsm_clock, hsm_rate); + if (IS_ERR(vc4_hdmi->hsm_req)) { + DRM_ERROR("Failed to set HSM clock rate: %ld\n", PTR_ERR(vc4_hdmi->hsm_req)); -+ clk_disable_unprepare(vc4_hdmi->pixel_clock); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); - return; ++ goto err_disable_pixel_clk; } -@@ -675,29 +957,36 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) - vc4_hdmi_cec_update_clk_div(vc4_hdmi); - /* @@ -58173,7 +59786,8 @@ index af5f01eff872..6f73fbecfd9c 100644 - (hsm_rate > VC4_HSM_MID_CLOCK ? 150000000 : 75000000)); - if (ret) { - DRM_ERROR("Failed to set pixel bvb clock rate: %d\n", ret); -- clk_disable_unprepare(vc4_hdmi->hsm_clock); +- clk_disable_unprepare(vc4_hdmi->pixel_clock); +- return; + if (pixel_rate > 297000000) + bvb_rate = 300000000; + else if (pixel_rate > 148500000) @@ -58181,26 +59795,20 @@ index af5f01eff872..6f73fbecfd9c 100644 + else + bvb_rate = 75000000; + -+ if (vc4_hdmi->pixel_bvb_clock) ++ if (vc4_hdmi->pixel_bvb_clock) { + vc4_hdmi->bvb_req = clk_request_start(vc4_hdmi->pixel_bvb_clock, bvb_rate); -+ if (IS_ERR(vc4_hdmi->bvb_req)) { -+ DRM_ERROR("Failed to set pixel bvb clock rate: %ld\n", PTR_ERR(vc4_hdmi->bvb_req)); -+ clk_request_done(vc4_hdmi->hsm_req); - clk_disable_unprepare(vc4_hdmi->pixel_clock); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); - return; ++ if (IS_ERR(vc4_hdmi->bvb_req)) { ++ DRM_ERROR("Failed to set pixel bvb clock rate: %ld\n", PTR_ERR(vc4_hdmi->bvb_req)); ++ goto err_remove_hsm_req; ++ } } ret = clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); if (ret) { DRM_ERROR("Failed to turn on pixel bvb clock: %d\n", ret); -- clk_disable_unprepare(vc4_hdmi->hsm_clock); -+ if (vc4_hdmi->bvb_req) -+ clk_request_done(vc4_hdmi->bvb_req); -+ clk_request_done(vc4_hdmi->hsm_req); - clk_disable_unprepare(vc4_hdmi->pixel_clock); -+ pm_runtime_put(&vc4_hdmi->pdev->dev); - return; +- clk_disable_unprepare(vc4_hdmi->pixel_clock); +- return; ++ goto err_remove_bvb_req; } if (vc4_hdmi->variant->phy_init) @@ -58209,12 +59817,25 @@ index af5f01eff872..6f73fbecfd9c 100644 HDMI_WRITE(HDMI_SCHEDULER_CONTROL, HDMI_READ(HDMI_SCHEDULER_CONTROL) | -@@ -705,10 +994,11 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) +@@ -699,10 +981,24 @@ static void vc4_hdmi_encoder_pre_crtc_configure(struct drm_encoder *encoder) VC4_HDMI_SCHEDULER_CONTROL_IGNORE_VSYNC_PREDICTS); if (vc4_hdmi->variant->set_timings) - vc4_hdmi->variant->set_timings(vc4_hdmi, mode); + vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode); ++ ++ return; ++ ++err_remove_bvb_req: ++ if (vc4_hdmi->bvb_req) ++ clk_request_done(vc4_hdmi->bvb_req); ++err_remove_hsm_req: ++ clk_request_done(vc4_hdmi->hsm_req); ++err_disable_pixel_clk: ++ clk_disable_unprepare(vc4_hdmi->pixel_clock); ++err_runtime_pm: ++ pm_runtime_put(&vc4_hdmi->pdev->dev); ++ return; } -static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder) @@ -58223,7 +59844,7 @@ index af5f01eff872..6f73fbecfd9c 100644 { struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); -@@ -730,7 +1020,8 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder) +@@ -724,7 +1020,8 @@ static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder) HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N); } @@ -58233,7 +59854,7 @@ index af5f01eff872..6f73fbecfd9c 100644 { struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); -@@ -741,6 +1032,7 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder) +@@ -735,6 +1032,7 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder) HDMI_WRITE(HDMI_VID_CTL, VC4_HD_VID_CTL_ENABLE | @@ -58241,7 +59862,7 @@ index af5f01eff872..6f73fbecfd9c 100644 VC4_HD_VID_CTL_UNDERFLOW_ENABLE | VC4_HD_VID_CTL_FRAME_COUNTER_RESET | (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW) | -@@ -786,6 +1078,7 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder) +@@ -780,6 +1078,7 @@ static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder) } vc4_hdmi_recenter_fifo(vc4_hdmi); @@ -58249,7 +59870,7 @@ index af5f01eff872..6f73fbecfd9c 100644 } static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) -@@ -799,12 +1092,14 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder, +@@ -793,12 +1092,14 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder, struct drm_crtc_state *crtc_state, struct drm_connector_state *conn_state) { @@ -58264,7 +59885,7 @@ index af5f01eff872..6f73fbecfd9c 100644 ((mode->hdisplay % 2) || (mode->hsync_start % 2) || (mode->hsync_end % 2) || (mode->htotal % 2))) return -EINVAL; -@@ -823,12 +1118,25 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder, +@@ -817,12 +1118,25 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder, pixel_rate = mode->clock * 1000; } @@ -58290,7 +59911,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return 0; } -@@ -839,6 +1147,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder, +@@ -833,6 +1147,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder, struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); if (vc4_hdmi->variant->unsupported_odd_h_timings && @@ -58298,7 +59919,7 @@ index af5f01eff872..6f73fbecfd9c 100644 ((mode->hdisplay % 2) || (mode->hsync_start % 2) || (mode->hsync_end % 2) || (mode->htotal % 2))) return MODE_H_ILLEGAL; -@@ -846,6 +1155,9 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder, +@@ -840,6 +1155,9 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder, if ((mode->clock * 1000) > vc4_hdmi->variant->max_pixel_clock) return MODE_CLOCK_HIGH; @@ -58308,7 +59929,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return MODE_OK; } -@@ -856,6 +1168,39 @@ static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = { +@@ -850,6 +1168,39 @@ static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = { .enable = vc4_hdmi_encoder_enable, }; @@ -58342,13 +59963,13 @@ index af5f01eff872..6f73fbecfd9c 100644 + * pixel clock, but HSM ends up being the limiting factor. + */ + -+ return max_t(unsigned long, 120000000, (pixel_rate / 100) * 101); ++ return max_t(unsigned long, HSM_MIN_CLOCK_FREQ, (pixel_rate / 100) * 101); +} + static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) { int i; -@@ -881,12 +1226,13 @@ static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) +@@ -875,12 +1226,13 @@ static u32 vc5_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) } /* HDMI audio codec callbacks */ @@ -58364,7 +59985,7 @@ index af5f01eff872..6f73fbecfd9c 100644 VC4_HD_MAI_SMP_N_MASK >> VC4_HD_MAI_SMP_N_SHIFT, (VC4_HD_MAI_SMP_M_MASK >> -@@ -898,12 +1244,11 @@ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi) +@@ -892,12 +1244,11 @@ static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi) VC4_SET_FIELD(m - 1, VC4_HD_MAI_SMP_M)); } @@ -58378,7 +59999,7 @@ index af5f01eff872..6f73fbecfd9c 100644 u32 n, cts; u64 tmp; -@@ -932,18 +1277,10 @@ static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai) +@@ -926,18 +1277,10 @@ static inline struct vc4_hdmi *dai_to_hdmi(struct snd_soc_dai *dai) return snd_soc_card_get_drvdata(card); } @@ -58399,7 +60020,7 @@ index af5f01eff872..6f73fbecfd9c 100644 /* * If the HDMI encoder hasn't probed, or the encoder is -@@ -953,15 +1290,18 @@ static int vc4_hdmi_audio_startup(struct snd_pcm_substream *substream, +@@ -947,15 +1290,18 @@ static int vc4_hdmi_audio_startup(struct snd_pcm_substream *substream, VC4_HDMI_RAM_PACKET_ENABLE)) return -ENODEV; @@ -58425,7 +60046,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return 0; } -@@ -972,7 +1312,7 @@ static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) +@@ -966,7 +1312,7 @@ static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) int ret; vc4_hdmi->audio.streaming = false; @@ -58434,7 +60055,7 @@ index af5f01eff872..6f73fbecfd9c 100644 if (ret) dev_err(dev, "Failed to stop audio infoframe: %d\n", ret); -@@ -981,48 +1321,96 @@ static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) +@@ -975,48 +1321,96 @@ static void vc4_hdmi_audio_reset(struct vc4_hdmi *vc4_hdmi) HDMI_WRITE(HDMI_MAI_CTL, VC4_HD_MAI_CTL_FLUSH); } @@ -58557,7 +60178,7 @@ index af5f01eff872..6f73fbecfd9c 100644 /* The B frame identifier should match the value used by alsa-lib (8) */ audio_packet_config = -@@ -1030,122 +1418,33 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream, +@@ -1024,122 +1418,33 @@ static int vc4_hdmi_audio_hw_params(struct snd_pcm_substream *substream, VC4_HDMI_AUDIO_PACKET_ZERO_DATA_ON_INACTIVE_CHANNELS | VC4_SET_FIELD(0x8, VC4_HDMI_AUDIO_PACKET_B_FRAME_IDENTIFIER); @@ -58690,7 +60311,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static const struct snd_soc_dapm_widget vc4_hdmi_audio_widgets[] = { SND_SOC_DAPM_OUTPUT("TX"), }; -@@ -1156,8 +1455,6 @@ static const struct snd_soc_dapm_route vc4_hdmi_audio_routes[] = { +@@ -1150,8 +1455,6 @@ static const struct snd_soc_dapm_route vc4_hdmi_audio_routes[] = { static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = { .name = "vc4-hdmi-codec-dai-component", @@ -58699,7 +60320,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .dapm_widgets = vc4_hdmi_audio_widgets, .num_dapm_widgets = ARRAY_SIZE(vc4_hdmi_audio_widgets), .dapm_routes = vc4_hdmi_audio_routes, -@@ -1168,28 +1465,6 @@ static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = { +@@ -1162,28 +1465,6 @@ static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = { .non_legacy_dai_naming = 1, }; @@ -58728,7 +60349,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static const struct snd_soc_component_driver vc4_hdmi_audio_cpu_dai_comp = { .name = "vc4-hdmi-cpu-dai-component", }; -@@ -1216,7 +1491,6 @@ static struct snd_soc_dai_driver vc4_hdmi_audio_cpu_dai_drv = { +@@ -1210,7 +1491,6 @@ static struct snd_soc_dai_driver vc4_hdmi_audio_cpu_dai_drv = { SNDRV_PCM_RATE_192000, .formats = SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE, }, @@ -58736,7 +60357,7 @@ index af5f01eff872..6f73fbecfd9c 100644 }; static const struct snd_dmaengine_pcm_config pcm_conf = { -@@ -1224,6 +1498,31 @@ static const struct snd_dmaengine_pcm_config pcm_conf = { +@@ -1218,6 +1498,31 @@ static const struct snd_dmaengine_pcm_config pcm_conf = { .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, }; @@ -58768,7 +60389,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) { const struct vc4_hdmi_register *mai_data = -@@ -1231,13 +1530,16 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) +@@ -1225,13 +1530,16 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) struct snd_soc_dai_link *dai_link = &vc4_hdmi->audio.link; struct snd_soc_card *card = &vc4_hdmi->audio.card; struct device *dev = &vc4_hdmi->pdev->dev; @@ -58787,7 +60408,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return 0; } -@@ -1277,12 +1579,13 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) +@@ -1271,12 +1579,13 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) return ret; } @@ -58807,7 +60428,7 @@ index af5f01eff872..6f73fbecfd9c 100644 } dai_link->cpus = &vc4_hdmi->audio.cpu; -@@ -1295,9 +1598,9 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) +@@ -1289,9 +1598,9 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) dai_link->name = "MAI"; dai_link->stream_name = "MAI PCM"; @@ -58819,17 +60440,18 @@ index af5f01eff872..6f73fbecfd9c 100644 dai_link->platforms->name = dev_name(dev); card->dai_link = dai_link; -@@ -1323,16 +1626,76 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) +@@ -1317,16 +1626,77 @@ static int vc4_hdmi_audio_init(struct vc4_hdmi *vc4_hdmi) } +static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv) +{ + struct vc4_hdmi *vc4_hdmi = priv; -+ struct drm_device *dev = vc4_hdmi->connector.dev; ++ struct drm_connector *connector = &vc4_hdmi->connector; ++ struct drm_device *dev = connector->dev; + + if (dev && dev->registered) -+ drm_kms_helper_hotplug_event(dev); ++ drm_connector_helper_hpd_irq_event(connector); + + return IRQ_HANDLED; +} @@ -58902,7 +60524,7 @@ index af5f01eff872..6f73fbecfd9c 100644 cec_transmit_done(vc4_hdmi->cec_adap, CEC_TX_STATUS_OK, 0, 0, 0, 0); } else { -@@ -1346,6 +1709,19 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) +@@ -1340,6 +1710,19 @@ static irqreturn_t vc4_cec_irq_handler_thread(int irq, void *priv) return IRQ_HANDLED; } @@ -58922,7 +60544,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) { struct drm_device *dev = vc4_hdmi->connector.dev; -@@ -1370,76 +1746,125 @@ static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) +@@ -1364,76 +1747,125 @@ static void vc4_cec_read_msg(struct vc4_hdmi *vc4_hdmi, u32 cntrl1) } } @@ -59001,11 +60623,11 @@ index af5f01eff872..6f73fbecfd9c 100644 - u32 val = HDMI_READ(HDMI_CEC_CNTRL_5); + u32 val; + int ret; -+ + + ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); + if (ret) + return ret; - ++ + val = HDMI_READ(HDMI_CEC_CNTRL_5); val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | VC4_HDMI_CEC_CNT_TO_4700_US_MASK | @@ -59090,7 +60712,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr) { struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); -@@ -1491,11 +1916,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +@@ -1485,11 +1917,14 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) { struct cec_connector_info conn_info; struct platform_device *pdev = vc4_hdmi->pdev; @@ -59106,7 +60728,7 @@ index af5f01eff872..6f73fbecfd9c 100644 vc4_hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, vc4_hdmi, "vc4", -@@ -1508,8 +1936,6 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +@@ -1502,8 +1937,6 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); @@ -59115,7 +60737,7 @@ index af5f01eff872..6f73fbecfd9c 100644 value = HDMI_READ(HDMI_CEC_CNTRL_1); /* Set the logical address to Unregistered */ value |= VC4_HDMI_CEC_ADDR_MASK; -@@ -1517,19 +1943,47 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +@@ -1511,19 +1944,47 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) vc4_hdmi_cec_update_clk_div(vc4_hdmi); @@ -59170,7 +60792,7 @@ index af5f01eff872..6f73fbecfd9c 100644 err_delete_cec_adap: cec_delete_adapter(vc4_hdmi->cec_adap); -@@ -1538,6 +1992,15 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) +@@ -1532,6 +1993,15 @@ static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) { @@ -59186,7 +60808,7 @@ index af5f01eff872..6f73fbecfd9c 100644 cec_unregister_adapter(vc4_hdmi->cec_adap); } #else -@@ -1622,6 +2085,7 @@ static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) +@@ -1616,6 +2086,7 @@ static int vc4_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) return PTR_ERR(vc4_hdmi->hsm_clock); } vc4_hdmi->audio_clock = vc4_hdmi->hsm_clock; @@ -59194,7 +60816,7 @@ index af5f01eff872..6f73fbecfd9c 100644 return 0; } -@@ -1631,6 +2095,7 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) +@@ -1625,6 +2096,7 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) struct platform_device *pdev = vc4_hdmi->pdev; struct device *dev = &pdev->dev; struct resource *res; @@ -59202,7 +60824,7 @@ index af5f01eff872..6f73fbecfd9c 100644 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi"); if (!res) -@@ -1715,15 +2180,76 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) +@@ -1709,12 +2181,50 @@ static int vc5_hdmi_init_resources(struct vc4_hdmi *vc4_hdmi) return PTR_ERR(vc4_hdmi->audio_clock); } @@ -59249,37 +60871,11 @@ index af5f01eff872..6f73fbecfd9c 100644 + ret = vc4_hdmi_build_regset(vc4_hdmi, &vc4_hdmi->rm_regset, VC5_RM); + if (ret) + return ret; -+ -+ return 0; -+} -+ -+#ifdef CONFIG_PM -+static int vc4_hdmi_runtime_suspend(struct device *dev) -+{ -+ struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); -+ -+ clk_disable_unprepare(vc4_hdmi->hsm_clock); + return 0; } -+static int vc4_hdmi_runtime_resume(struct device *dev) -+{ -+ struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); -+ int ret; -+ -+ ret = clk_prepare_enable(vc4_hdmi->hsm_clock); -+ if (ret) -+ return ret; -+ -+ return 0; -+} -+#endif -+ - static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) - { - const struct vc4_hdmi_variant *variant = of_device_get_match_data(dev); -@@ -1738,6 +2264,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) +@@ -1755,6 +2265,7 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL); if (!vc4_hdmi) return -ENOMEM; @@ -59287,12 +60883,10 @@ index af5f01eff872..6f73fbecfd9c 100644 dev_set_drvdata(dev, vc4_hdmi); encoder = &vc4_hdmi->encoder.base.base; -@@ -1787,11 +2314,29 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) +@@ -1804,6 +2315,52 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) vc4_hdmi->disable_wifi_frequencies = of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence"); -- if (vc4_hdmi->variant->reset) -- vc4_hdmi->variant->reset(vc4_hdmi); + if (variant->max_pixel_clock == 600000000) { + struct vc4_dev *vc4 = to_vc4_dev(drm); + long max_rate = clk_round_rate(vc4->hvs->core_clk, 550000000); @@ -59300,7 +60894,33 @@ index af5f01eff872..6f73fbecfd9c 100644 + if (max_rate < 550000000) + vc4_hdmi->disable_4kp60 = true; + } - ++ ++ /* ++ * If we boot without any cable connected to the HDMI connector, ++ * the firmware will skip the HSM initialization and leave it ++ * with a rate of 0, resulting in a bus lockup when we're ++ * accessing the registers even if it's enabled. ++ * ++ * Let's put a sensible default at runtime_resume so that we ++ * don't end up in this situation. ++ * ++ * Strictly speaking we should be using clk_set_min_rate. ++ * However, the clk-bcm2835 clock driver favors clock rates ++ * under the expected rate, which in the case where we set the ++ * minimum clock rate will be rejected by the clock framework. ++ * ++ * However, even for the two HDMI controllers found on the ++ * BCM2711, using clk_set_rate doesn't cause any issue. Indeed, ++ * the bind callbacks are called in sequence, and before the DRM ++ * device is registered and therefore a mode is set. As such, ++ * we're not at risk of having the first controller set a ++ * different mode and then the second overriding the HSM clock ++ * frequency in its bind. ++ */ ++ ret = clk_set_rate(vc4_hdmi->hsm_clock, HSM_MIN_CLOCK_FREQ); ++ if (ret) ++ goto err_put_ddc; ++ + /* + * We need to have the device powered up at this point to call + * our reset hook and for the CEC init. @@ -59311,15 +60931,21 @@ index af5f01eff872..6f73fbecfd9c 100644 + + pm_runtime_get_noresume(dev); + pm_runtime_set_active(dev); - pm_runtime_enable(dev); - -+ if (vc4_hdmi->variant->reset) -+ vc4_hdmi->variant->reset(vc4_hdmi); ++ pm_runtime_enable(dev); + + if (vc4_hdmi->variant->reset) + vc4_hdmi->variant->reset(vc4_hdmi); + +@@ -1815,8 +2372,6 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) + clk_prepare_enable(vc4_hdmi->pixel_bvb_clock); + } + +- pm_runtime_enable(dev); +- drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS); drm_encoder_helper_add(encoder, &vc4_hdmi_encoder_helper_funcs); -@@ -1799,10 +2344,14 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) +@@ -1824,10 +2379,14 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) if (ret) goto err_destroy_encoder; @@ -59335,7 +60961,7 @@ index af5f01eff872..6f73fbecfd9c 100644 ret = vc4_hdmi_audio_init(vc4_hdmi); if (ret) goto err_free_cec; -@@ -1811,14 +2360,22 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) +@@ -1836,14 +2395,19 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) vc4_hdmi_debugfs_regs, vc4_hdmi); @@ -59352,13 +60978,10 @@ index af5f01eff872..6f73fbecfd9c 100644 err_destroy_encoder: drm_encoder_cleanup(encoder); + pm_runtime_put_sync(dev); -+ pm_runtime_disable(dev); -+err_put_ddc: -+ put_device(&vc4_hdmi->ddc->dev); - err_unprepare_hsm: pm_runtime_disable(dev); + err_put_ddc: put_device(&vc4_hdmi->ddc->dev); -@@ -1856,6 +2413,7 @@ static void vc4_hdmi_unbind(struct device *dev, struct device *master, +@@ -1881,6 +2445,7 @@ static void vc4_hdmi_unbind(struct device *dev, struct device *master, kfree(vc4_hdmi->hd_regset.regs); vc4_hdmi_cec_exit(vc4_hdmi); @@ -59366,7 +60989,7 @@ index af5f01eff872..6f73fbecfd9c 100644 vc4_hdmi_connector_destroy(&vc4_hdmi->connector); drm_encoder_cleanup(&vc4_hdmi->encoder.base.base); -@@ -1885,7 +2443,6 @@ static const struct vc4_hdmi_variant bcm2835_variant = { +@@ -1910,7 +2475,6 @@ static const struct vc4_hdmi_variant bcm2835_variant = { .debugfs_name = "hdmi_regs", .card_name = "vc4-hdmi", .max_pixel_clock = 162000000, @@ -59374,7 +60997,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .registers = vc4_hdmi_fields, .num_registers = ARRAY_SIZE(vc4_hdmi_fields), -@@ -1897,14 +2454,16 @@ static const struct vc4_hdmi_variant bcm2835_variant = { +@@ -1922,14 +2486,16 @@ static const struct vc4_hdmi_variant bcm2835_variant = { .phy_disable = vc4_hdmi_phy_disable, .phy_rng_enable = vc4_hdmi_phy_rng_enable, .phy_rng_disable = vc4_hdmi_phy_rng_disable, @@ -59392,7 +61015,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .registers = vc5_hdmi_hdmi0_fields, .num_registers = ARRAY_SIZE(vc5_hdmi_hdmi0_fields), .phy_lane_mapping = { -@@ -1914,6 +2473,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = { +@@ -1939,6 +2505,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = { PHY_LANE_CK, }, .unsupported_odd_h_timings = true, @@ -59400,7 +61023,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .init_resources = vc5_hdmi_init_resources, .csc_setup = vc5_hdmi_csc_setup, -@@ -1923,14 +2483,16 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = { +@@ -1948,14 +2515,16 @@ static const struct vc4_hdmi_variant bcm2711_hdmi0_variant = { .phy_disable = vc5_hdmi_phy_disable, .phy_rng_enable = vc5_hdmi_phy_rng_enable, .phy_rng_disable = vc5_hdmi_phy_rng_disable, @@ -59418,7 +61041,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .registers = vc5_hdmi_hdmi1_fields, .num_registers = ARRAY_SIZE(vc5_hdmi_hdmi1_fields), .phy_lane_mapping = { -@@ -1940,6 +2502,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { +@@ -1965,6 +2534,7 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { PHY_LANE_2, }, .unsupported_odd_h_timings = true, @@ -59426,7 +61049,7 @@ index af5f01eff872..6f73fbecfd9c 100644 .init_resources = vc5_hdmi_init_resources, .csc_setup = vc5_hdmi_csc_setup, -@@ -1949,7 +2512,9 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { +@@ -1974,7 +2544,9 @@ static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { .phy_disable = vc5_hdmi_phy_disable, .phy_rng_enable = vc5_hdmi_phy_rng_enable, .phy_rng_disable = vc5_hdmi_phy_rng_disable, @@ -59437,7 +61060,7 @@ index af5f01eff872..6f73fbecfd9c 100644 static const struct of_device_id vc4_hdmi_dt_match[] = { diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.h b/drivers/gpu/drm/vc4/vc4_hdmi.h -index 0526a9cf608a..49fc91962fe4 100644 +index 0526a9cf608a3..49fc91962fe45 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi.h @@ -21,10 +21,9 @@ to_vc4_hdmi_encoder(struct drm_encoder *encoder) @@ -59598,7 +61221,7 @@ index 0526a9cf608a..49fc91962fe4 100644 void vc5_hdmi_phy_rng_enable(struct vc4_hdmi *vc4_hdmi); void vc5_hdmi_phy_rng_disable(struct vc4_hdmi *vc4_hdmi); diff --git a/drivers/gpu/drm/vc4/vc4_hdmi_phy.c b/drivers/gpu/drm/vc4/vc4_hdmi_phy.c -index 057796b54c51..36535480f8e2 100644 +index 057796b54c51a..36535480f8e2b 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi_phy.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi_phy.c @@ -127,7 +127,8 @@ @@ -59627,7 +61250,7 @@ index 057796b54c51..36535480f8e2 100644 unsigned char word_sel; u8 vco_sel, vco_div; diff --git a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h -index 6c0dfbbe1a7e..99dde6e06a37 100644 +index 6c0dfbbe1a7ef..23930a8fa3769 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h @@ -1,6 +1,8 @@ @@ -59660,7 +61283,15 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 HDMI_SW_RESET_CONTROL, HDMI_TX_PHY_CHANNEL_SWAP, HDMI_TX_PHY_CLK_DIV, -@@ -143,7 +149,7 @@ struct vc4_hdmi_register { +@@ -119,6 +125,7 @@ enum vc4_hdmi_field { + HDMI_VERTB0, + HDMI_VERTB1, + HDMI_VID_CTL, ++ HDMI_MISC_CONTROL, + }; + + struct vc4_hdmi_register { +@@ -143,7 +150,7 @@ struct vc4_hdmi_register { #define VC5_RAM_REG(reg, offset) _VC4_REG(VC5_RAM, reg, offset) #define VC5_RM_REG(reg, offset) _VC4_REG(VC5_RM, reg, offset) @@ -59669,7 +61300,7 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 VC4_HD_REG(HDMI_M_CTL, 0x000c), VC4_HD_REG(HDMI_MAI_CTL, 0x0014), VC4_HD_REG(HDMI_MAI_THR, 0x0018), -@@ -205,7 +211,7 @@ static const struct vc4_hdmi_register vc4_hdmi_fields[] = { +@@ -205,7 +212,7 @@ static const struct vc4_hdmi_register vc4_hdmi_fields[] = { VC4_HDMI_REG(HDMI_RAM_PACKET_START, 0x0400), }; @@ -59678,8 +61309,11 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 VC4_HD_REG(HDMI_DVP_CTL, 0x0000), VC4_HD_REG(HDMI_MAI_CTL, 0x0010), VC4_HD_REG(HDMI_MAI_THR, 0x0014), -@@ -231,7 +237,11 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi0_fields[] = { +@@ -229,9 +236,14 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi0_fields[] = { + VC4_HDMI_REG(HDMI_VERTB0, 0x0f0), + VC4_HDMI_REG(HDMI_VERTA1, 0x0f4), VC4_HDMI_REG(HDMI_VERTB1, 0x0f8), ++ VC4_HDMI_REG(HDMI_MISC_CONTROL, 0x100), VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c), VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0), + VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170), @@ -59690,7 +61324,7 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc), VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0), -@@ -281,7 +291,7 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi0_fields[] = { +@@ -281,7 +293,7 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi0_fields[] = { VC5_CSC_REG(HDMI_CSC_34_33, 0x018), }; @@ -59699,8 +61333,11 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 VC4_HD_REG(HDMI_DVP_CTL, 0x0000), VC4_HD_REG(HDMI_MAI_CTL, 0x0030), VC4_HD_REG(HDMI_MAI_THR, 0x0034), -@@ -307,7 +317,11 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi1_fields[] = { +@@ -305,9 +317,14 @@ static const struct vc4_hdmi_register vc5_hdmi_hdmi1_fields[] = { + VC4_HDMI_REG(HDMI_VERTB0, 0x0f0), + VC4_HDMI_REG(HDMI_VERTA1, 0x0f4), VC4_HDMI_REG(HDMI_VERTB1, 0x0f8), ++ VC4_HDMI_REG(HDMI_MISC_CONTROL, 0x100), VC4_HDMI_REG(HDMI_MAI_CHANNEL_MAP, 0x09c), VC4_HDMI_REG(HDMI_MAI_CONFIG, 0x0a0), + VC4_HDMI_REG(HDMI_DEEP_COLOR_CONFIG_1, 0x170), @@ -59711,7 +61348,7 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 VC5_DVP_REG(HDMI_CLOCK_STOP, 0x0bc), VC5_DVP_REG(HDMI_VEC_INTERFACE_XBAR, 0x0f0), -@@ -400,6 +414,8 @@ static inline u32 vc4_hdmi_read(struct vc4_hdmi *hdmi, +@@ -400,6 +417,8 @@ static inline u32 vc4_hdmi_read(struct vc4_hdmi *hdmi, const struct vc4_hdmi_variant *variant = hdmi->variant; void __iomem *base; @@ -59720,7 +61357,7 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 if (reg >= variant->num_registers) { dev_warn(&hdmi->pdev->dev, "Invalid register ID %u\n", reg); -@@ -426,6 +442,8 @@ static inline void vc4_hdmi_write(struct vc4_hdmi *hdmi, +@@ -426,6 +445,8 @@ static inline void vc4_hdmi_write(struct vc4_hdmi *hdmi, const struct vc4_hdmi_variant *variant = hdmi->variant; void __iomem *base; @@ -59730,7 +61367,7 @@ index 6c0dfbbe1a7e..99dde6e06a37 100644 dev_warn(&hdmi->pdev->dev, "Invalid register ID %u\n", reg); diff --git a/drivers/gpu/drm/vc4/vc4_hvs.c b/drivers/gpu/drm/vc4/vc4_hvs.c -index ad691571d759..6049923422d0 100644 +index ad691571d759f..6049923422d08 100644 --- a/drivers/gpu/drm/vc4/vc4_hvs.c +++ b/drivers/gpu/drm/vc4/vc4_hvs.c @@ -95,6 +95,45 @@ static int vc4_hvs_debugfs_underrun(struct seq_file *m, void *data) @@ -59855,7 +61492,7 @@ index ad691571d759..6049923422d0 100644 return 0; } diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c -index ba310c0ab5f6..fb2465964d46 100644 +index ba310c0ab5f69..fb2465964d463 100644 --- a/drivers/gpu/drm/vc4/vc4_kms.c +++ b/drivers/gpu/drm/vc4/vc4_kms.c @@ -40,6 +40,9 @@ static struct vc4_ctm_state *to_vc4_ctm_state(struct drm_private_state *priv) @@ -60176,7 +61813,7 @@ index ba310c0ab5f6..fb2465964d46 100644 ret = vc4_ctm_obj_init(vc4); if (ret) diff --git a/drivers/gpu/drm/vc4/vc4_perfmon.c b/drivers/gpu/drm/vc4/vc4_perfmon.c -index f4aa75efd16b..18abc06335c1 100644 +index f4aa75efd16b0..18abc06335c11 100644 --- a/drivers/gpu/drm/vc4/vc4_perfmon.c +++ b/drivers/gpu/drm/vc4/vc4_perfmon.c @@ -77,7 +77,7 @@ struct vc4_perfmon *vc4_perfmon_find(struct vc4_file *vc4file, int id) @@ -60189,7 +61826,7 @@ index f4aa75efd16b..18abc06335c1 100644 static int vc4_perfmon_idr_del(int id, void *elem, void *data) diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c -index af4b8944a603..7947cf47b6e1 100644 +index af4b8944a6032..7947cf47b6e13 100644 --- a/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c @@ -33,6 +33,7 @@ static const struct hvs_format { @@ -60551,7 +62188,7 @@ index af4b8944a603..7947cf47b6e1 100644 } diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h -index be2c32a519b3..7538b84a6dca 100644 +index be2c32a519b31..7538b84a6dcaa 100644 --- a/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h @@ -516,6 +516,36 @@ @@ -60633,7 +62270,7 @@ index be2c32a519b3..7538b84a6dca 100644 #define SCALER_TPZ0_VERT_RECALC BIT(31) #define SCALER_TPZ0_SCALE_MASK VC4_MASK(28, 8) diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c -index 849dcafbfff1..c0122d83b651 100644 +index d13502ae973dd..2fc7f4b5fa098 100644 --- a/drivers/gpu/drm/vc4/vc4_txp.c +++ b/drivers/gpu/drm/vc4/vc4_txp.c @@ -13,6 +13,7 @@ @@ -60710,7 +62347,7 @@ index 849dcafbfff1..c0122d83b651 100644 /* * Make sure we issue a vblank event after disabling the CRTC if diff --git a/drivers/gpu/drm/vc4/vc4_vec.c b/drivers/gpu/drm/vc4/vc4_vec.c -index bd5b8eb58b18..596b59ff6c9a 100644 +index bd5b8eb58b180..596b59ff6c9ad 100644 --- a/drivers/gpu/drm/vc4/vc4_vec.c +++ b/drivers/gpu/drm/vc4/vc4_vec.c @@ -45,6 +45,7 @@ @@ -61151,7 +62788,7 @@ index bd5b8eb58b18..596b59ff6c9a 100644 + "\t\t\tNTSC otherwise"); diff --git a/drivers/gpu/drm/vc4/vc_image_types.h b/drivers/gpu/drm/vc4/vc_image_types.h new file mode 100644 -index 000000000000..e8d2b4b162f7 +index 0000000000000..e8d2b4b162f7c --- /dev/null +++ b/drivers/gpu/drm/vc4/vc_image_types.h @@ -0,0 +1,175 @@ @@ -61331,7 +62968,7 @@ index 000000000000..e8d2b4b162f7 + VC_IMAGE_YUVINFO_CSC_REC_2020 = 9, +}; diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c -index f84b7e61311b..4bf74836bd53 100644 +index f84b7e61311bc..4bf74836bd53f 100644 --- a/drivers/gpu/drm/virtio/virtgpu_display.c +++ b/drivers/gpu/drm/virtio/virtgpu_display.c @@ -95,12 +95,12 @@ static void virtio_gpu_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -61366,7 +63003,7 @@ index f84b7e61311b..4bf74836bd53 100644 struct virtio_gpu_output *output = drm_crtc_to_virtio_gpu_output(crtc); diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c -index 1ae5cd47d954..758d8a98d96b 100644 +index 1ae5cd47d9546..758d8a98d96b3 100644 --- a/drivers/gpu/drm/vkms/vkms_crtc.c +++ b/drivers/gpu/drm/vkms/vkms_crtc.c @@ -169,9 +169,11 @@ static const struct drm_crtc_funcs vkms_crtc_funcs = { @@ -61443,7 +63080,7 @@ index 1ae5cd47d954..758d8a98d96b 100644 struct vkms_output *vkms_output = drm_crtc_to_vkms_output(crtc); diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c b/drivers/gpu/drm/vkms/vkms_writeback.c -index 094fa4aa061d..c0a53a2cbbf1 100644 +index 094fa4aa061d0..c0a53a2cbbf1c 100644 --- a/drivers/gpu/drm/vkms/vkms_writeback.c +++ b/drivers/gpu/drm/vkms/vkms_writeback.c @@ -1,6 +1,8 @@ @@ -61477,7 +63114,7 @@ index 094fa4aa061d..c0a53a2cbbf1 100644 static const struct drm_connector_helper_funcs vkms_wb_conn_helper_funcs = { diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c -index 312ed0881a99..bc67f2b930e1 100644 +index 312ed0881a99b..bc67f2b930e1f 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c @@ -522,8 +522,10 @@ int vmw_du_cursor_plane_atomic_check(struct drm_plane *plane, @@ -61509,7 +63146,7 @@ index 312ed0881a99..bc67f2b930e1 100644 struct drm_pending_vblank_event *event = crtc->state->event; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h -index 3ee03227607c..03f3694015ce 100644 +index 3ee03227607c6..03f3694015cec 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h @@ -473,11 +473,11 @@ void vmw_du_plane_unpin_surf(struct vmw_plane_state *vps, @@ -61528,7 +63165,7 @@ index 3ee03227607c..03f3694015ce 100644 struct drm_crtc_state *vmw_du_crtc_duplicate_state(struct drm_crtc *crtc); void vmw_du_crtc_destroy_state(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c -index c4017c7a24db..9d1de5b5cc6a 100644 +index c4017c7a24db6..9d1de5b5cc6a7 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c @@ -214,7 +214,7 @@ static void vmw_ldu_crtc_mode_set_nofb(struct drm_crtc *crtc) @@ -61550,7 +63187,7 @@ index c4017c7a24db..9d1de5b5cc6a 100644 } diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c -index 4bf0f5ec4fc2..dfa55fb80b07 100644 +index 4bf0f5ec4fc2d..dfa55fb80b073 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c @@ -279,7 +279,7 @@ static void vmw_sou_crtc_helper_prepare(struct drm_crtc *crtc) @@ -61572,7 +63209,7 @@ index 4bf0f5ec4fc2..dfa55fb80b07 100644 struct vmw_private *dev_priv; struct vmw_screen_object_unit *sou; diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c -index cf3aafd00837..5b04ec047ef3 100644 +index cf3aafd00837c..5b04ec047ef36 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c @@ -408,12 +408,12 @@ static void vmw_stdu_crtc_helper_prepare(struct drm_crtc *crtc) @@ -61591,7 +63228,7 @@ index cf3aafd00837..5b04ec047ef3 100644 struct vmw_private *dev_priv; struct vmw_screen_target_display_unit *stdu; diff --git a/drivers/gpu/drm/xlnx/zynqmp_disp.c b/drivers/gpu/drm/xlnx/zynqmp_disp.c -index 8cd8af35cfaa..6c95271f13b6 100644 +index 8cd8af35cfaac..6c95271f13b69 100644 --- a/drivers/gpu/drm/xlnx/zynqmp_disp.c +++ b/drivers/gpu/drm/xlnx/zynqmp_disp.c @@ -1441,7 +1441,7 @@ static int zynqmp_disp_crtc_setup_clock(struct drm_crtc *crtc, @@ -61642,7 +63279,7 @@ index 8cd8af35cfaa..6c95271f13b6 100644 if (crtc->state->event) { struct drm_pending_vblank_event *event; diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c -index 5259ff2825f9..904f62f3bfc1 100644 +index 5259ff2825f94..904f62f3bfc17 100644 --- a/drivers/gpu/drm/zte/zx_vou.c +++ b/drivers/gpu/drm/zte/zx_vou.c @@ -350,7 +350,7 @@ static inline void vou_chn_set_update(struct zx_crtc *zcrtc) @@ -61673,7 +63310,7 @@ index 5259ff2825f9..904f62f3bfc1 100644 struct drm_pending_vblank_event *event = crtc->state->event; diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index 136b58a91c04..fae50dbda6aa 100644 +index 136b58a91c04c..fae50dbda6aa5 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -221,6 +221,9 @@ @@ -61697,7 +63334,7 @@ index 136b58a91c04..fae50dbda6aa 100644 #define USB_DEVICE_ID_XIN_MO_DUAL_ARCADE 0x05e1 #define USB_DEVICE_ID_THT_2P_ARCADE 0x75e1 diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c -index be53c723c729..9f9d5778114e 100644 +index be53c723c729d..9f9d5778114e4 100644 --- a/drivers/hid/hid-quirks.c +++ b/drivers/hid/hid-quirks.c @@ -41,6 +41,7 @@ static const struct hid_device_id hid_quirks[] = { @@ -61717,7 +63354,7 @@ index be53c723c729..9f9d5778114e 100644 { 0 } }; diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c -index 8d4ac4b9fb9d..5ab69fc58d1b 100644 +index 8d4ac4b9fb9da..5ab69fc58d1b3 100644 --- a/drivers/hid/usbhid/hid-core.c +++ b/drivers/hid/usbhid/hid-core.c @@ -45,7 +45,7 @@ @@ -61749,7 +63386,7 @@ index 8d4ac4b9fb9d..5ab69fc58d1b 100644 ret = -ENOMEM; if (usb_endpoint_dir_in(endpoint)) { diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig -index a850e4f0e0bd..ecf08982c352 100644 +index a850e4f0e0bde..ecf08982c352c 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig @@ -1489,6 +1489,17 @@ config SENSORS_RASPBERRYPI_HWMON @@ -61771,7 +63408,7 @@ index a850e4f0e0bd..ecf08982c352 100644 tristate "Kontron sl28cpld hardware monitoring driver" depends on MFD_SL28CPLD || COMPILE_TEST diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile -index 9db2903b61e5..dc68c9788a5e 100644 +index 9db2903b61e5b..dc68c9788a5ea 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile @@ -157,6 +157,7 @@ obj-$(CONFIG_SENSORS_PCF8591) += pcf8591.o @@ -61783,7 +63420,7 @@ index 9db2903b61e5..dc68c9788a5e 100644 obj-$(CONFIG_SENSORS_SCH56XX_COMMON)+= sch56xx-common.o obj-$(CONFIG_SENSORS_SCH5627) += sch5627.o diff --git a/drivers/hwmon/raspberrypi-hwmon.c b/drivers/hwmon/raspberrypi-hwmon.c -index d3a64a35f7a9..db3b03438dd0 100644 +index d3a64a35f7a9a..db3b03438dd05 100644 --- a/drivers/hwmon/raspberrypi-hwmon.c +++ b/drivers/hwmon/raspberrypi-hwmon.c @@ -15,6 +15,36 @@ @@ -61843,7 +63480,7 @@ index d3a64a35f7a9..db3b03438dd0 100644 } diff --git a/drivers/hwmon/rpi-poe-fan.c b/drivers/hwmon/rpi-poe-fan.c new file mode 100644 -index 000000000000..8483b6ce1db8 +index 0000000000000..8483b6ce1db83 --- /dev/null +++ b/drivers/hwmon/rpi-poe-fan.c @@ -0,0 +1,451 @@ @@ -62299,7 +63936,7 @@ index 000000000000..8483b6ce1db8 +MODULE_DESCRIPTION("Raspberry Pi PoE HAT fan driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig -index 14d45b453a61..4c3010089b7f 100644 +index 14d45b453a615..4c3010089b7f9 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -9,6 +9,25 @@ menu "I2C Hardware Bus support" @@ -62329,7 +63966,7 @@ index 14d45b453a61..4c3010089b7f 100644 tristate "ALI 1535" depends on PCI diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile -index f36a05632f85..fe09307c1945 100644 +index f36a05632f856..fe09307c1945a 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile @@ -3,6 +3,8 @@ @@ -62343,7 +63980,7 @@ index f36a05632f85..fe09307c1945 100644 diff --git a/drivers/i2c/busses/i2c-bcm2708.c b/drivers/i2c/busses/i2c-bcm2708.c new file mode 100644 -index 000000000000..962f2e5c7455 +index 0000000000000..962f2e5c7455d --- /dev/null +++ b/drivers/i2c/busses/i2c-bcm2708.c @@ -0,0 +1,512 @@ @@ -62860,7 +64497,7 @@ index 000000000000..962f2e5c7455 +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c -index 37443edbf754..5b2589b6b9cc 100644 +index 37443edbf7546..5b2589b6b9cc8 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c @@ -51,6 +51,18 @@ @@ -63040,7 +64677,7 @@ index 37443edbf754..5b2589b6b9cc 100644 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) return -EREMOTEIO; diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c -index a4a6825c8758..cfbcf3952ddc 100644 +index a4a6825c87583..cfbcf3952ddc9 100644 --- a/drivers/i2c/busses/i2c-gpio.c +++ b/drivers/i2c/busses/i2c-gpio.c @@ -445,7 +445,9 @@ static int i2c_gpio_probe(struct platform_device *pdev) @@ -63055,7 +64692,7 @@ index a4a6825c8758..cfbcf3952ddc 100644 if (ret) return ret; diff --git a/drivers/input/joystick/Kconfig b/drivers/input/joystick/Kconfig -index b080f0cfb068..7457dd54fee9 100644 +index b080f0cfb068f..7457dd54fee94 100644 --- a/drivers/input/joystick/Kconfig +++ b/drivers/input/joystick/Kconfig @@ -382,4 +382,12 @@ config JOYSTICK_FSIA6B @@ -63072,7 +64709,7 @@ index b080f0cfb068..7457dd54fee9 100644 + endif diff --git a/drivers/input/joystick/Makefile b/drivers/input/joystick/Makefile -index 58232b3057d3..f5b39db324b3 100644 +index 58232b3057d30..f5b39db324b32 100644 --- a/drivers/input/joystick/Makefile +++ b/drivers/input/joystick/Makefile @@ -37,4 +37,4 @@ obj-$(CONFIG_JOYSTICK_WARRIOR) += warrior.o @@ -63083,7 +64720,7 @@ index 58232b3057d3..f5b39db324b3 100644 +obj-$(CONFIG_JOYSTICK_RPISENSE) += rpisense-js.o diff --git a/drivers/input/joystick/rpisense-js.c b/drivers/input/joystick/rpisense-js.c new file mode 100644 -index 000000000000..6a416769065d +index 0000000000000..6a416769065d2 --- /dev/null +++ b/drivers/input/joystick/rpisense-js.c @@ -0,0 +1,153 @@ @@ -63241,7 +64878,7 @@ index 000000000000..6a416769065d +MODULE_AUTHOR("Serge Schneider "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c -index 6ff81d48da86..7e8acc0c19be 100644 +index 6ff81d48da86b..d4060bc89ce9c 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -69,6 +69,8 @@ @@ -63324,8 +64961,19 @@ index 6ff81d48da86..7e8acc0c19be 100644 } error = devm_device_add_group(&client->dev, &edt_ft5x06_attr_group); +@@ -1257,6 +1288,10 @@ static int edt_ft5x06_ts_remove(struct i2c_client *client) + { + struct edt_ft5x06_ts_data *tsdata = i2c_get_clientdata(client); + ++ if (!client->irq) { ++ del_timer(&tsdata->timer); ++ cancel_work_sync(&tsdata->work_i2c_poll); ++ } + edt_ft5x06_ts_teardown_debugfs(tsdata); + + return 0; diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c -index a1e004af23e7..0e6c0811dc1e 100644 +index a1e004af23e78..0e6c0811dc1ef 100644 --- a/drivers/irqchip/irq-bcm2835.c +++ b/drivers/irqchip/irq-bcm2835.c @@ -43,9 +43,12 @@ @@ -63506,7 +65154,7 @@ index a1e004af23e7..0e6c0811dc1e 100644 } diff --git a/drivers/irqchip/irq-bcm2836.c b/drivers/irqchip/irq-bcm2836.c -index cbc7c740e4dc..0b2af88b69a0 100644 +index cbc7c740e4dc3..0b2af88b69a04 100644 --- a/drivers/irqchip/irq-bcm2836.c +++ b/drivers/irqchip/irq-bcm2836.c @@ -22,6 +22,9 @@ struct bcm2836_arm_irqchip_intc { @@ -63566,7 +65214,7 @@ index cbc7c740e4dc..0b2af88b69a0 100644 intc.domain = irq_domain_add_linear(node, LAST_IRQ + 1, diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c -index 93f5b1b60fde..d0d05d663eea 100644 +index 93f5b1b60fdec..d0d05d663eea4 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -46,8 +46,15 @@ static void gpio_led_set(struct led_classdev *led_cdev, @@ -63609,7 +65257,7 @@ index 93f5b1b60fde..d0d05d663eea 100644 state = gpiod_get_value_cansleep(led_dat->gpiod); if (state < 0) diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig -index ce9429ca6dde..d45aba3e1d13 100644 +index ce9429ca6ddea..d45aba3e1d13b 100644 --- a/drivers/leds/trigger/Kconfig +++ b/drivers/leds/trigger/Kconfig @@ -114,6 +114,13 @@ config LEDS_TRIGGER_CAMERA @@ -63643,7 +65291,7 @@ index ce9429ca6dde..d45aba3e1d13 100644 + endif # LEDS_TRIGGERS diff --git a/drivers/leds/trigger/Makefile b/drivers/leds/trigger/Makefile -index 733a83e2a718..1083b35cbe8b 100644 +index 733a83e2a7183..1083b35cbe8b6 100644 --- a/drivers/leds/trigger/Makefile +++ b/drivers/leds/trigger/Makefile @@ -11,7 +11,9 @@ obj-$(CONFIG_LEDS_TRIGGER_ACTIVITY) += ledtrig-activity.o @@ -63658,7 +65306,7 @@ index 733a83e2a718..1083b35cbe8b 100644 +obj-$(CONFIG_LEDS_TRIGGER_ACTPWR) += ledtrig-actpwr.o diff --git a/drivers/leds/trigger/ledtrig-actpwr.c b/drivers/leds/trigger/ledtrig-actpwr.c new file mode 100644 -index 000000000000..1a52107ceb03 +index 0000000000000..1a52107ceb03b --- /dev/null +++ b/drivers/leds/trigger/ledtrig-actpwr.c @@ -0,0 +1,190 @@ @@ -63854,7 +65502,7 @@ index 000000000000..1a52107ceb03 +MODULE_LICENSE("GPL v2"); diff --git a/drivers/leds/trigger/ledtrig-input.c b/drivers/leds/trigger/ledtrig-input.c new file mode 100644 -index 000000000000..8a974a355656 +index 0000000000000..8a974a3556564 --- /dev/null +++ b/drivers/leds/trigger/ledtrig-input.c @@ -0,0 +1,55 @@ @@ -63914,7 +65562,7 @@ index 000000000000..8a974a355656 +MODULE_DESCRIPTION("Set LED GPIO to Input \"trigger\""); +MODULE_LICENSE("GPL"); diff --git a/drivers/mailbox/bcm2835-mailbox.c b/drivers/mailbox/bcm2835-mailbox.c -index 39761d190545..9766d8b50778 100644 +index 39761d1905459..9766d8b50778a 100644 --- a/drivers/mailbox/bcm2835-mailbox.c +++ b/drivers/mailbox/bcm2835-mailbox.c @@ -45,12 +45,15 @@ @@ -63963,7 +65611,7 @@ index 39761d190545..9766d8b50778 100644 MODULE_AUTHOR("Lubomir Rintel "); MODULE_DESCRIPTION("BCM2835 mailbox IPC driver"); diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c -index 3e7d4b20ab34..0b821a5b2db8 100644 +index 3e7d4b20ab34f..0b821a5b2db84 100644 --- a/drivers/mailbox/mailbox.c +++ b/drivers/mailbox/mailbox.c @@ -82,12 +82,9 @@ static void msg_submit(struct mbox_chan *chan) @@ -63996,10 +65644,10 @@ index 3e7d4b20ab34..0b821a5b2db8 100644 } diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c -index 89e38392509c..1bd2d5b07ea6 100644 +index 72350343a56a6..3c6a74b296833 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c -@@ -2129,12 +2129,12 @@ static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off, +@@ -2140,12 +2140,12 @@ static int __find_plane_by_offset(struct vb2_queue *q, unsigned long off, return -EINVAL; } @@ -64015,7 +65663,7 @@ index 89e38392509c..1bd2d5b07ea6 100644 struct dma_buf *dbuf; if (q->memory != VB2_MEMORY_MMAP) { -@@ -2184,6 +2184,21 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, +@@ -2195,6 +2195,21 @@ int vb2_core_expbuf(struct vb2_queue *q, int *fd, unsigned int type, return -EINVAL; } @@ -64038,7 +65686,7 @@ index 89e38392509c..1bd2d5b07ea6 100644 if (ret < 0) { dprintk(q, 3, "buffer %d, plane %d failed to export (%d)\n", diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig -index 878f66ef2719..6ce7fd0c4cc2 100644 +index 878f66ef2719f..4c97729be2220 100644 --- a/drivers/media/i2c/Kconfig +++ b/drivers/media/i2c/Kconfig @@ -801,6 +801,17 @@ config VIDEO_IMX290 @@ -64059,7 +65707,25 @@ index 878f66ef2719..6ce7fd0c4cc2 100644 config VIDEO_IMX319 tristate "Sony IMX319 sensor support" depends on I2C && VIDEO_V4L2 -@@ -1040,6 +1051,17 @@ config VIDEO_OV9640 +@@ -825,6 +836,17 @@ config VIDEO_IMX355 + To compile this driver as a module, choose M here: the + module will be called imx355. + ++config VIDEO_IMX519 ++ tristate "Arducam IMX519 sensor support" ++ depends on I2C && VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API ++ depends on MEDIA_CAMERA_SUPPORT ++ help ++ This is a Video4Linux2 sensor driver for the Arducam ++ IMX519 camera. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called IMX519. ++ + config VIDEO_OV2640 + tristate "OmniVision OV2640 sensor support" + depends on VIDEO_V4L2 && I2C +@@ -1040,6 +1062,17 @@ config VIDEO_OV9640 This is a Video4Linux2 sensor driver for the OmniVision OV9640 camera sensor. @@ -64077,7 +65743,7 @@ index 878f66ef2719..6ce7fd0c4cc2 100644 config VIDEO_OV9650 tristate "OmniVision OV9650/OV9652 sensor support" depends on I2C && VIDEO_V4L2 -@@ -1060,6 +1082,18 @@ config VIDEO_OV13858 +@@ -1060,6 +1093,18 @@ config VIDEO_OV13858 This is a Video4Linux2 sensor driver for the OmniVision OV13858 camera. @@ -64097,7 +65763,7 @@ index 878f66ef2719..6ce7fd0c4cc2 100644 tristate "ST VS6624 sensor support" depends on VIDEO_V4L2 && I2C diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile -index f0a77473979d..6a00378cb351 100644 +index f0a77473979d8..944aea27f362d 100644 --- a/drivers/media/i2c/Makefile +++ b/drivers/media/i2c/Makefile @@ -81,9 +81,11 @@ obj-$(CONFIG_VIDEO_OV7670) += ov7670.o @@ -64112,16 +65778,19 @@ index f0a77473979d..6a00378cb351 100644 obj-$(CONFIG_VIDEO_MT9M001) += mt9m001.o obj-$(CONFIG_VIDEO_MT9M032) += mt9m032.o obj-$(CONFIG_VIDEO_MT9M111) += mt9m111.o -@@ -117,6 +119,7 @@ obj-$(CONFIG_VIDEO_IMX219) += imx219.o +@@ -117,8 +119,10 @@ obj-$(CONFIG_VIDEO_IMX219) += imx219.o obj-$(CONFIG_VIDEO_IMX258) += imx258.o obj-$(CONFIG_VIDEO_IMX274) += imx274.o obj-$(CONFIG_VIDEO_IMX290) += imx290.o +obj-$(CONFIG_VIDEO_IMX477) += imx477.o obj-$(CONFIG_VIDEO_IMX319) += imx319.o obj-$(CONFIG_VIDEO_IMX355) += imx355.o ++obj-$(CONFIG_VIDEO_IMX519) += imx519.o obj-$(CONFIG_VIDEO_MAX9286) += max9286.o + rdacm20-camera_module-objs := rdacm20.o max9271.o + obj-$(CONFIG_VIDEO_RDACM20) += rdacm20-camera_module.o diff --git a/drivers/media/i2c/adv7180.c b/drivers/media/i2c/adv7180.c -index 4498d14d3429..4103690a71df 100644 +index 4498d14d34291..4103690a71dfb 100644 --- a/drivers/media/i2c/adv7180.c +++ b/drivers/media/i2c/adv7180.c @@ -1248,6 +1248,7 @@ static const struct adv7180_chip_info adv7282_m_info = { @@ -64160,7 +65829,7 @@ index 4498d14d3429..4103690a71df 100644 mutex_unlock(&state->mutex); diff --git a/drivers/media/i2c/imx219.c b/drivers/media/i2c/imx219.c -index 4771d0ef2c46..79faa8cce94e 100644 +index 4771d0ef2c46f..79faa8cce94ea 100644 --- a/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c @@ -118,6 +118,16 @@ @@ -64483,7 +66152,7 @@ index 4771d0ef2c46..79faa8cce94e 100644 dev_err(dev, "failed to init entity pads: %d\n", ret); goto error_handler_free; diff --git a/drivers/media/i2c/imx290.c b/drivers/media/i2c/imx290.c -index adcddf3204f7..a26106c41cc6 100644 +index adcddf3204f75..a26106c41cc67 100644 --- a/drivers/media/i2c/imx290.c +++ b/drivers/media/i2c/imx290.c @@ -1,6 +1,12 @@ @@ -65470,10 +67139,10 @@ index adcddf3204f7..a26106c41cc6 100644 static struct i2c_driver imx290_i2c_driver = { diff --git a/drivers/media/i2c/imx477.c b/drivers/media/i2c/imx477.c new file mode 100644 -index 000000000000..fcde88d90a8f +index 0000000000000..05cb530d331eb --- /dev/null +++ b/drivers/media/i2c/imx477.c -@@ -0,0 +1,2276 @@ +@@ -0,0 +1,2284 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * A V4L2 driver for Sony IMX477 cameras. @@ -65497,6 +67166,10 @@ index 000000000000..fcde88d90a8f +#include +#include + ++static int dpc_enable = 1; ++module_param(dpc_enable, int, 0644); ++MODULE_PARM_DESC(dpc_enable, "Enable on-sensor DPC"); ++ +#define IMX477_REG_VALUE_08BIT 1 +#define IMX477_REG_VALUE_16BIT 2 + @@ -67187,6 +68860,10 @@ index 000000000000..fcde88d90a8f + return ret; + } + ++ /* Set on-sensor DPC. */ ++ imx477_write_reg(imx477, 0x0b05, IMX477_REG_VALUE_08BIT, !!dpc_enable); ++ imx477_write_reg(imx477, 0x0b06, IMX477_REG_VALUE_08BIT, !!dpc_enable); ++ + /* Apply customized values from user */ + ret = __v4l2_ctrl_handler_setup(imx477->sd.ctrl_handler); + if (ret) @@ -67750,9 +69427,2106 @@ index 000000000000..fcde88d90a8f +MODULE_AUTHOR("Naushir Patuck "); +MODULE_DESCRIPTION("Sony IMX477 sensor driver"); +MODULE_LICENSE("GPL v2"); +diff --git a/drivers/media/i2c/imx519.c b/drivers/media/i2c/imx519.c +new file mode 100644 +index 0000000000000..4e98704a68341 +--- /dev/null ++++ b/drivers/media/i2c/imx519.c +@@ -0,0 +1,2091 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * A V4L2 driver for Sony IMX519 cameras. ++ * Copyright (C) 2021 Arducam Technology co., Ltd. ++ * ++ * Based on Sony IMX477 camera driver ++ * Copyright (C) 2020 Raspberry Pi (Trading) Ltd ++ */ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define IMX519_REG_VALUE_08BIT 1 ++#define IMX519_REG_VALUE_16BIT 2 ++ ++/* Chip ID */ ++#define IMX519_REG_CHIP_ID 0x0016 ++#define IMX519_CHIP_ID 0x0519 ++ ++#define IMX519_REG_MODE_SELECT 0x0100 ++#define IMX519_MODE_STANDBY 0x00 ++#define IMX519_MODE_STREAMING 0x01 ++ ++#define IMX519_REG_ORIENTATION 0x101 ++ ++#define IMX519_XCLK_FREQ 24000000 ++ ++#define IMX519_DEFAULT_LINK_FREQ 493500000 ++ ++/* Pixel rate is fixed at 686MHz for all the modes */ ++#define IMX519_PIXEL_RATE 686000000 ++ ++/* V_TIMING internal */ ++#define IMX519_REG_FRAME_LENGTH 0x0340 ++#define IMX519_FRAME_LENGTH_MAX 0xffdc ++ ++/* Long exposure multiplier */ ++#define IMX519_LONG_EXP_SHIFT_MAX 7 ++#define IMX519_LONG_EXP_SHIFT_REG 0x3100 ++ ++/* Exposure control */ ++#define IMX519_REG_EXPOSURE 0x0202 ++#define IMX519_EXPOSURE_OFFSET 32 ++#define IMX519_EXPOSURE_MIN 1 ++#define IMX519_EXPOSURE_STEP 1 ++#define IMX519_EXPOSURE_DEFAULT 0x3e8 ++#define IMX519_EXPOSURE_MAX (IMX519_FRAME_LENGTH_MAX - \ ++ IMX519_EXPOSURE_OFFSET) ++ ++/* Analog gain control */ ++#define IMX519_REG_ANALOG_GAIN 0x0204 ++#define IMX519_ANA_GAIN_MIN 0 ++#define IMX519_ANA_GAIN_MAX 960 ++#define IMX519_ANA_GAIN_STEP 1 ++#define IMX519_ANA_GAIN_DEFAULT 0x0 ++ ++/* Digital gain control */ ++#define IMX519_REG_DIGITAL_GAIN 0x020e ++#define IMX519_DGTL_GAIN_MIN 0x0100 ++#define IMX519_DGTL_GAIN_MAX 0xffff ++#define IMX519_DGTL_GAIN_DEFAULT 0x0100 ++#define IMX519_DGTL_GAIN_STEP 1 ++ ++/* Test Pattern Control */ ++#define IMX519_REG_TEST_PATTERN 0x0600 ++#define IMX519_TEST_PATTERN_DISABLE 0 ++#define IMX519_TEST_PATTERN_SOLID_COLOR 1 ++#define IMX519_TEST_PATTERN_COLOR_BARS 2 ++#define IMX519_TEST_PATTERN_GREY_COLOR 3 ++#define IMX519_TEST_PATTERN_PN9 4 ++ ++/* Test pattern colour components */ ++#define IMX519_REG_TEST_PATTERN_R 0x0602 ++#define IMX519_REG_TEST_PATTERN_GR 0x0604 ++#define IMX519_REG_TEST_PATTERN_B 0x0606 ++#define IMX519_REG_TEST_PATTERN_GB 0x0608 ++#define IMX519_TEST_PATTERN_COLOUR_MIN 0 ++#define IMX519_TEST_PATTERN_COLOUR_MAX 0x0fff ++#define IMX519_TEST_PATTERN_COLOUR_STEP 1 ++#define IMX519_TEST_PATTERN_R_DEFAULT IMX519_TEST_PATTERN_COLOUR_MAX ++#define IMX519_TEST_PATTERN_GR_DEFAULT 0 ++#define IMX519_TEST_PATTERN_B_DEFAULT 0 ++#define IMX519_TEST_PATTERN_GB_DEFAULT 0 ++ ++/* Embedded metadata stream structure */ ++#define IMX519_EMBEDDED_LINE_WIDTH 16384 ++#define IMX519_NUM_EMBEDDED_LINES 1 ++ ++enum pad_types { ++ IMAGE_PAD, ++ METADATA_PAD, ++ NUM_PADS ++}; ++ ++/* IMX519 native and active pixel array size. */ ++#define IMX519_NATIVE_WIDTH 4672U ++#define IMX519_NATIVE_HEIGHT 3648U ++#define IMX519_PIXEL_ARRAY_LEFT 8U ++#define IMX519_PIXEL_ARRAY_TOP 48U ++#define IMX519_PIXEL_ARRAY_WIDTH 4656U ++#define IMX519_PIXEL_ARRAY_HEIGHT 3496U ++ ++struct imx519_reg { ++ u16 address; ++ u8 val; ++}; ++ ++struct imx519_reg_list { ++ unsigned int num_of_regs; ++ const struct imx519_reg *regs; ++}; ++ ++/* Mode : resolution and related config&values */ ++struct imx519_mode { ++ /* Frame width */ ++ unsigned int width; ++ ++ /* Frame height */ ++ unsigned int height; ++ ++ /* H-timing in pixels */ ++ unsigned int line_length_pix; ++ ++ /* Analog crop rectangle. */ ++ struct v4l2_rect crop; ++ ++ /* Highest possible framerate. */ ++ struct v4l2_fract timeperframe_min; ++ ++ /* Default framerate. */ ++ struct v4l2_fract timeperframe_default; ++ ++ /* Default register values */ ++ struct imx519_reg_list reg_list; ++}; ++ ++static const struct imx519_reg mode_common_regs[] = { ++ {0x0136, 0x18}, ++ {0x0137, 0x00}, ++ {0x3c7e, 0x01}, ++ {0x3c7f, 0x07}, ++ {0x3020, 0x00}, ++ {0x3e35, 0x01}, ++ {0x3f7f, 0x01}, ++ {0x5609, 0x57}, ++ {0x5613, 0x51}, ++ {0x561f, 0x5e}, ++ {0x5623, 0xd2}, ++ {0x5637, 0x11}, ++ {0x5657, 0x11}, ++ {0x5659, 0x12}, ++ {0x5733, 0x60}, ++ {0x5905, 0x57}, ++ {0x590f, 0x51}, ++ {0x591b, 0x5e}, ++ {0x591f, 0xd2}, ++ {0x5933, 0x11}, ++ {0x5953, 0x11}, ++ {0x5955, 0x12}, ++ {0x5a2f, 0x60}, ++ {0x5a85, 0x57}, ++ {0x5a8f, 0x51}, ++ {0x5a9b, 0x5e}, ++ {0x5a9f, 0xd2}, ++ {0x5ab3, 0x11}, ++ {0x5ad3, 0x11}, ++ {0x5ad5, 0x12}, ++ {0x5baf, 0x60}, ++ {0x5c15, 0x2a}, ++ {0x5c17, 0x80}, ++ {0x5c19, 0x31}, ++ {0x5c1b, 0x87}, ++ {0x5c25, 0x25}, ++ {0x5c27, 0x7b}, ++ {0x5c29, 0x2a}, ++ {0x5c2b, 0x80}, ++ {0x5c2d, 0x31}, ++ {0x5c2f, 0x87}, ++ {0x5c35, 0x2b}, ++ {0x5c37, 0x81}, ++ {0x5c39, 0x31}, ++ {0x5c3b, 0x87}, ++ {0x5c45, 0x25}, ++ {0x5c47, 0x7b}, ++ {0x5c49, 0x2a}, ++ {0x5c4b, 0x80}, ++ {0x5c4d, 0x31}, ++ {0x5c4f, 0x87}, ++ {0x5c55, 0x2d}, ++ {0x5c57, 0x83}, ++ {0x5c59, 0x32}, ++ {0x5c5b, 0x88}, ++ {0x5c65, 0x29}, ++ {0x5c67, 0x7f}, ++ {0x5c69, 0x2e}, ++ {0x5c6b, 0x84}, ++ {0x5c6d, 0x32}, ++ {0x5c6f, 0x88}, ++ {0x5e69, 0x04}, ++ {0x5e9d, 0x00}, ++ {0x5f18, 0x10}, ++ {0x5f1a, 0x0e}, ++ {0x5f20, 0x12}, ++ {0x5f22, 0x10}, ++ {0x5f24, 0x0e}, ++ {0x5f28, 0x10}, ++ {0x5f2a, 0x0e}, ++ {0x5f30, 0x12}, ++ {0x5f32, 0x10}, ++ {0x5f34, 0x0e}, ++ {0x5f38, 0x0f}, ++ {0x5f39, 0x0d}, ++ {0x5f3c, 0x11}, ++ {0x5f3d, 0x0f}, ++ {0x5f3e, 0x0d}, ++ {0x5f61, 0x07}, ++ {0x5f64, 0x05}, ++ {0x5f67, 0x03}, ++ {0x5f6a, 0x03}, ++ {0x5f6d, 0x07}, ++ {0x5f70, 0x07}, ++ {0x5f73, 0x05}, ++ {0x5f76, 0x02}, ++ {0x5f79, 0x07}, ++ {0x5f7c, 0x07}, ++ {0x5f7f, 0x07}, ++ {0x5f82, 0x07}, ++ {0x5f85, 0x03}, ++ {0x5f88, 0x02}, ++ {0x5f8b, 0x01}, ++ {0x5f8e, 0x01}, ++ {0x5f91, 0x04}, ++ {0x5f94, 0x05}, ++ {0x5f97, 0x02}, ++ {0x5f9d, 0x07}, ++ {0x5fa0, 0x07}, ++ {0x5fa3, 0x07}, ++ {0x5fa6, 0x07}, ++ {0x5fa9, 0x03}, ++ {0x5fac, 0x01}, ++ {0x5faf, 0x01}, ++ {0x5fb5, 0x03}, ++ {0x5fb8, 0x02}, ++ {0x5fbb, 0x01}, ++ {0x5fc1, 0x07}, ++ {0x5fc4, 0x07}, ++ {0x5fc7, 0x07}, ++ {0x5fd1, 0x00}, ++ {0x6302, 0x79}, ++ {0x6305, 0x78}, ++ {0x6306, 0xa5}, ++ {0x6308, 0x03}, ++ {0x6309, 0x20}, ++ {0x630b, 0x0a}, ++ {0x630d, 0x48}, ++ {0x630f, 0x06}, ++ {0x6311, 0xa4}, ++ {0x6313, 0x03}, ++ {0x6314, 0x20}, ++ {0x6316, 0x0a}, ++ {0x6317, 0x31}, ++ {0x6318, 0x4a}, ++ {0x631a, 0x06}, ++ {0x631b, 0x40}, ++ {0x631c, 0xa4}, ++ {0x631e, 0x03}, ++ {0x631f, 0x20}, ++ {0x6321, 0x0a}, ++ {0x6323, 0x4a}, ++ {0x6328, 0x80}, ++ {0x6329, 0x01}, ++ {0x632a, 0x30}, ++ {0x632b, 0x02}, ++ {0x632c, 0x20}, ++ {0x632d, 0x02}, ++ {0x632e, 0x30}, ++ {0x6330, 0x60}, ++ {0x6332, 0x90}, ++ {0x6333, 0x01}, ++ {0x6334, 0x30}, ++ {0x6335, 0x02}, ++ {0x6336, 0x20}, ++ {0x6338, 0x80}, ++ {0x633a, 0xa0}, ++ {0x633b, 0x01}, ++ {0x633c, 0x60}, ++ {0x633d, 0x02}, ++ {0x633e, 0x60}, ++ {0x633f, 0x01}, ++ {0x6340, 0x30}, ++ {0x6341, 0x02}, ++ {0x6342, 0x20}, ++ {0x6343, 0x03}, ++ {0x6344, 0x80}, ++ {0x6345, 0x03}, ++ {0x6346, 0x90}, ++ {0x6348, 0xf0}, ++ {0x6349, 0x01}, ++ {0x634a, 0x20}, ++ {0x634b, 0x02}, ++ {0x634c, 0x10}, ++ {0x634d, 0x03}, ++ {0x634e, 0x60}, ++ {0x6350, 0xa0}, ++ {0x6351, 0x01}, ++ {0x6352, 0x60}, ++ {0x6353, 0x02}, ++ {0x6354, 0x50}, ++ {0x6355, 0x02}, ++ {0x6356, 0x60}, ++ {0x6357, 0x01}, ++ {0x6358, 0x30}, ++ {0x6359, 0x02}, ++ {0x635a, 0x30}, ++ {0x635b, 0x03}, ++ {0x635c, 0x90}, ++ {0x635f, 0x01}, ++ {0x6360, 0x10}, ++ {0x6361, 0x01}, ++ {0x6362, 0x40}, ++ {0x6363, 0x02}, ++ {0x6364, 0x50}, ++ {0x6368, 0x70}, ++ {0x636a, 0xa0}, ++ {0x636b, 0x01}, ++ {0x636c, 0x50}, ++ {0x637d, 0xe4}, ++ {0x637e, 0xb4}, ++ {0x638c, 0x8e}, ++ {0x638d, 0x38}, ++ {0x638e, 0xe3}, ++ {0x638f, 0x4c}, ++ {0x6390, 0x30}, ++ {0x6391, 0xc3}, ++ {0x6392, 0xae}, ++ {0x6393, 0xba}, ++ {0x6394, 0xeb}, ++ {0x6395, 0x6e}, ++ {0x6396, 0x34}, ++ {0x6397, 0xe3}, ++ {0x6398, 0xcf}, ++ {0x6399, 0x3c}, ++ {0x639a, 0xf3}, ++ {0x639b, 0x0c}, ++ {0x639c, 0x30}, ++ {0x639d, 0xc1}, ++ {0x63b9, 0xa3}, ++ {0x63ba, 0xfe}, ++ {0x7600, 0x01}, ++ {0x79a0, 0x01}, ++ {0x79a1, 0x01}, ++ {0x79a2, 0x01}, ++ {0x79a3, 0x01}, ++ {0x79a4, 0x01}, ++ {0x79a5, 0x20}, ++ {0x79a9, 0x00}, ++ {0x79aa, 0x01}, ++ {0x79ad, 0x00}, ++ {0x79af, 0x00}, ++ {0x8173, 0x01}, ++ {0x835c, 0x01}, ++ {0x8a74, 0x01}, ++ {0x8c1f, 0x00}, ++ {0x8c27, 0x00}, ++ {0x8c3b, 0x03}, ++ {0x9004, 0x0b}, ++ {0x920c, 0x6a}, ++ {0x920d, 0x22}, ++ {0x920e, 0x6a}, ++ {0x920f, 0x23}, ++ {0x9214, 0x6a}, ++ {0x9215, 0x20}, ++ {0x9216, 0x6a}, ++ {0x9217, 0x21}, ++ {0x9385, 0x3e}, ++ {0x9387, 0x1b}, ++ {0x938d, 0x4d}, ++ {0x938f, 0x43}, ++ {0x9391, 0x1b}, ++ {0x9395, 0x4d}, ++ {0x9397, 0x43}, ++ {0x9399, 0x1b}, ++ {0x939d, 0x3e}, ++ {0x939f, 0x2f}, ++ {0x93a5, 0x43}, ++ {0x93a7, 0x2f}, ++ {0x93a9, 0x2f}, ++ {0x93ad, 0x34}, ++ {0x93af, 0x2f}, ++ {0x93b5, 0x3e}, ++ {0x93b7, 0x2f}, ++ {0x93bd, 0x4d}, ++ {0x93bf, 0x43}, ++ {0x93c1, 0x2f}, ++ {0x93c5, 0x4d}, ++ {0x93c7, 0x43}, ++ {0x93c9, 0x2f}, ++ {0x974b, 0x02}, ++ {0x995c, 0x8c}, ++ {0x995d, 0x00}, ++ {0x995e, 0x00}, ++ {0x9963, 0x64}, ++ {0x9964, 0x50}, ++ {0xaa0a, 0x26}, ++ {0xae03, 0x04}, ++ {0xae04, 0x03}, ++ {0xae05, 0x03}, ++ {0xbc1c, 0x08}, ++ {0xbcf1, 0x02}, ++}; ++ ++/* 16 mpix 10fps */ ++static const struct imx519_reg mode_4656x3496_regs[] = { ++ {0x0111, 0x02}, ++ {0x0112, 0x0a}, ++ {0x0113, 0x0a}, ++ {0x0114, 0x01}, ++ {0x0342, 0x42}, ++ {0x0343, 0x00}, ++ {0x0340, 0x0d}, ++ {0x0341, 0xf4}, ++ {0x0344, 0x00}, ++ {0x0345, 0x00}, ++ {0x0346, 0x00}, ++ {0x0347, 0x00}, ++ {0x0348, 0x12}, ++ {0x0349, 0x2f}, ++ {0x034a, 0x0d}, ++ {0x034b, 0xa7}, ++ {0x0220, 0x00}, ++ {0x0221, 0x11}, ++ {0x0222, 0x01}, ++ {0x0900, 0x00}, ++ {0x0901, 0x11}, ++ {0x0902, 0x0a}, ++ {0x3f4c, 0x01}, ++ {0x3f4d, 0x01}, ++ {0x4254, 0x7f}, ++ {0x0401, 0x00}, ++ {0x0404, 0x00}, ++ {0x0405, 0x10}, ++ {0x0408, 0x00}, ++ {0x0409, 0x00}, ++ {0x040a, 0x00}, ++ {0x040b, 0x00}, ++ {0x040c, 0x12}, ++ {0x040d, 0x30}, ++ {0x040e, 0x0d}, ++ {0x040f, 0xa8}, ++ {0x034c, 0x12}, ++ {0x034d, 0x30}, ++ {0x034e, 0x0d}, ++ {0x034f, 0xa8}, ++ {0x0301, 0x06}, ++ {0x0303, 0x04}, ++ {0x0305, 0x04}, ++ {0x0306, 0x01}, ++ {0x0307, 0x57}, ++ {0x0309, 0x0a}, ++ {0x030b, 0x02}, ++ {0x030d, 0x04}, ++ {0x030e, 0x01}, ++ {0x030f, 0x49}, ++ {0x0310, 0x01}, ++ {0x0820, 0x07}, ++ {0x0821, 0xb6}, ++ {0x0822, 0x00}, ++ {0x0823, 0x00}, ++ {0x3e20, 0x01}, ++ {0x3e37, 0x00}, ++ {0x3e3b, 0x00}, ++ {0x0106, 0x00}, ++ {0x0b00, 0x00}, ++ {0x3230, 0x00}, ++ {0x3f14, 0x01}, ++ {0x3f3c, 0x01}, ++ {0x3f0d, 0x0a}, ++ {0x3fbc, 0x00}, ++ {0x3c06, 0x00}, ++ {0x3c07, 0x48}, ++ {0x3c0a, 0x00}, ++ {0x3c0b, 0x00}, ++ {0x3f78, 0x00}, ++ {0x3f79, 0x40}, ++ {0x3f7c, 0x00}, ++ {0x3f7d, 0x00}, ++}; ++ ++/* 4k 21fps mode */ ++static const struct imx519_reg mode_3840x2160_regs[] = { ++ {0x0111, 0x02}, ++ {0x0112, 0x0a}, ++ {0x0113, 0x0a}, ++ {0x0114, 0x01}, ++ {0x0342, 0x38}, ++ {0x0343, 0x70}, ++ {0x0340, 0x08}, ++ {0x0341, 0xd4}, ++ {0x0344, 0x01}, ++ {0x0345, 0x98}, ++ {0x0346, 0x02}, ++ {0x0347, 0xa0}, ++ {0x0348, 0x10}, ++ {0x0349, 0x97}, ++ {0x034a, 0x0b}, ++ {0x034b, 0x17}, ++ {0x0220, 0x00}, ++ {0x0221, 0x11}, ++ {0x0222, 0x01}, ++ {0x0900, 0x00}, ++ {0x0901, 0x11}, ++ {0x0902, 0x0a}, ++ {0x3f4c, 0x01}, ++ {0x3f4d, 0x01}, ++ {0x4254, 0x7f}, ++ {0x0401, 0x00}, ++ {0x0404, 0x00}, ++ {0x0405, 0x10}, ++ {0x0408, 0x00}, ++ {0x0409, 0x00}, ++ {0x040a, 0x00}, ++ {0x040b, 0x00}, ++ {0x040c, 0x0f}, ++ {0x040d, 0x00}, ++ {0x040e, 0x08}, ++ {0x040f, 0x70}, ++ {0x034c, 0x0f}, ++ {0x034d, 0x00}, ++ {0x034e, 0x08}, ++ {0x034f, 0x70}, ++ {0x0301, 0x06}, ++ {0x0303, 0x04}, ++ {0x0305, 0x04}, ++ {0x0306, 0x01}, ++ {0x0307, 0x57}, ++ {0x0309, 0x0a}, ++ {0x030b, 0x02}, ++ {0x030d, 0x04}, ++ {0x030e, 0x01}, ++ {0x030f, 0x49}, ++ {0x0310, 0x01}, ++ {0x0820, 0x07}, ++ {0x0821, 0xb6}, ++ {0x0822, 0x00}, ++ {0x0823, 0x00}, ++ {0x3e20, 0x01}, ++ {0x3e37, 0x00}, ++ {0x3e3b, 0x00}, ++ {0x0106, 0x00}, ++ {0x0b00, 0x00}, ++ {0x3230, 0x00}, ++ {0x3f14, 0x01}, ++ {0x3f3c, 0x01}, ++ {0x3f0d, 0x0a}, ++ {0x3fbc, 0x00}, ++ {0x3c06, 0x00}, ++ {0x3c07, 0x48}, ++ {0x3c0a, 0x00}, ++ {0x3c0b, 0x00}, ++ {0x3f78, 0x00}, ++ {0x3f79, 0x40}, ++ {0x3f7c, 0x00}, ++ {0x3f7d, 0x00}, ++}; ++ ++/* 2x2 binned 30fps mode */ ++static const struct imx519_reg mode_2328x1748_regs[] = { ++ {0x0111, 0x02}, ++ {0x0112, 0x0a}, ++ {0x0113, 0x0a}, ++ {0x0114, 0x01}, ++ {0x0342, 0x24}, ++ {0x0343, 0x12}, ++ {0x0340, 0x09}, ++ {0x0341, 0xac}, ++ {0x0344, 0x00}, ++ {0x0345, 0x00}, ++ {0x0346, 0x00}, ++ {0x0347, 0x00}, ++ {0x0348, 0x12}, ++ {0x0349, 0x2f}, ++ {0x034a, 0x0d}, ++ {0x034b, 0xa7}, ++ {0x0220, 0x00}, ++ {0x0221, 0x11}, ++ {0x0222, 0x01}, ++ {0x0900, 0x01}, ++ {0x0901, 0x22}, ++ {0x0902, 0x0a}, ++ {0x3f4c, 0x01}, ++ {0x3f4d, 0x01}, ++ {0x4254, 0x7f}, ++ {0x0401, 0x00}, ++ {0x0404, 0x00}, ++ {0x0405, 0x10}, ++ {0x0408, 0x00}, ++ {0x0409, 0x00}, ++ {0x040a, 0x00}, ++ {0x040b, 0x00}, ++ {0x040c, 0x09}, ++ {0x040d, 0x18}, ++ {0x040e, 0x06}, ++ {0x040f, 0xd4}, ++ {0x034c, 0x09}, ++ {0x034d, 0x18}, ++ {0x034e, 0x06}, ++ {0x034f, 0xd4}, ++ {0x0301, 0x06}, ++ {0x0303, 0x04}, ++ {0x0305, 0x04}, ++ {0x0306, 0x01}, ++ {0x0307, 0x57}, ++ {0x0309, 0x0a}, ++ {0x030b, 0x02}, ++ {0x030d, 0x04}, ++ {0x030e, 0x01}, ++ {0x030f, 0x49}, ++ {0x0310, 0x01}, ++ {0x0820, 0x07}, ++ {0x0821, 0xb6}, ++ {0x0822, 0x00}, ++ {0x0823, 0x00}, ++ {0x3e20, 0x01}, ++ {0x3e37, 0x00}, ++ {0x3e3b, 0x00}, ++ {0x0106, 0x00}, ++ {0x0b00, 0x00}, ++ {0x3230, 0x00}, ++ {0x3f14, 0x01}, ++ {0x3f3c, 0x01}, ++ {0x3f0d, 0x0a}, ++ {0x3fbc, 0x00}, ++ {0x3c06, 0x00}, ++ {0x3c07, 0x48}, ++ {0x3c0a, 0x00}, ++ {0x3c0b, 0x00}, ++ {0x3f78, 0x00}, ++ {0x3f79, 0x40}, ++ {0x3f7c, 0x00}, ++ {0x3f7d, 0x00}, ++}; ++ ++/* 1080p 60fps mode */ ++static const struct imx519_reg mode_1920x1080_regs[] = { ++ {0x0111, 0x02}, ++ {0x0112, 0x0a}, ++ {0x0113, 0x0a}, ++ {0x0114, 0x01}, ++ {0x0342, 0x25}, ++ {0x0343, 0xd9}, ++ {0x0340, 0x04}, ++ {0x0341, 0x9c}, ++ {0x0344, 0x01}, ++ {0x0345, 0x98}, ++ {0x0346, 0x02}, ++ {0x0347, 0xa2}, ++ {0x0348, 0x10}, ++ {0x0349, 0x97}, ++ {0x034a, 0x0b}, ++ {0x034b, 0x15}, ++ {0x0220, 0x00}, ++ {0x0221, 0x11}, ++ {0x0222, 0x01}, ++ {0x0900, 0x01}, ++ {0x0901, 0x22}, ++ {0x0902, 0x0a}, ++ {0x3f4c, 0x01}, ++ {0x3f4d, 0x01}, ++ {0x4254, 0x7f}, ++ {0x0401, 0x00}, ++ {0x0404, 0x00}, ++ {0x0405, 0x10}, ++ {0x0408, 0x00}, ++ {0x0409, 0x00}, ++ {0x040a, 0x00}, ++ {0x040b, 0x00}, ++ {0x040c, 0x07}, ++ {0x040d, 0x80}, ++ {0x040e, 0x04}, ++ {0x040f, 0x38}, ++ {0x034c, 0x07}, ++ {0x034d, 0x80}, ++ {0x034e, 0x04}, ++ {0x034f, 0x38}, ++ {0x0301, 0x06}, ++ {0x0303, 0x04}, ++ {0x0305, 0x04}, ++ {0x0306, 0x01}, ++ {0x0307, 0x57}, ++ {0x0309, 0x0a}, ++ {0x030b, 0x02}, ++ {0x030d, 0x04}, ++ {0x030e, 0x01}, ++ {0x030f, 0x49}, ++ {0x0310, 0x01}, ++ {0x0820, 0x07}, ++ {0x0821, 0xb6}, ++ {0x0822, 0x00}, ++ {0x0823, 0x00}, ++ {0x3e20, 0x01}, ++ {0x3e37, 0x00}, ++ {0x3e3b, 0x00}, ++ {0x0106, 0x00}, ++ {0x0b00, 0x00}, ++ {0x3230, 0x00}, ++ {0x3f14, 0x01}, ++ {0x3f3c, 0x01}, ++ {0x3f0d, 0x0a}, ++ {0x3fbc, 0x00}, ++ {0x3c06, 0x00}, ++ {0x3c07, 0x48}, ++ {0x3c0a, 0x00}, ++ {0x3c0b, 0x00}, ++ {0x3f78, 0x00}, ++ {0x3f79, 0x40}, ++ {0x3f7c, 0x00}, ++ {0x3f7d, 0x00}, ++}; ++ ++/* 720p 120fps mode */ ++static const struct imx519_reg mode_1280x720_regs[] = { ++ {0x0111, 0x02}, ++ {0x0112, 0x0a}, ++ {0x0113, 0x0a}, ++ {0x0114, 0x01}, ++ {0x0342, 0x1b}, ++ {0x0343, 0x3b}, ++ {0x0340, 0x03}, ++ {0x0341, 0x34}, ++ {0x0344, 0x04}, ++ {0x0345, 0x18}, ++ {0x0346, 0x04}, ++ {0x0347, 0x12}, ++ {0x0348, 0x0e}, ++ {0x0349, 0x17}, ++ {0x034a, 0x09}, ++ {0x034b, 0xb6}, ++ {0x0220, 0x00}, ++ {0x0221, 0x11}, ++ {0x0222, 0x01}, ++ {0x0900, 0x01}, ++ {0x0901, 0x22}, ++ {0x0902, 0x0a}, ++ {0x3f4c, 0x01}, ++ {0x3f4d, 0x01}, ++ {0x4254, 0x7f}, ++ {0x0401, 0x00}, ++ {0x0404, 0x00}, ++ {0x0405, 0x10}, ++ {0x0408, 0x00}, ++ {0x0409, 0x00}, ++ {0x040a, 0x00}, ++ {0x040b, 0x00}, ++ {0x040c, 0x05}, ++ {0x040d, 0x00}, ++ {0x040e, 0x02}, ++ {0x040f, 0xd0}, ++ {0x034c, 0x05}, ++ {0x034d, 0x00}, ++ {0x034e, 0x02}, ++ {0x034f, 0xd0}, ++ {0x0301, 0x06}, ++ {0x0303, 0x04}, ++ {0x0305, 0x04}, ++ {0x0306, 0x01}, ++ {0x0307, 0x57}, ++ {0x0309, 0x0a}, ++ {0x030b, 0x02}, ++ {0x030d, 0x04}, ++ {0x030e, 0x01}, ++ {0x030f, 0x49}, ++ {0x0310, 0x01}, ++ {0x0820, 0x07}, ++ {0x0821, 0xb6}, ++ {0x0822, 0x00}, ++ {0x0823, 0x00}, ++ {0x3e20, 0x01}, ++ {0x3e37, 0x00}, ++ {0x3e3b, 0x00}, ++ {0x0106, 0x00}, ++ {0x0b00, 0x00}, ++ {0x3230, 0x00}, ++ {0x3f14, 0x01}, ++ {0x3f3c, 0x01}, ++ {0x3f0d, 0x0a}, ++ {0x3fbc, 0x00}, ++ {0x3c06, 0x00}, ++ {0x3c07, 0x48}, ++ {0x3c0a, 0x00}, ++ {0x3c0b, 0x00}, ++ {0x3f78, 0x00}, ++ {0x3f79, 0x40}, ++ {0x3f7c, 0x00}, ++ {0x3f7d, 0x00}, ++}; ++ ++/* Mode configs */ ++static const struct imx519_mode supported_modes_10bit[] = { ++ { ++ .width = 4656, ++ .height = 3496, ++ .line_length_pix = 0x4200, ++ .crop = { ++ .left = IMX519_PIXEL_ARRAY_LEFT, ++ .top = IMX519_PIXEL_ARRAY_TOP, ++ .width = 4656, ++ .height = 3496, ++ }, ++ .timeperframe_min = { ++ .numerator = 100, ++ .denominator = 1000 ++ }, ++ .timeperframe_default = { ++ .numerator = 100, ++ .denominator = 1000 ++ }, ++ .reg_list = { ++ .num_of_regs = ARRAY_SIZE(mode_4656x3496_regs), ++ .regs = mode_4656x3496_regs, ++ } ++ }, ++ { ++ .width = 3840, ++ .height = 2160, ++ .line_length_pix = 0x3870, ++ .crop = { ++ .left = IMX519_PIXEL_ARRAY_LEFT + 408, ++ .top = IMX519_PIXEL_ARRAY_TOP + 672, ++ .width = 3840, ++ .height = 2160, ++ }, ++ .timeperframe_min = { ++ .numerator = 100, ++ .denominator = 2100 ++ }, ++ .timeperframe_default = { ++ .numerator = 100, ++ .denominator = 2100 ++ }, ++ .reg_list = { ++ .num_of_regs = ARRAY_SIZE(mode_3840x2160_regs), ++ .regs = mode_3840x2160_regs, ++ } ++ }, ++ { ++ .width = 2328, ++ .height = 1748, ++ .line_length_pix = 0x2412, ++ .crop = { ++ .left = IMX519_PIXEL_ARRAY_LEFT, ++ .top = IMX519_PIXEL_ARRAY_TOP, ++ .width = 4656, ++ .height = 3496, ++ }, ++ .timeperframe_min = { ++ .numerator = 100, ++ .denominator = 3000 ++ }, ++ .timeperframe_default = { ++ .numerator = 100, ++ .denominator = 3000 ++ }, ++ .reg_list = { ++ .num_of_regs = ARRAY_SIZE(mode_2328x1748_regs), ++ .regs = mode_2328x1748_regs, ++ } ++ }, ++ { ++ .width = 1920, ++ .height = 1080, ++ .line_length_pix = 0x25D9, ++ .crop = { ++ .left = IMX519_PIXEL_ARRAY_LEFT + 408, ++ .top = IMX519_PIXEL_ARRAY_TOP + 674, ++ .width = 3840, ++ .height = 2160, ++ }, ++ .timeperframe_min = { ++ .numerator = 100, ++ .denominator = 6000 ++ }, ++ .timeperframe_default = { ++ .numerator = 100, ++ .denominator = 6000 ++ }, ++ .reg_list = { ++ .num_of_regs = ARRAY_SIZE(mode_1920x1080_regs), ++ .regs = mode_1920x1080_regs, ++ } ++ }, ++ { ++ .width = 1280, ++ .height = 720, ++ .line_length_pix = 0x1B3B, ++ .crop = { ++ .left = IMX519_PIXEL_ARRAY_LEFT + 1048, ++ .top = IMX519_PIXEL_ARRAY_TOP + 1042, ++ .width = 2560, ++ .height = 1440, ++ }, ++ .timeperframe_min = { ++ .numerator = 100, ++ .denominator = 12000 ++ }, ++ .timeperframe_default = { ++ .numerator = 100, ++ .denominator = 12000 ++ }, ++ .reg_list = { ++ .num_of_regs = ARRAY_SIZE(mode_1280x720_regs), ++ .regs = mode_1280x720_regs, ++ } ++ } ++}; ++ ++/* ++ * The supported formats. ++ * This table MUST contain 4 entries per format, to cover the various flip ++ * combinations in the order ++ * - no flip ++ * - h flip ++ * - v flip ++ * - h&v flips ++ */ ++static const u32 codes[] = { ++ /* 10-bit modes. */ ++ MEDIA_BUS_FMT_SRGGB10_1X10, ++ MEDIA_BUS_FMT_SGRBG10_1X10, ++ MEDIA_BUS_FMT_SGBRG10_1X10, ++ MEDIA_BUS_FMT_SBGGR10_1X10, ++}; ++ ++static const char * const imx519_test_pattern_menu[] = { ++ "Disabled", ++ "Color Bars", ++ "Solid Color", ++ "Grey Color Bars", ++ "PN9" ++}; ++ ++static const int imx519_test_pattern_val[] = { ++ IMX519_TEST_PATTERN_DISABLE, ++ IMX519_TEST_PATTERN_COLOR_BARS, ++ IMX519_TEST_PATTERN_SOLID_COLOR, ++ IMX519_TEST_PATTERN_GREY_COLOR, ++ IMX519_TEST_PATTERN_PN9, ++}; ++ ++/* regulator supplies */ ++static const char * const imx519_supply_name[] = { ++ /* Supplies can be enabled in any order */ ++ "VANA", /* Analog (2.8V) supply */ ++ "VDIG", /* Digital Core (1.05V) supply */ ++ "VDDL", /* IF (1.8V) supply */ ++}; ++ ++#define IMX519_NUM_SUPPLIES ARRAY_SIZE(imx519_supply_name) ++ ++/* ++ * Initialisation delay between XCLR low->high and the moment when the sensor ++ * can start capture (i.e. can leave software standby), given by T7 in the ++ * datasheet is 8ms. This does include I2C setup time as well. ++ * ++ * Note, that delay between XCLR low->high and reading the CCI ID register (T6 ++ * in the datasheet) is much smaller - 600us. ++ */ ++#define IMX519_XCLR_MIN_DELAY_US 8000 ++#define IMX519_XCLR_DELAY_RANGE_US 1000 ++ ++struct imx519 { ++ struct v4l2_subdev sd; ++ struct media_pad pad[NUM_PADS]; ++ ++ unsigned int fmt_code; ++ ++ struct clk *xclk; ++ ++ struct gpio_desc *reset_gpio; ++ struct regulator_bulk_data supplies[IMX519_NUM_SUPPLIES]; ++ ++ struct v4l2_ctrl_handler ctrl_handler; ++ /* V4L2 Controls */ ++ struct v4l2_ctrl *pixel_rate; ++ struct v4l2_ctrl *exposure; ++ struct v4l2_ctrl *vflip; ++ struct v4l2_ctrl *hflip; ++ struct v4l2_ctrl *vblank; ++ struct v4l2_ctrl *hblank; ++ ++ /* Current mode */ ++ const struct imx519_mode *mode; ++ ++ /* ++ * Mutex for serialized access: ++ * Protect sensor module set pad format and start/stop streaming safely. ++ */ ++ struct mutex mutex; ++ ++ /* Streaming on/off */ ++ bool streaming; ++ ++ /* Rewrite common registers on stream on? */ ++ bool common_regs_written; ++ ++ /* Current long exposure factor in use. Set through V4L2_CID_VBLANK */ ++ unsigned int long_exp_shift; ++}; ++ ++static inline struct imx519 *to_imx519(struct v4l2_subdev *_sd) ++{ ++ return container_of(_sd, struct imx519, sd); ++} ++ ++/* Read registers up to 2 at a time */ ++static int imx519_read_reg(struct imx519 *imx519, u16 reg, u32 len, u32 *val) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ struct i2c_msg msgs[2]; ++ u8 addr_buf[2] = { reg >> 8, reg & 0xff }; ++ u8 data_buf[4] = { 0, }; ++ int ret; ++ ++ if (len > 4) ++ return -EINVAL; ++ ++ /* Write register address */ ++ msgs[0].addr = client->addr; ++ msgs[0].flags = 0; ++ msgs[0].len = ARRAY_SIZE(addr_buf); ++ msgs[0].buf = addr_buf; ++ ++ /* Read data from register */ ++ msgs[1].addr = client->addr; ++ msgs[1].flags = I2C_M_RD; ++ msgs[1].len = len; ++ msgs[1].buf = &data_buf[4 - len]; ++ ++ ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); ++ if (ret != ARRAY_SIZE(msgs)) ++ return -EIO; ++ ++ *val = get_unaligned_be32(data_buf); ++ ++ return 0; ++} ++ ++/* Write registers up to 2 at a time */ ++static int imx519_write_reg(struct imx519 *imx519, u16 reg, u32 len, u32 val) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ u8 buf[6]; ++ ++ if (len > 4) ++ return -EINVAL; ++ ++ put_unaligned_be16(reg, buf); ++ put_unaligned_be32(val << (8 * (4 - len)), buf + 2); ++ if (i2c_master_send(client, buf, len + 2) != len + 2) ++ return -EIO; ++ ++ return 0; ++} ++ ++/* Write a list of registers */ ++static int imx519_write_regs(struct imx519 *imx519, ++ const struct imx519_reg *regs, u32 len) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ unsigned int i; ++ int ret; ++ ++ for (i = 0; i < len; i++) { ++ ret = imx519_write_reg(imx519, regs[i].address, 1, regs[i].val); ++ if (ret) { ++ dev_err_ratelimited(&client->dev, ++ "Failed to write reg 0x%4.4x. error = %d\n", ++ regs[i].address, ret); ++ ++ return ret; ++ } ++ } ++ ++ return 0; ++} ++ ++/* Get bayer order based on flip setting. */ ++static u32 imx519_get_format_code(struct imx519 *imx519) ++{ ++ unsigned int i; ++ ++ lockdep_assert_held(&imx519->mutex); ++ ++ i = (imx519->vflip->val ? 2 : 0) | ++ (imx519->hflip->val ? 1 : 0); ++ ++ return codes[i]; ++} ++ ++static int imx519_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) ++{ ++ struct imx519 *imx519 = to_imx519(sd); ++ struct v4l2_mbus_framefmt *try_fmt_img = ++ v4l2_subdev_get_try_format(sd, fh->pad, IMAGE_PAD); ++ struct v4l2_mbus_framefmt *try_fmt_meta = ++ v4l2_subdev_get_try_format(sd, fh->pad, METADATA_PAD); ++ struct v4l2_rect *try_crop; ++ ++ mutex_lock(&imx519->mutex); ++ ++ /* Initialize try_fmt for the image pad */ ++ try_fmt_img->width = supported_modes_10bit[0].width; ++ try_fmt_img->height = supported_modes_10bit[0].height; ++ try_fmt_img->code = imx519_get_format_code(imx519); ++ try_fmt_img->field = V4L2_FIELD_NONE; ++ ++ /* Initialize try_fmt for the embedded metadata pad */ ++ try_fmt_meta->width = IMX519_EMBEDDED_LINE_WIDTH; ++ try_fmt_meta->height = IMX519_NUM_EMBEDDED_LINES; ++ try_fmt_meta->code = MEDIA_BUS_FMT_SENSOR_DATA; ++ try_fmt_meta->field = V4L2_FIELD_NONE; ++ ++ /* Initialize try_crop */ ++ try_crop = v4l2_subdev_get_try_crop(sd, fh->pad, IMAGE_PAD); ++ try_crop->left = IMX519_PIXEL_ARRAY_LEFT; ++ try_crop->top = IMX519_PIXEL_ARRAY_TOP; ++ try_crop->width = IMX519_PIXEL_ARRAY_WIDTH; ++ try_crop->height = IMX519_PIXEL_ARRAY_HEIGHT; ++ ++ mutex_unlock(&imx519->mutex); ++ ++ return 0; ++} ++ ++static void imx519_adjust_exposure_range(struct imx519 *imx519) ++{ ++ int exposure_max, exposure_def; ++ ++ /* Honour the VBLANK limits when setting exposure. */ ++ exposure_max = imx519->mode->height + imx519->vblank->val - ++ IMX519_EXPOSURE_OFFSET; ++ exposure_def = min(exposure_max, imx519->exposure->val); ++ __v4l2_ctrl_modify_range(imx519->exposure, imx519->exposure->minimum, ++ exposure_max, imx519->exposure->step, ++ exposure_def); ++} ++ ++static int imx519_set_frame_length(struct imx519 *imx519, unsigned int val) ++{ ++ int ret = 0; ++ ++ imx519->long_exp_shift = 0; ++ ++ while (val > IMX519_FRAME_LENGTH_MAX) { ++ imx519->long_exp_shift++; ++ val >>= 1; ++ } ++ ++ ret = imx519_write_reg(imx519, IMX519_REG_FRAME_LENGTH, ++ IMX519_REG_VALUE_16BIT, val); ++ if (ret) ++ return ret; ++ ++ return imx519_write_reg(imx519, IMX519_LONG_EXP_SHIFT_REG, ++ IMX519_REG_VALUE_08BIT, imx519->long_exp_shift); ++} ++ ++static int imx519_set_ctrl(struct v4l2_ctrl *ctrl) ++{ ++ struct imx519 *imx519 = ++ container_of(ctrl->handler, struct imx519, ctrl_handler); ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ int ret = 0; ++ ++ /* ++ * The VBLANK control may change the limits of usable exposure, so check ++ * and adjust if necessary. ++ */ ++ if (ctrl->id == V4L2_CID_VBLANK) ++ imx519_adjust_exposure_range(imx519); ++ ++ /* ++ * Applying V4L2 control value only happens ++ * when power is up for streaming ++ */ ++ if (pm_runtime_get_if_in_use(&client->dev) == 0) ++ return 0; ++ ++ switch (ctrl->id) { ++ case V4L2_CID_ANALOGUE_GAIN: ++ ret = imx519_write_reg(imx519, IMX519_REG_ANALOG_GAIN, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_EXPOSURE: ++ ret = imx519_write_reg(imx519, IMX519_REG_EXPOSURE, ++ IMX519_REG_VALUE_16BIT, ctrl->val >> ++ imx519->long_exp_shift); ++ break; ++ case V4L2_CID_DIGITAL_GAIN: ++ ret = imx519_write_reg(imx519, IMX519_REG_DIGITAL_GAIN, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_TEST_PATTERN: ++ ret = imx519_write_reg(imx519, IMX519_REG_TEST_PATTERN, ++ IMX519_REG_VALUE_16BIT, ++ imx519_test_pattern_val[ctrl->val]); ++ break; ++ case V4L2_CID_TEST_PATTERN_RED: ++ ret = imx519_write_reg(imx519, IMX519_REG_TEST_PATTERN_R, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_TEST_PATTERN_GREENR: ++ ret = imx519_write_reg(imx519, IMX519_REG_TEST_PATTERN_GR, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_TEST_PATTERN_BLUE: ++ ret = imx519_write_reg(imx519, IMX519_REG_TEST_PATTERN_B, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_TEST_PATTERN_GREENB: ++ ret = imx519_write_reg(imx519, IMX519_REG_TEST_PATTERN_GB, ++ IMX519_REG_VALUE_16BIT, ctrl->val); ++ break; ++ case V4L2_CID_HFLIP: ++ case V4L2_CID_VFLIP: ++ ret = imx519_write_reg(imx519, IMX519_REG_ORIENTATION, 1, ++ imx519->hflip->val | ++ imx519->vflip->val << 1); ++ break; ++ case V4L2_CID_VBLANK: ++ ret = imx519_set_frame_length(imx519, ++ imx519->mode->height + ctrl->val); ++ break; ++ default: ++ dev_info(&client->dev, ++ "ctrl(id:0x%x,val:0x%x) is not handled\n", ++ ctrl->id, ctrl->val); ++ ret = -EINVAL; ++ break; ++ } ++ ++ pm_runtime_put(&client->dev); ++ ++ return ret; ++} ++ ++static const struct v4l2_ctrl_ops imx519_ctrl_ops = { ++ .s_ctrl = imx519_set_ctrl, ++}; ++ ++static int imx519_enum_mbus_code(struct v4l2_subdev *sd, ++ struct v4l2_subdev_pad_config *cfg, ++ struct v4l2_subdev_mbus_code_enum *code) ++{ ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ if (code->pad >= NUM_PADS) ++ return -EINVAL; ++ ++ if (code->pad == IMAGE_PAD) { ++ if (code->index > 0) ++ return -EINVAL; ++ ++ code->code = imx519_get_format_code(imx519); ++ } else { ++ if (code->index > 0) ++ return -EINVAL; ++ ++ code->code = MEDIA_BUS_FMT_SENSOR_DATA; ++ } ++ ++ return 0; ++} ++ ++static int imx519_enum_frame_size(struct v4l2_subdev *sd, ++ struct v4l2_subdev_pad_config *cfg, ++ struct v4l2_subdev_frame_size_enum *fse) ++{ ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ if (fse->pad >= NUM_PADS) ++ return -EINVAL; ++ ++ if (fse->pad == IMAGE_PAD) { ++ if (fse->index >= ARRAY_SIZE(supported_modes_10bit)) ++ return -EINVAL; ++ ++ if (fse->code != imx519_get_format_code(imx519)) ++ return -EINVAL; ++ ++ fse->min_width = supported_modes_10bit[fse->index].width; ++ fse->max_width = fse->min_width; ++ fse->min_height = supported_modes_10bit[fse->index].height; ++ fse->max_height = fse->min_height; ++ } else { ++ if (fse->code != MEDIA_BUS_FMT_SENSOR_DATA || fse->index > 0) ++ return -EINVAL; ++ ++ fse->min_width = IMX519_EMBEDDED_LINE_WIDTH; ++ fse->max_width = fse->min_width; ++ fse->min_height = IMX519_NUM_EMBEDDED_LINES; ++ fse->max_height = fse->min_height; ++ } ++ ++ return 0; ++} ++ ++static void imx519_reset_colorspace(struct v4l2_mbus_framefmt *fmt) ++{ ++ fmt->colorspace = V4L2_COLORSPACE_SRGB; ++ fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace); ++ fmt->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true, ++ fmt->colorspace, ++ fmt->ycbcr_enc); ++ fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace); ++} ++ ++static void imx519_update_image_pad_format(struct imx519 *imx519, ++ const struct imx519_mode *mode, ++ struct v4l2_subdev_format *fmt) ++{ ++ fmt->format.width = mode->width; ++ fmt->format.height = mode->height; ++ fmt->format.field = V4L2_FIELD_NONE; ++ imx519_reset_colorspace(&fmt->format); ++} ++ ++static void imx519_update_metadata_pad_format(struct v4l2_subdev_format *fmt) ++{ ++ fmt->format.width = IMX519_EMBEDDED_LINE_WIDTH; ++ fmt->format.height = IMX519_NUM_EMBEDDED_LINES; ++ fmt->format.code = MEDIA_BUS_FMT_SENSOR_DATA; ++ fmt->format.field = V4L2_FIELD_NONE; ++} ++ ++static int imx519_get_pad_format(struct v4l2_subdev *sd, ++ struct v4l2_subdev_pad_config *cfg, ++ struct v4l2_subdev_format *fmt) ++{ ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ if (fmt->pad >= NUM_PADS) ++ return -EINVAL; ++ ++ mutex_lock(&imx519->mutex); ++ ++ if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { ++ struct v4l2_mbus_framefmt *try_fmt = ++ v4l2_subdev_get_try_format(&imx519->sd, cfg, fmt->pad); ++ /* update the code which could change due to vflip or hflip: */ ++ try_fmt->code = fmt->pad == IMAGE_PAD ? ++ imx519_get_format_code(imx519) : ++ MEDIA_BUS_FMT_SENSOR_DATA; ++ fmt->format = *try_fmt; ++ } else { ++ if (fmt->pad == IMAGE_PAD) { ++ imx519_update_image_pad_format(imx519, imx519->mode, ++ fmt); ++ fmt->format.code = ++ imx519_get_format_code(imx519); ++ } else { ++ imx519_update_metadata_pad_format(fmt); ++ } ++ } ++ ++ mutex_unlock(&imx519->mutex); ++ return 0; ++} ++ ++static ++unsigned int imx519_get_frame_length(const struct imx519_mode *mode, ++ const struct v4l2_fract *timeperframe) ++{ ++ u64 frame_length; ++ ++ frame_length = (u64)timeperframe->numerator * IMX519_PIXEL_RATE; ++ do_div(frame_length, ++ (u64)timeperframe->denominator * mode->line_length_pix); ++ ++ if (WARN_ON(frame_length > IMX519_FRAME_LENGTH_MAX)) ++ frame_length = IMX519_FRAME_LENGTH_MAX; ++ ++ return max_t(unsigned int, frame_length, mode->height); ++} ++ ++static void imx519_set_framing_limits(struct imx519 *imx519) ++{ ++ unsigned int frm_length_min, frm_length_default, hblank; ++ const struct imx519_mode *mode = imx519->mode; ++ ++ frm_length_min = imx519_get_frame_length(mode, &mode->timeperframe_min); ++ frm_length_default = ++ imx519_get_frame_length(mode, &mode->timeperframe_default); ++ ++ /* Default to no long exposure multiplier. */ ++ imx519->long_exp_shift = 0; ++ ++ /* Update limits and set FPS to default */ ++ __v4l2_ctrl_modify_range(imx519->vblank, frm_length_min - mode->height, ++ ((1 << IMX519_LONG_EXP_SHIFT_MAX) * ++ IMX519_FRAME_LENGTH_MAX) - mode->height, ++ 1, frm_length_default - mode->height); ++ ++ /* Setting this will adjust the exposure limits as well. */ ++ __v4l2_ctrl_s_ctrl(imx519->vblank, frm_length_default - mode->height); ++ ++ /* ++ * Currently PPL is fixed to the mode specified value, so hblank ++ * depends on mode->width only, and is not changeable in any ++ * way other than changing the mode. ++ */ ++ hblank = mode->line_length_pix - mode->width; ++ __v4l2_ctrl_modify_range(imx519->hblank, hblank, hblank, 1, hblank); ++} ++ ++static int imx519_set_pad_format(struct v4l2_subdev *sd, ++ struct v4l2_subdev_pad_config *cfg, ++ struct v4l2_subdev_format *fmt) ++{ ++ struct v4l2_mbus_framefmt *framefmt; ++ const struct imx519_mode *mode; ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ if (fmt->pad >= NUM_PADS) ++ return -EINVAL; ++ ++ mutex_lock(&imx519->mutex); ++ ++ if (fmt->pad == IMAGE_PAD) { ++ /* Bayer order varies with flips */ ++ fmt->format.code = imx519_get_format_code(imx519); ++ ++ mode = v4l2_find_nearest_size(supported_modes_10bit, ++ ARRAY_SIZE(supported_modes_10bit), ++ width, height, ++ fmt->format.width, ++ fmt->format.height); ++ imx519_update_image_pad_format(imx519, mode, fmt); ++ if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { ++ framefmt = v4l2_subdev_get_try_format(sd, cfg, ++ fmt->pad); ++ *framefmt = fmt->format; ++ } else { ++ imx519->mode = mode; ++ imx519->fmt_code = fmt->format.code; ++ imx519_set_framing_limits(imx519); ++ } ++ } else { ++ if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { ++ framefmt = v4l2_subdev_get_try_format(sd, cfg, ++ fmt->pad); ++ *framefmt = fmt->format; ++ } else { ++ /* Only one embedded data mode is supported */ ++ imx519_update_metadata_pad_format(fmt); ++ } ++ } ++ ++ mutex_unlock(&imx519->mutex); ++ ++ return 0; ++} ++ ++static const struct v4l2_rect * ++__imx519_get_pad_crop(struct imx519 *imx519, struct v4l2_subdev_pad_config *cfg, ++ unsigned int pad, enum v4l2_subdev_format_whence which) ++{ ++ switch (which) { ++ case V4L2_SUBDEV_FORMAT_TRY: ++ return v4l2_subdev_get_try_crop(&imx519->sd, cfg, pad); ++ case V4L2_SUBDEV_FORMAT_ACTIVE: ++ return &imx519->mode->crop; ++ } ++ ++ return NULL; ++} ++ ++static int imx519_get_selection(struct v4l2_subdev *sd, ++ struct v4l2_subdev_pad_config *cfg, ++ struct v4l2_subdev_selection *sel) ++{ ++ switch (sel->target) { ++ case V4L2_SEL_TGT_CROP: { ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ mutex_lock(&imx519->mutex); ++ sel->r = *__imx519_get_pad_crop(imx519, cfg, sel->pad, ++ sel->which); ++ mutex_unlock(&imx519->mutex); ++ ++ return 0; ++ } ++ ++ case V4L2_SEL_TGT_NATIVE_SIZE: ++ sel->r.left = 0; ++ sel->r.top = 0; ++ sel->r.width = IMX519_NATIVE_WIDTH; ++ sel->r.height = IMX519_NATIVE_HEIGHT; ++ ++ return 0; ++ ++ case V4L2_SEL_TGT_CROP_DEFAULT: ++ case V4L2_SEL_TGT_CROP_BOUNDS: ++ sel->r.left = IMX519_PIXEL_ARRAY_LEFT; ++ sel->r.top = IMX519_PIXEL_ARRAY_TOP; ++ sel->r.width = IMX519_PIXEL_ARRAY_WIDTH; ++ sel->r.height = IMX519_PIXEL_ARRAY_HEIGHT; ++ ++ return 0; ++ } ++ ++ return -EINVAL; ++} ++ ++/* Start streaming */ ++static int imx519_start_streaming(struct imx519 *imx519) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ const struct imx519_reg_list *reg_list; ++ int ret; ++ ++ if (!imx519->common_regs_written) { ++ ret = imx519_write_regs(imx519, mode_common_regs, ++ ARRAY_SIZE(mode_common_regs)); ++ ++ if (ret) { ++ dev_err(&client->dev, "%s failed to set common settings\n", ++ __func__); ++ return ret; ++ } ++ imx519->common_regs_written = true; ++ } ++ ++ /* Apply default values of current mode */ ++ reg_list = &imx519->mode->reg_list; ++ ret = imx519_write_regs(imx519, reg_list->regs, reg_list->num_of_regs); ++ if (ret) { ++ dev_err(&client->dev, "%s failed to set mode\n", __func__); ++ return ret; ++ } ++ ++ /* Apply customized values from user */ ++ ret = __v4l2_ctrl_handler_setup(imx519->sd.ctrl_handler); ++ if (ret) ++ return ret; ++ ++ /* set stream on register */ ++ return imx519_write_reg(imx519, IMX519_REG_MODE_SELECT, ++ IMX519_REG_VALUE_08BIT, IMX519_MODE_STREAMING); ++} ++ ++/* Stop streaming */ ++static void imx519_stop_streaming(struct imx519 *imx519) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ int ret; ++ ++ /* set stream off register */ ++ ret = imx519_write_reg(imx519, IMX519_REG_MODE_SELECT, ++ IMX519_REG_VALUE_08BIT, IMX519_MODE_STANDBY); ++ if (ret) ++ dev_err(&client->dev, "%s failed to set stream\n", __func__); ++} ++ ++static int imx519_set_stream(struct v4l2_subdev *sd, int enable) ++{ ++ struct imx519 *imx519 = to_imx519(sd); ++ struct i2c_client *client = v4l2_get_subdevdata(sd); ++ int ret = 0; ++ ++ mutex_lock(&imx519->mutex); ++ if (imx519->streaming == enable) { ++ mutex_unlock(&imx519->mutex); ++ return 0; ++ } ++ ++ if (enable) { ++ ret = pm_runtime_get_sync(&client->dev); ++ if (ret < 0) { ++ pm_runtime_put_noidle(&client->dev); ++ goto err_unlock; ++ } ++ ++ /* ++ * Apply default & customized values ++ * and then start streaming. ++ */ ++ ret = imx519_start_streaming(imx519); ++ if (ret) ++ goto err_rpm_put; ++ } else { ++ imx519_stop_streaming(imx519); ++ pm_runtime_put(&client->dev); ++ } ++ ++ imx519->streaming = enable; ++ ++ /* vflip and hflip cannot change during streaming */ ++ __v4l2_ctrl_grab(imx519->vflip, enable); ++ __v4l2_ctrl_grab(imx519->hflip, enable); ++ ++ mutex_unlock(&imx519->mutex); ++ ++ return ret; ++ ++err_rpm_put: ++ pm_runtime_put(&client->dev); ++err_unlock: ++ mutex_unlock(&imx519->mutex); ++ ++ return ret; ++} ++ ++/* Power/clock management functions */ ++static int imx519_power_on(struct device *dev) ++{ ++ struct i2c_client *client = to_i2c_client(dev); ++ struct v4l2_subdev *sd = i2c_get_clientdata(client); ++ struct imx519 *imx519 = to_imx519(sd); ++ int ret; ++ ++ ret = regulator_bulk_enable(IMX519_NUM_SUPPLIES, ++ imx519->supplies); ++ if (ret) { ++ dev_err(&client->dev, "%s: failed to enable regulators\n", ++ __func__); ++ return ret; ++ } ++ ++ ret = clk_prepare_enable(imx519->xclk); ++ if (ret) { ++ dev_err(&client->dev, "%s: failed to enable clock\n", ++ __func__); ++ goto reg_off; ++ } ++ ++ gpiod_set_value_cansleep(imx519->reset_gpio, 1); ++ usleep_range(IMX519_XCLR_MIN_DELAY_US, ++ IMX519_XCLR_MIN_DELAY_US + IMX519_XCLR_DELAY_RANGE_US); ++ ++ return 0; ++ ++reg_off: ++ regulator_bulk_disable(IMX519_NUM_SUPPLIES, imx519->supplies); ++ return ret; ++} ++ ++static int imx519_power_off(struct device *dev) ++{ ++ struct i2c_client *client = to_i2c_client(dev); ++ struct v4l2_subdev *sd = i2c_get_clientdata(client); ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ gpiod_set_value_cansleep(imx519->reset_gpio, 0); ++ regulator_bulk_disable(IMX519_NUM_SUPPLIES, imx519->supplies); ++ clk_disable_unprepare(imx519->xclk); ++ ++ /* Force reprogramming of the common registers when powered up again. */ ++ imx519->common_regs_written = false; ++ ++ return 0; ++} ++ ++static int __maybe_unused imx519_suspend(struct device *dev) ++{ ++ struct i2c_client *client = to_i2c_client(dev); ++ struct v4l2_subdev *sd = i2c_get_clientdata(client); ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ if (imx519->streaming) ++ imx519_stop_streaming(imx519); ++ ++ return 0; ++} ++ ++static int __maybe_unused imx519_resume(struct device *dev) ++{ ++ struct i2c_client *client = to_i2c_client(dev); ++ struct v4l2_subdev *sd = i2c_get_clientdata(client); ++ struct imx519 *imx519 = to_imx519(sd); ++ int ret; ++ ++ if (imx519->streaming) { ++ ret = imx519_start_streaming(imx519); ++ if (ret) ++ goto error; ++ } ++ ++ return 0; ++ ++error: ++ imx519_stop_streaming(imx519); ++ imx519->streaming = 0; ++ return ret; ++} ++ ++static int imx519_get_regulators(struct imx519 *imx519) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ unsigned int i; ++ ++ for (i = 0; i < IMX519_NUM_SUPPLIES; i++) ++ imx519->supplies[i].supply = imx519_supply_name[i]; ++ ++ return devm_regulator_bulk_get(&client->dev, ++ IMX519_NUM_SUPPLIES, ++ imx519->supplies); ++} ++ ++/* Verify chip ID */ ++static int imx519_identify_module(struct imx519 *imx519, u32 expected_id) ++{ ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ int ret; ++ u32 val; ++ ++ ret = imx519_read_reg(imx519, IMX519_REG_CHIP_ID, ++ IMX519_REG_VALUE_16BIT, &val); ++ if (ret) { ++ dev_err(&client->dev, "failed to read chip id %x, with error %d\n", ++ expected_id, ret); ++ return ret; ++ } ++ ++ if (val != expected_id) { ++ dev_err(&client->dev, "chip id mismatch: %x!=%x\n", ++ expected_id, val); ++ return -EIO; ++ } ++ ++ dev_info(&client->dev, "Device found is imx%x\n", val); ++ ++ return 0; ++} ++ ++static const struct v4l2_subdev_core_ops imx519_core_ops = { ++ .subscribe_event = v4l2_ctrl_subdev_subscribe_event, ++ .unsubscribe_event = v4l2_event_subdev_unsubscribe, ++}; ++ ++static const struct v4l2_subdev_video_ops imx519_video_ops = { ++ .s_stream = imx519_set_stream, ++}; ++ ++static const struct v4l2_subdev_pad_ops imx519_pad_ops = { ++ .enum_mbus_code = imx519_enum_mbus_code, ++ .get_fmt = imx519_get_pad_format, ++ .set_fmt = imx519_set_pad_format, ++ .get_selection = imx519_get_selection, ++ .enum_frame_size = imx519_enum_frame_size, ++}; ++ ++static const struct v4l2_subdev_ops imx519_subdev_ops = { ++ .core = &imx519_core_ops, ++ .video = &imx519_video_ops, ++ .pad = &imx519_pad_ops, ++}; ++ ++static const struct v4l2_subdev_internal_ops imx519_internal_ops = { ++ .open = imx519_open, ++}; ++ ++/* Initialize control handlers */ ++static int imx519_init_controls(struct imx519 *imx519) ++{ ++ struct v4l2_ctrl_handler *ctrl_hdlr; ++ struct i2c_client *client = v4l2_get_subdevdata(&imx519->sd); ++ struct v4l2_fwnode_device_properties props; ++ unsigned int i; ++ int ret; ++ ++ ctrl_hdlr = &imx519->ctrl_handler; ++ ret = v4l2_ctrl_handler_init(ctrl_hdlr, 16); ++ if (ret) ++ return ret; ++ ++ mutex_init(&imx519->mutex); ++ ctrl_hdlr->lock = &imx519->mutex; ++ ++ /* By default, PIXEL_RATE is read only */ ++ imx519->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_PIXEL_RATE, ++ IMX519_PIXEL_RATE, ++ IMX519_PIXEL_RATE, 1, ++ IMX519_PIXEL_RATE); ++ ++ /* ++ * Create the controls here, but mode specific limits are setup ++ * in the imx519_set_framing_limits() call below. ++ */ ++ imx519->vblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_VBLANK, 0, 0xffff, 1, 0); ++ imx519->hblank = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_HBLANK, 0, 0xffff, 1, 0); ++ ++ /* HBLANK is read-only for now, but does change with mode. */ ++ if (imx519->hblank) ++ imx519->hblank->flags |= V4L2_CTRL_FLAG_READ_ONLY; ++ ++ imx519->exposure = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_EXPOSURE, ++ IMX519_EXPOSURE_MIN, ++ IMX519_EXPOSURE_MAX, ++ IMX519_EXPOSURE_STEP, ++ IMX519_EXPOSURE_DEFAULT); ++ ++ v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, V4L2_CID_ANALOGUE_GAIN, ++ IMX519_ANA_GAIN_MIN, IMX519_ANA_GAIN_MAX, ++ IMX519_ANA_GAIN_STEP, IMX519_ANA_GAIN_DEFAULT); ++ ++ v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, V4L2_CID_DIGITAL_GAIN, ++ IMX519_DGTL_GAIN_MIN, IMX519_DGTL_GAIN_MAX, ++ IMX519_DGTL_GAIN_STEP, IMX519_DGTL_GAIN_DEFAULT); ++ ++ imx519->hflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_HFLIP, 0, 1, 1, 0); ++ if (imx519->hflip) ++ imx519->hflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; ++ ++ imx519->vflip = v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_VFLIP, 0, 1, 1, 0); ++ if (imx519->vflip) ++ imx519->vflip->flags |= V4L2_CTRL_FLAG_MODIFY_LAYOUT; ++ ++ v4l2_ctrl_new_std_menu_items(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_TEST_PATTERN, ++ ARRAY_SIZE(imx519_test_pattern_menu) - 1, ++ 0, 0, imx519_test_pattern_menu); ++ for (i = 0; i < 4; i++) { ++ /* ++ * The assumption is that ++ * V4L2_CID_TEST_PATTERN_GREENR == V4L2_CID_TEST_PATTERN_RED + 1 ++ * V4L2_CID_TEST_PATTERN_BLUE == V4L2_CID_TEST_PATTERN_RED + 2 ++ * V4L2_CID_TEST_PATTERN_GREENB == V4L2_CID_TEST_PATTERN_RED + 3 ++ */ ++ v4l2_ctrl_new_std(ctrl_hdlr, &imx519_ctrl_ops, ++ V4L2_CID_TEST_PATTERN_RED + i, ++ IMX519_TEST_PATTERN_COLOUR_MIN, ++ IMX519_TEST_PATTERN_COLOUR_MAX, ++ IMX519_TEST_PATTERN_COLOUR_STEP, ++ IMX519_TEST_PATTERN_COLOUR_MAX); ++ /* The "Solid color" pattern is white by default */ ++ } ++ ++ if (ctrl_hdlr->error) { ++ ret = ctrl_hdlr->error; ++ dev_err(&client->dev, "%s control init failed (%d)\n", ++ __func__, ret); ++ goto error; ++ } ++ ++ ret = v4l2_fwnode_device_parse(&client->dev, &props); ++ if (ret) ++ goto error; ++ ++ ret = v4l2_ctrl_new_fwnode_properties(ctrl_hdlr, &imx519_ctrl_ops, ++ &props); ++ if (ret) ++ goto error; ++ ++ imx519->sd.ctrl_handler = ctrl_hdlr; ++ ++ /* Setup exposure and frame/line length limits. */ ++ imx519_set_framing_limits(imx519); ++ ++ return 0; ++ ++error: ++ v4l2_ctrl_handler_free(ctrl_hdlr); ++ mutex_destroy(&imx519->mutex); ++ ++ return ret; ++} ++ ++static void imx519_free_controls(struct imx519 *imx519) ++{ ++ v4l2_ctrl_handler_free(imx519->sd.ctrl_handler); ++ mutex_destroy(&imx519->mutex); ++} ++ ++static int imx519_check_hwcfg(struct device *dev) ++{ ++ struct fwnode_handle *endpoint; ++ struct v4l2_fwnode_endpoint ep_cfg = { ++ .bus_type = V4L2_MBUS_CSI2_DPHY ++ }; ++ int ret = -EINVAL; ++ ++ endpoint = fwnode_graph_get_next_endpoint(dev_fwnode(dev), NULL); ++ if (!endpoint) { ++ dev_err(dev, "endpoint node not found\n"); ++ return -EINVAL; ++ } ++ ++ if (v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep_cfg)) { ++ dev_err(dev, "could not parse endpoint\n"); ++ goto error_out; ++ } ++ ++ /* Check the number of MIPI CSI2 data lanes */ ++ if (ep_cfg.bus.mipi_csi2.num_data_lanes != 2) { ++ dev_err(dev, "only 2 data lanes are currently supported\n"); ++ goto error_out; ++ } ++ ++ /* Check the link frequency set in device tree */ ++ if (!ep_cfg.nr_of_link_frequencies) { ++ dev_err(dev, "link-frequency property not found in DT\n"); ++ goto error_out; ++ } ++ ++ if (ep_cfg.nr_of_link_frequencies != 1 || ++ ep_cfg.link_frequencies[0] != IMX519_DEFAULT_LINK_FREQ) { ++ dev_err(dev, "Link frequency not supported: %lld\n", ++ ep_cfg.link_frequencies[0]); ++ goto error_out; ++ } ++ ++ ret = 0; ++ ++error_out: ++ v4l2_fwnode_endpoint_free(&ep_cfg); ++ fwnode_handle_put(endpoint); ++ ++ return ret; ++} ++ ++static const struct of_device_id imx519_dt_ids[] = { ++ { .compatible = "sony,imx519"}, ++ { /* sentinel */ } ++}; ++ ++static int imx519_probe(struct i2c_client *client) ++{ ++ struct device *dev = &client->dev; ++ struct imx519 *imx519; ++ const struct of_device_id *match; ++ u32 xclk_freq; ++ int ret; ++ ++ imx519 = devm_kzalloc(&client->dev, sizeof(*imx519), GFP_KERNEL); ++ if (!imx519) ++ return -ENOMEM; ++ ++ v4l2_i2c_subdev_init(&imx519->sd, client, &imx519_subdev_ops); ++ ++ match = of_match_device(imx519_dt_ids, dev); ++ if (!match) ++ return -ENODEV; ++ ++ /* Check the hardware configuration in device tree */ ++ if (imx519_check_hwcfg(dev)) ++ return -EINVAL; ++ ++ /* Get system clock (xclk) */ ++ imx519->xclk = devm_clk_get(dev, NULL); ++ if (IS_ERR(imx519->xclk)) { ++ dev_err(dev, "failed to get xclk\n"); ++ return PTR_ERR(imx519->xclk); ++ } ++ ++ xclk_freq = clk_get_rate(imx519->xclk); ++ if (xclk_freq != IMX519_XCLK_FREQ) { ++ dev_err(dev, "xclk frequency not supported: %d Hz\n", ++ xclk_freq); ++ return -EINVAL; ++ } ++ ++ ret = imx519_get_regulators(imx519); ++ if (ret) { ++ dev_err(dev, "failed to get regulators\n"); ++ return ret; ++ } ++ ++ /* Request optional enable pin */ ++ imx519->reset_gpio = devm_gpiod_get_optional(dev, "reset", ++ GPIOD_OUT_HIGH); ++ ++ /* ++ * The sensor must be powered for imx519_identify_module() ++ * to be able to read the CHIP_ID register ++ */ ++ ret = imx519_power_on(dev); ++ if (ret) ++ return ret; ++ ++ ret = imx519_identify_module(imx519, IMX519_CHIP_ID); ++ if (ret) ++ goto error_power_off; ++ ++ /* Set default mode to max resolution */ ++ imx519->mode = &supported_modes_10bit[0]; ++ imx519->fmt_code = MEDIA_BUS_FMT_SRGGB10_1X10; ++ ++ /* Enable runtime PM and turn off the device */ ++ pm_runtime_set_active(dev); ++ pm_runtime_enable(dev); ++ pm_runtime_idle(dev); ++ ++ /* This needs the pm runtime to be registered. */ ++ ret = imx519_init_controls(imx519); ++ if (ret) ++ goto error_power_off; ++ ++ /* Initialize subdev */ ++ imx519->sd.internal_ops = &imx519_internal_ops; ++ imx519->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | ++ V4L2_SUBDEV_FL_HAS_EVENTS; ++ imx519->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; ++ ++ /* Initialize source pads */ ++ imx519->pad[IMAGE_PAD].flags = MEDIA_PAD_FL_SOURCE; ++ imx519->pad[METADATA_PAD].flags = MEDIA_PAD_FL_SOURCE; ++ ++ ret = media_entity_pads_init(&imx519->sd.entity, NUM_PADS, imx519->pad); ++ if (ret) { ++ dev_err(dev, "failed to init entity pads: %d\n", ret); ++ goto error_handler_free; ++ } ++ ++ ret = v4l2_async_register_subdev_sensor_common(&imx519->sd); ++ if (ret < 0) { ++ dev_err(dev, "failed to register sensor sub-device: %d\n", ret); ++ goto error_media_entity; ++ } ++ ++ return 0; ++ ++error_media_entity: ++ media_entity_cleanup(&imx519->sd.entity); ++ ++error_handler_free: ++ imx519_free_controls(imx519); ++ ++error_power_off: ++ pm_runtime_disable(&client->dev); ++ pm_runtime_set_suspended(&client->dev); ++ imx519_power_off(&client->dev); ++ ++ return ret; ++} ++ ++static int imx519_remove(struct i2c_client *client) ++{ ++ struct v4l2_subdev *sd = i2c_get_clientdata(client); ++ struct imx519 *imx519 = to_imx519(sd); ++ ++ v4l2_async_unregister_subdev(sd); ++ media_entity_cleanup(&sd->entity); ++ imx519_free_controls(imx519); ++ ++ pm_runtime_disable(&client->dev); ++ if (!pm_runtime_status_suspended(&client->dev)) ++ imx519_power_off(&client->dev); ++ pm_runtime_set_suspended(&client->dev); ++ ++ return 0; ++} ++ ++MODULE_DEVICE_TABLE(of, imx519_dt_ids); ++ ++static const struct dev_pm_ops imx519_pm_ops = { ++ SET_SYSTEM_SLEEP_PM_OPS(imx519_suspend, imx519_resume) ++ SET_RUNTIME_PM_OPS(imx519_power_off, imx519_power_on, NULL) ++}; ++ ++static struct i2c_driver imx519_i2c_driver = { ++ .driver = { ++ .name = "imx519", ++ .of_match_table = imx519_dt_ids, ++ .pm = &imx519_pm_ops, ++ }, ++ .probe_new = imx519_probe, ++ .remove = imx519_remove, ++}; ++ ++module_i2c_driver(imx519_i2c_driver); ++ ++MODULE_AUTHOR("Lee Jackson "); ++MODULE_DESCRIPTION("Sony IMX519 sensor driver"); ++MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/i2c/irs1125.c b/drivers/media/i2c/irs1125.c new file mode 100644 -index 000000000000..30c3d2640386 +index 0000000000000..30c3d26403865 --- /dev/null +++ b/drivers/media/i2c/irs1125.c @@ -0,0 +1,1200 @@ @@ -68958,7 +72732,7 @@ index 000000000000..30c3d2640386 + diff --git a/drivers/media/i2c/irs1125.h b/drivers/media/i2c/irs1125.h new file mode 100644 -index 000000000000..96d676123d5e +index 0000000000000..96d676123d5ed --- /dev/null +++ b/drivers/media/i2c/irs1125.h @@ -0,0 +1,95 @@ @@ -69058,7 +72832,7 @@ index 000000000000..96d676123d5e +#endif /* IRS1125 */ + diff --git a/drivers/media/i2c/ov5647.c b/drivers/media/i2c/ov5647.c -index e7d2e5b4ad4b..98a5329d68fb 100644 +index e7d2e5b4ad4b9..98a5329d68fbb 100644 --- a/drivers/media/i2c/ov5647.c +++ b/drivers/media/i2c/ov5647.c @@ -21,6 +21,7 @@ @@ -70540,7 +74314,7 @@ index e7d2e5b4ad4b..98a5329d68fb 100644 mutex_destroy(&ov5647->lock); diff --git a/drivers/media/i2c/ov7251.c b/drivers/media/i2c/ov7251.c -index 0c10203f822b..2c554626319d 100644 +index 0c10203f822b1..2c554626319d9 100644 --- a/drivers/media/i2c/ov7251.c +++ b/drivers/media/i2c/ov7251.c @@ -1253,6 +1253,7 @@ static const struct v4l2_subdev_ops ov7251_subdev_ops = { @@ -70578,7 +74352,7 @@ index 0c10203f822b..2c554626319d 100644 ov7251->pad.flags = MEDIA_PAD_FL_SOURCE; diff --git a/drivers/media/i2c/ov9281.c b/drivers/media/i2c/ov9281.c new file mode 100644 -index 000000000000..a6ffcdd47b21 +index 0000000000000..a6ffcdd47b215 --- /dev/null +++ b/drivers/media/i2c/ov9281.c @@ -0,0 +1,1289 @@ @@ -71872,7 +75646,7 @@ index 000000000000..a6ffcdd47b21 +MODULE_DESCRIPTION("OmniVision ov9281 sensor driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c -index 1b309bb743c7..3c62eb3b3a1d 100644 +index f21da11caf224..ce64c25c1511a 100644 --- a/drivers/media/i2c/tc358743.c +++ b/drivers/media/i2c/tc358743.c @@ -110,7 +110,7 @@ static inline struct tc358743_state *to_state(struct v4l2_subdev *sd) @@ -72047,7 +75821,7 @@ index 1b309bb743c7..3c62eb3b3a1d 100644 */ bps_pr_lane = 2 * endpoint.link_frequencies[0]; if (bps_pr_lane < 62500000U || bps_pr_lane > 1000000000U) { -@@ -1982,23 +1999,42 @@ static int tc358743_probe_of(struct tc358743_state *state) +@@ -1983,23 +2000,42 @@ static int tc358743_probe_of(struct tc358743_state *state) state->pdata.refclk_hz * state->pdata.pll_prd; /* @@ -72104,7 +75878,7 @@ index 1b309bb743c7..3c62eb3b3a1d 100644 state->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); -@@ -2037,6 +2073,7 @@ static int tc358743_probe(struct i2c_client *client) +@@ -2038,6 +2074,7 @@ static int tc358743_probe(struct i2c_client *client) struct tc358743_platform_data *pdata = client->dev.platform_data; struct v4l2_subdev *sd; u16 irq_mask = MASK_HDMI_MSK | MASK_CSI_MSK; @@ -72112,7 +75886,7 @@ index 1b309bb743c7..3c62eb3b3a1d 100644 int err; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) -@@ -2055,6 +2092,7 @@ static int tc358743_probe(struct i2c_client *client) +@@ -2056,6 +2093,7 @@ static int tc358743_probe(struct i2c_client *client) if (pdata) { state->pdata = *pdata; state->bus.flags = V4L2_MBUS_CSI2_CONTINUOUS_CLOCK; @@ -72120,7 +75894,7 @@ index 1b309bb743c7..3c62eb3b3a1d 100644 } else { err = tc358743_probe_of(state); if (err == -ENODEV) -@@ -2068,7 +2106,8 @@ static int tc358743_probe(struct i2c_client *client) +@@ -2069,7 +2107,8 @@ static int tc358743_probe(struct i2c_client *client) sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; /* i2c access */ @@ -72131,7 +75905,7 @@ index 1b309bb743c7..3c62eb3b3a1d 100644 client->addr << 1); return -ENODEV; diff --git a/drivers/media/mc/mc-request.c b/drivers/media/mc/mc-request.c -index c0782fd96c59..88a167fc830e 100644 +index c0782fd96c591..88a167fc830e2 100644 --- a/drivers/media/mc/mc-request.c +++ b/drivers/media/mc/mc-request.c @@ -504,3 +504,38 @@ void media_request_object_complete(struct media_request_object *obj) @@ -72174,7 +75948,7 @@ index c0782fd96c59..88a167fc830e 100644 +} +EXPORT_SYMBOL_GPL(media_request_unpin); diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig -index 7e152bbb4fa6..e8c0dc223ba2 100644 +index 7e152bbb4fa66..e8c0dc223ba28 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig @@ -152,6 +152,7 @@ source "drivers/media/platform/am437x/Kconfig" @@ -72186,7 +75960,7 @@ index 7e152bbb4fa6..e8c0dc223ba2 100644 config VIDEO_TI_CAL diff --git a/drivers/media/platform/Makefile b/drivers/media/platform/Makefile -index 62b6cdc8c730..1fb1a67451e3 100644 +index 62b6cdc8c7300..1fb1a67451e3f 100644 --- a/drivers/media/platform/Makefile +++ b/drivers/media/platform/Makefile @@ -79,4 +79,6 @@ obj-$(CONFIG_VIDEO_QCOM_CAMSS) += qcom/camss/ @@ -72198,7 +75972,7 @@ index 62b6cdc8c730..1fb1a67451e3 100644 obj-y += sunxi/ diff --git a/drivers/media/platform/bcm2835/Kconfig b/drivers/media/platform/bcm2835/Kconfig new file mode 100644 -index 000000000000..bd1370199650 +index 0000000000000..bd13701996509 --- /dev/null +++ b/drivers/media/platform/bcm2835/Kconfig @@ -0,0 +1,21 @@ @@ -72225,7 +75999,7 @@ index 000000000000..bd1370199650 + called bcm2835-unicam. diff --git a/drivers/media/platform/bcm2835/Makefile b/drivers/media/platform/bcm2835/Makefile new file mode 100644 -index 000000000000..a98aba03598a +index 0000000000000..a98aba03598ab --- /dev/null +++ b/drivers/media/platform/bcm2835/Makefile @@ -0,0 +1,3 @@ @@ -72234,7 +76008,7 @@ index 000000000000..a98aba03598a +obj-$(CONFIG_VIDEO_BCM2835_UNICAM) += bcm2835-unicam.o diff --git a/drivers/media/platform/bcm2835/bcm2835-unicam.c b/drivers/media/platform/bcm2835/bcm2835-unicam.c new file mode 100644 -index 000000000000..59163f93b207 +index 0000000000000..59163f93b2071 --- /dev/null +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c @@ -0,0 +1,2913 @@ @@ -75153,7 +78927,7 @@ index 000000000000..59163f93b207 +MODULE_VERSION(UNICAM_VERSION); diff --git a/drivers/media/platform/bcm2835/vc4-regs-unicam.h b/drivers/media/platform/bcm2835/vc4-regs-unicam.h new file mode 100644 -index 000000000000..ae059a171d0f +index 0000000000000..ae059a171d0fe --- /dev/null +++ b/drivers/media/platform/bcm2835/vc4-regs-unicam.h @@ -0,0 +1,253 @@ @@ -75411,7 +79185,7 @@ index 000000000000..ae059a171d0f + +#endif diff --git a/drivers/media/spi/Kconfig b/drivers/media/spi/Kconfig -index 857ef4ace6e9..deae75ea3c44 100644 +index 857ef4ace6e9b..deae75ea3c448 100644 --- a/drivers/media/spi/Kconfig +++ b/drivers/media/spi/Kconfig @@ -25,6 +25,7 @@ menu "Media SPI Adapters" @@ -75423,10 +79197,10 @@ index 857ef4ace6e9..deae75ea3c44 100644 help Choose if you would like to have SPI interface support for Sony CXD2880. diff --git a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c -index 91460e4d0c30..637cf99d81ed 100644 +index c278b9b0f1024..05f2297cf583a 100644 --- a/drivers/media/usb/dvb-usb-v2/rtl28xxu.c +++ b/drivers/media/usb/dvb-usb-v2/rtl28xxu.c -@@ -1944,6 +1944,10 @@ static const struct usb_device_id rtl28xxu_id_table[] = { +@@ -1953,6 +1953,10 @@ static const struct usb_device_id rtl28xxu_id_table[] = { &rtl28xxu_props, "Compro VideoMate U650F", NULL) }, { DVB_USB_DEVICE(USB_VID_KWORLD_2, 0xd394, &rtl28xxu_props, "MaxMedia HU394-T", NULL) }, @@ -75438,7 +79212,7 @@ index 91460e4d0c30..637cf99d81ed 100644 &rtl28xxu_props, "Leadtek WinFast DTV Dongle mini", NULL) }, { DVB_USB_DEVICE(USB_VID_GTEK, USB_PID_CPYTO_REDI_PC50A, diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 41f8410d08d6..517c4499f56d 100644 +index 41f8410d08d65..517c4499f56d3 100644 --- a/drivers/media/v4l2-core/v4l2-ctrls.c +++ b/drivers/media/v4l2-core/v4l2-ctrls.c @@ -275,6 +275,7 @@ const char * const *v4l2_ctrl_get_menu(u32 id) @@ -75488,7 +79262,7 @@ index 41f8410d08d6..517c4499f56d 100644 elem_size = sizeof(struct v4l2_area); break; diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c -index 9eda8b91d17a..d72b462bb054 100644 +index 9eda8b91d17af..d72b462bb054b 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c @@ -1283,6 +1283,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) @@ -75519,7 +79293,7 @@ index 9eda8b91d17a..d72b462bb054 100644 default: /* Compressed formats */ diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c -index b221b4e438a1..fb8708ddc1dc 100644 +index b221b4e438a1a..fb8708ddc1dc3 100644 --- a/drivers/media/v4l2-core/v4l2-mem2mem.c +++ b/drivers/media/v4l2-core/v4l2-mem2mem.c @@ -301,9 +301,10 @@ static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev, @@ -75546,7 +79320,7 @@ index b221b4e438a1..fb8708ddc1dc 100644 schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx); spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig -index 4789507f325b..2aa44318b6c3 100644 +index b8847ae04d938..525cb2c705383 100644 --- a/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig @@ -11,6 +11,14 @@ config MFD_CORE @@ -75565,7 +79339,7 @@ index 4789507f325b..2aa44318b6c3 100644 tristate "AMD CS5535 and CS5536 southbridge core functions" select MFD_CORE diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile -index 1780019d2474..d6091f3b1ca3 100644 +index 1780019d24748..d6091f3b1ca3a 100644 --- a/drivers/mfd/Makefile +++ b/drivers/mfd/Makefile @@ -263,6 +263,7 @@ obj-$(CONFIG_MFD_ROHM_BD71828) += rohm-bd71828.o @@ -75577,7 +79351,7 @@ index 1780019d2474..d6091f3b1ca3 100644 obj-$(CONFIG_SGI_MFD_IOC3) += ioc3.o obj-$(CONFIG_MFD_SIMPLE_MFD_I2C) += simple-mfd-i2c.o diff --git a/drivers/mfd/bcm2835-pm.c b/drivers/mfd/bcm2835-pm.c -index 42fe67f1538e..f66f92fe28c3 100644 +index 42fe67f1538e7..f66f92fe28c34 100644 --- a/drivers/mfd/bcm2835-pm.c +++ b/drivers/mfd/bcm2835-pm.c @@ -50,6 +50,17 @@ static int bcm2835_pm_probe(struct platform_device *pdev) @@ -75600,7 +79374,7 @@ index 42fe67f1538e..f66f92fe28c3 100644 * the full PM register range and support power domains. diff --git a/drivers/mfd/rpisense-core.c b/drivers/mfd/rpisense-core.c new file mode 100644 -index 000000000000..6cfd63e5e8b8 +index 0000000000000..6cfd63e5e8b8d --- /dev/null +++ b/drivers/mfd/rpisense-core.c @@ -0,0 +1,165 @@ @@ -75770,7 +79544,7 @@ index 000000000000..6cfd63e5e8b8 +MODULE_LICENSE("GPL"); + diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig -index fafa8b0d8099..5b01870e8f6f 100644 +index fafa8b0d80996..5b01870e8f6fe 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -9,6 +9,14 @@ config SENSORS_LIS3LV02D @@ -75789,7 +79563,7 @@ index fafa8b0d8099..5b01870e8f6f 100644 tristate "Analog Devices Digital Potentiometers" depends on (I2C || SPI) && SYSFS diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile -index d23231e73330..3fd91279bdd9 100644 +index d23231e733303..3fd91279bdd97 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -11,6 +11,7 @@ obj-$(CONFIG_AD525X_DPOT_SPI) += ad525x_dpot-spi.o @@ -75802,7 +79576,7 @@ index d23231e73330..3fd91279bdd9 100644 obj-$(CONFIG_LKDTM) += lkdtm/ diff --git a/drivers/misc/bcm2835_smi.c b/drivers/misc/bcm2835_smi.c new file mode 100644 -index 000000000000..f1a7f6a3e966 +index 0000000000000..f1a7f6a3e966b --- /dev/null +++ b/drivers/misc/bcm2835_smi.c @@ -0,0 +1,955 @@ @@ -76762,7 +80536,7 @@ index 000000000000..f1a7f6a3e966 +MODULE_DESCRIPTION("Device driver for BCM2835's secondary memory interface"); +MODULE_AUTHOR("Luke Wren "); diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c -index 3246598e4d7e..5ab9b118805b 100644 +index 87bac99207023..b1c3f3c567562 100644 --- a/drivers/mmc/core/block.c +++ b/drivers/mmc/core/block.c @@ -165,6 +165,13 @@ static DEFINE_MUTEX(open_lock); @@ -76779,7 +80553,7 @@ index 3246598e4d7e..5ab9b118805b 100644 static inline int mmc_blk_part_switch(struct mmc_card *card, unsigned int part_type); static void mmc_blk_rw_rq_prep(struct mmc_queue_req *mqrq, -@@ -2890,6 +2897,7 @@ static int mmc_blk_probe(struct mmc_card *card) +@@ -2898,6 +2905,7 @@ static int mmc_blk_probe(struct mmc_card *card) { struct mmc_blk_data *md, *part_md; char cap_str[10]; @@ -76787,7 +80561,7 @@ index 3246598e4d7e..5ab9b118805b 100644 /* * Check that the card supports the command class(es) we need. -@@ -2897,7 +2905,16 @@ static int mmc_blk_probe(struct mmc_card *card) +@@ -2905,7 +2913,16 @@ static int mmc_blk_probe(struct mmc_card *card) if (!(card->csd.cmdclass & CCC_BLOCK_READ)) return -ENODEV; @@ -76805,7 +80579,7 @@ index 3246598e4d7e..5ab9b118805b 100644 card->complete_wq = alloc_workqueue("mmc_complete", WQ_MEM_RECLAIM | WQ_HIGHPRI, 0); -@@ -2912,9 +2929,14 @@ static int mmc_blk_probe(struct mmc_card *card) +@@ -2920,9 +2937,14 @@ static int mmc_blk_probe(struct mmc_card *card) string_get_size((u64)get_capacity(md->disk), 512, STRING_UNITS_2, cap_str, sizeof(cap_str)); @@ -76823,10 +80597,10 @@ index 3246598e4d7e..5ab9b118805b 100644 if (mmc_blk_alloc_parts(card, md)) goto out; diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c -index eaf4810fe656..df3b8ade6cd8 100644 +index b5f3f160c8420..c73368d5d6b26 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1871,7 +1871,8 @@ EXPORT_SYMBOL(mmc_erase); +@@ -1874,7 +1874,8 @@ EXPORT_SYMBOL(mmc_erase); int mmc_can_erase(struct mmc_card *card) { @@ -76837,7 +80611,7 @@ index eaf4810fe656..df3b8ade6cd8 100644 return 0; } diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h -index d68e6e513a4f..e41bc00ece42 100644 +index d68e6e513a4f4..e41bc00ece429 100644 --- a/drivers/mmc/core/quirks.h +++ b/drivers/mmc/core/quirks.h @@ -99,6 +99,14 @@ static const struct mmc_fixup __maybe_unused mmc_blk_fixups[] = { @@ -76856,7 +80630,7 @@ index d68e6e513a4f..e41bc00ece42 100644 }; diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig -index 31481c9fcc2e..49f56beb5fde 100644 +index 31481c9fcc2ec..49f56beb5fde2 100644 --- a/drivers/mmc/host/Kconfig +++ b/drivers/mmc/host/Kconfig @@ -5,6 +5,45 @@ @@ -76906,7 +80680,7 @@ index 31481c9fcc2e..49f56beb5fde 100644 bool "MMC host drivers debugging" depends on MMC != n diff --git a/drivers/mmc/host/Makefile b/drivers/mmc/host/Makefile -index 451c25fc2c69..ecf787b7e277 100644 +index 451c25fc2c692..ecf787b7e2774 100644 --- a/drivers/mmc/host/Makefile +++ b/drivers/mmc/host/Makefile @@ -24,6 +24,8 @@ obj-$(CONFIG_MMC_SDHCI_F_SDH30) += sdhci_f_sdh30.o @@ -76920,7 +80694,7 @@ index 451c25fc2c69..ecf787b7e277 100644 obj-$(CONFIG_MMC_ALCOR) += alcor.o diff --git a/drivers/mmc/host/bcm2835-mmc.c b/drivers/mmc/host/bcm2835-mmc.c new file mode 100644 -index 000000000000..cdc1318e5936 +index 0000000000000..cdc1318e59360 --- /dev/null +++ b/drivers/mmc/host/bcm2835-mmc.c @@ -0,0 +1,1576 @@ @@ -78502,10 +82276,10 @@ index 000000000000..cdc1318e5936 +MODULE_AUTHOR("Gellert Weisz"); diff --git a/drivers/mmc/host/bcm2835-sdhost.c b/drivers/mmc/host/bcm2835-sdhost.c new file mode 100644 -index 000000000000..7caba5e12f79 +index 0000000000000..2c41240827852 --- /dev/null +++ b/drivers/mmc/host/bcm2835-sdhost.c -@@ -0,0 +1,2196 @@ +@@ -0,0 +1,2208 @@ +/* + * BCM2835 SD host driver. + * @@ -78655,6 +82429,8 @@ index 000000000000..7caba5e12f79 +struct bcm2835_host { + spinlock_t lock; + ++ struct rpi_firmware *fw; ++ + void __iomem *ioaddr; + phys_addr_t bus_addr; + @@ -80066,7 +83842,7 @@ index 000000000000..7caba5e12f79 + if (host->firmware_sets_cdiv) { + u32 msg[3] = { clock, 0, 0 }; + -+ rpi_firmware_property(rpi_firmware_get(NULL), ++ rpi_firmware_property(host->fw, + RPI_FIRMWARE_SET_SDHOST_CLOCK, + &msg, sizeof(msg)); + @@ -80608,6 +84384,13 @@ index 000000000000..7caba5e12f79 + goto err; + } + ++ host->fw = rpi_firmware_get( ++ of_parse_phandle(dev->of_node, "firmware", 0)); ++ if (!host->fw) { ++ ret = -EPROBE_DEFER; ++ goto err; ++ } ++ + host->max_clk = clk_get_rate(clk); + + host->irq = platform_get_irq(pdev, 0); @@ -80632,7 +84415,7 @@ index 000000000000..7caba5e12f79 + msg[1] = ~0; + msg[2] = ~0; + -+ rpi_firmware_property(rpi_firmware_get(NULL), ++ rpi_firmware_property(host->fw, + RPI_FIRMWARE_SET_SDHOST_CLOCK, + &msg, sizeof(msg)); + @@ -80650,6 +84433,8 @@ index 000000000000..7caba5e12f79 + +err: + pr_debug("bcm2835_sdhost_probe -> err %d\n", ret); ++ if (host->fw) ++ rpi_firmware_put(host->fw); + if (host->dma_chan_rxtx) + dma_release_channel(host->dma_chan_rxtx); + mmc_free_host(mmc); @@ -80672,6 +84457,7 @@ index 000000000000..7caba5e12f79 + del_timer_sync(&host->timer); + + tasklet_kill(&host->finish_tasklet); ++ rpi_firmware_put(host->fw); + if (host->dma_chan_rxtx) + dma_release_channel(host->dma_chan_rxtx); + mmc_free_host(host->mmc); @@ -80703,37 +84489,19 @@ index 000000000000..7caba5e12f79 +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Phil Elwell"); diff --git a/drivers/mmc/host/sdhci-iproc.c b/drivers/mmc/host/sdhci-iproc.c -index ddeaf8e1f72f..57257a014022 100644 +index b9eb2ec61a83a..404870e6b759b 100644 --- a/drivers/mmc/host/sdhci-iproc.c +++ b/drivers/mmc/host/sdhci-iproc.c -@@ -173,6 +173,17 @@ static unsigned int sdhci_iproc_get_max_clock(struct sdhci_host *host) - return pltfm_host->clock; - } - -+static void sdhci_iproc_set_power(struct sdhci_host *host, unsigned char mode, -+ unsigned short vdd) -+{ -+ if (!IS_ERR(host->mmc->supply.vmmc)) { -+ struct mmc_host *mmc = host->mmc; -+ -+ mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); -+ } -+ sdhci_set_power_noreg(host, mode, vdd); -+} -+ - static const struct sdhci_ops sdhci_iproc_ops = { - .set_clock = sdhci_set_clock, - .get_max_clock = sdhci_iproc_get_max_clock, -@@ -190,6 +201,7 @@ static const struct sdhci_ops sdhci_iproc_32only_ops = { +@@ -207,6 +207,7 @@ static const struct sdhci_ops sdhci_iproc_32only_ops = { .write_b = sdhci_iproc_writeb, .set_clock = sdhci_set_clock, .get_max_clock = sdhci_iproc_get_max_clock, -+ .set_power = sdhci_iproc_set_power, ++ .set_power = sdhci_set_power_and_bus_voltage, .set_bus_width = sdhci_set_bus_width, .reset = sdhci_reset, .set_uhs_signaling = sdhci_set_uhs_signaling, diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c -index 58c977d581e7..a1af2f5c0998 100644 +index b1e1d327cb8eb..30d5f2debfd9e 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -41,7 +41,7 @@ @@ -80745,7 +84513,7 @@ index 58c977d581e7..a1af2f5c0998 100644 #define MAX_TUNING_LOOP 40 -@@ -3122,7 +3122,7 @@ static void sdhci_timeout_timer(struct timer_list *t) +@@ -3127,7 +3127,7 @@ static void sdhci_timeout_timer(struct timer_list *t) spin_lock_irqsave(&host->lock, flags); if (host->cmd && !sdhci_data_line_cmd(host->cmd)) { @@ -80754,7 +84522,7 @@ index 58c977d581e7..a1af2f5c0998 100644 mmc_hostname(host->mmc)); sdhci_dumpregs(host); -@@ -3144,7 +3144,7 @@ static void sdhci_timeout_data_timer(struct timer_list *t) +@@ -3149,7 +3149,7 @@ static void sdhci_timeout_data_timer(struct timer_list *t) if (host->data || host->data_cmd || (host->cmd && sdhci_data_line_cmd(host->cmd))) { @@ -80764,7 +84532,7 @@ index 58c977d581e7..a1af2f5c0998 100644 sdhci_dumpregs(host); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c -index fcca023f22e5..3cbfe5bebc57 100644 +index aac837aa2c24b..18460c3536dc3 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -67,6 +67,9 @@ @@ -80777,7 +84545,7 @@ index fcca023f22e5..3cbfe5bebc57 100644 static inline void bcmgenet_writel(u32 value, void __iomem *offset) { -@@ -2425,6 +2428,11 @@ static void reset_umac(struct bcmgenet_priv *priv) +@@ -2430,6 +2433,11 @@ static void reset_umac(struct bcmgenet_priv *priv) bcmgenet_rbuf_ctrl_set(priv, 0); udelay(10); @@ -80789,7 +84557,7 @@ index fcca023f22e5..3cbfe5bebc57 100644 /* issue soft reset and disable MAC while updating its registers */ bcmgenet_umac_writel(priv, CMD_SW_RESET, UMAC_CMD); udelay(2); -@@ -2594,7 +2602,7 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, +@@ -2599,7 +2607,7 @@ static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv, bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX); bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_CONS_INDEX); @@ -80798,16 +84566,16 @@ index fcca023f22e5..3cbfe5bebc57 100644 /* Disable rate control for now */ bcmgenet_tdma_ring_writel(priv, index, flow_period_val, TDMA_FLOW_PERIOD); -@@ -3235,7 +3243,7 @@ static void bcmgenet_get_hw_addr(struct bcmgenet_priv *priv, +@@ -3240,7 +3248,7 @@ static void bcmgenet_get_hw_addr(struct bcmgenet_priv *priv, } /* Returns a reusable dma control register value */ -static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv) +static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx) { + unsigned int i; u32 reg; - u32 dma_ctrl; -@@ -3254,6 +3262,14 @@ static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv) +@@ -3265,6 +3273,14 @@ static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv) udelay(10); bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH); @@ -80822,9 +84590,9 @@ index fcca023f22e5..3cbfe5bebc57 100644 return dma_ctrl; } -@@ -3324,8 +3340,8 @@ static int bcmgenet_open(struct net_device *dev) - bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); - } +@@ -3328,8 +3344,8 @@ static int bcmgenet_open(struct net_device *dev) + + bcmgenet_set_hw_addr(priv, dev->dev_addr); - /* Disable RX/TX DMA and flush TX queues */ - dma_ctrl = bcmgenet_dma_disable(priv); @@ -80833,7 +84601,7 @@ index fcca023f22e5..3cbfe5bebc57 100644 /* Reinitialize TDMA and RDMA and SW housekeeping */ ret = bcmgenet_init_dma(priv); -@@ -4058,9 +4074,12 @@ static int bcmgenet_probe(struct platform_device *pdev) +@@ -4062,9 +4078,12 @@ static int bcmgenet_probe(struct platform_device *pdev) netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1); /* Set default coalescing parameters */ @@ -80847,8 +84615,8 @@ index fcca023f22e5..3cbfe5bebc57 100644 /* libphy will determine the link state */ netif_carrier_off(dev); -@@ -4183,7 +4202,7 @@ static int bcmgenet_resume(struct device *d) - } +@@ -4180,7 +4199,7 @@ static int bcmgenet_resume(struct device *d) + bcmgenet_hfb_create_rxnfc_filter(priv, rule); /* Disable RX/TX DMA and flush TX queues */ - dma_ctrl = bcmgenet_dma_disable(priv); @@ -80857,7 +84625,7 @@ index fcca023f22e5..3cbfe5bebc57 100644 /* Reinitialize TDMA and RDMA and SW housekeeping */ ret = bcmgenet_init_dma(priv); diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.h b/drivers/net/ethernet/broadcom/genet/bcmgenet.h -index f6ca01da141d..45ea07829b8c 100644 +index f6ca01da141d4..45ea07829b8c4 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h @@ -29,7 +29,7 @@ @@ -80870,7 +84638,7 @@ index f6ca01da141d..45ea07829b8c 100644 /* misc. configuration */ #define MAX_NUM_OF_FS_RULES 16 diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c -index 6fb6c3556285..2e516f4c435e 100644 +index f9e91304d2327..7abd5ddebd8e4 100644 --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c @@ -293,6 +293,8 @@ int bcmgenet_mii_probe(struct net_device *dev) @@ -80883,7 +84651,7 @@ index 6fb6c3556285..2e516f4c435e 100644 /* Initialize link state variables that bcmgenet_mii_setup() uses */ priv->old_link = -1; diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c -index dbed15dc0fe7..8b0ac38742d0 100644 +index dbed15dc0fe77..8b0ac38742d06 100644 --- a/drivers/net/phy/broadcom.c +++ b/drivers/net/phy/broadcom.c @@ -82,6 +82,11 @@ static int bcm54210e_config_init(struct phy_device *phydev) @@ -80983,7 +84751,7 @@ index dbed15dc0fe7..8b0ac38742d0 100644 { PHY_ID_BCM54612E, 0xfffffff0 }, { PHY_ID_BCM54616S, 0xfffffff0 }, diff --git a/drivers/net/phy/microchip.c b/drivers/net/phy/microchip.c -index a644e8e5071c..15e0a7383f68 100644 +index a644e8e5071c3..15e0a7383f688 100644 --- a/drivers/net/phy/microchip.c +++ b/drivers/net/phy/microchip.c @@ -217,6 +217,7 @@ static int lan88xx_probe(struct phy_device *phydev) @@ -81027,8 +84795,27 @@ index a644e8e5071c..15e0a7383f68 100644 /* these values can be used to identify internal PHY */ priv->chip_id = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_ID); priv->chip_rev = phy_read_mmd(phydev, 3, LAN88XX_MMD3_CHIP_REV); +diff --git a/drivers/net/phy/smsc.c b/drivers/net/phy/smsc.c +index caf7291ffaf83..9983eeded6244 100644 +--- a/drivers/net/phy/smsc.c ++++ b/drivers/net/phy/smsc.c +@@ -195,12 +195,12 @@ static int lan87xx_read_status(struct phy_device *phydev) + if (rc < 0) + return rc; + +- /* Wait max 640 ms to detect energy and the timeout is not ++ /* Wait max 1500 ms to detect energy and the timeout is not + * an actual error. + */ + read_poll_timeout(phy_read, rc, + rc & MII_LAN83C185_ENERGYON || rc < 0, +- 10000, 640000, true, phydev, ++ 10000, 1500000, true, phydev, + MII_LAN83C185_CTRL_STATUS); + if (rc < 0) + return rc; diff --git a/drivers/net/usb/Makefile b/drivers/net/usb/Makefile -index 99fd12be2111..99381e6bea78 100644 +index 99fd12be21111..99381e6bea782 100644 --- a/drivers/net/usb/Makefile +++ b/drivers/net/usb/Makefile @@ -13,7 +13,7 @@ obj-$(CONFIG_USB_LAN78XX) += lan78xx.o @@ -81041,7 +84828,7 @@ index 99fd12be2111..99381e6bea78 100644 obj-$(CONFIG_USB_NET_DM9601) += dm9601.o obj-$(CONFIG_USB_NET_SR9700) += sr9700.o diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 65b315bc60ab..3cf5ad0bf0c1 100644 +index a5cd42bae9621..2c54e4eadde60 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -425,6 +425,20 @@ static int msg_level = -1; @@ -81072,10 +84859,10 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 + /* Acknowledge any pending PHY interrupt, lest it be the last */ + phy_read(phydev, LAN88XX_INT_STS); + + mutex_lock(&phydev->lock); phy_read_status(phydev); - - if (!phydev->link && dev->link_on) { -@@ -2158,6 +2175,22 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) + link = phydev->link; +@@ -2166,6 +2183,22 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) mii_adv_to_linkmode_adv_t(fc, mii_adv); linkmode_or(phydev->advertising, fc, phydev->advertising); @@ -81098,7 +84885,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 if (phydev->mdio.dev.of_node) { u32 reg; int len; -@@ -2453,6 +2486,11 @@ static int lan78xx_reset(struct lan78xx_net *dev) +@@ -2461,6 +2494,11 @@ static int lan78xx_reset(struct lan78xx_net *dev) int ret = 0; unsigned long timeout; u8 sig; @@ -81110,7 +84897,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 ret = lan78xx_read_reg(dev, HW_CFG, &buf); buf |= HW_CFG_LRST_; -@@ -2506,6 +2544,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) +@@ -2514,6 +2552,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) ret = lan78xx_read_reg(dev, HW_CFG, &buf); buf |= HW_CFG_MEF_; @@ -81120,7 +84907,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 ret = lan78xx_write_reg(dev, HW_CFG, buf); ret = lan78xx_read_reg(dev, USB_CFG0, &buf); -@@ -2561,6 +2602,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) +@@ -2569,6 +2610,9 @@ static int lan78xx_reset(struct lan78xx_net *dev) buf |= MAC_CR_AUTO_DUPLEX_ | MAC_CR_AUTO_SPEED_; } } @@ -81130,7 +84917,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 ret = lan78xx_write_reg(dev, MAC_CR, buf); ret = lan78xx_read_reg(dev, MAC_TX, &buf); -@@ -2890,8 +2934,14 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) +@@ -2898,8 +2942,14 @@ static int lan78xx_bind(struct lan78xx_net *dev, struct usb_interface *intf) if (DEFAULT_RX_CSUM_ENABLE) dev->net->features |= NETIF_F_RXCSUM; @@ -81147,7 +84934,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 if (DEFAULT_VLAN_RX_OFFLOAD) dev->net->features |= NETIF_F_HW_VLAN_CTAG_RX; -@@ -3114,7 +3164,7 @@ static int rx_submit(struct lan78xx_net *dev, struct urb *urb, gfp_t flags) +@@ -3122,7 +3172,7 @@ static int rx_submit(struct lan78xx_net *dev, struct urb *urb, gfp_t flags) size_t size = dev->rx_urb_size; int ret = 0; @@ -81156,7 +84943,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 if (!skb) { usb_free_urb(urb); return -ENOMEM; -@@ -3718,7 +3768,13 @@ static int lan78xx_probe(struct usb_interface *intf, +@@ -3726,7 +3776,13 @@ static int lan78xx_probe(struct usb_interface *intf, netdev->max_mtu = MAX_SINGLE_PACKET_SIZE; netif_set_gso_max_size(netdev, MAX_SINGLE_PACKET_SIZE - MAX_HEADER); @@ -81172,7 +84959,7 @@ index 65b315bc60ab..3cf5ad0bf0c1 100644 buf = kmalloc(maxp, GFP_KERNEL); if (buf) { diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c -index f5010f8ac1ec..9119a860e9bd 100644 +index 63b64fa7f33c2..bf402dfd0c2c0 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -26,9 +26,10 @@ @@ -82469,7 +86256,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 + case RTL_VER_15: default: if (type == MCU_TYPE_USB) { - ocp_write_byte(tp, MCU_TYPE_USB, USB_BP2_EN, 0); + ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0); @@ -3462,65 +3984,238 @@ static void rtl_clear_bp(struct r8152 *tp, u16 type) ocp_write_word(tp, type, PLA_BP_BA, 0); } @@ -83762,7 +87549,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 r8153b_u1u2en(tp, true); } -@@ -5041,186 +6273,433 @@ static void rtl8153b_down(struct r8152 *tp) +@@ -5041,239 +6273,486 @@ static void rtl8153b_down(struct r8152 *tp) r8153_aldps_en(tp, true); } @@ -84034,14 +87821,25 @@ index f5010f8ac1ec..9119a860e9bd 100644 +static void rtl8156_up(struct r8152 *tp) +{ + u32 ocp_data; -+ + +- tp->rtl_ops.up(tp); + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return; -+ + +- netif_carrier_off(netdev); +- netif_start_queue(netdev); +- set_bit(WORK_ENABLE, &tp->flags); + r8153b_u1u2en(tp, false); + r8153_u2p3en(tp, false); + r8153_aldps_en(tp, false); -+ + +- res = usb_submit_urb(tp->intr_urb, GFP_KERNEL); +- if (res) { +- if (res == -ENODEV) +- netif_device_detach(tp->netdev); +- netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", +- res); +- goto out_unlock; + rxdy_gated_en(tp, true); + r8153_teredo_off(tp); + @@ -84074,7 +87872,9 @@ index f5010f8ac1ec..9119a860e9bd 100644 + break; + default: + break; -+ } + } +- napi_enable(&tp->napi); +- tasklet_enable(&tp->tx_tl); + + /* share FIFO settings */ + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_RXFIFO_FULL); @@ -84243,13 +88043,19 @@ index f5010f8ac1ec..9119a860e9bd 100644 + if (test_and_clear_bit(SCHEDULE_TASKLET, &tp->flags) && + netif_carrier_ok(tp->netdev)) + tasklet_schedule(&tp->tx_tl); -+ -+ mutex_unlock(&tp->control); -+ + + mutex_unlock(&tp->control); + +out1: -+ usb_autopm_put_interface(tp->intf); + usb_autopm_put_interface(tp->intf); +-#ifdef CONFIG_PM_SLEEP +- tp->pm_notifier.notifier_call = rtl_notifier; +- register_pm_notifier(&tp->pm_notifier); +-#endif +- return 0; +} -+ + +-out_unlock: +static void rtl_hw_phy_work_func_t(struct work_struct *work) +{ + struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work); @@ -84278,23 +88084,41 @@ index f5010f8ac1ec..9119a860e9bd 100644 + tp->advertising); + +ignore_once: -+ mutex_unlock(&tp->control); -+ -+ usb_autopm_put_interface(tp->intf); -+} + mutex_unlock(&tp->control); + + usb_autopm_put_interface(tp->intf); +-out_free: +- free_all_mem(tp); +-out: +- return res; + } + +-static int rtl8152_close(struct net_device *netdev) +#ifdef CONFIG_PM_SLEEP +static int rtl_notifier(struct notifier_block *nb, unsigned long action, + void *data) -+{ + { +- struct r8152 *tp = netdev_priv(netdev); +- int res = 0; + struct r8152 *tp = container_of(nb, struct r8152, pm_notifier); -+ + +-#ifdef CONFIG_PM_SLEEP +- unregister_pm_notifier(&tp->pm_notifier); +-#endif +- tasklet_disable(&tp->tx_tl); +- clear_bit(WORK_ENABLE, &tp->flags); +- usb_kill_urb(tp->intr_urb); +- cancel_delayed_work_sync(&tp->schedule); +- napi_disable(&tp->napi); +- netif_stop_queue(netdev); + switch (action) { + case PM_HIBERNATION_PREPARE: + case PM_SUSPEND_PREPARE: + usb_autopm_get_interface(tp->intf); + break; -+ + +- res = usb_autopm_get_interface(tp->intf); +- if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) { + case PM_POST_HIBERNATION: + case PM_POST_SUSPEND: + usb_autopm_put_interface(tp->intf); @@ -84329,19 +88153,73 @@ index f5010f8ac1ec..9119a860e9bd 100644 + goto out_free; + + mutex_lock(&tp->control); - - tp->rtl_ops.up(tp); - -@@ -5281,94 +6760,774 @@ static int rtl8152_close(struct net_device *netdev) ++ ++ tp->rtl_ops.up(tp); ++ ++ netif_carrier_off(netdev); ++ netif_start_queue(netdev); ++ set_bit(WORK_ENABLE, &tp->flags); ++ ++ res = usb_submit_urb(tp->intr_urb, GFP_KERNEL); ++ if (res) { ++ if (res == -ENODEV) ++ netif_device_detach(tp->netdev); ++ netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", ++ res); ++ goto out_unlock; ++ } ++ napi_enable(&tp->napi); ++ tasklet_enable(&tp->tx_tl); ++ ++ mutex_unlock(&tp->control); ++ ++ usb_autopm_put_interface(tp->intf); ++#ifdef CONFIG_PM_SLEEP ++ tp->pm_notifier.notifier_call = rtl_notifier; ++ register_pm_notifier(&tp->pm_notifier); ++#endif ++ return 0; ++ ++out_unlock: ++ mutex_unlock(&tp->control); ++ usb_autopm_put_interface(tp->intf); ++out_free: ++ free_all_mem(tp); ++out: ++ return res; ++} ++ ++static int rtl8152_close(struct net_device *netdev) ++{ ++ struct r8152 *tp = netdev_priv(netdev); ++ int res = 0; ++ ++#ifdef CONFIG_PM_SLEEP ++ unregister_pm_notifier(&tp->pm_notifier); ++#endif ++ tasklet_disable(&tp->tx_tl); ++ clear_bit(WORK_ENABLE, &tp->flags); ++ usb_kill_urb(tp->intr_urb); ++ cancel_delayed_work_sync(&tp->schedule); ++ napi_disable(&tp->napi); ++ netif_stop_queue(netdev); ++ ++ res = usb_autopm_get_interface(tp->intf); ++ if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) { + rtl_drop_queued_tx(tp); + rtl_stop_rx(tp); + } else { +@@ -5281,95 +6760,775 @@ static int rtl8152_close(struct net_device *netdev) tp->rtl_ops.down(tp); - mutex_unlock(&tp->control); + mutex_unlock(&tp->control); -+ -+ usb_autopm_put_interface(tp->intf); + } + ++ if (!res) ++ usb_autopm_put_interface(tp->intf); ++ + free_all_mem(tp); + + return res; @@ -84599,8 +88477,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 + ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3); + ocp_data &= ~PLA_MCU_SPDWN_EN; + ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data); - -- usb_autopm_put_interface(tp->intf); ++ + if (tp->version == RTL_VER_09) { + /* Disable Test IO for 32QFN */ + if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) { @@ -84610,6 +88487,9 @@ index f5010f8ac1ec..9119a860e9bd 100644 + } } +- if (!res) +- usb_autopm_put_interface(tp->intf); +- - free_all_mem(tp); + set_bit(GREEN_ETHERNET, &tp->flags); @@ -85153,7 +89033,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 data = r8152_mdio_read(tp, MII_BMCR); if (data & BMCR_PDOWN) { -@@ -5376,119 +7535,450 @@ static void r8153_init(struct r8152 *tp) +@@ -5377,119 +7536,450 @@ static void r8153_init(struct r8152 *tp) r8152_mdio_write(tp, MII_BMCR, data); } @@ -85688,7 +89568,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 { u32 ocp_data; u16 data; -@@ -5497,8 +7987,31 @@ static void r8153b_init(struct r8152 *tp) +@@ -5498,8 +7988,31 @@ static void r8153b_init(struct r8152 *tp) if (test_bit(RTL8152_UNPLUG, &tp->flags)) return; @@ -85720,7 +89600,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 for (i = 0; i < 500; i++) { if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & AUTOLOAD_DONE) -@@ -5506,10 +8019,19 @@ static void r8153b_init(struct r8152 *tp) +@@ -5507,10 +8020,19 @@ static void r8153b_init(struct r8152 *tp) msleep(20); if (test_bit(RTL8152_UNPLUG, &tp->flags)) @@ -85741,7 +89621,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 data = r8152_mdio_read(tp, MII_BMCR); if (data & BMCR_PDOWN) { -@@ -5528,39 +8050,50 @@ static void r8153b_init(struct r8152 *tp) +@@ -5529,39 +8051,50 @@ static void r8153b_init(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, USB_U1U2_TIMER, 500); r8153b_power_cut_en(tp, false); @@ -85814,7 +89694,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 set_bit(GREEN_ETHERNET, &tp->flags); -@@ -5574,6 +8107,39 @@ static void r8153b_init(struct r8152 *tp) +@@ -5575,6 +8108,39 @@ static void r8153b_init(struct r8152 *tp) tp->coalesce = 15000; /* 15 us */ } @@ -85854,7 +89734,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 static int rtl8152_pre_reset(struct usb_interface *intf) { struct r8152 *tp = usb_get_intfdata(intf); -@@ -5724,6 +8290,9 @@ static int rtl8152_runtime_suspend(struct r8152 *tp) +@@ -5725,6 +8291,9 @@ static int rtl8152_runtime_suspend(struct r8152 *tp) struct net_device *netdev = tp->netdev; int ret = 0; @@ -85864,7 +89744,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 set_bit(SELECTIVE_SUSPEND, &tp->flags); smp_mb__after_atomic(); -@@ -5934,6 +8503,22 @@ int rtl8152_get_link_ksettings(struct net_device *netdev, +@@ -5935,6 +8504,22 @@ int rtl8152_get_link_ksettings(struct net_device *netdev, mii_ethtool_get_link_ksettings(&tp->mii, cmd); @@ -85887,7 +89767,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 mutex_unlock(&tp->control); usb_autopm_put_interface(tp->intf); -@@ -5977,6 +8562,10 @@ static int rtl8152_set_link_ksettings(struct net_device *dev, +@@ -5978,6 +8563,10 @@ static int rtl8152_set_link_ksettings(struct net_device *dev, cmd->link_modes.advertising)) advertising |= RTL_ADVERTISED_1000_FULL; @@ -85898,7 +89778,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 mutex_lock(&tp->control); ret = rtl8152_set_speed(tp, cmd->base.autoneg, cmd->base.speed, -@@ -6123,6 +8712,11 @@ rtl_ethtool_get_eee(struct net_device *net, struct ethtool_eee *edata) +@@ -6124,6 +8713,11 @@ rtl_ethtool_get_eee(struct net_device *net, struct ethtool_eee *edata) struct r8152 *tp = netdev_priv(net); int ret; @@ -85910,7 +89790,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 ret = usb_autopm_get_interface(tp->intf); if (ret < 0) goto out; -@@ -6145,6 +8739,11 @@ rtl_ethtool_set_eee(struct net_device *net, struct ethtool_eee *edata) +@@ -6146,6 +8740,11 @@ rtl_ethtool_set_eee(struct net_device *net, struct ethtool_eee *edata) struct r8152 *tp = netdev_priv(net); int ret; @@ -85922,7 +89802,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 ret = usb_autopm_get_interface(tp->intf); if (ret < 0) goto out; -@@ -6425,12 +9024,21 @@ static int rtl8152_change_mtu(struct net_device *dev, int new_mtu) +@@ -6430,12 +9029,21 @@ static int rtl8152_change_mtu(struct net_device *dev, int new_mtu) dev->mtu = new_mtu; if (netif_running(dev)) { @@ -85949,7 +89829,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 } mutex_unlock(&tp->control); -@@ -6519,6 +9127,7 @@ static int rtl_ops_init(struct r8152 *tp) +@@ -6524,6 +9132,7 @@ static int rtl_ops_init(struct r8152 *tp) ops->in_nway = rtl8153_in_nway; ops->hw_phy_cfg = r8153_hw_phy_cfg; ops->autosuspend_en = rtl8153_runtime_enable; @@ -85957,7 +89837,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 if (tp->udev->speed < USB_SPEED_SUPER) tp->rx_buf_sz = 16 * 1024; else -@@ -6540,6 +9149,68 @@ static int rtl_ops_init(struct r8152 *tp) +@@ -6545,6 +9154,68 @@ static int rtl_ops_init(struct r8152 *tp) ops->in_nway = rtl8153_in_nway; ops->hw_phy_cfg = r8153b_hw_phy_cfg; ops->autosuspend_en = rtl8153b_runtime_enable; @@ -86026,7 +89906,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 tp->rx_buf_sz = 32 * 1024; tp->eee_en = true; tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX; -@@ -6547,7 +9218,7 @@ static int rtl_ops_init(struct r8152 *tp) +@@ -6552,7 +9223,7 @@ static int rtl_ops_init(struct r8152 *tp) default: ret = -ENODEV; @@ -86035,7 +89915,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 break; } -@@ -6558,11 +9229,17 @@ static int rtl_ops_init(struct r8152 *tp) +@@ -6563,11 +9234,17 @@ static int rtl_ops_init(struct r8152 *tp) #define FIRMWARE_8153A_3 "rtl_nic/rtl8153a-3.fw" #define FIRMWARE_8153A_4 "rtl_nic/rtl8153a-4.fw" #define FIRMWARE_8153B_2 "rtl_nic/rtl8153b-2.fw" @@ -86053,7 +89933,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 static int rtl_fw_init(struct r8152 *tp) { -@@ -6588,6 +9265,19 @@ static int rtl_fw_init(struct r8152 *tp) +@@ -6593,6 +9270,19 @@ static int rtl_fw_init(struct r8152 *tp) rtl_fw->pre_fw = r8153b_pre_firmware_1; rtl_fw->post_fw = r8153b_post_firmware_1; break; @@ -86073,7 +89953,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 default: break; } -@@ -6595,7 +9285,7 @@ static int rtl_fw_init(struct r8152 *tp) +@@ -6600,7 +9290,7 @@ static int rtl_fw_init(struct r8152 *tp) return 0; } @@ -86082,7 +89962,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 { struct usb_device *udev = interface_to_usbdev(intf); u32 ocp_data = 0; -@@ -6643,6 +9333,27 @@ static u8 rtl_get_version(struct usb_interface *intf) +@@ -6648,6 +9338,27 @@ static u8 rtl_get_version(struct usb_interface *intf) case 0x6010: version = RTL_VER_09; break; @@ -86110,7 +89990,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 default: version = RTL_VER_UNKNOWN; dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); -@@ -6653,12 +9364,13 @@ static u8 rtl_get_version(struct usb_interface *intf) +@@ -6658,12 +9369,13 @@ static u8 rtl_get_version(struct usb_interface *intf) return version; } @@ -86125,7 +90005,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 struct r8152 *tp; struct net_device *netdev; int ret; -@@ -6666,10 +9378,8 @@ static int rtl8152_probe(struct usb_interface *intf, +@@ -6671,10 +9383,8 @@ static int rtl8152_probe(struct usb_interface *intf, if (version == RTL_VER_UNKNOWN) return -ENODEV; @@ -86137,7 +90017,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 if (intf->cur_altsetting->desc.bNumEndpoints < 3) return -ENODEV; -@@ -6710,7 +9420,7 @@ static int rtl8152_probe(struct usb_interface *intf, +@@ -6715,7 +9425,7 @@ static int rtl8152_probe(struct usb_interface *intf, mutex_init(&tp->control); INIT_DELAYED_WORK(&tp->schedule, rtl_work_func_t); INIT_DELAYED_WORK(&tp->hw_phy_work, rtl_hw_phy_work_func_t); @@ -86146,7 +90026,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 tasklet_disable(&tp->tx_tl); netdev->netdev_ops = &rtl8152_netdev_ops; -@@ -6754,12 +9464,29 @@ static int rtl8152_probe(struct usb_interface *intf, +@@ -6759,12 +9469,29 @@ static int rtl8152_probe(struct usb_interface *intf, /* MTU range: 68 - 1500 or 9194 */ netdev->min_mtu = ETH_MIN_MTU; switch (tp->version) { @@ -86179,7 +90059,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 break; } -@@ -6775,7 +9502,13 @@ static int rtl8152_probe(struct usb_interface *intf, +@@ -6780,7 +9507,13 @@ static int rtl8152_probe(struct usb_interface *intf, tp->advertising = RTL_ADVERTISED_10_HALF | RTL_ADVERTISED_10_FULL | RTL_ADVERTISED_100_HALF | RTL_ADVERTISED_100_FULL; if (tp->mii.supports_gmii) { @@ -86194,7 +90074,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 tp->advertising |= RTL_ADVERTISED_1000_FULL; } tp->duplex = DUPLEX_FULL; -@@ -6799,11 +9532,15 @@ static int rtl8152_probe(struct usb_interface *intf, +@@ -6804,11 +9537,15 @@ static int rtl8152_probe(struct usb_interface *intf, set_ethernet_addr(tp); usb_set_intfdata(intf, tp); @@ -86212,7 +90092,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 goto out1; } -@@ -6835,7 +9572,8 @@ static void rtl8152_disconnect(struct usb_interface *intf) +@@ -6840,7 +9577,8 @@ static void rtl8152_disconnect(struct usb_interface *intf) unregister_netdev(tp->netdev); tasklet_kill(&tp->tx_tl); cancel_delayed_work_sync(&tp->hw_phy_work); @@ -86222,7 +90102,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 rtl8152_release_firmware(tp); free_netdev(tp->netdev); } -@@ -6855,13 +9593,28 @@ static void rtl8152_disconnect(struct usb_interface *intf) +@@ -6860,13 +9598,28 @@ static void rtl8152_disconnect(struct usb_interface *intf) .idProduct = (prod), \ .bInterfaceClass = USB_CLASS_COMM, \ .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ @@ -86253,7 +90133,7 @@ index f5010f8ac1ec..9119a860e9bd 100644 {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927)}, diff --git a/drivers/net/usb/r8153_ecm.c b/drivers/net/usb/r8153_ecm.c new file mode 100644 -index 000000000000..2c3fabd38b16 +index 0000000000000..2c3fabd38b163 --- /dev/null +++ b/drivers/net/usb/r8153_ecm.c @@ -0,0 +1,162 @@ @@ -86420,7 +90300,7 @@ index 000000000000..2c3fabd38b16 +MODULE_DESCRIPTION("Realtek USB ECM device"); +MODULE_LICENSE("GPL"); diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c -index ea0d5f04dc3a..09d4c1963b2c 100644 +index ea0d5f04dc3a8..09d4c1963b2c4 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -50,6 +50,7 @@ @@ -86555,7 +90435,7 @@ index ea0d5f04dc3a..09d4c1963b2c 100644 usbnet_skb_return(dev, ax_skb); } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h -index 3f5da3bb6aa5..ba3c58caac9f 100644 +index 3f5da3bb6aa59..ba3c58caac9f6 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h @@ -78,7 +78,7 @@ struct brcmf_bus_ops { @@ -86584,7 +90464,7 @@ index 3f5da3bb6aa5..ba3c58caac9f 100644 static inline diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 23e6422c2251..380a5ece63da 100644 +index c2b6e5c966d04..e51b42b547beb 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -9,6 +9,7 @@ @@ -86595,7 +90475,7 @@ index 23e6422c2251..380a5ece63da 100644 #include #include #include -@@ -2937,7 +2938,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, +@@ -2940,7 +2941,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, brcmf_dbg(INFO, "Do not enable power save for P2P clients\n"); pm = PM_OFF; } @@ -86604,7 +90484,7 @@ index 23e6422c2251..380a5ece63da 100644 err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, pm); if (err) { -@@ -2947,6 +2948,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, +@@ -2950,6 +2951,7 @@ brcmf_cfg80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *ndev, bphy_err(drvr, "error (%d)\n", err); } @@ -86612,7 +90492,7 @@ index 23e6422c2251..380a5ece63da 100644 err = brcmf_fil_iovar_int_set(ifp, "pm2_sleep_ret", min_t(u32, timeout, BRCMF_PS_MAX_TIMEOUT_MS)); if (err) -@@ -7353,12 +7355,18 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], +@@ -7356,12 +7358,18 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], struct brcmfmac_pd_cc *country_codes; struct brcmfmac_pd_cc_entry *cc; s32 found_index; @@ -86633,7 +90513,7 @@ index 23e6422c2251..380a5ece63da 100644 } if ((alpha2[0] == ccreq->country_abbrev[0]) && -@@ -7382,10 +7390,14 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], +@@ -7385,10 +7393,14 @@ static s32 brcmf_translate_country_code(struct brcmf_pub *drvr, char alpha2[2], brcmf_dbg(TRACE, "No country code match found\n"); return -EINVAL; } @@ -86651,7 +90531,7 @@ index 23e6422c2251..380a5ece63da 100644 ccreq->country_abbrev[0] = alpha2[0]; ccreq->country_abbrev[1] = alpha2[1]; ccreq->country_abbrev[2] = 0; -@@ -7400,31 +7412,45 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, +@@ -7403,31 +7415,45 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); struct brcmf_pub *drvr = cfg->pub; struct brcmf_fil_country_le ccreq; @@ -86710,7 +90590,7 @@ index 23e6422c2251..380a5ece63da 100644 return; diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c -index e3758bd86acf..9047a0813ebf 100644 +index e3758bd86acf0..9047a0813ebf0 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c @@ -134,13 +134,23 @@ static int brcmf_c_process_clm_blob(struct brcmf_if *ifp) @@ -86740,7 +90620,7 @@ index e3758bd86acf..9047a0813ebf 100644 brcmf_info("no clm_blob available (err=%d), device may have limited channels available\n", err); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c -index d821a4758f8c..b14963be17f1 100644 +index d821a4758f8cf..b14963be17f15 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c @@ -10,6 +10,7 @@ @@ -86798,7 +90678,7 @@ index d821a4758f8c..b14963be17f1 100644 return ret; } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c -index 603aff421e38..c86b9d6eb2f3 100644 +index 1f12dfb33938a..89cdd2075846a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -1400,7 +1400,8 @@ static int brcmf_pcie_get_memdump(struct device *dev, void *data, size_t len) @@ -86823,7 +90703,7 @@ index 603aff421e38..c86b9d6eb2f3 100644 brcmf_pcie_fwnames, ARRAY_SIZE(brcmf_pcie_fwnames), diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c -index 59c2b2b6027d..26722dcccf66 100644 +index 6d5d5c39c6359..3ab944c39677c 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -611,12 +611,14 @@ BRCMF_FW_DEF(4329, "brcmfmac4329-sdio"); @@ -86884,7 +90764,7 @@ index 59c2b2b6027d..26722dcccf66 100644 brcmf_sdio_fwnames, ARRAY_SIZE(brcmf_sdio_fwnames), diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c -index 9fb68c2dc7e3..9bf2dbd30ded 100644 +index 9fb68c2dc7e39..9bf2dbd30ded1 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c @@ -1155,7 +1155,8 @@ struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo, @@ -86909,7 +90789,7 @@ index 9fb68c2dc7e3..9bf2dbd30ded 100644 brcmf_usb_fwnames, ARRAY_SIZE(brcmf_usb_fwnames), diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig -index 954d3b4a52ab..fecc19b884bf 100644 +index 954d3b4a52aba..fecc19b884bfb 100644 --- a/drivers/nvmem/Kconfig +++ b/drivers/nvmem/Kconfig @@ -270,4 +270,12 @@ config SPRD_EFUSE @@ -86926,7 +90806,7 @@ index 954d3b4a52ab..fecc19b884bf 100644 + will be called nvmem-rmem. endif diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile -index a7c377218341..5376b8e0dae5 100644 +index a7c3772183410..5376b8e0dae5a 100644 --- a/drivers/nvmem/Makefile +++ b/drivers/nvmem/Makefile @@ -55,3 +55,5 @@ obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o @@ -86937,7 +90817,7 @@ index a7c377218341..5376b8e0dae5 100644 +nvmem-rmem-y := rmem.o diff --git a/drivers/nvmem/rmem.c b/drivers/nvmem/rmem.c new file mode 100644 -index 000000000000..b11c3c974b3d +index 0000000000000..b11c3c974b3d6 --- /dev/null +++ b/drivers/nvmem/rmem.c @@ -0,0 +1,97 @@ @@ -87039,7 +90919,7 @@ index 000000000000..b11c3c974b3d +MODULE_DESCRIPTION("Reserved Memory Based nvmem Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig -index 18450437d5d5..0fec52ff94ac 100644 +index 18450437d5d5a..0fec52ff94ac8 100644 --- a/drivers/of/Kconfig +++ b/drivers/of/Kconfig @@ -100,4 +100,11 @@ config OF_DMA_DEFAULT_COHERENT @@ -87055,7 +90935,7 @@ index 18450437d5d5..0fec52ff94ac 100644 + endif # OF diff --git a/drivers/of/Makefile b/drivers/of/Makefile -index c13b982084a3..957a5b60c167 100644 +index c13b982084a3a..957a5b60c167d 100644 --- a/drivers/of/Makefile +++ b/drivers/of/Makefile @@ -1,6 +1,7 @@ @@ -87068,7 +90948,7 @@ index c13b982084a3..957a5b60c167 100644 obj-$(CONFIG_OF_EARLY_FLATTREE) += fdt_address.o diff --git a/drivers/of/configfs.c b/drivers/of/configfs.c new file mode 100644 -index 000000000000..ac04301dabe1 +index 0000000000000..ac04301dabe13 --- /dev/null +++ b/drivers/of/configfs.c @@ -0,0 +1,277 @@ @@ -87350,7 +91230,7 @@ index 000000000000..ac04301dabe1 +} +late_initcall(of_cfs_init); diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c -index 43a77d720008..bccef312f4c3 100644 +index 43a77d7200087..bccef312f4c30 100644 --- a/drivers/of/overlay.c +++ b/drivers/of/overlay.c @@ -245,6 +245,8 @@ static struct property *dup_and_fixup_symbol_prop( @@ -87363,7 +91243,7 @@ index 43a77d720008..bccef312f4c3 100644 new_prop = kzalloc(sizeof(*new_prop), GFP_KERNEL); if (!new_prop) diff --git a/drivers/of/platform.c b/drivers/of/platform.c -index b557a0fcd4ba..281856ac1988 100644 +index b557a0fcd4ba0..281856ac19886 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -511,6 +511,7 @@ static const struct of_device_id reserved_mem_matches[] = { @@ -87375,7 +91255,7 @@ index b557a0fcd4ba..281856ac1988 100644 }; diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c -index 9c3d2982248d..840f264f7a9b 100644 +index 9c3d2982248d3..840f264f7a9bf 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -114,8 +114,9 @@ @@ -87457,7 +91337,7 @@ index 9c3d2982248d..840f264f7a9b 100644 ret = clk_prepare_enable(pcie->clk); if (ret) { diff --git a/drivers/perf/Kconfig b/drivers/perf/Kconfig -index 1e82ab01e75f..585a4411c90b 100644 +index 1e82ab01e75f5..585a4411c90b4 100644 --- a/drivers/perf/Kconfig +++ b/drivers/perf/Kconfig @@ -130,6 +130,14 @@ config ARM_SPE_PMU @@ -87476,7 +91356,7 @@ index 1e82ab01e75f..585a4411c90b 100644 endmenu diff --git a/drivers/perf/Makefile b/drivers/perf/Makefile -index 5365fd56f88f..fe8c4eb61511 100644 +index 5365fd56f88f3..fe8c4eb61511f 100644 --- a/drivers/perf/Makefile +++ b/drivers/perf/Makefile @@ -13,3 +13,4 @@ obj-$(CONFIG_QCOM_L3_PMU) += qcom_l3_pmu.o @@ -87486,7 +91366,7 @@ index 5365fd56f88f..fe8c4eb61511 100644 +obj-$(CONFIG_RPI_AXIPERF) += raspberrypi_axi_monitor.o diff --git a/drivers/perf/raspberrypi_axi_monitor.c b/drivers/perf/raspberrypi_axi_monitor.c new file mode 100644 -index 000000000000..5ae2bdaa88b4 +index 0000000000000..5ae2bdaa88b41 --- /dev/null +++ b/drivers/perf/raspberrypi_axi_monitor.c @@ -0,0 +1,637 @@ @@ -88128,7 +92008,7 @@ index 000000000000..5ae2bdaa88b4 +MODULE_LICENSE("GPL"); + diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c -index 1d21129f7751..c5d88157f4b2 100644 +index 1d21129f7751c..c5d88157f4b28 100644 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c @@ -362,7 +362,7 @@ static const struct gpio_chip bcm2835_gpio_chip = { @@ -88224,7 +92104,7 @@ index 1d21129f7751..c5d88157f4b2 100644 } diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c -index c5067eb75370..1b18dbf3deff 100644 +index 1c5af2fef1423..81e7acb8acb5f 100644 --- a/drivers/power/reset/gpio-poweroff.c +++ b/drivers/power/reset/gpio-poweroff.c @@ -24,6 +24,7 @@ static struct gpio_desc *reset_gpio; @@ -88285,7 +92165,7 @@ index c5067eb75370..1b18dbf3deff 100644 return 0; } diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig -index 1699b9269a78..718eebc793e5 100644 +index 0aa46b4510177..dadc866870547 100644 --- a/drivers/power/supply/Kconfig +++ b/drivers/power/supply/Kconfig @@ -28,6 +28,12 @@ config POWER_SUPPLY_HWMON @@ -88302,7 +92182,7 @@ index 1699b9269a78..718eebc793e5 100644 config PDA_POWER tristate "Generic PDA/phone power driver" diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile -index dd4b86318cd9..f881637da4f7 100644 +index dd4b86318cd9b..f881637da4f72 100644 --- a/drivers/power/supply/Makefile +++ b/drivers/power/supply/Makefile @@ -9,6 +9,7 @@ obj-$(CONFIG_POWER_SUPPLY) += power_supply.o @@ -88315,7 +92195,7 @@ index dd4b86318cd9..f881637da4f7 100644 obj-$(CONFIG_AXP20X_POWER) += axp20x_usb_power.o diff --git a/drivers/power/supply/rpi_poe_power.c b/drivers/power/supply/rpi_poe_power.c new file mode 100644 -index 000000000000..0c96b2c1e8ab +index 0000000000000..0c96b2c1e8ab6 --- /dev/null +++ b/drivers/power/supply/rpi_poe_power.c @@ -0,0 +1,227 @@ @@ -88547,7 +92427,7 @@ index 000000000000..0c96b2c1e8ab +MODULE_DESCRIPTION("Raspberry Pi PoE+ HAT power supply driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/pps/clients/pps-gpio.c b/drivers/pps/clients/pps-gpio.c -index e0de1df2ede0..ee7d8f4e7f2e 100644 +index e0de1df2ede07..ee7d8f4e7f2e2 100644 --- a/drivers/pps/clients/pps-gpio.c +++ b/drivers/pps/clients/pps-gpio.c @@ -145,6 +145,8 @@ static int pps_gpio_setup(struct platform_device *pdev) @@ -88559,8 +92439,394 @@ index e0de1df2ede0..ee7d8f4e7f2e 100644 return 0; } +diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regulator/rpi-panel-attiny-regulator.c +index ee46bfbf5eee7..8090b9a485b5e 100644 +--- a/drivers/regulator/rpi-panel-attiny-regulator.c ++++ b/drivers/regulator/rpi-panel-attiny-regulator.c +@@ -8,6 +8,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -21,63 +22,146 @@ + /* I2C registers of the Atmel microcontroller. */ + #define REG_ID 0x80 + #define REG_PORTA 0x81 +-#define REG_PORTA_HF BIT(2) +-#define REG_PORTA_VF BIT(3) + #define REG_PORTB 0x82 ++#define REG_PORTC 0x83 + #define REG_POWERON 0x85 + #define REG_PWM 0x86 ++#define REG_ADDR_L 0x8c ++#define REG_ADDR_H 0x8d ++#define REG_WRITE_DATA_H 0x90 ++#define REG_WRITE_DATA_L 0x91 ++ ++#define PA_LCD_DITHB BIT(0) ++#define PA_LCD_MODE BIT(1) ++#define PA_LCD_LR BIT(2) ++#define PA_LCD_UD BIT(3) ++ ++#define PB_BRIDGE_PWRDNX_N BIT(0) ++#define PB_LCD_VCC_N BIT(1) ++#define PB_LCD_MAIN BIT(7) ++ ++#define PC_LED_EN BIT(0) ++#define PC_RST_TP_N BIT(1) ++#define PC_RST_LCD_N BIT(2) ++#define PC_RST_BRIDGE_N BIT(3) ++ ++enum gpio_signals { ++ RST_BRIDGE_N, /* TC358762 bridge reset */ ++ RST_TP_N, /* Touch controller reset */ ++ NUM_GPIO ++}; ++ ++struct gpio_signal_mappings { ++ unsigned int reg; ++ unsigned int mask; ++}; ++ ++static const struct gpio_signal_mappings mappings[NUM_GPIO] = { ++ [RST_BRIDGE_N] = { REG_PORTC, PC_RST_BRIDGE_N | PC_RST_LCD_N }, ++ [RST_TP_N] = { REG_PORTC, PC_RST_TP_N }, ++}; ++ ++struct attiny_lcd { ++ /* lock to serialise overall accesses to the Atmel */ ++ struct mutex lock; ++ struct regmap *regmap; ++ bool gpio_states[NUM_GPIO]; ++ u8 port_states[3]; ++ ++ struct gpio_chip gc; ++}; + + static const struct regmap_config attiny_regmap_config = { + .reg_bits = 8, + .val_bits = 8, +- .max_register = REG_PWM, ++ .disable_locking = 1, ++ .max_register = REG_WRITE_DATA_L, + .cache_type = REGCACHE_NONE, + }; + ++static int attiny_set_port_state(struct attiny_lcd *state, int reg, u8 val) ++{ ++ state->port_states[reg - REG_PORTA] = val; ++ return regmap_write(state->regmap, reg, val); ++}; ++ ++static u8 attiny_get_port_state(struct attiny_lcd *state, int reg) ++{ ++ return state->port_states[reg - REG_PORTA]; ++}; ++ + static int attiny_lcd_power_enable(struct regulator_dev *rdev) + { +- unsigned int data; ++ struct attiny_lcd *state = rdev_get_drvdata(rdev); + +- regmap_write(rdev->regmap, REG_POWERON, 1); +- /* Wait for nPWRDWN to go low to indicate poweron is done. */ +- regmap_read_poll_timeout(rdev->regmap, REG_PORTB, data, +- data & BIT(0), 10, 1000000); ++ mutex_lock(&state->lock); ++ ++ /* Ensure bridge, and tp stay in reset */ ++ attiny_set_port_state(state, REG_PORTC, 0); ++ usleep_range(5000, 10000); + + /* Default to the same orientation as the closed source + * firmware used for the panel. Runtime rotation + * configuration will be supported using VC4's plane + * orientation bits. + */ +- regmap_write(rdev->regmap, REG_PORTA, BIT(2)); ++ attiny_set_port_state(state, REG_PORTA, PA_LCD_LR); ++ usleep_range(5000, 10000); ++ /* Main regulator on, and power to the panel (LCD_VCC_N) */ ++ attiny_set_port_state(state, REG_PORTB, PB_LCD_MAIN); ++ usleep_range(5000, 10000); ++ /* Bring controllers out of reset */ ++ attiny_set_port_state(state, REG_PORTC, PC_LED_EN); ++ ++ msleep(80); ++ ++ mutex_unlock(&state->lock); + + return 0; + } + + static int attiny_lcd_power_disable(struct regulator_dev *rdev) + { ++ struct attiny_lcd *state = rdev_get_drvdata(rdev); ++ ++ mutex_lock(&state->lock); ++ + regmap_write(rdev->regmap, REG_PWM, 0); +- regmap_write(rdev->regmap, REG_POWERON, 0); +- udelay(1); ++ usleep_range(5000, 10000); ++ ++ attiny_set_port_state(state, REG_PORTA, 0); ++ usleep_range(5000, 10000); ++ attiny_set_port_state(state, REG_PORTB, PB_LCD_VCC_N); ++ usleep_range(5000, 10000); ++ attiny_set_port_state(state, REG_PORTC, 0); ++ msleep(30); ++ ++ mutex_unlock(&state->lock); ++ + return 0; + } + + static int attiny_lcd_power_is_enabled(struct regulator_dev *rdev) + { ++ struct attiny_lcd *state = rdev_get_drvdata(rdev); + unsigned int data; +- int ret; ++ int ret, i; + +- ret = regmap_read(rdev->regmap, REG_POWERON, &data); +- if (ret < 0) +- return ret; ++ mutex_lock(&state->lock); ++ ++ for (i = 0; i < 10; i++) { ++ ret = regmap_read(rdev->regmap, REG_PORTC, &data); ++ if (!ret) ++ break; ++ usleep_range(10000, 12000); ++ } + +- if (!(data & BIT(0))) +- return 0; ++ mutex_unlock(&state->lock); + +- ret = regmap_read(rdev->regmap, REG_PORTB, &data); + if (ret < 0) + return ret; + +- return data & BIT(0); ++ return data & PC_RST_BRIDGE_N; + } + + static const struct regulator_init_data attiny_regulator_default = { +@@ -101,33 +185,71 @@ static const struct regulator_desc attiny_regulator = { + + static int attiny_update_status(struct backlight_device *bl) + { +- struct regmap *regmap = bl_get_data(bl); ++ struct attiny_lcd *state = bl_get_data(bl); ++ struct regmap *regmap = state->regmap; + int brightness = bl->props.brightness; ++ int ret, i; ++ ++ mutex_lock(&state->lock); + + if (bl->props.power != FB_BLANK_UNBLANK || + bl->props.fb_blank != FB_BLANK_UNBLANK) + brightness = 0; + +- return regmap_write(regmap, REG_PWM, brightness); +-} ++ for (i = 0; i < 10; i++) { ++ ret = regmap_write(regmap, REG_PWM, brightness); ++ if (!ret) ++ break; ++ } + +-static int attiny_get_brightness(struct backlight_device *bl) +-{ +- struct regmap *regmap = bl_get_data(bl); +- int ret, brightness; ++ mutex_unlock(&state->lock); + +- ret = regmap_read(regmap, REG_PWM, &brightness); +- if (ret) +- return ret; +- +- return brightness; ++ return ret; + } + + static const struct backlight_ops attiny_bl = { + .update_status = attiny_update_status, +- .get_brightness = attiny_get_brightness, + }; + ++static int attiny_gpio_get_direction(struct gpio_chip *gc, unsigned int off) ++{ ++ return GPIO_LINE_DIRECTION_OUT; ++} ++ ++static void attiny_gpio_set(struct gpio_chip *gc, unsigned int off, int val) ++{ ++ struct attiny_lcd *state = gpiochip_get_data(gc); ++ u8 last_val; ++ ++ if (off >= NUM_GPIO) ++ return; ++ ++ mutex_lock(&state->lock); ++ ++ last_val = attiny_get_port_state(state, mappings[off].reg); ++ if (val) ++ last_val |= mappings[off].mask; ++ else ++ last_val &= ~mappings[off].mask; ++ ++ attiny_set_port_state(state, mappings[off].reg, last_val); ++ ++ if (off == RST_BRIDGE_N && val) { ++ usleep_range(5000, 8000); ++ regmap_write(state->regmap, REG_ADDR_H, 0x04); ++ usleep_range(5000, 8000); ++ regmap_write(state->regmap, REG_ADDR_L, 0x7c); ++ usleep_range(5000, 8000); ++ regmap_write(state->regmap, REG_WRITE_DATA_H, 0x00); ++ usleep_range(5000, 8000); ++ regmap_write(state->regmap, REG_WRITE_DATA_L, 0x00); ++ ++ msleep(100); ++ } ++ ++ mutex_unlock(&state->lock); ++} ++ + /* + * I2C driver interface functions + */ +@@ -138,22 +260,30 @@ static int attiny_i2c_probe(struct i2c_client *i2c, + struct regulator_config config = { }; + struct backlight_device *bl; + struct regulator_dev *rdev; ++ struct attiny_lcd *state; + struct regmap *regmap; + unsigned int data; + int ret; + ++ state = devm_kzalloc(&i2c->dev, sizeof(*state), GFP_KERNEL); ++ if (!state) ++ return -ENOMEM; ++ ++ mutex_init(&state->lock); ++ i2c_set_clientdata(i2c, state); ++ + regmap = devm_regmap_init_i2c(i2c, &attiny_regmap_config); + if (IS_ERR(regmap)) { + ret = PTR_ERR(regmap); + dev_err(&i2c->dev, "Failed to allocate register map: %d\n", + ret); +- return ret; ++ goto error; + } + + ret = regmap_read(regmap, REG_ID, &data); + if (ret < 0) { + dev_err(&i2c->dev, "Failed to read REG_ID reg: %d\n", ret); +- return ret; ++ goto error; + } + + switch (data) { +@@ -162,34 +292,73 @@ static int attiny_i2c_probe(struct i2c_client *i2c, + break; + default: + dev_err(&i2c->dev, "Unknown Atmel firmware revision: 0x%02x\n", data); +- return -ENODEV; ++ ret = -ENODEV; ++ goto error; + } + + regmap_write(regmap, REG_POWERON, 0); +- mdelay(1); ++ msleep(30); ++ regmap_write(regmap, REG_PWM, 0); + + config.dev = &i2c->dev; + config.regmap = regmap; + config.of_node = i2c->dev.of_node; + config.init_data = &attiny_regulator_default; ++ config.driver_data = state; + + rdev = devm_regulator_register(&i2c->dev, &attiny_regulator, &config); + if (IS_ERR(rdev)) { + dev_err(&i2c->dev, "Failed to register ATTINY regulator\n"); +- return PTR_ERR(rdev); ++ ret = PTR_ERR(rdev); ++ goto error; + } + + props.type = BACKLIGHT_RAW; + props.max_brightness = 0xff; +- bl = devm_backlight_device_register(&i2c->dev, +- "7inch-touchscreen-panel-bl", +- &i2c->dev, regmap, &attiny_bl, ++ ++ state->regmap = regmap; ++ ++ bl = devm_backlight_device_register(&i2c->dev, dev_name(&i2c->dev), ++ &i2c->dev, state, &attiny_bl, + &props); +- if (IS_ERR(bl)) +- return PTR_ERR(bl); ++ if (IS_ERR(bl)) { ++ ret = PTR_ERR(bl); ++ goto error; ++ } + + bl->props.brightness = 0xff; + ++ state->gc.parent = &i2c->dev; ++ state->gc.label = i2c->name; ++ state->gc.owner = THIS_MODULE; ++ state->gc.of_node = i2c->dev.of_node; ++ state->gc.base = -1; ++ state->gc.ngpio = NUM_GPIO; ++ ++ state->gc.set = attiny_gpio_set; ++ state->gc.get_direction = attiny_gpio_get_direction; ++ state->gc.can_sleep = true; ++ ++ ret = devm_gpiochip_add_data(&i2c->dev, &state->gc, state); ++ if (ret) { ++ dev_err(&i2c->dev, "Failed to create gpiochip: %d\n", ret); ++ goto error; ++ } ++ ++ return 0; ++ ++error: ++ mutex_destroy(&state->lock); ++ ++ return ret; ++} ++ ++static int attiny_i2c_remove(struct i2c_client *client) ++{ ++ struct attiny_lcd *state = i2c_get_clientdata(client); ++ ++ mutex_destroy(&state->lock); ++ + return 0; + } + +@@ -205,6 +374,7 @@ static struct i2c_driver attiny_regulator_driver = { + .of_match_table = of_match_ptr(attiny_dt_ids), + }, + .probe = attiny_i2c_probe, ++ .remove = attiny_i2c_remove, + }; + + module_i2c_driver(attiny_regulator_driver); diff --git a/drivers/rtc/rtc-pcf2123.c b/drivers/rtc/rtc-pcf2123.c -index c3691fa4210e..ead1fd376d2d 100644 +index c3691fa4210e5..ead1fd376d2d8 100644 --- a/drivers/rtc/rtc-pcf2123.c +++ b/drivers/rtc/rtc-pcf2123.c @@ -465,3 +465,4 @@ module_spi_driver(pcf2123_driver); @@ -88568,8 +92834,28 @@ index c3691fa4210e..ead1fd376d2d 100644 MODULE_DESCRIPTION("NXP PCF2123 RTC driver"); MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:rtc-pcf2123"); +diff --git a/drivers/rtc/rtc-pcf85063.c b/drivers/rtc/rtc-pcf85063.c +index 62684ca3a665e..fc293d4d8901f 100644 +--- a/drivers/rtc/rtc-pcf85063.c ++++ b/drivers/rtc/rtc-pcf85063.c +@@ -34,6 +34,7 @@ + #define PCF85063_REG_CTRL1 0x00 /* status */ + #define PCF85063_REG_CTRL1_CAP_SEL BIT(0) + #define PCF85063_REG_CTRL1_STOP BIT(5) ++#define PCF85063_REG_CTRL1_EXT_TEST BIT(7) + + #define PCF85063_REG_CTRL2 0x01 + #define PCF85063_CTRL2_AF BIT(6) +@@ -117,6 +118,7 @@ static int pcf85063_rtc_set_time(struct device *dev, struct rtc_time *tm) + * reset state until all time/date registers are written + */ + rc = regmap_update_bits(pcf85063->regmap, PCF85063_REG_CTRL1, ++ PCF85063_REG_CTRL1_EXT_TEST | + PCF85063_REG_CTRL1_STOP, + PCF85063_REG_CTRL1_STOP); + if (rc) diff --git a/drivers/rtc/rtc-pcf8523.c b/drivers/rtc/rtc-pcf8523.c -index 57d351dfe272..0aa1e8f9ee75 100644 +index 57d351dfe2723..0aa1e8f9ee759 100644 --- a/drivers/rtc/rtc-pcf8523.c +++ b/drivers/rtc/rtc-pcf8523.c @@ -205,8 +205,28 @@ static int pcf8523_rtc_read_time(struct device *dev, struct rtc_time *tm) @@ -88612,7 +92898,7 @@ index 57d351dfe272..0aa1e8f9ee75 100644 regs[2] = bin2bcd(tm->tm_min); regs[3] = bin2bcd(tm->tm_hour); diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c -index fa226f0fe67d..20baf2257631 100644 +index fa226f0fe67d7..20baf22576319 100644 --- a/drivers/rtc/rtc-rv3028.c +++ b/drivers/rtc/rtc-rv3028.c @@ -80,6 +80,7 @@ @@ -88654,7 +92940,7 @@ index fa226f0fe67d..20baf2257631 100644 if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms", &ohms)) { diff --git a/drivers/soc/bcm/Kconfig b/drivers/soc/bcm/Kconfig -index 24f92a6e882a..a6a705ec30c7 100644 +index 24f92a6e882af..a6a705ec30c7f 100644 --- a/drivers/soc/bcm/Kconfig +++ b/drivers/soc/bcm/Kconfig @@ -17,6 +17,7 @@ config RASPBERRYPI_POWER @@ -88666,7 +92952,7 @@ index 24f92a6e882a..a6a705ec30c7 100644 help This enables support for the RPi power domains which can be enabled diff --git a/drivers/soc/bcm/bcm2835-power.c b/drivers/soc/bcm/bcm2835-power.c -index 1e0041ec8132..6059210170bc 100644 +index 1e0041ec81323..6059210170bc6 100644 --- a/drivers/soc/bcm/bcm2835-power.c +++ b/drivers/soc/bcm/bcm2835-power.c @@ -143,6 +143,8 @@ struct bcm2835_power { @@ -88720,7 +93006,7 @@ index 1e0041ec8132..6059210170bc 100644 if (id != 0x62726467 /* "BRDG" */) { dev_err(dev, "ASB register ID returned 0x%08x\n", id); diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c -index 29ee555a42f9..536935abb79d 100644 +index 33c32e9317675..0f6a2f7c8b533 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -28,6 +28,7 @@ @@ -88731,7 +93017,7 @@ index 29ee555a42f9..536935abb79d 100644 #include #include -@@ -377,6 +378,10 @@ static irqreturn_t bcm2835_spi_interrupt(int irq, void *dev_id) +@@ -379,6 +380,10 @@ static irqreturn_t bcm2835_spi_interrupt(int irq, void *dev_id) if (bs->tx_len && cs & BCM2835_SPI_CS_DONE) bcm2835_wr_fifo_blind(bs, BCM2835_SPI_FIFO_SIZE); @@ -88742,7 +93028,7 @@ index 29ee555a42f9..536935abb79d 100644 /* Read as many bytes as possible from FIFO */ bcm2835_rd_fifo(bs); /* Write as many bytes as possible to FIFO */ -@@ -1086,6 +1091,16 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, +@@ -1088,6 +1093,16 @@ static int bcm2835_spi_transfer_one(struct spi_controller *ctlr, unsigned long hz_per_byte, byte_limit; u32 cs = bs->prepare_cs[spi->chip_select]; @@ -88758,8 +93044,8 @@ index 29ee555a42f9..536935abb79d 100644 + /* set clock */ spi_hz = tfr->speed_hz; - clk_hz = clk_get_rate(bs->clk); -@@ -1284,6 +1299,11 @@ static int bcm2835_spi_probe(struct platform_device *pdev) + +@@ -1285,6 +1300,11 @@ static int bcm2835_spi_probe(struct platform_device *pdev) struct bcm2835_spi *bs; int err; @@ -88771,7 +93057,7 @@ index 29ee555a42f9..536935abb79d 100644 ctlr = devm_spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs), dma_get_cache_alignment())); if (!ctlr) -@@ -1327,7 +1347,8 @@ static int bcm2835_spi_probe(struct platform_device *pdev) +@@ -1329,7 +1349,8 @@ static int bcm2835_spi_probe(struct platform_device *pdev) bcm2835_wr(bs, BCM2835_SPI_CS, BCM2835_SPI_CS_CLEAR_RX | BCM2835_SPI_CS_CLEAR_TX); @@ -88782,10 +93068,10 @@ index 29ee555a42f9..536935abb79d 100644 if (err) { dev_err(&pdev->dev, "could not request IRQ: %d\n", err); diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c -index 0cf67de741e7..b92eaeec1145 100644 +index 8c261eac2cee5..4436fd319df39 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c -@@ -3336,6 +3336,7 @@ static int __spi_validate_bits_per_word(struct spi_controller *ctlr, +@@ -3338,6 +3338,7 @@ static int __spi_validate_bits_per_word(struct spi_controller *ctlr, */ int spi_setup(struct spi_device *spi) { @@ -88793,7 +93079,7 @@ index 0cf67de741e7..b92eaeec1145 100644 unsigned bad_bits, ugly_bits; int status; -@@ -3353,6 +3354,14 @@ int spi_setup(struct spi_device *spi) +@@ -3355,6 +3356,14 @@ int spi_setup(struct spi_device *spi) (SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL | SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL))) return -EINVAL; @@ -88809,7 +93095,7 @@ index 0cf67de741e7..b92eaeec1145 100644 * that aren't supported with their current controller * SPI_CS_WORD has a fallback software implementation, diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c -index 859910ec8d9f..a262479f0a92 100644 +index 859910ec8d9f6..a262479f0a92c 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c @@ -402,7 +402,6 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) @@ -88841,7 +93127,7 @@ index 859910ec8d9f..a262479f0a92 100644 "%pOF: buggy DT: spidev listed directly in DT\n", spi->dev.of_node); diff --git a/drivers/staging/fbtft/fb_st7735r.c b/drivers/staging/fbtft/fb_st7735r.c -index 9670a8989b91..1a3219657cbb 100644 +index 9670a8989b917..1a3219657cbb2 100644 --- a/drivers/staging/fbtft/fb_st7735r.c +++ b/drivers/staging/fbtft/fb_st7735r.c @@ -16,6 +16,10 @@ @@ -88909,7 +93195,7 @@ index 9670a8989b91..1a3219657cbb 100644 MODULE_DESCRIPTION("FB driver for the ST7735R LCD Controller"); MODULE_AUTHOR("Noralf Tronnes"); diff --git a/drivers/staging/fbtft/fb_st7789v.c b/drivers/staging/fbtft/fb_st7789v.c -index 3a280cc1892c..af4e975e7b30 100644 +index 3a280cc1892ca..af4e975e7b300 100644 --- a/drivers/staging/fbtft/fb_st7789v.c +++ b/drivers/staging/fbtft/fb_st7789v.c @@ -66,6 +66,12 @@ enum st7789v_command { @@ -89000,7 +93286,7 @@ index 3a280cc1892c..af4e975e7b30 100644 MODULE_ALIAS("spi:" DRVNAME); MODULE_ALIAS("platform:" DRVNAME); diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c -index 4f362dad4436..d4bda5481693 100644 +index 3723269890d5f..6f4ad6e97637c 100644 --- a/drivers/staging/fbtft/fbtft-core.c +++ b/drivers/staging/fbtft/fbtft-core.c @@ -24,6 +24,8 @@ @@ -89012,7 +93298,7 @@ index 4f362dad4436..d4bda5481693 100644 #include