From 3f09969e866ca520f45967d4d1d0aa98fb46c7a7 Mon Sep 17 00:00:00 2001 From: coolsnowwolf <coolsowwolf@gmail.com> Date: Thu, 4 Aug 2022 19:47:00 +0000 Subject: [PATCH 1/9] kernel: refresh RTL 5.19 patch --- package/lean/r8125/patches/020-5.19-support.patch | 2 +- package/lean/r8152/patches/010-5.19-support.patch | 2 +- package/lean/r8168/patches/030-5.19-support.patch | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package/lean/r8125/patches/020-5.19-support.patch b/package/lean/r8125/patches/020-5.19-support.patch index 778e21888a902d..481c7739ebef18 100644 --- a/package/lean/r8125/patches/020-5.19-support.patch +++ b/package/lean/r8125/patches/020-5.19-support.patch @@ -4,7 +4,7 @@ #define FIRMWARE_8168FP_3 "rtl_nic/rtl8168fp-3.fw" #define FIRMWARE_8168FP_4 "rtl_nic/rtl8168fp-4.fw" -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) +static inline void netif_set_gso_max_size(struct net_device *dev, + unsigned int size) +{ diff --git a/package/lean/r8152/patches/010-5.19-support.patch b/package/lean/r8152/patches/010-5.19-support.patch index 3046862320daf7..944e5bfcc94c1b 100644 --- a/package/lean/r8152/patches/010-5.19-support.patch +++ b/package/lean/r8152/patches/010-5.19-support.patch @@ -4,7 +4,7 @@ #define RTL_ADVERTISED_1000_FULL BIT(5) #define RTL_ADVERTISED_2500_FULL BIT(6) -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) +static inline void netif_set_gso_max_size(struct net_device *dev, + unsigned int size) +{ diff --git a/package/lean/r8168/patches/030-5.19-support.patch b/package/lean/r8168/patches/030-5.19-support.patch index 07c94921fe6dfa..d4dca31255a876 100644 --- a/package/lean/r8168/patches/030-5.19-support.patch +++ b/package/lean/r8168/patches/030-5.19-support.patch @@ -4,7 +4,7 @@ #define FIRMWARE_8168FP_3 "rtl_nic/rtl8168fp-3.fw" #define FIRMWARE_8168FP_4 "rtl_nic/rtl8168fp-4.fw" -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0) +static inline void netif_set_gso_max_size(struct net_device *dev, + unsigned int size) +{ From bda5611e48fffc0362504a2967e139aa1d460bde Mon Sep 17 00:00:00 2001 From: coolsnowwolf <31687149+coolsnowwolf@users.noreply.github.com> Date: Fri, 5 Aug 2022 11:18:08 +0800 Subject: [PATCH 2/9] ntfs3-mount : add support kernel 5.19 --- package/lean/ntfs3-mount/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/lean/ntfs3-mount/Makefile b/package/lean/ntfs3-mount/Makefile index e3b266a317d0d6..61dd214bac1e56 100644 --- a/package/lean/ntfs3-mount/Makefile +++ b/package/lean/ntfs3-mount/Makefile @@ -10,7 +10,7 @@ define Package/ntfs3-mount CATEGORY:=Utilities SUBMENU:=Filesystem TITLE:=NTFS mount script for Paragon NTFS3 driver - DEPENDS:=+LINUX_5_4:kmod-fs-ntfs3-oot +(LINUX_5_15||LINUX_5_18):kmod-fs-ntfs3 + DEPENDS:=+LINUX_5_4:kmod-fs-ntfs3-oot +(LINUX_5_15||LINUX_5_18||LINUX_5_19):kmod-fs-ntfs3 PKGARCH:=all endef From cabbef2b4e4618e8acd4f0819642b1e6d5e7e1ae Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Fri, 5 Aug 2022 11:19:25 +0800 Subject: [PATCH 3/9] kernel: bump 5.10 to 5.10.135 (#9887) All patches automatically rebased. Signed-off-by: John Audia <therealgraysky@proton.me> Co-authored-by: John Audia <therealgraysky@proton.me> --- include/kernel-5.10 | 4 ++-- .../ath79/patches-5.10/910-unaligned_access_hacks.patch | 8 ++++---- ...ix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/kernel-5.10 b/include/kernel-5.10 index c2df3cb11a3770..8a4895d91b2ef4 100644 --- a/include/kernel-5.10 +++ b/include/kernel-5.10 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.10 = .134 -LINUX_KERNEL_HASH-5.10.134 = ec3513acdf033dd8f8ac2545cd1bb826b0669e151185e5f70408a5c9fe273269 +LINUX_VERSION-5.10 = .135 +LINUX_KERNEL_HASH-5.10.135 = e499a61be9ce670716dd27b5124bb9ef6c6bc0e8fab443abf717a77136543344 diff --git a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch index ad19f8eaf97d2e..713f01f20f508f 100644 --- a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch +++ b/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch @@ -305,7 +305,7 @@ list_for_each_entry(p, head, list) { --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -612,48 +612,53 @@ static void tcp_options_write(__be32 *pt +@@ -609,48 +609,53 @@ static void tcp_options_write(__be32 *pt u16 options = opts->options; /* mungable copy */ if (unlikely(OPTION_MD5 & options)) { @@ -382,7 +382,7 @@ } if (unlikely(opts->num_sack_blocks)) { -@@ -661,16 +666,17 @@ static void tcp_options_write(__be32 *pt +@@ -658,16 +663,17 @@ static void tcp_options_write(__be32 *pt tp->duplicate_sack : tp->selective_acks; int this_sack; @@ -406,7 +406,7 @@ } tp->rx_opt.dsack = 0; -@@ -683,13 +689,14 @@ static void tcp_options_write(__be32 *pt +@@ -680,13 +686,14 @@ static void tcp_options_write(__be32 *pt if (foc->exp) { len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len; @@ -706,7 +706,7 @@ EXPORT_SYMBOL(xfrm_parse_spi); --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c -@@ -4092,14 +4092,16 @@ static bool tcp_parse_aligned_timestamp( +@@ -4093,14 +4093,16 @@ static bool tcp_parse_aligned_timestamp( { const __be32 *ptr = (const __be32 *)(th + 1); diff --git a/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch index 0d1d3e1137c721..f788deabac16d9 100644 --- a/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ b/target/linux/generic/pending-5.10/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de> --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -7055,7 +7055,7 @@ static void __ref alloc_node_mem_map(str +@@ -7059,7 +7059,7 @@ static void __ref alloc_node_mem_map(str if (pgdat == NODE_DATA(0)) { mem_map = NODE_DATA(0)->node_mem_map; if (page_to_pfn(mem_map) != pgdat->node_start_pfn) From 766e12fcd555e0274dbb06cb4d96295955022c49 Mon Sep 17 00:00:00 2001 From: lean <coolsnowwolf@gmail.com> Date: Fri, 5 Aug 2022 12:00:06 +0800 Subject: [PATCH 4/9] rockchip: add kernel 5.19 support --- target/linux/rockchip/Makefile | 2 +- target/linux/rockchip/armv8/config-5.19 | 846 ++++++++++++++++++ .../boot/dts/rockchip/rk3328-doornet1.dts | 495 ++++++++++ .../boot/dts/rockchip/rk3328-nanopi-r2c.dts | 47 + .../rockchip/rk3328-orangepi-r1-plus-lts.dts | 70 ++ .../dts/rockchip/rk3328-orangepi-r1-plus.dts | 39 + .../boot/dts/rockchip/rk3399-doornet2.dts | 113 +++ .../boot/dts/rockchip/rk3399-doornet2.dtsi | 636 +++++++++++++ .../boot/dts/rockchip/rk3399-nanopi4-opp.dtsi | 152 ++++ .../boot/dts/rockchip/rk3399-rock-pi-4.dts | 19 + ...kchip-add-EEPROM-node-for-NanoPi-R4S.patch | 31 + ...-rockchip-add-Quartz64-A-fan-pinctrl.patch | 39 + ...ip-enable-sdr-104-for-sdmmc-on-Quart.patch | 32 + ...ip-enable-sfc-controller-on-Quartz64.patch | 41 + ...ckchip-Add-rk3568-PCIe2x1-controller.patch | 74 ++ ...ip-Enable-PCIe-controller-on-quartz6.patch | 80 ++ ...ip-add-pine64-touch-panel-display-to.patch | 131 +++ ...4-dts-rockchip-rk356x-Add-VOP2-nodes.patch | 106 +++ ...4-dts-rockchip-rk356x-Add-HDMI-nodes.patch | 56 ++ ...chip-rk3568-evb-Enable-VOP2-and-hdmi.patch | 90 ++ ...ip-enable-vop2-and-hdmi-tx-on-quartz.patch | 91 ++ ...ip-enable-vop2-and-hdmi-tx-on-rock-3.patch | 93 ++ ...ts-rockchip-adjust-whitespace-around.patch | 105 +++ ...kchip-Add-HDMI-audio-nodes-to-rk356x.patch | 67 ++ ...chip-Enable-HDMI-audio-on-Quartz64-A.patch | 40 + ...4-dts-rockchip-add-RTC-to-BPI-R2-Pro.patch | 53 ++ ...ip-set-display-regulators-to-always-.patch | 44 + ...ip-enable-vop2-and-hdmi-tx-on-BPI-R2.patch | 90 ++ ...chip-Enable-HDMI-audio-on-BPI-R2-Pro.patch | 40 + ...ip-configure-thermal-shutdown-for-BP.patch | 26 + ...ockchip-enable-the-gpu-on-BPI-R2-Pro.patch | 28 + ...ip-Add-missing-space-around-regulato.patch | 31 + ...s-rockchip-add-ROCK-Pi-S-DTS-support.patch | 245 +++++ ...kchip-rock-pi-s-add-more-peripherals.patch | 100 +++ ...ip-align-gpio-key-node-names-with-dt.patch | 369 ++++++++ ...ip-enable-hdmi-tx-audio-on-rk3568-ev.patch | 40 + ...chip-enable-hdmi-tx-audio-on-rock-3a.patch | 39 + ...ip-Add-mt7531-dsa-node-to-BPI-R2-Pro.patch | 72 ++ ...t7530-rework-mt7530_hw_vlan_-add-del.patch | 87 ++ ...et-dsa-mt7530-rework-mt753-01-_setup.patch | 75 ++ ...et-cpu-port-via-dp-cpu_dp-instead-of.patch | 117 +++ ...-Kconfig-dependencies-for-display-po.patch | 46 + ...ove-unneeded-semicolon-from-vop2-dri.patch | 29 + ...ix-spelling-mistake-aligened-aligned.patch | 26 + ...2-unlock-on-error-path-in-vop2_crtc_.patch | 27 + ...-drm-Drop-drm_edid.h-from-drm_crtc.h.patch | 569 ++++++++++++ ...-Don-t-crash-for-invalid-duplicate_s.patch | 33 + ...-an-error-handling-path-rockchip_dp_.patch | 36 + ...o-usb2-Prevent-incorrect-error-on-pr.patch | 28 + ...hip-inno-usb2-Sync-initial-otg-state.patch | 33 + ...indings-phy-rockchip-add-PCIe-v3-phy.patch | 97 ++ ...ings-soc-grf-add-pcie30-phy-pipe-grf.patch | 28 + .../0046-phy-rockchip-Support-PCIe-v3.patch | 390 ++++++++ ...ts-rockchip-rk3568-Add-PCIe-v3-nodes.patch | 144 +++ ...chip-Add-PCIe-v3-nodes-to-BPI-R2-Pro.patch | 127 +++ ...no-usb2-Ignore-OTG-IRQs-in-host-mode.patch | 34 + ...56x-fix-upper-usb-port-on-BPI-R2-Pro.patch | 28 + .../0051-rockchip-add-pci3-for-rock3-a.patch | 211 +++++ ...FriendlyElec-NanoPi-R5S-rk3568-board.patch | 844 +++++++++++++++++ ...-rockchip-use-system-LED-for-OpenWrt.patch | 31 + ...dd-OF-node-for-USB-eth-on-NanoPi-R2S.patch | 24 + ...add-support-for-FriendlyARM-NanoPi-N.patch | 397 ++++++++ 62 files changed, 8132 insertions(+), 1 deletion(-) create mode 100644 target/linux/rockchip/armv8/config-5.19 create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-doornet1.dts create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dts create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi create mode 100644 target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts create mode 100644 target/linux/rockchip/patches-5.19/0000-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch create mode 100644 target/linux/rockchip/patches-5.19/0001-arm64-dts-rockchip-add-Quartz64-A-fan-pinctrl.patch create mode 100644 target/linux/rockchip/patches-5.19/0002-arm64-dts-rockchip-enable-sdr-104-for-sdmmc-on-Quart.patch create mode 100644 target/linux/rockchip/patches-5.19/0003-arm64-dts-rockchip-enable-sfc-controller-on-Quartz64.patch create mode 100644 target/linux/rockchip/patches-5.19/0004-arm64-dts-rockchip-Add-rk3568-PCIe2x1-controller.patch create mode 100644 target/linux/rockchip/patches-5.19/0005-arm64-dts-rockchip-Enable-PCIe-controller-on-quartz6.patch create mode 100644 target/linux/rockchip/patches-5.19/0006-arm64-dts-rockchip-add-pine64-touch-panel-display-to.patch create mode 100644 target/linux/rockchip/patches-5.19/0007-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch create mode 100644 target/linux/rockchip/patches-5.19/0008-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch create mode 100644 target/linux/rockchip/patches-5.19/0009-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch create mode 100644 target/linux/rockchip/patches-5.19/0010-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz.patch create mode 100644 target/linux/rockchip/patches-5.19/0011-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-rock-3.patch create mode 100644 target/linux/rockchip/patches-5.19/0013-arm64-dts-rockchip-adjust-whitespace-around.patch create mode 100644 target/linux/rockchip/patches-5.19/0014-arm64-dts-rockchip-Add-HDMI-audio-nodes-to-rk356x.patch create mode 100644 target/linux/rockchip/patches-5.19/0015-arm64-dts-rockchip-Enable-HDMI-audio-on-Quartz64-A.patch create mode 100644 target/linux/rockchip/patches-5.19/0017-arm64-dts-rockchip-add-RTC-to-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0019-arm64-dts-rockchip-set-display-regulators-to-always-.patch create mode 100644 target/linux/rockchip/patches-5.19/0020-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-BPI-R2.patch create mode 100644 target/linux/rockchip/patches-5.19/0021-arm64-dts-rockchip-Enable-HDMI-audio-on-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0022-arm64-dts-rockchip-configure-thermal-shutdown-for-BP.patch create mode 100644 target/linux/rockchip/patches-5.19/0023-arm64-dts-rockchip-enable-the-gpu-on-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0024-arm64-dts-rockchip-Add-missing-space-around-regulato.patch create mode 100644 target/linux/rockchip/patches-5.19/0025-arm64-dts-rockchip-add-ROCK-Pi-S-DTS-support.patch create mode 100644 target/linux/rockchip/patches-5.19/0026-arm64-dts-rockchip-rock-pi-s-add-more-peripherals.patch create mode 100644 target/linux/rockchip/patches-5.19/0027-arm64-dts-rockchip-align-gpio-key-node-names-with-dt.patch create mode 100644 target/linux/rockchip/patches-5.19/0028-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rk3568-ev.patch create mode 100644 target/linux/rockchip/patches-5.19/0029-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rock-3a.patch create mode 100644 target/linux/rockchip/patches-5.19/0030-arm64-dts-rockchip-Add-mt7531-dsa-node-to-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0031-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch create mode 100644 target/linux/rockchip/patches-5.19/0032-net-dsa-mt7530-rework-mt753-01-_setup.patch create mode 100644 target/linux/rockchip/patches-5.19/0033-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch create mode 100644 target/linux/rockchip/patches-5.19/0034-drm-rockchip-Fix-Kconfig-dependencies-for-display-po.patch create mode 100644 target/linux/rockchip/patches-5.19/0035-drm-rockchip-remove-unneeded-semicolon-from-vop2-dri.patch create mode 100644 target/linux/rockchip/patches-5.19/0036-drm-rockchip-Fix-spelling-mistake-aligened-aligned.patch create mode 100644 target/linux/rockchip/patches-5.19/0037-drm-rockchip-vop2-unlock-on-error-path-in-vop2_crtc_.patch create mode 100644 target/linux/rockchip/patches-5.19/0038-drm-Drop-drm_edid.h-from-drm_crtc.h.patch create mode 100644 target/linux/rockchip/patches-5.19/0039-drm-rockchip-vop-Don-t-crash-for-invalid-duplicate_s.patch create mode 100644 target/linux/rockchip/patches-5.19/0040-drm-rockchip-Fix-an-error-handling-path-rockchip_dp_.patch create mode 100644 target/linux/rockchip/patches-5.19/0042-phy-rockchip-inno-usb2-Prevent-incorrect-error-on-pr.patch create mode 100644 target/linux/rockchip/patches-5.19/0043-phy-rockchip-inno-usb2-Sync-initial-otg-state.patch create mode 100644 target/linux/rockchip/patches-5.19/0044-dt-bindings-phy-rockchip-add-PCIe-v3-phy.patch create mode 100644 target/linux/rockchip/patches-5.19/0045-dt-bindings-soc-grf-add-pcie30-phy-pipe-grf.patch create mode 100644 target/linux/rockchip/patches-5.19/0046-phy-rockchip-Support-PCIe-v3.patch create mode 100644 target/linux/rockchip/patches-5.19/0047-arm64-dts-rockchip-rk3568-Add-PCIe-v3-nodes.patch create mode 100644 target/linux/rockchip/patches-5.19/0048-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0049-phy-rockchip-inno-usb2-Ignore-OTG-IRQs-in-host-mode.patch create mode 100644 target/linux/rockchip/patches-5.19/0050-arm64-dts-rk356x-fix-upper-usb-port-on-BPI-R2-Pro.patch create mode 100644 target/linux/rockchip/patches-5.19/0051-rockchip-add-pci3-for-rock3-a.patch create mode 100644 target/linux/rockchip/patches-5.19/0052-rockchip-add-FriendlyElec-NanoPi-R5S-rk3568-board.patch create mode 100644 target/linux/rockchip/patches-5.19/0053-rockchip-use-system-LED-for-OpenWrt.patch create mode 100644 target/linux/rockchip/patches-5.19/0054-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch create mode 100644 target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch diff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile index 4cac4d40f905c7..e616ba05cbd241 100644 --- a/target/linux/rockchip/Makefile +++ b/target/linux/rockchip/Makefile @@ -7,7 +7,7 @@ BOARDNAME:=Rockchip FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-part squashfs SUBTARGETS:=armv8 -KERNEL_PATCHVER=5.18 +KERNEL_PATCHVER=5.15 KERNEL_TESTING_PATCHVER=5.4 define Target/Description diff --git a/target/linux/rockchip/armv8/config-5.19 b/target/linux/rockchip/armv8/config-5.19 new file mode 100644 index 00000000000000..1591ae509a122e --- /dev/null +++ b/target/linux/rockchip/armv8/config-5.19 @@ -0,0 +1,846 @@ +CONFIG_64BIT=y +CONFIG_AF_UNIX_OOB=y +CONFIG_ARCH_BINFMT_ELF_EXTRA_PHDRS=y +CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +CONFIG_ARCH_KEEP_MEMBLOCK=y +CONFIG_ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE=y +CONFIG_ARCH_MMAP_RND_BITS_MAX=33 +CONFIG_ARCH_MMAP_RND_BITS_MIN=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS_MIN=11 +CONFIG_ARCH_NR_GPIO=0 +CONFIG_ARCH_PROC_KCORE_TEXT=y +CONFIG_ARCH_ROCKCHIP=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARC_EMAC_CORE=y +CONFIG_ARM64=y +CONFIG_ARM64_CNP=y +CONFIG_ARM64_CRYPTO=y +CONFIG_ARM64_ERRATUM_1024718=y +CONFIG_ARM64_ERRATUM_1530923=y +CONFIG_ARM64_ERRATUM_2051678=y +CONFIG_ARM64_ERRATUM_2077057=y +CONFIG_ARM64_ERRATUM_819472=y +CONFIG_ARM64_ERRATUM_824069=y +CONFIG_ARM64_ERRATUM_826319=y +CONFIG_ARM64_ERRATUM_827319=y +CONFIG_ARM64_ERRATUM_832075=y +CONFIG_ARM64_ERRATUM_843419=y +CONFIG_ARM64_ERRATUM_845719=y +CONFIG_ARM64_ERRATUM_858921=y +CONFIG_ARM64_HW_AFDBM=y +CONFIG_ARM64_LD_HAS_FIX_ERRATUM_843419=y +CONFIG_ARM64_MODULE_PLTS=y +CONFIG_ARM64_PAGE_SHIFT=12 +CONFIG_ARM64_PAN=y +CONFIG_ARM64_PA_BITS=48 +CONFIG_ARM64_PA_BITS_48=y +CONFIG_ARM64_PTR_AUTH=y +CONFIG_ARM64_RAS_EXTN=y +CONFIG_ARM64_SME=y +CONFIG_ARM64_SVE=y +# CONFIG_ARM64_SW_TTBR0_PAN is not set +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM64_VA_BITS=48 +# CONFIG_ARM64_VA_BITS_39 is not set +CONFIG_ARM64_VA_BITS_48=y +CONFIG_ARM64_WORKAROUND_CLEAN_CACHE=y +CONFIG_ARM64_WORKAROUND_SPECULATIVE_AT=y +# CONFIG_ARMV8_DEPRECATED is not set +CONFIG_ARM_AMBA=y +CONFIG_ARM_ARCH_TIMER=y +CONFIG_ARM_ARCH_TIMER_EVTSTREAM=y +CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND=y +CONFIG_ARM_CPUIDLE=y +CONFIG_ARM_FFA_SMCCC=y +CONFIG_ARM_FFA_TRANSPORT=y +CONFIG_ARM_GIC=y +CONFIG_ARM_GIC_V2M=y +CONFIG_ARM_GIC_V3=y +CONFIG_ARM_GIC_V3_ITS=y +CONFIG_ARM_GIC_V3_ITS_PCI=y +CONFIG_ARM_MHU=y +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y +CONFIG_ARM_PSCI_FW=y +CONFIG_ARM_RK3399_DMC_DEVFREQ=y +CONFIG_ARM_SCMI_CPUFREQ=y +CONFIG_ARM_SCMI_HAVE_SHMEM=y +CONFIG_ARM_SCMI_HAVE_TRANSPORT=y +CONFIG_ARM_SCMI_POWER_DOMAIN=y +CONFIG_ARM_SCMI_PROTOCOL=y +CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y +CONFIG_ARM_SCMI_TRANSPORT_SMC=y +# CONFIG_ARM_SCMI_TRANSPORT_SMC_ATOMIC_ENABLE is not set +CONFIG_ARM_SCPI_CPUFREQ=y +CONFIG_ARM_SCPI_POWER_DOMAIN=y +CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_SMCCC_SOC_ID=y +CONFIG_ARM_SMMU=y +CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y +# CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set +CONFIG_ARM_SMMU_V3=y +# CONFIG_ARM_SMMU_V3_SVA is not set +CONFIG_ATA=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_BACKLIGHT_CLASS_DEVICE=y +CONFIG_BACKLIGHT_GPIO=y +CONFIG_BACKLIGHT_PWM=y +CONFIG_BINARY_PRINTF=y +CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y +CONFIG_BLK_DEV_BSG_COMMON=y +# CONFIG_BLK_DEV_INITRD is not set +CONFIG_BLK_DEV_INTEGRITY=y +CONFIG_BLK_DEV_INTEGRITY_T10=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NBD=m +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_PCIESSD_MTIP32XX=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_DEV_SD=y +CONFIG_BLK_MQ_PCI=y +CONFIG_BLK_PM=y +CONFIG_BLOCK_COMPAT=y +CONFIG_BLOCK_LEGACY_AUTOLOAD=y +CONFIG_BRCMSTB_GISB_ARB=y +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_BSD_PROCESS_ACCT_V3=y +CONFIG_CC_HAVE_STACKPROTECTOR_SYSREG=y +CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5" +CONFIG_CHARGER_GPIO=y +CONFIG_CLKSRC_MMIO=y +CONFIG_CLK_PX30=y +CONFIG_CLK_RK3308=y +CONFIG_CLK_RK3328=y +CONFIG_CLK_RK3368=y +CONFIG_CLK_RK3399=y +CONFIG_CLK_RK3568=y +CONFIG_CLONE_BACKWARDS=y +CONFIG_CMA=y +CONFIG_CMA_ALIGNMENT=8 +CONFIG_CMA_AREAS=7 +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +CONFIG_CMA_SIZE_MBYTES=5 +# CONFIG_CMA_SIZE_SEL_MAX is not set +CONFIG_CMA_SIZE_SEL_MBYTES=y +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_RK808=y +CONFIG_COMMON_CLK_ROCKCHIP=y +# CONFIG_COMMON_CLK_RS9_PCIE is not set +CONFIG_COMMON_CLK_SCMI=y +CONFIG_COMMON_CLK_SCPI=y +CONFIG_COMPAT=y +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_COMPAT_BINFMT_ELF=y +CONFIG_COMPAT_NETLINK_MESSAGES=y +CONFIG_COMPAT_OLD_SIGACTION=y +CONFIG_CONFIGFS_FS=y +CONFIG_CONSOLE_TRANSLATIONS=y +CONFIG_CONTIG_ALLOC=y +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_FREQ=y +# CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set +CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y +CONFIG_CPU_FREQ_GOV_ATTR_SET=y +# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set +# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y +# CONFIG_CPU_FREQ_GOV_USERSPACE is not set +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_MENU=y +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +CONFIG_CPU_ISOLATION=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +CONFIG_CPU_THERMAL=y +CONFIG_CRASH_CORE=y +CONFIG_CRASH_DUMP=y +CONFIG_CRC16=y +# CONFIG_CRC32_SARWATE is not set +CONFIG_CRC32_SLICEBY8=y +CONFIG_CRC64=y +CONFIG_CRC64_ROCKSOFT=y +CONFIG_CRC_T10DIF=y +CONFIG_CROSS_MEMORY_ATTACH=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_CRC32=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CRC64_ROCKSOFT=y +CONFIG_CRYPTO_CRCT10DIF=y +CONFIG_CRYPTO_CRCT10DIF_ARM64_CE=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_RNG2=y +# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set +# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +CONFIG_DEBUG_INFO=y +CONFIG_DEVFREQ_EVENT_ROCKCHIP_DFI=y +# CONFIG_DEVFREQ_GOV_PASSIVE is not set +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_USERSPACE=y +# CONFIG_DEVFREQ_THERMAL is not set +CONFIG_DEVMEM=y +# CONFIG_DEVPORT is not set +# CONFIG_DM9051 is not set +CONFIG_DMADEVICES=y +CONFIG_DMA_CMA=y +CONFIG_DMA_DIRECT_REMAP=y +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +CONFIG_DMA_OPS=y +CONFIG_DMA_SHARED_BUFFER=y +CONFIG_DNOTIFY=y +CONFIG_DRM=y +# CONFIG_DRM_ANALOGIX_ANX7625 is not set +CONFIG_DRM_BRIDGE=y +# CONFIG_DRM_CHIPONE_ICN6211 is not set +CONFIG_DRM_DEBUG_MODESET_LOCK=y +CONFIG_DRM_DISPLAY_HDMI_HELPER=y +CONFIG_DRM_DISPLAY_HELPER=y +CONFIG_DRM_DW_HDMI=y +CONFIG_DRM_DW_MIPI_DSI=y +# CONFIG_DRM_FSL_LDB is not set +CONFIG_DRM_GEM_CMA_HELPER=y +# CONFIG_DRM_ITE_IT6505 is not set +# CONFIG_DRM_ITE_IT66121 is not set +CONFIG_DRM_KMS_HELPER=y +# CONFIG_DRM_LONTIUM_LT8912B is not set +# CONFIG_DRM_LONTIUM_LT9211 is not set +# CONFIG_DRM_LONTIUM_LT9611UXC is not set +CONFIG_DRM_MIPI_DSI=y +CONFIG_DRM_NOMODESET=y +CONFIG_DRM_PANEL=y +# CONFIG_DRM_PANEL_ABT_Y030XX067A is not set +# CONFIG_DRM_PANEL_BOE_BF060Y8M_AJ0 is not set +CONFIG_DRM_PANEL_BRIDGE=y +# CONFIG_DRM_PANEL_DSI_CM is not set +# CONFIG_DRM_PANEL_EDP is not set +# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set +# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set +# CONFIG_DRM_PANEL_JDI_R63452 is not set +# CONFIG_DRM_PANEL_KHADAS_TS050 is not set +# CONFIG_DRM_PANEL_MIPI_DBI is not set +# CONFIG_DRM_PANEL_NEWVISION_NV3052C is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35560 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT35950 is not set +# CONFIG_DRM_PANEL_NOVATEK_NT36672A is not set +CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y +# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set +# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set +# CONFIG_DRM_PANEL_SAMSUNG_S6D27A1 is not set +# CONFIG_DRM_PANEL_SAMSUNG_SOFEF00 is not set +# CONFIG_DRM_PANEL_SHARP_LS060T1SX01 is not set +# CONFIG_DRM_PANEL_SONY_TULIP_TRULY_NT35521 is not set +# CONFIG_DRM_PANEL_TDO_TL070WSH30 is not set +# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set +# CONFIG_DRM_RCAR_MIPI_DSI is not set +# CONFIG_DRM_RCAR_USE_LVDS is not set +CONFIG_DRM_ROCKCHIP=y +# CONFIG_DRM_SIMPLEDRM is not set +# CONFIG_DRM_SSD130X is not set +# CONFIG_DRM_TI_SN65DSI83 is not set +CONFIG_DTC=y +CONFIG_DT_IDLE_GENPD=y +CONFIG_DT_IDLE_STATES=y +CONFIG_DUMMY_CONSOLE=y +CONFIG_DWMAC_DWC_QOS_ETH=y +CONFIG_DWMAC_GENERIC=y +CONFIG_DWMAC_ROCKCHIP=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EEPROM_AT24=y +CONFIG_EMAC_ROCKCHIP=y +CONFIG_ENERGY_MODEL=y +CONFIG_EXCLUSIVE_SYSTEM_RAM=y +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_POSIX_ACL=y +CONFIG_EXTCON=y +CONFIG_F2FS_FS=y +CONFIG_FANOTIFY=y +CONFIG_FB_CMDLINE=y +CONFIG_FHANDLE=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +# CONFIG_FORTIFY_SOURCE is not set +CONFIG_FRAME_POINTER=y +CONFIG_FRAME_WARN=2048 +CONFIG_FS_IOMAP=y +CONFIG_FS_MBCACHE=y +CONFIG_FS_POSIX_ACL=y +# CONFIG_FUN_ETH is not set +CONFIG_FWNODE_MDIO=y +CONFIG_FW_LOADER_PAGED_BUF=y +CONFIG_FW_LOADER_SYSFS=y +CONFIG_GCC12_NO_ARRAY_BOUNDS=y +CONFIG_GCC_SUPPORTS_DYNAMIC_FTRACE_WITH_REGS=y +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_ARCH_TOPOLOGY=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y +CONFIG_GENERIC_CSUM=y +CONFIG_GENERIC_EARLY_IOREMAP=y +CONFIG_GENERIC_GETTIMEOFDAY=y +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK=y +CONFIG_GENERIC_IRQ_MIGRATION=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=y +CONFIG_GENERIC_PHY_MIPI_DPHY=y +CONFIG_GENERIC_PINCONF=y +CONFIG_GENERIC_PINCTRL_GROUPS=y +CONFIG_GENERIC_PINMUX_FUNCTIONS=y +CONFIG_GENERIC_SCHED_CLOCK=y +CONFIG_GENERIC_SMP_IDLE_THREAD=y +CONFIG_GENERIC_STRNCPY_FROM_USER=y +CONFIG_GENERIC_STRNLEN_USER=y +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GLOB=y +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_GPIO_CASCADE is not set +CONFIG_GPIO_CDEV=y +CONFIG_GPIO_DWAPB=y +CONFIG_GPIO_GENERIC=y +CONFIG_GPIO_GENERIC_PLATFORM=y +CONFIG_GPIO_ROCKCHIP=y +# CONFIG_GPIO_SIM is not set +CONFIG_GRO_CELLS=y +# CONFIG_HARDENED_USERCOPY is not set +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HDMI=y +CONFIG_HID=y +CONFIG_HID_GENERIC=y +CONFIG_HOTPLUG_CPU=y +CONFIG_HOTPLUG_PCI=y +# CONFIG_HOTPLUG_PCI_CPCI is not set +CONFIG_HOTPLUG_PCI_PCIE=y +CONFIG_HOTPLUG_PCI_SHPC=y +CONFIG_HUGETLBFS=y +CONFIG_HUGETLB_PAGE=y +CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y +# CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON is not set +CONFIG_HWMON=y +CONFIG_HWSPINLOCK=y +CONFIG_HW_CONSOLE=y +CONFIG_HZ=250 +# CONFIG_HZ_100 is not set +CONFIG_HZ_250=y +CONFIG_I2C=y +CONFIG_I2C_ALGOBIT=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_HELPER_AUTO=y +CONFIG_I2C_RK3X=y +CONFIG_IGB=y +CONFIG_IGB_HWMON=y +CONFIG_IGC=y +CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000 +CONFIG_INDIRECT_PIO=y +CONFIG_INPUT=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_FF_MEMLESS=y +CONFIG_INPUT_KEYBOARD=y +CONFIG_INPUT_LEDS=y +CONFIG_INPUT_MATRIXKMAP=y +CONFIG_INPUT_MOUSE=y +CONFIG_INPUT_MOUSEDEV=y +CONFIG_INPUT_MOUSEDEV_PSAUX=y +CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 +CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 +CONFIG_INPUT_RK805_PWRKEY=y +CONFIG_INPUT_SPARSEKMAP=y +CONFIG_IOMMU_API=y +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +CONFIG_IOMMU_DEFAULT_DMA_STRICT=y +CONFIG_IOMMU_DMA=y +CONFIG_IOMMU_IOVA=y +CONFIG_IOMMU_IO_PGTABLE=y +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +CONFIG_IOMMU_IO_PGTABLE_LPAE=y +# CONFIG_IOMMU_IO_PGTABLE_LPAE_SELFTEST is not set +CONFIG_IOMMU_SUPPORT=y +# CONFIG_IO_STRICT_DEVMEM is not set +CONFIG_IO_URING=y +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_MSI_IOMMU=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +CONFIG_JFFS2_ZLIB=y +CONFIG_JUMP_LABEL=y +CONFIG_KALLSYMS=y +CONFIG_KCMP=y +CONFIG_KEXEC_CORE=y +CONFIG_KEXEC_FILE=y +# CONFIG_KEXEC_SIG is not set +CONFIG_KSM=y +# CONFIG_LAN966X_SWITCH is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_PWM=y +# CONFIG_LEDS_PWM_MULTICOLOR is not set +CONFIG_LEDS_SYSCON=y +CONFIG_LEDS_TRIGGER_CPU=y +CONFIG_LEDS_TRIGGER_PANIC=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=16 +CONFIG_LIBCRC32C=y +CONFIG_LIBFDT=y +CONFIG_LOCALVERSION_AUTO=y +CONFIG_LOCK_DEBUGGING_SUPPORT=y +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LOG_BUF_SHIFT=19 +CONFIG_LTO_NONE=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_MAGIC_SYSRQ_SERIAL=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +CONFIG_MDIO_BUS=y +CONFIG_MDIO_BUS_MUX=y +CONFIG_MDIO_BUS_MUX_GPIO=y +CONFIG_MDIO_BUS_MUX_MMIOREG=y +CONFIG_MDIO_DEVICE=y +CONFIG_MDIO_DEVRES=y +CONFIG_MEDIATEK_GE_PHY=y +CONFIG_MEMFD_CREATE=y +CONFIG_MEMORY_ISOLATION=y +CONFIG_MFD_CORE=y +# CONFIG_MFD_KHADAS_MCU is not set +# CONFIG_MFD_MAX77714 is not set +CONFIG_MFD_RK808=y +# CONFIG_MFD_SIMPLE_MFD_I2C is not set +CONFIG_MFD_SYSCON=y +CONFIG_MIGRATION=y +CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY=y +CONFIG_MMC=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_CQHCI=y +CONFIG_MMC_DW=y +# CONFIG_MMC_DW_BLUEFIELD is not set +# CONFIG_MMC_DW_EXYNOS is not set +# CONFIG_MMC_DW_HI3798CV200 is not set +# CONFIG_MMC_DW_K3 is not set +# CONFIG_MMC_DW_PCI is not set +CONFIG_MMC_DW_PLTFM=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_OF_ARASAN=y +CONFIG_MMC_SDHCI_OF_DWCMSHC=y +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MODULES_USE_ELF_RELA=y +CONFIG_MOTORCOMM_PHY=y +# CONFIG_MOUSE_BCM5974 is not set +# CONFIG_MOUSE_CYAPA is not set +CONFIG_MOUSE_PS2=y +CONFIG_MOUSE_PS2_ALPS=y +CONFIG_MOUSE_PS2_BYD=y +CONFIG_MOUSE_PS2_CYPRESS=y +# CONFIG_MOUSE_PS2_ELANTECH is not set +CONFIG_MOUSE_PS2_LOGIPS2PP=y +CONFIG_MOUSE_PS2_SMBUS=y +CONFIG_MOUSE_PS2_SYNAPTICS=y +CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y +# CONFIG_MOUSE_PS2_TOUCHKIT is not set +CONFIG_MOUSE_PS2_TRACKPOINT=y +# CONFIG_MOUSE_SERIAL is not set +# CONFIG_MOUSE_VSXXXAA is not set +CONFIG_MQ_IOSCHED_DEADLINE=y +# CONFIG_MTD_CFI is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_COMPLEX_MAPPINGS is not set +CONFIG_MTD_SPI_NOR=y +CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y +CONFIG_MTD_SPLIT_FIRMWARE=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEED_SG_DMA_LENGTH=y +CONFIG_NET_DEVLINK=y +CONFIG_NET_DSA=y +CONFIG_NET_DSA_MT7530=y +# CONFIG_NET_DSA_REALTEK is not set +CONFIG_NET_DSA_TAG_MTK=y +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_PTP_CLASSIFY=y +CONFIG_NET_SELFTESTS=y +CONFIG_NET_SOCK_MSG=y +CONFIG_NET_SWITCHDEV=y +CONFIG_NET_VENDOR_DAVICOM=y +CONFIG_NET_VENDOR_FUNGIBLE=y +CONFIG_NLS=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NTFS_FS=y +CONFIG_NTFS_RW=y +CONFIG_NVMEM=y +CONFIG_NVMEM_SYSFS=y +CONFIG_NVME_CORE=y +# CONFIG_NVME_HWMON is not set +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_NVME_VERBOSE_ERRORS is not set +# CONFIG_OCTEON_EP is not set +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_DYNAMIC=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IOMMU=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_OVERLAY=y +CONFIG_OF_RESOLVE=y +CONFIG_OLD_SIGSUSPEND3=y +# CONFIG_OVERLAY_FS_XINO_AUTO is not set +CONFIG_PADATA=y +CONFIG_PAGE_POOL=y +CONFIG_PAGE_SIZE_LESS_THAN_256KB=y +CONFIG_PAGE_SIZE_LESS_THAN_64KB=y +CONFIG_PAHOLE_HAS_SPLIT_BTF=y +CONFIG_PAHOLE_VERSION=121 +# CONFIG_PANIC_ON_OOPS is not set +CONFIG_PANIC_ON_OOPS_VALUE=0 +CONFIG_PANIC_TIMEOUT=0 +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_PARTITION_PERCPU=y +CONFIG_PATA_SIS=y +CONFIG_PCI=y +CONFIG_PCIEAER=y +CONFIG_PCIEASPM=y +CONFIG_PCIEASPM_DEFAULT=y +# CONFIG_PCIEASPM_PERFORMANCE is not set +# CONFIG_PCIEASPM_POWERSAVE is not set +# CONFIG_PCIEASPM_POWER_SUPERSAVE is not set +CONFIG_PCIEPORTBUS=y +CONFIG_PCIE_DW=y +CONFIG_PCIE_DW_HOST=y +CONFIG_PCIE_PME=y +CONFIG_PCIE_ROCKCHIP=y +CONFIG_PCIE_ROCKCHIP_DW_HOST=y +CONFIG_PCIE_ROCKCHIP_HOST=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCI_STUB=y +CONFIG_PCS_XPCS=y +CONFIG_PGTABLE_LEVELS=4 +CONFIG_PHYLIB=y +CONFIG_PHYLINK=y +CONFIG_PHYS_ADDR_T_64BIT=y +CONFIG_PHY_ROCKCHIP_DP=y +CONFIG_PHY_ROCKCHIP_DPHY_RX0=y +CONFIG_PHY_ROCKCHIP_EMMC=y +CONFIG_PHY_ROCKCHIP_INNO_CSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_DSIDPHY=y +CONFIG_PHY_ROCKCHIP_INNO_HDMI=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY=y +CONFIG_PHY_ROCKCHIP_PCIE=y +CONFIG_PHY_ROCKCHIP_SNPS_PCIE3=y +CONFIG_PHY_ROCKCHIP_TYPEC=y +CONFIG_PHY_ROCKCHIP_USB=y +CONFIG_PINCTRL=y +CONFIG_PINCTRL_RK805=y +CONFIG_PINCTRL_ROCKCHIP=y +# CONFIG_PINCTRL_SINGLE is not set +CONFIG_PL330_DMA=y +CONFIG_PLATFORM_MHU=y +CONFIG_PM=y +CONFIG_PM_CLK=y +CONFIG_PM_DEVFREQ=y +CONFIG_PM_DEVFREQ_EVENT=y +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_OPP=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POWER_RESET=y +CONFIG_POWER_SUPPLY=y +CONFIG_POWER_SUPPLY_HWMON=y +CONFIG_PPS=y +CONFIG_PREEMPT=y +CONFIG_PREEMPTION=y +CONFIG_PREEMPT_BUILD=y +CONFIG_PREEMPT_COUNT=y +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_RCU=y +CONFIG_PRINTK_TIME=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_PROC_PAGE_MONITOR=y +CONFIG_PROC_VMCORE=y +CONFIG_PTP_1588_CLOCK=y +CONFIG_PTP_1588_CLOCK_OPTIONAL=y +CONFIG_PWM=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_XILINX is not set +# CONFIG_QFMT_V1 is not set +# CONFIG_QFMT_V2 is not set +CONFIG_QUEUED_RWLOCKS=y +CONFIG_QUEUED_SPINLOCKS=y +CONFIG_QUOTA=y +CONFIG_QUOTACTL=y +# CONFIG_QUOTA_NETLINK_INTERFACE is not set +CONFIG_RAID_ATTRS=y +CONFIG_RANDOMIZE_BASE=y +CONFIG_RANDOMIZE_KSTACK_OFFSET=y +CONFIG_RANDOMIZE_MODULE_REGION_FULL=y +CONFIG_RANDSTRUCT_NONE=y +CONFIG_RAS=y +CONFIG_RATIONAL=y +# CONFIG_RAVE_SP_CORE is not set +CONFIG_RCU_TRACE=y +CONFIG_REALTEK_PHY=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=y +CONFIG_REGMAP_IRQ=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +# CONFIG_REGULATOR_ARM_SCMI is not set +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +CONFIG_REGULATOR_PWM=y +CONFIG_REGULATOR_RK808=y +# CONFIG_REGULATOR_RT5190A is not set +# CONFIG_REGULATOR_RT5759 is not set +# CONFIG_REGULATOR_SY7636A is not set +# CONFIG_REGULATOR_TPS6286X is not set +CONFIG_RELOCATABLE=y +CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_SCMI=y +CONFIG_RFS_ACCEL=y +# CONFIG_ROCKCHIP_ANALOGIX_DP is not set +# CONFIG_ROCKCHIP_CDN_DP is not set +CONFIG_ROCKCHIP_DW_HDMI=y +CONFIG_ROCKCHIP_DW_MIPI_DSI=y +CONFIG_ROCKCHIP_EFUSE=y +CONFIG_ROCKCHIP_GRF=y +CONFIG_ROCKCHIP_INNO_HDMI=y +CONFIG_ROCKCHIP_IODOMAIN=y +CONFIG_ROCKCHIP_IOMMU=y +# CONFIG_ROCKCHIP_LVDS is not set +CONFIG_ROCKCHIP_MBOX=y +# CONFIG_ROCKCHIP_OTP is not set +CONFIG_ROCKCHIP_PHY=y +CONFIG_ROCKCHIP_PM_DOMAINS=y +# CONFIG_ROCKCHIP_RGB is not set +CONFIG_ROCKCHIP_RK3066_HDMI=y +CONFIG_ROCKCHIP_THERMAL=y +CONFIG_ROCKCHIP_TIMER=y +CONFIG_ROCKCHIP_VOP=y +CONFIG_ROCKCHIP_VOP2=y +CONFIG_RODATA_FULL_DEFAULT_ENABLED=y +CONFIG_RPS=y +CONFIG_RSEQ=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_RK808=y +CONFIG_RTC_I2C_AND_SPI=y +CONFIG_RTC_NVMEM=y +# CONFIG_RUNTIME_TESTING_MENU is not set +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_SATA_AHCI=y +CONFIG_SATA_HOST=y +CONFIG_SATA_PMP=y +CONFIG_SATA_SIS=y +CONFIG_SCHED_MC=y +CONFIG_SCSI=y +CONFIG_SCSI_COMMON=y +# CONFIG_SCSI_LOWLEVEL is not set +# CONFIG_SCSI_PROC_FS is not set +# CONFIG_SCSI_SAS_ATA is not set +CONFIG_SCSI_SAS_ATTRS=y +CONFIG_SCSI_SAS_HOST_SMP=y +CONFIG_SCSI_SAS_LIBSAS=y +# CONFIG_SECURITY_DMESG_RESTRICT is not set +# CONFIG_SENSORS_ARM_SCMI is not set +CONFIG_SENSORS_ARM_SCPI=y +# CONFIG_SENSORS_NCT6775_I2C is not set +# CONFIG_SENSORS_SY7636A is not set +# CONFIG_SENSORS_TMP464 is not set +CONFIG_SERIAL_8250_ASPEED_VUART=y +CONFIG_SERIAL_8250_DEPRECATED_OPTIONS=y +CONFIG_SERIAL_8250_DW=y +CONFIG_SERIAL_8250_DWLIB=y +CONFIG_SERIAL_8250_EXAR=y +CONFIG_SERIAL_8250_EXTENDED=y +CONFIG_SERIAL_8250_FINTEK=y +CONFIG_SERIAL_8250_FSL=y +CONFIG_SERIAL_8250_NR_UARTS=4 +CONFIG_SERIAL_8250_PCI=y +CONFIG_SERIAL_8250_RUNTIME_UARTS=4 +CONFIG_SERIAL_8250_SHARE_IRQ=y +CONFIG_SERIAL_AMBA_PL011=y +CONFIG_SERIAL_AMBA_PL011_CONSOLE=y +CONFIG_SERIAL_DEV_BUS=y +CONFIG_SERIAL_DEV_CTRL_TTYPORT=y +CONFIG_SERIAL_MCTRL_GPIO=y +CONFIG_SERIAL_OF_PLATFORM=y +CONFIG_SERIO=y +CONFIG_SERIO_AMBAKMI=y +CONFIG_SERIO_LIBPS2=y +CONFIG_SERIO_PCIPS2=y +CONFIG_SERIO_RAW=y +# CONFIG_SFC_SIENA is not set +CONFIG_SG_POOL=y +CONFIG_SLUB_DEBUG=y +CONFIG_SMP=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SOC_BUS=y +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_SPARSE_IRQ=y +CONFIG_SPI=y +CONFIG_SPI_BITBANG=y +CONFIG_SPI_DYNAMIC=y +CONFIG_SPI_MASTER=y +CONFIG_SPI_MEM=y +CONFIG_SPI_ROCKCHIP=y +CONFIG_SPI_SPIDEV=y +# CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set +CONFIG_SQUASHFS_DECOMP_SINGLE=y +# CONFIG_SQUASHFS_EMBEDDED is not set +CONFIG_SQUASHFS_FILE_CACHE=y +# CONFIG_SQUASHFS_FILE_DIRECT is not set +CONFIG_SRAM=y +CONFIG_SRCU=y +CONFIG_STACKDEPOT=y +CONFIG_STACKPROTECTOR=y +CONFIG_STACKPROTECTOR_PER_TASK=y +CONFIG_STACKPROTECTOR_STRONG=y +CONFIG_STACKTRACE=y +CONFIG_STMMAC_ETH=y +CONFIG_STMMAC_PLATFORM=y +# CONFIG_STMMAC_SELFTESTS is not set +CONFIG_STRICT_DEVMEM=y +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_SWAP is not set +CONFIG_SWIOTLB=y +CONFIG_SWPHY=y +CONFIG_SYNC_FILE=y +CONFIG_SYSCTL_EXCEPTION_TRACE=y +CONFIG_SYSFS_SYSCALL=y +CONFIG_SYSVIPC_COMPAT=y +# CONFIG_TEXTSEARCH is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_EMULATION=y +CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THREAD_INFO_IN_TASK=y +CONFIG_TICK_CPU_ACCOUNTING=y +CONFIG_TIMER_OF=y +CONFIG_TIMER_PROBE=y +# CONFIG_TINYDRM_ILI9163 is not set +CONFIG_TRACE_CLOCK=y +CONFIG_TRANSPARENT_HUGEPAGE=y +CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y +# CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set +CONFIG_TRANS_TABLE=y +CONFIG_TREE_RCU=y +CONFIG_TREE_SRCU=y +CONFIG_TYPEC=y +# CONFIG_TYPEC_DP_ALTMODE is not set +CONFIG_TYPEC_FUSB302=y +# CONFIG_TYPEC_HD3SS3220 is not set +# CONFIG_TYPEC_MUX_FSA4480 is not set +# CONFIG_TYPEC_MUX_PI3USB30532 is not set +# CONFIG_TYPEC_RT1719 is not set +# CONFIG_TYPEC_STUSB160X is not set +# CONFIG_TYPEC_TCPCI is not set +CONFIG_TYPEC_TCPM=y +# CONFIG_TYPEC_TPS6598X is not set +# CONFIG_TYPEC_WUSB3801 is not set +# CONFIG_UACCE is not set +# CONFIG_UCLAMP_TASK is not set +# CONFIG_UEVENT_HELPER is not set +CONFIG_UNINLINE_SPIN_UNLOCK=y +CONFIG_UNMAP_KERNEL_AT_EL0=y +CONFIG_USB=y +CONFIG_USB_COMMON=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_HOST=y +CONFIG_USB_DWC3_OF_SIMPLE=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_HCD_PLATFORM=y +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +CONFIG_USB_HID=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_HCD_PLATFORM=y +CONFIG_USB_PHY=y +CONFIG_USB_ROLE_SWITCH=y +CONFIG_USB_STORAGE=y +CONFIG_USB_SUPPORT=y +CONFIG_USB_ULPI=y +CONFIG_USB_ULPI_BUS=y +CONFIG_USB_ULPI_VIEWPORT=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_XHCI_PLATFORM=y +CONFIG_USERIO=y +CONFIG_VIDEOMODE_HELPERS=y +# CONFIG_VIRTIO_MENU is not set +CONFIG_VMAP_STACK=y +# CONFIG_VMWARE_VMCI is not set +CONFIG_VM_EVENT_COUNTERS=y +CONFIG_VT=y +CONFIG_VT_CONSOLE=y +CONFIG_VT_HW_CONSOLE_BINDING=y +# CONFIG_WATCHDOG is not set +CONFIG_XARRAY_MULTI=y +CONFIG_XPS=y +CONFIG_XXHASH=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_ARMTHUMB=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZLIB_DEFLATE=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZONE_DMA32=y diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-doornet1.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-doornet1.dts new file mode 100644 index 00000000000000..6f9cf81f89370a --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-doornet1.dts @@ -0,0 +1,495 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 EmbedFire <embedfire@embedfire.com> + */ + +/dts-v1/; + +#include <dt-bindings/input/input.h> +#include <dt-bindings/gpio/gpio.h> +#include "rk3328-dram-nanopi2-timing.dtsi" +#include "rk3328.dtsi" + +/ { + model = "EmbedFire DoorNet1"; + compatible = "embedfire,doornet1", "rockchip,rk3328"; + + aliases { + led-boot = &sys_led; + led-failsafe = &sys_led; + led-running = &sys_led; + led-upgrade = &sys_led; + // mmc1 = &sdmmc; + // mmc0 = &emmc; + }; + + chosen { + stdout-path = "serial2:1500000n8"; + }; + + gmac_clk: gmac-clock { + compatible = "fixed-clock"; + clock-frequency = <125000000>; + clock-output-names = "gmac_clkin"; + #clock-cells = <0>; + }; + + keys { + compatible = "gpio-keys"; + pinctrl-0 = <&reset_button_pin>; + pinctrl-names = "default"; + + reset { + label = "reset"; + gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; + linux,code = <KEY_RESTART>; + debounce-interval = <50>; + }; + }; + + vcc_rtl8153: vcc-rtl8153-regulator { + compatible = "regulator-fixed"; + gpio = <&gpio2 RK_PC6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&rtl8153_en_drv>; + regulator-always-on; + regulator-name = "vcc_rtl8153"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + enable-active-high; + }; + + dmc: dmc { + compatible = "rockchip,rk3328-dmc"; + devfreq-events = <&dfi>; + center-supply = <&vdd_log>; + clocks = <&cru SCLK_DDRCLK>; + clock-names = "dmc_clk"; + operating-points-v2 = <&dmc_opp_table>; + ddr_timing = <&ddr_timing>; + upthreshold = <40>; + downdifferential = <20>; + auto-min-freq = <786000>; + auto-freq-en = <1>; + #cooling-cells = <2>; + status = "okay"; + + ddr_power_model: ddr_power_model { + compatible = "ddr_power_model"; + dynamic-power-coefficient = <120>; + static-power-coefficient = <200>; + ts = <32000 4700 (-80) 2>; + thermal-zone = "soc-thermal"; + }; + }; + + dmc_opp_table: dmc-opp-table { + compatible = "operating-points-v2"; + + rockchip,leakage-voltage-sel = < + 1 10 0 + 11 254 1 + >; + nvmem-cells = <&logic_leakage>; + nvmem-cell-names = "ddr_leakage"; + + opp-786000000 { + opp-hz = /bits/ 64 <786000000>; + opp-microvolt = <1075000>; + opp-microvolt-L0 = <1075000>; + opp-microvolt-L1 = <1050000>; + }; + opp-798000000 { + opp-hz = /bits/ 64 <798000000>; + opp-microvolt = <1075000>; + opp-microvolt-L0 = <1075000>; + opp-microvolt-L1 = <1050000>; + }; + opp-840000000 { + opp-hz = /bits/ 64 <840000000>; + opp-microvolt = <1075000>; + opp-microvolt-L0 = <1075000>; + opp-microvolt-L1 = <1050000>; + }; + opp-924000000 { + opp-hz = /bits/ 64 <924000000>; + opp-microvolt = <1100000>; + opp-microvolt-L0 = <1100000>; + opp-microvolt-L1 = <1075000>; + }; + opp-1056000000 { + opp-hz = /bits/ 64 <1056000000>; + opp-microvolt = <1175000>; + opp-microvolt-L0 = <1175000>; + opp-microvolt-L1 = <1150000>; + }; + }; + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; + pinctrl-names = "default"; + + lan_led: led-0 { + gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; + label = "doornet1:green:lan"; + }; + + sys_led: led-1 { + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; + label = "doornet1:red:sys"; + }; + + wan_led: led-2 { + gpios = <&gpio2 RK_PC2 GPIO_ACTIVE_HIGH>; + label = "doornet1:green:wan"; + }; + + wifi_enable: wifi_enable { + gpios = <&gpio2 RK_PC5 GPIO_ACTIVE_HIGH>; + label = "wifi-enable"; + }; + }; + + vcc_io_sdio: sdmmcio-regulator { + compatible = "regulator-gpio"; + enable-active-high; + gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; + pinctrl-0 = <&sdio_vcc_pin>; + pinctrl-names = "default"; + regulator-name = "vcc_io_sdio"; + regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-settling-time-us = <5000>; + regulator-type = "voltage"; + startup-delay-us = <2000>; + states = <1800000 0x1 + 3300000 0x0>; + vin-supply = <&vcc_io_33>; + }; + + vcc_sd: sdmmc-regulator { + compatible = "regulator-fixed"; + gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; + pinctrl-0 = <&sdmmc0m1_pin>; + pinctrl-names = "default"; + regulator-name = "vcc_sd"; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_io_33>; + }; + + vdd_5v: vdd-5v { + compatible = "regulator-fixed"; + regulator-name = "vdd_5v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; +}; + +&cpu0 { + cpu-supply = <&vdd_arm>; +}; + +&cpu1 { + cpu-supply = <&vdd_arm>; +}; + +&cpu2 { + cpu-supply = <&vdd_arm>; +}; + +&cpu3 { + cpu-supply = <&vdd_arm>; +}; + +&dfi { + status = "okay"; +}; + +&gmac2io { + assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; + assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; + clock_in_out = "input"; + phy-mode = "rgmii"; + phy-supply = <&vcc_io_33>; + pinctrl-0 = <&rgmiim1_pins>; + pinctrl-names = "default"; + snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; + snps,reset-delays-us = <0 1000000 50000>; + snps,reset-active-low; + tx_delay = <0x18>; + rx_delay = <0x24>; + status = "okay"; +}; + +&i2c1 { + status = "okay"; + + rk805: pmic@18 { + compatible = "rockchip,rk805"; + reg = <0x18>; + interrupt-parent = <&gpio1>; + interrupts = <24 IRQ_TYPE_LEVEL_LOW>; + #clock-cells = <1>; + clock-output-names = "xin32k", "rk805-clkout2"; + gpio-controller; + #gpio-cells = <2>; + pinctrl-0 = <&pmic_int_l>; + pinctrl-names = "default"; + rockchip,system-power-controller; + wakeup-source; + + vcc1-supply = <&vdd_5v>; + vcc2-supply = <&vdd_5v>; + vcc3-supply = <&vdd_5v>; + vcc4-supply = <&vdd_5v>; + vcc5-supply = <&vcc_io_33>; + vcc6-supply = <&vdd_5v>; + + regulators { + vdd_log: DCDC_REG1 { + regulator-name = "vdd_log"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <1075000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1450000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1000000>; + }; + }; + + vdd_arm: DCDC_REG2 { + regulator-name = "vdd_arm"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <1225000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1450000>; + regulator-ramp-delay = <12500>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <950000>; + }; + }; + + vcc_ddr: DCDC_REG3 { + regulator-name = "vcc_ddr"; + regulator-always-on; + regulator-boot-on; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcc_io_33: DCDC_REG4 { + regulator-name = "vcc_io_33"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3300000>; + }; + }; + + vcc_18: LDO_REG1 { + regulator-name = "vcc_18"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vcc18_emmc: LDO_REG2 { + regulator-name = "vcc18_emmc"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vdd_10: LDO_REG3 { + regulator-name = "vdd_10"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1000000>; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1000000>; + }; + }; + }; + }; + usb { + rtl8153_en_drv: rtl8153-en-drv { + rockchip,pins = <2 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&io_domains { + pmuio-supply = <&vcc_io_33>; + vccio1-supply = <&vcc_io_33>; + vccio2-supply = <&vcc18_emmc>; + vccio3-supply = <&vcc_io_sdio>; + vccio4-supply = <&vcc_18>; + vccio5-supply = <&vcc_io_33>; + vccio6-supply = <&vcc_io_33>; + status = "okay"; +}; + +&pinctrl { + button { + reset_button_pin: reset-button-pin { + rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + ethernet-phy { + eth_phy_reset_pin: eth-phy-reset-pin { + rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + leds { + lan_led_pin: lan-led-pin { + rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + sys_led_pin: sys-led-pin { + rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wan_led_pin: wan-led-pin { + rockchip,pins = <2 RK_PC2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wifi_pin: wifi_pin{ + rockchip,pins = <2 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + pmic { + pmic_int_l: pmic-int-l { + rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + sd { + sdio_vcc_pin: sdio-vcc-pin { + rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; +}; + +&pwm2 { + status = "okay"; +}; + +&sdmmc { + bus-width = <4>; + cap-sd-highspeed; + disable-wp; + pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; + pinctrl-names = "default"; + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc_sd>; + vqmmc-supply = <&vcc_io_sdio>; + status = "okay"; +}; + +&emmc { + bus-width = <8>; + cap-mmc-highspeed; + max-frequency = <150000000>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_clk &emmc_cmd &emmc_bus8>; + vmmc-supply = <&vcc_io_33>; + vqmmc-supply = <&vcc18_emmc>; + status = "okay"; +}; + +&tsadc { + rockchip,hw-tshut-mode = <0>; + rockchip,hw-tshut-polarity = <0>; + status = "okay"; +}; + +&u2phy { + status = "okay"; +}; + +&u2phy_host { + status = "okay"; +}; + +&u2phy_otg { + status = "okay"; +}; + +&uart2 { + status = "okay"; +}; + +&usb20_otg { + status = "okay"; + dr_mode = "host"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usbdrd3 { + status = "okay"; +}; + +&usbdrd3 { + dr_mode = "host"; + status = "okay"; + #address-cells = <1>; + #size-cells = <0>; + + /* Second port is for USB 3.0 */ + rtl8153: device@2 { + compatible = "usbbda,8153"; + reg = <2>; + + realtek,led-data = <0x87>; + }; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts new file mode 100644 index 00000000000000..adf91a0306cc45 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2c.dts @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2021 FriendlyElec Computer Tech. Co., Ltd. + * (http://www.friendlyarm.com) + * + * Copyright (c) 2021 Tianling Shen <cnsztl@immortalwrt.org> + */ + +/dts-v1/; + +#include "rk3328-nanopi-r2s.dts" + +/ { + model = "FriendlyElec NanoPi R2C"; + compatible = "friendlyarm,nanopi-r2c", "rockchip,rk3328"; +}; + +&gmac2io { + phy-handle = <&yt8521s>; + + mdio { + /delete-node/ ethernet-phy@1; + + yt8521s: ethernet-phy@3 { + compatible = "ethernet-phy-id0000.011a", + "ethernet-phy-ieee802.3-c22"; + reg = <3>; + pinctrl-0 = <ð_phy_reset_pin>; + pinctrl-names = "default"; + reset-assert-us = <10000>; + reset-deassert-us = <50000>; + reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&lan_led { + label = "nanopi-r2c:green:lan"; +}; + +&sys_led { + label = "nanopi-r2c:red:sys"; +}; + +&wan_led { + label = "nanopi-r2c:green:wan"; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts new file mode 100644 index 00000000000000..ee37573d6a8b58 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus-lts.dts @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +#include "rk3328-orangepi-r1-plus.dts" + +/ { + model = "Xunlong Orange Pi R1 Plus LTS"; + compatible = "xunlong,orangepi-r1-plus-lts", "rockchip,rk3328"; +}; + +/delete-node/ &rtl8211e; +&gmac2io { + phy-handle = <ðphy3>; + snps,reset-delays-us = <0 15000 50000>; + tx_delay = <0x19>; + rx_delay = <0x05>; + status = "okay"; + + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + ethphy3: ethernet-phy@0 { + reg = <0x0>; + keep-clkout-on; + reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; + }; + }; +}; + +&sdmmc { + bus-width = <4>; + cap-sd-highspeed; + disable-wp; + pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; + pinctrl-names = "default"; + sd-uhs-sdr12; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc_sd>; + vqmmc-supply = <&vcc_io_sdio>; + status = "okay"; +}; + +&dmc_opp_table { + opp-1056000000 { + status = "disabled"; + }; + opp-924000000 { + status = "disabled"; + }; + opp-840000000 { + status = "disabled"; + }; + opp-798000000 { + status = "disabled"; + }; +}; + +&sys_led { + label = "orangepi-r1-plus-lts:red:sys"; +}; + +&wan_led { + label = "orangepi-r1-plus-lts:green:wan"; +}; + +&lan_led { + label = "orangepi-r1-plus-lts:green:lan"; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts new file mode 100644 index 00000000000000..ed585daf438d64 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3328-orangepi-r1-plus.dts @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +#include "rk3328-nanopi-r2s.dts" + +/ { + model = "Xunlong Orange Pi R1 Plus"; + compatible = "xunlong,orangepi-r1-plus", "rockchip,rk3328"; +}; + +&lan_led { + label = "orangepi-r1-plus:green:lan"; +}; + +&spi0 { + max-freq = <48000000>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <10000000>; + }; +}; + +&sys_led { + gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; + label = "orangepi-r1-plus:red:sys"; +}; + +&sys_led_pin { + rockchip,pins = <3 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; +}; + +&uart1 { + status = "okay"; +}; + +&wan_led { + label = "orangepi-r1-plus:green:wan"; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dts new file mode 100644 index 00000000000000..7b9d5efafaac94 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dts @@ -0,0 +1,113 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; +#include "rk3399-doornet2.dtsi" + +/ { + model = "EmbedFire DoorNet2 1GB"; + compatible = "embedfire,doornet2", "rockchip,rk3399"; + + aliases { + led-boot = &sys_led; + led-failsafe = &sys_led; + led-running = &sys_led; + led-upgrade = &sys_led; + }; + + /delete-node/ display-subsystem; + + gpio-leds { + pinctrl-0 = <&lan_led_pin>, <&sys_led_pin>, <&wan_led_pin>; + + /delete-node/ status; + + lan_led: led-lan { + gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>; + label = "green:lan"; + }; + + sys_led: led-sys { + gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; + label = "red:sys"; + default-state = "on"; + }; + + wan_led: led-wan { + gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>; + label = "green:wan"; + }; + }; + + gpio-keys { + pinctrl-0 = <&reset_button_pin>; + + /delete-node/ power; + + reset { + debounce-interval = <50>; + gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>; + label = "reset"; + linux,code = <KEY_RESTART>; + }; + }; + + vdd_5v: vdd-5v { + compatible = "regulator-fixed"; + regulator-name = "vdd_5v"; + regulator-always-on; + regulator-boot-on; + }; +}; + +&pcie0 { + max-link-speed = <1>; + num-lanes = <1>; + vpcie3v3-supply = <&vcc3v3_sys>; + + pcie@0 { + reg = <0x00000000 0 0 0 0>; + #address-cells = <3>; + #size-cells = <2>; + + pcie-eth@0,0 { + compatible = "realtek,r8168"; + reg = <0x000000 0 0 0 0>; + + realtek,led-data = <0x870>; + }; + }; +}; + +&pinctrl { + gpio-leds { + /delete-node/ leds-gpio; + + lan_led_pin: lan-led-pin { + rockchip,pins = <1 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + sys_led_pin: sys-led-pin { + rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wan_led_pin: wan-led-pin { + rockchip,pins = <1 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + rockchip-key { + /delete-node/ power-key; + + reset_button_pin: reset-button-pin { + rockchip,pins = <1 RK_PC6 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; +}; + +&u2phy0_host { + phy-supply = <&vdd_5v>; +}; + +&vcc3v3_sys { + vin-supply = <&vcc5v0_sys>; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi new file mode 100644 index 00000000000000..4f6bddafe68171 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi @@ -0,0 +1,636 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; +#include <dt-bindings/input/linux-event-codes.h> +#include "rk3399.dtsi" + +/ { + chosen { + stdout-path = "serial2:1500000n8"; + }; + + clkin_gmac: external-gmac-clock { + compatible = "fixed-clock"; + clock-frequency = <125000000>; + clock-output-names = "clkin_gmac"; + #clock-cells = <0>; + }; + + vcc3v3_sys: vcc3v3-sys { + compatible = "regulator-fixed"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc3v3_sys"; + }; + + vcc5v0_sys: vcc5v0-sys { + compatible = "regulator-fixed"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-name = "vcc5v0_sys"; + vin-supply = <&vdd_5v>; + }; + + /* switched by pmic_sleep */ + vcc1v8_s3: vcca1v8_s3: vcc1v8-s3 { + compatible = "regulator-fixed"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc1v8_s3"; + vin-supply = <&vcc_1v8>; + }; + + vcc3v0_sd: vcc3v0-sd { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_pwr_h>; + regulator-always-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-name = "vcc3v0_sd"; + vin-supply = <&vcc3v3_sys>; + }; + + vbus_typec: vbus-typec { + compatible = "regulator-fixed"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + regulator-name = "vbus_typec"; + }; + + gpio-keys { + compatible = "gpio-keys"; + autorepeat; + pinctrl-names = "default"; + pinctrl-0 = <&power_key>; + + power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; + linux,code = <KEY_POWER>; + wakeup-source; + }; + }; + + leds: gpio-leds { + compatible = "gpio-leds"; + pinctrl-names = "default"; + pinctrl-0 = <&leds_gpio>; + + status { + gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>; + label = "status_led"; + linux,default-trigger = "heartbeat"; + }; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + clocks = <&rk808 1>; + clock-names = "ext_clock"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_reg_on_h>; + reset-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>; + }; +}; + +&cpu_b0 { + cpu-supply = <&vdd_cpu_b>; +}; + +&cpu_b1 { + cpu-supply = <&vdd_cpu_b>; +}; + +&cpu_l0 { + cpu-supply = <&vdd_cpu_l>; +}; + +&cpu_l1 { + cpu-supply = <&vdd_cpu_l>; +}; + +&cpu_l2 { + cpu-supply = <&vdd_cpu_l>; +}; + +&cpu_l3 { + cpu-supply = <&vdd_cpu_l>; +}; + +&emmc_phy { + status = "okay"; +}; + +&gmac { + assigned-clocks = <&cru SCLK_RMII_SRC>; + assigned-clock-parents = <&clkin_gmac>; + clock_in_out = "input"; + phy-supply = <&vcc3v3_s3>; + phy-mode = "rgmii"; + pinctrl-names = "default"; + pinctrl-0 = <&rgmii_pins>; + snps,reset-gpio = <&gpio3 RK_PB7 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + snps,reset-delays-us = <0 100000 50000>; + tx_delay = <0x28>; + rx_delay = <0x11>; + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_gpu>; + status = "okay"; +}; + +&hdmi { + ddc-i2c-bus = <&i2c7>; + pinctrl-names = "default"; + pinctrl-0 = <&hdmi_cec>; + status = "okay"; +}; + +&i2c0 { + clock-frequency = <400000>; + i2c-scl-rising-time-ns = <160>; + i2c-scl-falling-time-ns = <30>; + status = "okay"; + + vdd_cpu_b: regulator@40 { + compatible = "silergy,syr827"; + reg = <0x40>; + fcs,suspend-voltage-selector = <1>; + pinctrl-names = "default"; + pinctrl-0 = <&cpu_b_sleep>; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1500000>; + regulator-name = "vdd_cpu_b"; + regulator-ramp-delay = <1000>; + vin-supply = <&vcc3v3_sys>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_gpu: regulator@41 { + compatible = "silergy,syr828"; + reg = <0x41>; + fcs,suspend-voltage-selector = <1>; + pinctrl-names = "default"; + pinctrl-0 = <&gpu_sleep>; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1500000>; + regulator-name = "vdd_gpu"; + regulator-ramp-delay = <1000>; + vin-supply = <&vcc3v3_sys>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + rk808: pmic@1b { + compatible = "rockchip,rk808"; + reg = <0x1b>; + clock-output-names = "xin32k", "rtc_clko_wifi"; + #clock-cells = <1>; + interrupt-parent = <&gpio1>; + interrupts = <21 IRQ_TYPE_LEVEL_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&pmic_int_l>; + rockchip,system-power-controller; + wakeup-source; + + vcc1-supply = <&vcc3v3_sys>; + vcc2-supply = <&vcc3v3_sys>; + vcc3-supply = <&vcc3v3_sys>; + vcc4-supply = <&vcc3v3_sys>; + vcc6-supply = <&vcc3v3_sys>; + vcc7-supply = <&vcc3v3_sys>; + vcc8-supply = <&vcc3v3_sys>; + vcc9-supply = <&vcc3v3_sys>; + vcc10-supply = <&vcc3v3_sys>; + vcc11-supply = <&vcc3v3_sys>; + vcc12-supply = <&vcc3v3_sys>; + vddio-supply = <&vcc_3v0>; + + regulators { + vdd_center: DCDC_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <1350000>; + regulator-name = "vdd_center"; + regulator-ramp-delay = <6001>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vdd_cpu_l: DCDC_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <750000>; + regulator-max-microvolt = <1350000>; + regulator-name = "vdd_cpu_l"; + regulator-ramp-delay = <6001>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_ddr: DCDC_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-name = "vcc_ddr"; + + regulator-state-mem { + regulator-on-in-suspend; + }; + }; + + vcc_1v8: DCDC_REG4 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc_1v8"; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vcc1v8_cam: LDO_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc1v8_cam"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc3v0_touch: LDO_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-name = "vcc3v0_touch"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc1v8_pmupll: LDO_REG3 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcc1v8_pmupll"; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1800000>; + }; + }; + + vcc_sdio: LDO_REG4 { + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <3000000>; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc_sdio"; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3000000>; + }; + }; + + vcca3v0_codec: LDO_REG5 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-name = "vcca3v0_codec"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_1v5: LDO_REG6 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1500000>; + regulator-max-microvolt = <1500000>; + regulator-name = "vcc_1v5"; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <1500000>; + }; + }; + + vcca1v8_codec: LDO_REG7 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-name = "vcca1v8_codec"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc_3v0: LDO_REG8 { + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-name = "vcc_3v0"; + + regulator-state-mem { + regulator-on-in-suspend; + regulator-suspend-microvolt = <3000000>; + }; + }; + + vcc3v3_s3: SWITCH_REG1 { + regulator-always-on; + regulator-boot-on; + regulator-name = "vcc3v3_s3"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + + vcc3v3_s0: SWITCH_REG2 { + regulator-always-on; + regulator-boot-on; + regulator-name = "vcc3v3_s0"; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; + }; + }; +}; + +&i2c1 { + clock-frequency = <200000>; + i2c-scl-rising-time-ns = <150>; + i2c-scl-falling-time-ns = <30>; + status = "okay"; +}; + +&i2c2 { + status = "okay"; +}; + +&i2c7 { + status = "okay"; +}; + +&io_domains { + bt656-supply = <&vcc_1v8>; + audio-supply = <&vcca1v8_codec>; + sdmmc-supply = <&vcc_sdio>; + gpio1830-supply = <&vcc_3v0>; + status = "okay"; +}; + +&pcie_phy { + assigned-clock-parents = <&cru SCLK_PCIEPHY_REF100M>; + assigned-clock-rates = <100000000>; + assigned-clocks = <&cru SCLK_PCIEPHY_REF>; + status = "okay"; +}; + +&pcie0 { + ep-gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_HIGH>; + max-link-speed = <2>; + num-lanes = <4>; + status = "okay"; +}; + +&pinctrl { + fusb30x { + fusb0_int: fusb0-int { + rockchip,pins = <1 RK_PA2 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + gpio-leds { + leds_gpio: leds-gpio { + rockchip,pins = <0 RK_PB5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + ethernet-phy { + eth_phy_reset_pin: eth-phy-reset-pin { + rockchip,pins = <3 RK_PB7 RK_FUNC_GPIO &pcfg_pull_down>; + }; + }; + + pmic { + cpu_b_sleep: cpu-b-sleep { + rockchip,pins = <1 RK_PC1 RK_FUNC_GPIO &pcfg_pull_down>; + }; + + gpu_sleep: gpu-sleep { + rockchip,pins = <1 RK_PB6 RK_FUNC_GPIO &pcfg_pull_down>; + }; + + pmic_int_l: pmic-int-l { + rockchip,pins = <1 RK_PC5 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + rockchip-key { + power_key: power-key { + rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + + sdio { + bt_host_wake_l: bt-host-wake-l { + rockchip,pins = <0 RK_PA4 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + bt_reg_on_h: bt-reg-on-h { + /* external pullup to VCC1V8_PMUPLL */ + rockchip,pins = <0 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + bt_wake_l: bt-wake-l { + rockchip,pins = <2 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + wifi_reg_on_h: wifi-reg_on-h { + rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + sdmmc { + sdmmc0_det_l: sdmmc0-det-l { + rockchip,pins = <0 RK_PA7 RK_FUNC_GPIO &pcfg_pull_up>; + }; + + sdmmc0_pwr_h: sdmmc0-pwr-h { + rockchip,pins = <0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pmu_io_domains { + pmu1830-supply = <&vcc_3v0>; + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; + +&saradc { + vref-supply = <&vcca1v8_s3>; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + mmc-ddr-1_8v; + mmc-hs200-1_8v; + non-removable; + status = "okay"; +}; + +&sdmmc { + bus-width = <4>; + cap-sd-highspeed; + cap-mmc-highspeed; + cd-gpios = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc_bus4 &sdmmc_clk &sdmmc_cmd &sdmmc0_det_l>; + sd-uhs-sdr104; + vmmc-supply = <&vcc3v0_sd>; + vqmmc-supply = <&vcc_sdio>; + status = "okay"; +}; + +&tcphy0 { + status = "okay"; +}; + +&tcphy1 { + status = "okay"; +}; + +&tsadc { + /* tshut mode 0:CRU 1:GPIO */ + rockchip,hw-tshut-mode = <1>; + /* tshut polarity 0:LOW 1:HIGH */ + rockchip,hw-tshut-polarity = <1>; + status = "okay"; +}; + +&u2phy0 { + status = "okay"; +}; + +&u2phy0_host { + status = "okay"; +}; + +&u2phy0_otg { + status = "okay"; +}; + +&u2phy1 { + status = "okay"; +}; + +&u2phy1_otg { + status = "okay"; +}; + +&uart2 { + status = "okay"; +}; + +&usbdrd3_0 { + status = "okay"; +}; + +&usbdrd3_1 { + status = "okay"; +}; + +&usbdrd_dwc3_0 { + dr_mode = "host"; + status = "okay"; +}; + +&usbdrd_dwc3_1 { + dr_mode = "host"; + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usb_host1_ehci { + status = "okay"; +}; + +&usb_host1_ohci { + status = "okay"; +}; + +&vopb { + status = "okay"; +}; + +&vopb_mmu { + status = "okay"; +}; + +&vopl { + status = "okay"; +}; + +&vopl_mmu { + status = "okay"; +}; + diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi new file mode 100644 index 00000000000000..0c700e32ddbc71 --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-opp.dtsi @@ -0,0 +1,152 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2016-2017 Fuzhou Rockchip Electronics Co., Ltd + * + * Copyright (c) 2020 Tianling Shen <cnsztl@gmail.com> + * Copyright (c) 2020 gzelvis <gzelvis@gmail.com> + */ + +/ { + cluster0_opp: opp-table-0 { + compatible = "operating-points-v2"; + opp-shared; + + opp00 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <800000>; + clock-latency-ns = <40000>; + }; + opp01 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <800000>; + }; + opp02 { + opp-hz = /bits/ 64 <816000000>; + opp-microvolt = <850000>; + }; + opp03 { + opp-hz = /bits/ 64 <1008000000>; + opp-microvolt = <925000>; + }; + opp04 { + opp-hz = /bits/ 64 <1200000000>; + opp-microvolt = <1000000>; + }; + opp05 { + opp-hz = /bits/ 64 <1416000000>; + opp-microvolt = <1125000>; + }; + opp06 { + opp-hz = /bits/ 64 <1608000000>; + opp-microvolt = <1225000>; + }; + opp07 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <1275000>; + }; + }; + + cluster1_opp: opp-table-1 { + compatible = "operating-points-v2"; + opp-shared; + + opp00 { + opp-hz = /bits/ 64 <408000000>; + opp-microvolt = <800000>; + clock-latency-ns = <40000>; + }; + opp01 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <800000>; + }; + opp02 { + opp-hz = /bits/ 64 <816000000>; + opp-microvolt = <825000>; + }; + opp03 { + opp-hz = /bits/ 64 <1008000000>; + opp-microvolt = <875000>; + }; + opp04 { + opp-hz = /bits/ 64 <1200000000>; + opp-microvolt = <950000>; + }; + opp05 { + opp-hz = /bits/ 64 <1416000000>; + opp-microvolt = <1025000>; + }; + opp06 { + opp-hz = /bits/ 64 <1608000000>; + opp-microvolt = <1100000>; + }; + opp07 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <1200000>; + }; + opp08 { + opp-hz = /bits/ 64 <2016000000>; + opp-microvolt = <1250000>; + }; + opp09 { + opp-hz = /bits/ 64 <2208000000>; + opp-microvolt = <1325000>; + }; + }; + + gpu_opp_table: opp-table-2 { + compatible = "operating-points-v2"; + + opp00 { + opp-hz = /bits/ 64 <200000000>; + opp-microvolt = <800000>; + }; + opp01 { + opp-hz = /bits/ 64 <297000000>; + opp-microvolt = <800000>; + }; + opp02 { + opp-hz = /bits/ 64 <400000000>; + opp-microvolt = <825000>; + }; + opp03 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <875000>; + }; + opp04 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <925000>; + }; + opp05 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <1100000>; + }; + }; +}; + +&cpu_l0 { + operating-points-v2 = <&cluster0_opp>; +}; + +&cpu_l1 { + operating-points-v2 = <&cluster0_opp>; +}; + +&cpu_l2 { + operating-points-v2 = <&cluster0_opp>; +}; + +&cpu_l3 { + operating-points-v2 = <&cluster0_opp>; +}; + +&cpu_b0 { + operating-points-v2 = <&cluster1_opp>; +}; + +&cpu_b1 { + operating-points-v2 = <&cluster1_opp>; +}; + +&gpu { + operating-points-v2 = <&gpu_opp_table>; +}; diff --git a/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts new file mode 100644 index 00000000000000..f6e7710a01cb4f --- /dev/null +++ b/target/linux/rockchip/files-5.19/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dts @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2019 Akash Gajjar <Akash_Gajjar@mentor.com> + * Copyright (c) 2019 Pragnesh Patel <Pragnesh_Patel@mentor.com> + */ + +/* TODO + * Delete this file and migrate RockPi 4 to RockPi 4A after + * removing Kernel 5.4. + */ + + +/dts-v1/; +#include "rk3399-rock-pi-4.dtsi" + +/ { + model = "Radxa ROCK Pi 4"; + compatible = "radxa,rockpi4", "rockchip,rk3399"; +}; diff --git a/target/linux/rockchip/patches-5.19/0000-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch b/target/linux/rockchip/patches-5.19/0000-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch new file mode 100644 index 00000000000000..792028b29290f5 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0000-arm64-dts-rockchip-add-EEPROM-node-for-NanoPi-R4S.patch @@ -0,0 +1,31 @@ +From af20b3384e8723077cc6484160b0cf4e9be321de Mon Sep 17 00:00:00 2001 +From: Tianling Shen <cnsztl@gmail.com> +Date: Mon, 7 Jun 2021 15:45:37 +0800 +Subject: [PATCH] arm64: dts: rockchip: add EEPROM node for NanoPi R4S + +NanoPi R4S has a EEPROM attached to the 2nd I2C bus (U92), which +stores the MAC address. + +Signed-off-by: Tianling Shen <cnsztl@gmail.com> +--- + arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts +@@ -68,6 +68,15 @@ + status = "disabled"; + }; + ++&i2c2 { ++ eeprom@51 { ++ compatible = "microchip,24c02", "atmel,24c02"; ++ reg = <0x51>; ++ pagesize = <16>; ++ read-only; /* This holds our MAC */ ++ }; ++}; ++ + &i2c4 { + status = "disabled"; + }; diff --git a/target/linux/rockchip/patches-5.19/0001-arm64-dts-rockchip-add-Quartz64-A-fan-pinctrl.patch b/target/linux/rockchip/patches-5.19/0001-arm64-dts-rockchip-add-Quartz64-A-fan-pinctrl.patch new file mode 100644 index 00000000000000..e430e6972eb35f --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0001-arm64-dts-rockchip-add-Quartz64-A-fan-pinctrl.patch @@ -0,0 +1,39 @@ +From 2c26cd88f13382b6965bbf5a8fc1c56384c6c3f6 Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Wed, 11 May 2022 11:01:15 -0400 +Subject: [PATCH 01/51] arm64: dts: rockchip: add Quartz64-A fan pinctrl + +The Quartz64 Model A fan is bound to a single gpio. Prevent pinctrl +issues in the future by binding the pinctrl assignment for the gpio. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220511150117.113070-5-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -32,6 +32,8 @@ + gpios = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>; + gpio-fan,speed-map = <0 0 + 4500 1>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&fan_en_h>; + #cooling-cells = <2>; + }; + +@@ -524,6 +526,12 @@ + }; + }; + ++ fan { ++ fan_en_h: fan-en-h { ++ rockchip,pins = <0 RK_PD5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + leds { + work_led_enable_h: work-led-enable-h { + rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>; diff --git a/target/linux/rockchip/patches-5.19/0002-arm64-dts-rockchip-enable-sdr-104-for-sdmmc-on-Quart.patch b/target/linux/rockchip/patches-5.19/0002-arm64-dts-rockchip-enable-sdr-104-for-sdmmc-on-Quart.patch new file mode 100644 index 00000000000000..87e3c6866a551c --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0002-arm64-dts-rockchip-enable-sdr-104-for-sdmmc-on-Quart.patch @@ -0,0 +1,32 @@ +From eda045fa2ca7b1567457048a389cda854a3a01e5 Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Wed, 11 May 2022 11:01:16 -0400 +Subject: [PATCH 02/51] arm64: dts: rockchip: enable sdr-104 for sdmmc on + Quartz A + +Now that we have working io-domain support, we can enable higher date +rates on the sdmmc card. + +Before: +Timing buffered disk reads: 68 MB in 3.08 seconds = 22.07 MB/sec + +After: +Timing buffered disk reads: 188 MB in 3.02 seconds = 62.29 MB/sec + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220511150117.113070-6-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts | 1 + + 1 file changed, 1 insertion(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -596,6 +596,7 @@ + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; ++ sd-uhs-sdr104; + vmmc-supply = <&vcc3v3_sd>; + vqmmc-supply = <&vccio_sd>; + status = "okay"; diff --git a/target/linux/rockchip/patches-5.19/0003-arm64-dts-rockchip-enable-sfc-controller-on-Quartz64.patch b/target/linux/rockchip/patches-5.19/0003-arm64-dts-rockchip-enable-sfc-controller-on-Quartz64.patch new file mode 100644 index 00000000000000..48ee021876e310 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0003-arm64-dts-rockchip-enable-sfc-controller-on-Quartz64.patch @@ -0,0 +1,41 @@ +From 591f44f27342906ccd58eb7e63ec3ef5810bd7eb Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Wed, 11 May 2022 11:01:17 -0400 +Subject: [PATCH 03/51] arm64: dts: rockchip: enable sfc controller on Quartz64 + Model A + +Add the sfc controller binding for the Quartz64 Model A. This is not +populated by default, so leave it disabled. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220511150117.113070-7-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3566-quartz64-a.dts | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -617,6 +617,22 @@ + status = "okay"; + }; + ++&sfc { ++ pinctrl-0 = <&fspi_pins>; ++ pinctrl-names = "default"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "disabled"; ++ ++ flash@0 { ++ compatible = "jedec,spi-nor"; ++ reg = <0>; ++ spi-max-frequency = <24000000>; ++ spi-rx-bus-width = <4>; ++ spi-tx-bus-width = <1>; ++ }; ++}; ++ + /* spdif is exposed on con40 pin 18 */ + &spdif { + status = "okay"; diff --git a/target/linux/rockchip/patches-5.19/0004-arm64-dts-rockchip-Add-rk3568-PCIe2x1-controller.patch b/target/linux/rockchip/patches-5.19/0004-arm64-dts-rockchip-Add-rk3568-PCIe2x1-controller.patch new file mode 100644 index 00000000000000..cea47965f73d32 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0004-arm64-dts-rockchip-Add-rk3568-PCIe2x1-controller.patch @@ -0,0 +1,74 @@ +From 83729931332a2f15b0452f7dc8ea7a2e1b431842 Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Fri, 29 Apr 2022 08:38:30 -0400 +Subject: [PATCH 04/51] arm64: dts: rockchip: Add rk3568 PCIe2x1 controller + +The PCIe2x1 controller is common between the rk3568 and rk3566. It is a +single lane PCIe2 compliant controller. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220429123832.2376381-5-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk356x.dtsi | 50 ++++++++++++++++++++++++ + 1 file changed, 50 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi +@@ -752,6 +752,56 @@ + reg = <0x0 0xfe1a8100 0x0 0x20>; + }; + ++ pcie2x1: pcie@fe260000 { ++ compatible = "rockchip,rk3568-pcie"; ++ reg = <0x3 0xc0000000 0x0 0x00400000>, ++ <0x0 0xfe260000 0x0 0x00010000>, ++ <0x3 0x3f000000 0x0 0x01000000>; ++ reg-names = "dbi", "apb", "config"; ++ interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-names = "sys", "pmc", "msi", "legacy", "err"; ++ bus-range = <0x0 0xf>; ++ clocks = <&cru ACLK_PCIE20_MST>, <&cru ACLK_PCIE20_SLV>, ++ <&cru ACLK_PCIE20_DBI>, <&cru PCLK_PCIE20>, ++ <&cru CLK_PCIE20_AUX_NDFT>; ++ clock-names = "aclk_mst", "aclk_slv", ++ "aclk_dbi", "pclk", "aux"; ++ device_type = "pci"; ++ interrupt-map-mask = <0 0 0 7>; ++ interrupt-map = <0 0 0 1 &pcie_intc 0>, ++ <0 0 0 2 &pcie_intc 1>, ++ <0 0 0 3 &pcie_intc 2>, ++ <0 0 0 4 &pcie_intc 3>; ++ linux,pci-domain = <0>; ++ num-ib-windows = <6>; ++ num-ob-windows = <2>; ++ max-link-speed = <2>; ++ msi-map = <0x0 &gic 0x0 0x1000>; ++ num-lanes = <1>; ++ phys = <&combphy2 PHY_TYPE_PCIE>; ++ phy-names = "pcie-phy"; ++ power-domains = <&power RK3568_PD_PIPE>; ++ ranges = <0x01000000 0x0 0x3ef00000 0x3 0x3ef00000 0x0 0x00100000 ++ 0x02000000 0x0 0x00000000 0x3 0x00000000 0x0 0x3ef00000>; ++ resets = <&cru SRST_PCIE20_POWERUP>; ++ reset-names = "pipe"; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ status = "disabled"; ++ ++ pcie_intc: legacy-interrupt-controller { ++ #address-cells = <0>; ++ #interrupt-cells = <1>; ++ interrupt-controller; ++ interrupt-parent = <&gic>; ++ interrupts = <GIC_SPI 72 IRQ_TYPE_EDGE_RISING>; ++ }; ++ }; ++ + sdmmc0: mmc@fe2b0000 { + compatible = "rockchip,rk3568-dw-mshc", "rockchip,rk3288-dw-mshc"; + reg = <0x0 0xfe2b0000 0x0 0x4000>; diff --git a/target/linux/rockchip/patches-5.19/0005-arm64-dts-rockchip-Enable-PCIe-controller-on-quartz6.patch b/target/linux/rockchip/patches-5.19/0005-arm64-dts-rockchip-Enable-PCIe-controller-on-quartz6.patch new file mode 100644 index 00000000000000..0980512db97a2d --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0005-arm64-dts-rockchip-Enable-PCIe-controller-on-quartz6.patch @@ -0,0 +1,80 @@ +From 5b1b78762d3fb4cf20aec4b22fbfab33960a6fdc Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Fri, 29 Apr 2022 08:38:31 -0400 +Subject: [PATCH 05/51] arm64: dts: rockchip: Enable PCIe controller on + quartz64-a + +Add the nodes to enable the PCIe controller on the Quartz64 Model A +board. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220429123832.2376381-6-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3566-quartz64-a.dts | 34 +++++++++++++++++++ + 1 file changed, 34 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -127,6 +127,18 @@ + vin-supply = <&vcc12v_dcin>; + }; + ++ vcc3v3_pcie_p: vcc3v3-pcie-p-regulator { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie_enable_h>; ++ regulator-name = "vcc3v3_pcie_p"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ vin-supply = <&vcc_3v3>; ++ }; ++ + vcc5v0_usb: vcc5v0_usb { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_usb"; +@@ -203,6 +215,10 @@ + status = "okay"; + }; + ++&combphy2 { ++ status = "okay"; ++}; ++ + &cpu0 { + cpu-supply = <&vdd_cpu>; + }; +@@ -511,6 +527,14 @@ + }; + }; + ++&pcie2x1 { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pcie_reset_h>; ++ reset-gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&vcc3v3_pcie_p>; ++ status = "okay"; ++}; ++ + &pinctrl { + bt { + bt_enable_h: bt-enable-h { +@@ -542,6 +566,16 @@ + }; + }; + ++ pcie { ++ pcie_enable_h: pcie-enable-h { ++ rockchip,pins = <0 RK_PC6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ pcie_reset_h: pcie-reset-h { ++ rockchip,pins = <1 RK_PB2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + pmic { + pmic_int_l: pmic-int-l { + rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; diff --git a/target/linux/rockchip/patches-5.19/0006-arm64-dts-rockchip-add-pine64-touch-panel-display-to.patch b/target/linux/rockchip/patches-5.19/0006-arm64-dts-rockchip-add-pine64-touch-panel-display-to.patch new file mode 100644 index 00000000000000..e714d89bb46421 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0006-arm64-dts-rockchip-add-pine64-touch-panel-display-to.patch @@ -0,0 +1,131 @@ +From 175ce006fe4ebf077322e5818127acfade41296f Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Wed, 11 May 2022 07:35:16 -0400 +Subject: [PATCH 06/51] arm64: dts: rockchip: add pine64 touch panel display to + rockpro64 + +The Pine64 touch panel is a panel consisting of the Feiyang fy07024di26a30d +panel with a Goodix gt911 touch screen. Add the device tree nodes to the +rockpro64 to permit attaching this display to the device. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220511113517.4172962-4-pgwipeout@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3399-rockpro64.dtsi | 70 +++++++++++++++++-- + 1 file changed, 66 insertions(+), 4 deletions(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi +@@ -20,6 +20,15 @@ + stdout-path = "serial2:1500000n8"; + }; + ++ /* enable for panel backlight support */ ++ backlight: backlight { ++ compatible = "pwm-backlight"; ++ brightness-levels = <0 4 8 16 32 64 128 255>; ++ default-brightness-level = <5>; ++ pwms = <&pwm0 0 1000000 0>; ++ status = "disabled"; ++ }; ++ + clkin_gmac: external-gmac-clock { + compatible = "fixed-clock"; + clock-frequency = <125000000>; +@@ -107,6 +116,14 @@ + }; + }; + ++ avdd: avdd-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "avdd"; ++ regulator-min-microvolt = <11000000>; ++ regulator-max-microvolt = <11000000>; ++ vin-supply = <&vcc3v3_s0>; ++ }; ++ + vcc12v_dcin: vcc12v-dcin { + compatible = "regulator-fixed"; + regulator-name = "vcc12v_dcin"; +@@ -400,8 +417,6 @@ + + vcc3v0_touch: LDO_REG2 { + regulator-name = "vcc3v0_touch"; +- regulator-always-on; +- regulator-boot-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-state-mem { +@@ -490,8 +505,6 @@ + + vcc3v3_s0: SWITCH_REG2 { + regulator-name = "vcc3v3_s0"; +- regulator-always-on; +- regulator-boot-on; + regulator-state-mem { + regulator-off-in-suspend; + }; +@@ -565,6 +578,19 @@ + vbus-supply = <&vcc5v0_typec>; + status = "okay"; + }; ++ ++ /* enable for pine64 touch screen support */ ++ touch: touchscreen@5d { ++ compatible = "goodix,gt911"; ++ reg = <0x5d>; ++ interrupt-parent = <&gpio4>; ++ interrupts = <RK_PD5 IRQ_TYPE_EDGE_FALLING>; ++ AVDD28-supply = <&vcc3v0_touch>; ++ VDDIO-supply = <&vcc3v0_touch>; ++ irq-gpios = <&gpio4 RK_PD5 GPIO_ACTIVE_HIGH>; ++ reset-gpios = <&gpio4 RK_PD6 GPIO_ACTIVE_HIGH>; ++ status = "disabled"; ++ }; + }; + + &i2s0 { +@@ -600,6 +626,42 @@ + gpio1830-supply = <&vcc_3v0>; + }; + ++/* enable for pine64 panel display support */ ++&mipi_dsi { ++ clock-master; ++ status = "disabled"; ++ ++ ports { ++ mipi_out: port@1 { ++ reg = <1>; ++ ++ mipi_out_panel: endpoint { ++ remote-endpoint = <&mipi_in_panel>; ++ }; ++ }; ++ }; ++ ++ mipi_panel: panel@0 { ++ compatible = "feiyang,fy07024di26a30d"; ++ reg = <0>; ++ avdd-supply = <&avdd>; ++ backlight = <&backlight>; ++ dvdd-supply = <&vcc3v3_s0>; ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port@0 { ++ reg = <0>; ++ ++ mipi_in_panel: endpoint { ++ remote-endpoint = <&mipi_out_panel>; ++ }; ++ }; ++ }; ++ }; ++}; ++ + &pcie0 { + ep-gpios = <&gpio2 RK_PD4 GPIO_ACTIVE_HIGH>; + num-lanes = <4>; diff --git a/target/linux/rockchip/patches-5.19/0007-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch b/target/linux/rockchip/patches-5.19/0007-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch new file mode 100644 index 00000000000000..8105f0840a435c --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0007-arm64-dts-rockchip-rk356x-Add-VOP2-nodes.patch @@ -0,0 +1,106 @@ +From ec7cbc7e9111d3d655f25807e8511492359bb0fd Mon Sep 17 00:00:00 2001 +From: Sascha Hauer <s.hauer@pengutronix.de> +Date: Fri, 22 Apr 2022 09:28:33 +0200 +Subject: [PATCH 07/51] arm64: dts: rockchip: rk356x: Add VOP2 nodes + +The VOP2 is the display output controller on the RK3568. Add the node +for it to the dtsi file along with the required display-subsystem node +and the iommu node. + +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Acked-by: Rob Herring <robh@kernel.org> +Link: https://lore.kernel.org/r/20220422072841.2206452-17-s.hauer@pengutronix.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3566.dtsi | 4 ++ + arch/arm64/boot/dts/rockchip/rk3568.dtsi | 4 ++ + arch/arm64/boot/dts/rockchip/rk356x.dtsi | 51 ++++++++++++++++++++++++ + 3 files changed, 59 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3566.dtsi +@@ -29,3 +29,7 @@ + extcon = <&usb2phy0>; + maximum-speed = "high-speed"; + }; ++ ++&vop { ++ compatible = "rockchip,rk3566-vop"; ++}; +--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi +@@ -137,3 +137,7 @@ + phys = <&usb2phy0_otg>, <&combphy0 PHY_TYPE_USB3>; + phy-names = "usb2-phy", "usb3-phy"; + }; ++ ++&vop { ++ compatible = "rockchip,rk3568-vop"; ++}; +--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi +@@ -129,6 +129,11 @@ + }; + }; + ++ display_subsystem: display-subsystem { ++ compatible = "rockchip,display-subsystem"; ++ ports = <&vop_out>; ++ }; ++ + firmware { + scmi: scmi { + compatible = "arm,scmi-smc"; +@@ -632,6 +637,52 @@ + }; + }; + ++ vop: vop@fe040000 { ++ reg = <0x0 0xfe040000 0x0 0x3000>, <0x0 0xfe044000 0x0 0x1000>; ++ reg-names = "vop", "gamma-lut"; ++ interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>, <&cru DCLK_VOP0>, ++ <&cru DCLK_VOP1>, <&cru DCLK_VOP2>; ++ clock-names = "aclk", "hclk", "dclk_vp0", "dclk_vp1", "dclk_vp2"; ++ iommus = <&vop_mmu>; ++ power-domains = <&power RK3568_PD_VO>; ++ rockchip,grf = <&grf>; ++ status = "disabled"; ++ ++ vop_out: ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ vp0: port@0 { ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ vp1: port@1 { ++ reg = <1>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ ++ vp2: port@2 { ++ reg = <2>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ }; ++ }; ++ }; ++ ++ vop_mmu: iommu@fe043e00 { ++ compatible = "rockchip,rk3568-iommu"; ++ reg = <0x0 0xfe043e00 0x0 0x100>, <0x0 0xfe043f00 0x0 0x100>; ++ interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>; ++ clock-names = "aclk", "iface"; ++ #iommu-cells = <0>; ++ status = "disabled"; ++ }; ++ + qos_gpu: qos@fe128000 { + compatible = "rockchip,rk3568-qos", "syscon"; + reg = <0x0 0xfe128000 0x0 0x20>; diff --git a/target/linux/rockchip/patches-5.19/0008-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch b/target/linux/rockchip/patches-5.19/0008-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch new file mode 100644 index 00000000000000..eed468bdfa1a93 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0008-arm64-dts-rockchip-rk356x-Add-HDMI-nodes.patch @@ -0,0 +1,56 @@ +From 98180f4652c2c994cc2cc6088932086ee5c6e4d9 Mon Sep 17 00:00:00 2001 +From: Sascha Hauer <s.hauer@pengutronix.de> +Date: Fri, 22 Apr 2022 09:28:34 +0200 +Subject: [PATCH 08/51] arm64: dts: rockchip: rk356x: Add HDMI nodes + +Add support for the HDMI port found on RK3568. + +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Link: https://lore.kernel.org/r/20220422072841.2206452-18-s.hauer@pengutronix.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk356x.dtsi | 32 ++++++++++++++++++++++++ + 1 file changed, 32 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi +@@ -683,6 +683,38 @@ + status = "disabled"; + }; + ++ hdmi: hdmi@fe0a0000 { ++ compatible = "rockchip,rk3568-dw-hdmi"; ++ reg = <0x0 0xfe0a0000 0x0 0x20000>; ++ interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&cru PCLK_HDMI_HOST>, ++ <&cru CLK_HDMI_SFR>, ++ <&cru CLK_HDMI_CEC>, ++ <&pmucru CLK_HDMI_REF>, ++ <&cru HCLK_VO>; ++ clock-names = "iahb", "isfr", "cec", "ref"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hdmitx_scl &hdmitx_sda &hdmitxm0_cec>; ++ power-domains = <&power RK3568_PD_VO>; ++ reg-io-width = <4>; ++ rockchip,grf = <&grf>; ++ #sound-dai-cells = <0>; ++ status = "disabled"; ++ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ hdmi_in: port@0 { ++ reg = <0>; ++ }; ++ ++ hdmi_out: port@1 { ++ reg = <1>; ++ }; ++ }; ++ }; ++ + qos_gpu: qos@fe128000 { + compatible = "rockchip,rk3568-qos", "syscon"; + reg = <0x0 0xfe128000 0x0 0x20>; diff --git a/target/linux/rockchip/patches-5.19/0009-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch b/target/linux/rockchip/patches-5.19/0009-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch new file mode 100644 index 00000000000000..c4316b5d19eba4 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0009-arm64-dts-rockchip-rk3568-evb-Enable-VOP2-and-hdmi.patch @@ -0,0 +1,90 @@ +From 7ccf41205a3deb146e7cc4fffb59fb1eb490a649 Mon Sep 17 00:00:00 2001 +From: Sascha Hauer <s.hauer@pengutronix.de> +Date: Fri, 22 Apr 2022 09:28:35 +0200 +Subject: [PATCH 09/51] arm64: dts: rockchip: rk3568-evb: Enable VOP2 and hdmi + +This enabled the VOP2 display controller along with hdmi and the +required port routes which is enough to get a picture out of the +hdmi port of the board. + +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Link: https://lore.kernel.org/r/20220422072841.2206452-19-s.hauer@pengutronix.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3568-evb1-v10.dts | 47 +++++++++++++++++++ + 1 file changed, 47 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts +@@ -8,6 +8,7 @@ + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/leds/common.h> + #include <dt-bindings/pinctrl/rockchip.h> ++#include <dt-bindings/soc/rockchip,vop2.h> + #include "rk3568.dtsi" + + / { +@@ -34,6 +35,17 @@ + regulator-max-microvolt = <12000000>; + }; + ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ + leds { + compatible = "gpio-leds"; + +@@ -209,6 +221,24 @@ + status = "okay"; + }; + ++&hdmi { ++ avdd-0v9-supply = <&vdda0v9_image>; ++ avdd-1v8-supply = <&vcca1v8_image>; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -635,3 +665,20 @@ + phy-supply = <&vcc5v0_usb_host>; + status = "okay"; + }; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = <ROCKCHIP_VOP2_EP_HDMI0>; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.19/0010-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz.patch b/target/linux/rockchip/patches-5.19/0010-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz.patch new file mode 100644 index 00000000000000..3b4489aa95d703 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0010-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-quartz.patch @@ -0,0 +1,91 @@ +From d6eb924b01522decb987cb8c70d66c6b732a91e4 Mon Sep 17 00:00:00 2001 +From: Michael Riesch <michael.riesch@wolfvision.net> +Date: Fri, 22 Apr 2022 09:28:36 +0200 +Subject: [PATCH 10/51] arm64: dts: rockchip: enable vop2 and hdmi tx on + quartz64a + +Enable the RK356x Video Output Processor (VOP) 2 on the Pine64 +Quartz64 Model A. + +Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Link: https://lore.kernel.org/r/20220422072841.2206452-20-s.hauer@pengutronix.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3566-quartz64-a.dts | 47 +++++++++++++++++++ + 1 file changed, 47 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -4,6 +4,7 @@ + + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/pinctrl/rockchip.h> ++#include <dt-bindings/soc/rockchip,vop2.h> + #include "rk3566.dtsi" + + / { +@@ -37,6 +38,17 @@ + #cooling-cells = <2>; + }; + ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ + leds { + compatible = "gpio-leds"; + +@@ -280,6 +292,24 @@ + status = "okay"; + }; + ++&hdmi { ++ avdd-0v9-supply = <&vdda_0v9>; ++ avdd-1v8-supply = <&vcc_1v8>; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -782,3 +812,20 @@ + phy-supply = <&vcc5v0_usb20_host>; + status = "okay"; + }; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = <ROCKCHIP_VOP2_EP_HDMI0>; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.19/0011-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-rock-3.patch b/target/linux/rockchip/patches-5.19/0011-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-rock-3.patch new file mode 100644 index 00000000000000..2b7a680907b586 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0011-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-rock-3.patch @@ -0,0 +1,93 @@ +From 284f0150efd541d60156bcfea1d575b24d320cc3 Mon Sep 17 00:00:00 2001 +From: Michael Riesch <michael.riesch@wolfvision.net> +Date: Fri, 22 Apr 2022 09:28:37 +0200 +Subject: [PATCH 11/51] arm64: dts: rockchip: enable vop2 and hdmi tx on + rock-3a + +Enable the RK356x Video Output Processor (VOP) 2 on the Radxa +ROCK3 Model A. + +Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> +Reported-by: kernel test robot <lkp@intel.com> +Link: https://lore.kernel.org/r/20220310210352.451136-4-michael.riesch@wolfvision.net +Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> +Link: https://lore.kernel.org/r/20220422072841.2206452-21-s.hauer@pengutronix.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3568-rock-3a.dts | 47 +++++++++++++++++++ + 1 file changed, 47 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +@@ -4,6 +4,7 @@ + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/leds/common.h> + #include <dt-bindings/pinctrl/rockchip.h> ++#include <dt-bindings/soc/rockchip,vop2.h> + #include "rk3568.dtsi" + + / { +@@ -20,6 +21,17 @@ + stdout-path = "serial2:1500000n8"; + }; + ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ + leds { + compatible = "gpio-leds"; + +@@ -166,6 +178,24 @@ + status = "okay"; + }; + ++&hdmi { ++ avdd-0v9-supply = <&vdda0v9_image>; ++ avdd-1v8-supply = <&vcca1v8_image>; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -560,3 +590,20 @@ + phy-supply = <&vcc5v0_usb_host>; + status = "okay"; + }; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = <ROCKCHIP_VOP2_EP_HDMI0>; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.19/0013-arm64-dts-rockchip-adjust-whitespace-around.patch b/target/linux/rockchip/patches-5.19/0013-arm64-dts-rockchip-adjust-whitespace-around.patch new file mode 100644 index 00000000000000..2896d4254ba9a2 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0013-arm64-dts-rockchip-adjust-whitespace-around.patch @@ -0,0 +1,105 @@ +From 6ca0fc50d82e4ee0c1f5a2ba35cc692cfb4eeeec Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +Date: Thu, 26 May 2022 22:42:16 +0200 +Subject: [PATCH 13/51] arm64: dts: rockchip: adjust whitespace around '=' + +Fix whitespace coding style: use single space instead of tabs or +multiple spaces around '=' sign in property assignment. No functional +changes (same DTB). + +Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +Link: https://lore.kernel.org/r/20220526204218.832029-1-krzysztof.kozlowski@linaro.org +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/px30.dtsi | 2 +- + arch/arm64/boot/dts/rockchip/rk3368.dtsi | 6 +++--- + arch/arm64/boot/dts/rockchip/rk3399-evb.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3399pro-vmarc-som.dtsi | 2 +- + 6 files changed, 8 insertions(+), 8 deletions(-) + +--- a/arch/arm64/boot/dts/rockchip/px30.dtsi ++++ b/arch/arm64/boot/dts/rockchip/px30.dtsi +@@ -528,7 +528,7 @@ + i2c0: i2c@ff180000 { + compatible = "rockchip,px30-i2c", "rockchip,rk3399-i2c"; + reg = <0x0 0xff180000 0x0 0x1000>; +- clocks = <&cru SCLK_I2C0>, <&cru PCLK_I2C0>; ++ clocks = <&cru SCLK_I2C0>, <&cru PCLK_I2C0>; + clock-names = "i2c", "pclk"; + interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>; + pinctrl-names = "default"; +--- a/arch/arm64/boot/dts/rockchip/rk3368.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3368.dtsi +@@ -1084,7 +1084,7 @@ + + gmac { + rgmii_pins: rgmii-pins { +- rockchip,pins = <3 RK_PC6 1 &pcfg_pull_none>, ++ rockchip,pins = <3 RK_PC6 1 &pcfg_pull_none>, + <3 RK_PD0 1 &pcfg_pull_none>, + <3 RK_PC3 1 &pcfg_pull_none>, + <3 RK_PB0 1 &pcfg_pull_none_12ma>, +@@ -1102,7 +1102,7 @@ + }; + + rmii_pins: rmii-pins { +- rockchip,pins = <3 RK_PC6 1 &pcfg_pull_none>, ++ rockchip,pins = <3 RK_PC6 1 &pcfg_pull_none>, + <3 RK_PD0 1 &pcfg_pull_none>, + <3 RK_PC3 1 &pcfg_pull_none>, + <3 RK_PB0 1 &pcfg_pull_none_12ma>, +@@ -1257,7 +1257,7 @@ + + spdif { + spdif_tx: spdif-tx { +- rockchip,pins = <2 RK_PC7 1 &pcfg_pull_none>; ++ rockchip,pins = <2 RK_PC7 1 &pcfg_pull_none>; + }; + }; + +--- a/arch/arm64/boot/dts/rockchip/rk3399-evb.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-evb.dts +@@ -55,7 +55,7 @@ + }; + + edp_panel: edp-panel { +- compatible ="lg,lp079qx1-sp0v"; ++ compatible = "lg,lp079qx1-sp0v"; + backlight = <&backlight>; + enable-gpios = <&gpio1 RK_PB5 GPIO_ACTIVE_HIGH>; + power-supply = <&vcc3v3_s0>; +--- a/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-puma-haikou.dts +@@ -49,7 +49,7 @@ + sgtl5000_clk: sgtl5000-oscillator { + compatible = "fixed-clock"; + #clock-cells = <0>; +- clock-frequency = <24576000>; ++ clock-frequency = <24576000>; + }; + + dc_12v: dc-12v { +--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator.dts +@@ -88,7 +88,7 @@ + }; + + edp_panel: edp-panel { +- compatible ="lg,lp079qx1-sp0v"; ++ compatible = "lg,lp079qx1-sp0v"; + backlight = <&backlight>; + enable-gpios = <&gpio4 RK_PC6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; +--- a/arch/arm64/boot/dts/rockchip/rk3399pro-vmarc-som.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399pro-vmarc-som.dtsi +@@ -347,7 +347,7 @@ + + pcie { + pcie_pwr: pcie-pwr { +- rockchip,pins = <4 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; ++ rockchip,pins = <4 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; + }; + }; + diff --git a/target/linux/rockchip/patches-5.19/0014-arm64-dts-rockchip-Add-HDMI-audio-nodes-to-rk356x.patch b/target/linux/rockchip/patches-5.19/0014-arm64-dts-rockchip-Add-HDMI-audio-nodes-to-rk356x.patch new file mode 100644 index 00000000000000..5f5d06dd4ce6df --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0014-arm64-dts-rockchip-Add-HDMI-audio-nodes-to-rk356x.patch @@ -0,0 +1,67 @@ +From 7a32752d0d94ea613092aaa45db136626a55a1ab Mon Sep 17 00:00:00 2001 +From: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> +Date: Sat, 11 Jun 2022 08:52:59 +0200 +Subject: [PATCH 14/51] arm64: dts: rockchip: Add HDMI audio nodes to rk356x + +This adds the i2s0 node and an hdmi-sound sound device to the +rk356x device tree. On the rk356[68], the i2s0 controller is +connected to HDMI audio. + +Tested-by: Michael Riesch <michael.riesch@wolfvision.net> +Tested-by: Peter Geis <pgwipeout@gmail.com> +Signed-off-by: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> +Link: https://lore.kernel.org/r/20220611065300.885212-2-frattaroli.nicolas@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk356x.dtsi | 33 ++++++++++++++++++++++++ + 1 file changed, 33 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi +@@ -183,6 +183,22 @@ + }; + }; + ++ hdmi_sound: hdmi-sound { ++ compatible = "simple-audio-card"; ++ simple-audio-card,name = "HDMI"; ++ simple-audio-card,format = "i2s"; ++ simple-audio-card,mclk-fs = <256>; ++ status = "disabled"; ++ ++ simple-audio-card,codec { ++ sound-dai = <&hdmi>; ++ }; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s0_8ch>; ++ }; ++ }; ++ + pmu { + compatible = "arm,cortex-a55-pmu"; + interrupts = <GIC_SPI 228 IRQ_TYPE_LEVEL_HIGH>, +@@ -950,6 +966,23 @@ + #sound-dai-cells = <0>; + status = "disabled"; + }; ++ ++ i2s0_8ch: i2s@fe400000 { ++ compatible = "rockchip,rk3568-i2s-tdm"; ++ reg = <0x0 0xfe400000 0x0 0x1000>; ++ interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>; ++ assigned-clocks = <&cru CLK_I2S0_8CH_TX_SRC>, <&cru CLK_I2S0_8CH_RX_SRC>; ++ assigned-clock-rates = <1188000000>, <1188000000>; ++ clocks = <&cru MCLK_I2S0_8CH_TX>, <&cru MCLK_I2S0_8CH_RX>, <&cru HCLK_I2S0_8CH>; ++ clock-names = "mclk_tx", "mclk_rx", "hclk"; ++ dmas = <&dmac1 0>; ++ dma-names = "tx"; ++ resets = <&cru SRST_M_I2S0_8CH_TX>, <&cru SRST_M_I2S0_8CH_RX>; ++ reset-names = "tx-m", "rx-m"; ++ rockchip,grf = <&grf>; ++ #sound-dai-cells = <0>; ++ status = "disabled"; ++ }; + + i2s1_8ch: i2s@fe410000 { + compatible = "rockchip,rk3568-i2s-tdm"; diff --git a/target/linux/rockchip/patches-5.19/0015-arm64-dts-rockchip-Enable-HDMI-audio-on-Quartz64-A.patch b/target/linux/rockchip/patches-5.19/0015-arm64-dts-rockchip-Enable-HDMI-audio-on-Quartz64-A.patch new file mode 100644 index 00000000000000..09369e3d838f70 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0015-arm64-dts-rockchip-Enable-HDMI-audio-on-Quartz64-A.patch @@ -0,0 +1,40 @@ +From 2d330dcbbb5f3ce5ff55a2642aac4fb0d0e0a79e Mon Sep 17 00:00:00 2001 +From: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> +Date: Sat, 11 Jun 2022 08:53:00 +0200 +Subject: [PATCH 15/51] arm64: dts: rockchip: Enable HDMI audio on Quartz64 A + +This enables the i2s0 controller and the hdmi-sound node on +the PINE64 Quartz64 Model A single-board computer. + +Tested-by: Peter Geis <pgwipeout@gmail.com> +Signed-off-by: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> +Link: https://lore.kernel.org/r/20220611065300.885212-3-frattaroli.nicolas@gmail.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3566-quartz64-a.dts +@@ -310,6 +310,10 @@ + }; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -540,6 +544,10 @@ + status = "okay"; + }; + ++&i2s0_8ch { ++ status = "okay"; ++}; ++ + &i2s1_8ch { + pinctrl-names = "default"; + pinctrl-0 = <&i2s1m0_sclktx diff --git a/target/linux/rockchip/patches-5.19/0017-arm64-dts-rockchip-add-RTC-to-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0017-arm64-dts-rockchip-add-RTC-to-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..e7609aef6f929e --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0017-arm64-dts-rockchip-add-RTC-to-BPI-R2-Pro.patch @@ -0,0 +1,53 @@ +From 0a691542952f6706436e383f984c38b361c986ee Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Wed, 8 Jun 2022 18:11:49 +0200 +Subject: [PATCH 17/51] arm64: dts: rockchip: add RTC to BPI-R2 Pro + +Add devicetree node for hym8563 rtc to Bananapi R2 Pro board. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220608161150.58919-3-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 23 +++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -389,6 +389,23 @@ + }; + }; + ++&i2c3 { ++ status = "okay"; ++ ++ hym8563: rtc@51 { ++ compatible = "haoyu,hym8563"; ++ reg = <0x51>; ++ interrupt-parent = <&gpio0>; ++ interrupts = <RK_PD3 IRQ_TYPE_EDGE_FALLING>; ++ #clock-cells = <0>; ++ clock-frequency = <32768>; ++ clock-output-names = "rtcic_32kout"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&hym8563_int>; ++ wakeup-source; ++ }; ++}; ++ + &i2c5 { + /* pin 3 (SDA) + 4 (SCL) of header con2 */ + status = "disabled"; +@@ -411,6 +428,12 @@ + }; + }; + ++ hym8563 { ++ hym8563_int: hym8563-int { ++ rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ + pmic { + pmic_int: pmic_int { + rockchip,pins = diff --git a/target/linux/rockchip/patches-5.19/0019-arm64-dts-rockchip-set-display-regulators-to-always-.patch b/target/linux/rockchip/patches-5.19/0019-arm64-dts-rockchip-set-display-regulators-to-always-.patch new file mode 100644 index 00000000000000..902ccaa14710aa --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0019-arm64-dts-rockchip-set-display-regulators-to-always-.patch @@ -0,0 +1,44 @@ +From 032baf8d6c3493e0dcad2c780361faa7ac4f9dde Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Mon, 6 Jun 2022 19:07:59 +0200 +Subject: [PATCH 19/51] arm64: dts: rockchip: set display regulators to + always-on on BPI-R2-Pro + +The gpu power supply needs to stay always on until the issues with power- +domains not being regulator aware is resolved. Otherwise we run into +issues where the gpu-regulator gets shut down and we start getting mmu +faults. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220606170803.478082-2-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -215,6 +215,7 @@ + + vdd_gpu: DCDC_REG2 { + regulator-name = "vdd_gpu"; ++ regulator-always-on; + regulator-init-microvolt = <900000>; + regulator-initial-mode = <0x2>; + regulator-min-microvolt = <500000>; +@@ -264,6 +265,7 @@ + + vdda0v9_image: LDO_REG1 { + regulator-name = "vdda0v9_image"; ++ regulator-always-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + +@@ -359,6 +361,7 @@ + + vcca1v8_image: LDO_REG9 { + regulator-name = "vcca1v8_image"; ++ regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + diff --git a/target/linux/rockchip/patches-5.19/0020-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-BPI-R2.patch b/target/linux/rockchip/patches-5.19/0020-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-BPI-R2.patch new file mode 100644 index 00000000000000..725f4630642196 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0020-arm64-dts-rockchip-enable-vop2-and-hdmi-tx-on-BPI-R2.patch @@ -0,0 +1,90 @@ +From ffb2555c106a820acc90d31c201d9879b4400623 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Mon, 6 Jun 2022 19:08:00 +0200 +Subject: [PATCH 20/51] arm64: dts: rockchip: enable vop2 and hdmi tx on + BPI-R2-Pro + +Enable the RK356x Video Output Processor (VOP) 2 on the +BananaPi R2 Pro board. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220606170803.478082-3-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 47 +++++++++++++++++++ + 1 file changed, 47 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -8,6 +8,7 @@ + #include <dt-bindings/gpio/gpio.h> + #include <dt-bindings/leds/common.h> + #include <dt-bindings/pinctrl/rockchip.h> ++#include <dt-bindings/soc/rockchip,vop2.h> + #include "rk3568.dtsi" + + / { +@@ -54,6 +55,17 @@ + regulator-max-microvolt = <12000000>; + }; + ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ + vcc3v3_sys: vcc3v3-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_sys"; +@@ -174,6 +186,24 @@ + status = "okay"; + }; + ++&hdmi { ++ avdd-0v9-supply = <&vdda0v9_image>; ++ avdd-1v8-supply = <&vcca1v8_image>; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -613,3 +643,20 @@ + phy-supply = <&vcc5v0_usb_otg>; + status = "okay"; + }; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = <ROCKCHIP_VOP2_EP_HDMI0>; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.19/0021-arm64-dts-rockchip-Enable-HDMI-audio-on-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0021-arm64-dts-rockchip-Enable-HDMI-audio-on-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..65ca0a5f65b488 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0021-arm64-dts-rockchip-Enable-HDMI-audio-on-BPI-R2-Pro.patch @@ -0,0 +1,40 @@ +From 16fa52e8e2aae8debb651ac5f84a8d49499a301e Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Mon, 6 Jun 2022 19:08:01 +0200 +Subject: [PATCH 21/51] arm64: dts: rockchip: Enable HDMI audio on BPI R2 Pro + +This enables the i2s0 controller and the hdmi-sound node on +the Bananapi R2 Pro single-board computer. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220606170803.478082-4-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 9 +++++++++ + 1 file changed, 9 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -204,6 +204,10 @@ + }; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -444,6 +448,11 @@ + status = "disabled"; + }; + ++&i2s0_8ch { ++ /* hdmi sound */ ++ status = "okay"; ++}; ++ + &mdio1 { + rgmii_phy1: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; diff --git a/target/linux/rockchip/patches-5.19/0022-arm64-dts-rockchip-configure-thermal-shutdown-for-BP.patch b/target/linux/rockchip/patches-5.19/0022-arm64-dts-rockchip-configure-thermal-shutdown-for-BP.patch new file mode 100644 index 00000000000000..7238aabbf9fba2 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0022-arm64-dts-rockchip-configure-thermal-shutdown-for-BP.patch @@ -0,0 +1,26 @@ +From 6976a5970ca53ac9dba444f4929528c3400152a5 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Mon, 6 Jun 2022 19:08:02 +0200 +Subject: [PATCH 22/51] arm64: dts: rockchip: configure thermal shutdown for + BPI-R2-Pro + +Add thermal shutdown configuration for use of GPU. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220606170803.478082-5-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -588,6 +588,8 @@ + }; + + &tsadc { ++ rockchip,hw-tshut-mode = <1>; ++ rockchip,hw-tshut-polarity = <0>; + status = "okay"; + }; + diff --git a/target/linux/rockchip/patches-5.19/0023-arm64-dts-rockchip-enable-the-gpu-on-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0023-arm64-dts-rockchip-enable-the-gpu-on-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..8a86137080df3f --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0023-arm64-dts-rockchip-enable-the-gpu-on-BPI-R2-Pro.patch @@ -0,0 +1,28 @@ +From 92e9e89c7fe9178cb56dba0faf4b0fabbc19d97d Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Mon, 6 Jun 2022 19:08:03 +0200 +Subject: [PATCH 23/51] arm64: dts: rockchip: enable the gpu on BPI-R2-Pro + +Enable the GPU core on the Rockchip RK3568 BananaPi R2 Pro + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Link: https://lore.kernel.org/r/20220606170803.478082-6-linux@fw-web.de +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -186,6 +186,11 @@ + status = "okay"; + }; + ++&gpu { ++ mali-supply = <&vdd_gpu>; ++ status = "okay"; ++}; ++ + &hdmi { + avdd-0v9-supply = <&vdda0v9_image>; + avdd-1v8-supply = <&vcca1v8_image>; diff --git a/target/linux/rockchip/patches-5.19/0024-arm64-dts-rockchip-Add-missing-space-around-regulato.patch b/target/linux/rockchip/patches-5.19/0024-arm64-dts-rockchip-Add-missing-space-around-regulato.patch new file mode 100644 index 00000000000000..41a6973b825803 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0024-arm64-dts-rockchip-Add-missing-space-around-regulato.patch @@ -0,0 +1,31 @@ +From fe99ab9113e33c825d1efb8d66f79e217e3108bf Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Niklas=20S=C3=B6derlund?= + <niklas.soderlund+renesas@ragnatech.se> +Date: Mon, 13 Jun 2022 00:31:57 +0200 +Subject: [PATCH 24/51] arm64: dts: rockchip: Add missing space around + regulator-name on rk3368-orion-r68 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Add the missing space around the regulator-name property before the typo +spreads to other files. + +Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> +Link: https://lore.kernel.org/r/20220612223201.2740248-3-niklas.soderlund+renesas@ragnatech.se +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts +@@ -134,7 +134,7 @@ + + vccio_sd: vcc-io-sd-regulator { + compatible = "regulator-fixed"; +- regulator-name= "vccio_sd"; ++ regulator-name = "vccio_sd"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; diff --git a/target/linux/rockchip/patches-5.19/0025-arm64-dts-rockchip-add-ROCK-Pi-S-DTS-support.patch b/target/linux/rockchip/patches-5.19/0025-arm64-dts-rockchip-add-ROCK-Pi-S-DTS-support.patch new file mode 100644 index 00000000000000..f787cd2282a41c --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0025-arm64-dts-rockchip-add-ROCK-Pi-S-DTS-support.patch @@ -0,0 +1,245 @@ +From 50373d43ecd2504c240f0048087bf0a1fd6e8b4c Mon Sep 17 00:00:00 2001 +From: Akash Gajjar <akash@openedev.com> +Date: Tue, 14 Jun 2022 08:48:56 +0200 +Subject: [PATCH 25/51] arm64: dts: rockchip: add ROCK Pi S DTS support + +ROCK Pi S is RK3308 based SBC from radxa.com. ROCK Pi S has a, +- 256MB/512MB DDR3 RAM +- SD, NAND flash (optional on board 1/2/4/8Gb) +- 100MB ethernet, PoE (optional) +- Onboard 802.11 b/g/n wifi + Bluetooth 4.0 Module +- USB2.0 Type-A HOST x1 +- USB3.0 Type-C OTG x1 +- 26-pin expansion header +- USB Type-C DC 5V Power Supply + +This patch enables +- Console +- NAND Flash +- SD Card + +Signed-off-by: Akash Gajjar <akash@openedev.com> +[sjoerd: Sort dt nodes, drop properties duplicated from dtsi] +Signed-off-by: Sjoerd Simons <sjoerd@collabora.com> +Link: https://lore.kernel.org/r/20220614064858.1445817-3-sjoerd@collabora.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../boot/dts/rockchip/rk3308-rock-pi-s.dts | 201 ++++++++++++++++++ + 2 files changed, 202 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -5,6 +5,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-engi + dtb-$(CONFIG_ARCH_ROCKCHIP) += px30-engicam-px30-core-edimm2.2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-evb.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-roc-cc.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3308-rock-pi-s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a95x-z2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts +@@ -0,0 +1,201 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * Copyright (c) 2019 Akash Gajjar <akash@openedev.com> ++ * Copyright (c) 2019 Jagan Teki <jagan@openedev.com> ++ */ ++ ++/dts-v1/; ++#include "rk3308.dtsi" ++ ++/ { ++ model = "Radxa ROCK Pi S"; ++ compatible = "radxa,rockpis", "rockchip,rk3308"; ++ ++ chosen { ++ stdout-path = "serial0:1500000n8"; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&green_led_gio>, <&heartbeat_led_gpio>; ++ ++ green-led { ++ default-state = "on"; ++ gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; ++ label = "rockpis:green:power"; ++ linux,default-trigger = "default-on"; ++ }; ++ ++ blue-led { ++ default-state = "on"; ++ gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; ++ label = "rockpis:blue:user"; ++ linux,default-trigger = "heartbeat"; ++ }; ++ }; ++ ++ sdio_pwrseq: sdio-pwrseq { ++ compatible = "mmc-pwrseq-simple"; ++ pinctrl-0 = <&wifi_enable_h>; ++ pinctrl-names = "default"; ++ reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; ++ }; ++ ++ vcc_1v8: vcc-1v8 { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ vin-supply = <&vcc_io>; ++ }; ++ ++ vcc_io: vcc-io { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_io"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++ ++ vcc_ddr: vcc-ddr { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc_ddr"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1500000>; ++ regulator-max-microvolt = <1500000>; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++ ++ vcc5v0_otg: vcc5v0-otg { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&otg_vbus_drv>; ++ regulator-name = "vcc5v0_otg"; ++ regulator-always-on; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++ ++ vcc5v0_sys: vcc5v0-sys { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc5v0_sys"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++ ++ vdd_core: vdd-core { ++ compatible = "pwm-regulator"; ++ pwms = <&pwm0 0 5000 1>; ++ pwm-supply = <&vcc5v0_sys>; ++ regulator-name = "vdd_core"; ++ regulator-min-microvolt = <827000>; ++ regulator-max-microvolt = <1340000>; ++ regulator-init-microvolt = <1015000>; ++ regulator-settling-time-up-us = <250>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ ++ vdd_log: vdd-log { ++ compatible = "regulator-fixed"; ++ regulator-name = "vdd_log"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1050000>; ++ regulator-max-microvolt = <1050000>; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_core>; ++}; ++ ++&emmc { ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ mmc-hs200-1_8v; ++ non-removable; ++ vmmc-supply = <&vcc_io>; ++ status = "okay"; ++}; ++ ++&i2c1 { ++ status = "okay"; ++}; ++ ++&pinctrl { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&rtc_32k>; ++ ++ leds { ++ green_led_gio: green-led-gpio { ++ rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ heartbeat_led_gpio: heartbeat-led-gpio { ++ rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ usb { ++ otg_vbus_drv: otg-vbus-drv { ++ rockchip,pins = <0 RK_PC5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ sdio-pwrseq { ++ wifi_enable_h: wifi-enable-h { ++ rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ wifi_host_wake: wifi-host-wake { ++ rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_down>; ++ }; ++ }; ++}; ++ ++&pwm0 { ++ status = "okay"; ++ pinctrl-0 = <&pwm0_pin_pull_down>; ++}; ++ ++&saradc { ++ vref-supply = <&vcc_1v8>; ++ status = "okay"; ++}; ++ ++&sdio { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ cap-sd-highspeed; ++ cap-sdio-irq; ++ keep-power-in-suspend; ++ max-frequency = <1000000>; ++ mmc-pwrseq = <&sdio_pwrseq>; ++ non-removable; ++ sd-uhs-sdr104; ++ status = "okay"; ++}; ++ ++&sdmmc { ++ cap-sd-highspeed; ++ status = "okay"; ++}; ++ ++&uart0 { ++ status = "okay"; ++}; ++ ++&uart4 { ++ status = "okay"; ++}; diff --git a/target/linux/rockchip/patches-5.19/0026-arm64-dts-rockchip-rock-pi-s-add-more-peripherals.patch b/target/linux/rockchip/patches-5.19/0026-arm64-dts-rockchip-rock-pi-s-add-more-peripherals.patch new file mode 100644 index 00000000000000..20b5695fe22d5e --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0026-arm64-dts-rockchip-rock-pi-s-add-more-peripherals.patch @@ -0,0 +1,100 @@ +From a1bee6a014cf68d8298c370115f7036f0dcb4f59 Mon Sep 17 00:00:00 2001 +From: Sjoerd Simons <sjoerd@collabora.com> +Date: Tue, 14 Jun 2022 08:48:57 +0200 +Subject: [PATCH 26/51] arm64: dts: rockchip: rock-pi-s add more peripherals + +This enables the following peripherals: +* Onboard ethernet support +* Bluetooth +* USB 2 port +* OTG port via type-c connector +* Hardware watchog + +Also add aliases for the mmc devices and the ethernet interface + +Signed-off-by: Sjoerd Simons <sjoerd@collabora.com> +Link: https://lore.kernel.org/r/20220614064858.1445817-4-sjoerd@collabora.com +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + .../boot/dts/rockchip/rk3308-rock-pi-s.dts | 52 +++++++++++++++++++ + 1 file changed, 52 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3308-rock-pi-s.dts +@@ -11,6 +11,12 @@ + model = "Radxa ROCK Pi S"; + compatible = "radxa,rockpis", "rockchip,rk3308"; + ++ aliases { ++ ethernet0 = &gmac; ++ mmc0 = &emmc; ++ mmc1 = &sdmmc; ++ }; ++ + chosen { + stdout-path = "serial0:1500000n8"; + }; +@@ -129,6 +135,15 @@ + status = "okay"; + }; + ++&gmac { ++ clock_in_out = "output"; ++ phy-supply = <&vcc_io>; ++ snps,reset-gpio = <&gpio0 RK_PA7 GPIO_ACTIVE_LOW>; ++ snps,reset-active-low; ++ snps,reset-delays-us = <0 50000 50000>; ++ status = "okay"; ++}; ++ + &i2c1 { + status = "okay"; + }; +@@ -192,10 +207,47 @@ + status = "okay"; + }; + ++&u2phy { ++ status = "okay"; ++ ++ u2phy_host: host-port { ++ phy-supply = <&vcc5v0_otg>; ++ status = "okay"; ++ }; ++ ++ u2phy_otg: otg-port { ++ phy-supply = <&vcc5v0_otg>; ++ status = "okay"; ++ }; ++}; ++ + &uart0 { + status = "okay"; + }; + + &uart4 { + status = "okay"; ++ ++ bluetooth { ++ compatible = "realtek,rtl8723bs-bt"; ++ device-wake-gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>; ++ host-wake-gpios = <&gpio4 RK_PB4 GPIO_ACTIVE_HIGH>; ++ }; ++}; ++ ++&usb_host_ehci { ++ status = "okay"; ++}; ++ ++&usb_host_ohci { ++ status = "okay"; ++}; ++ ++&usb20_otg { ++ dr_mode = "peripheral"; ++ status = "okay"; ++}; ++ ++&wdt { ++ status = "okay"; + }; diff --git a/target/linux/rockchip/patches-5.19/0027-arm64-dts-rockchip-align-gpio-key-node-names-with-dt.patch b/target/linux/rockchip/patches-5.19/0027-arm64-dts-rockchip-align-gpio-key-node-names-with-dt.patch new file mode 100644 index 00000000000000..3df5bf71fc4a79 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0027-arm64-dts-rockchip-align-gpio-key-node-names-with-dt.patch @@ -0,0 +1,369 @@ +From deefbffc188d3b0c9e08fa1ce31bb098839a9995 Mon Sep 17 00:00:00 2001 +From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +Date: Wed, 15 Jun 2022 17:53:19 -0700 +Subject: [PATCH 27/51] arm64: dts: rockchip: align gpio-key node names with + dtschema + +The node names should be generic and DT schema expects certain pattern +(e.g. with key/button/switch). + +Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +Link: https://lore.kernel.org/r/20220616005333.18491-26-krzysztof.kozlowski@linaro.org +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3308-evb.dts | 2 +- + .../boot/dts/rockchip/rk3326-odroid-go2.dts | 32 +++++++++---------- + .../boot/dts/rockchip/rk3328-nanopi-r2s.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi | 2 +- + .../boot/dts/rockchip/rk3368-geekbox.dts | 2 +- + .../dts/rockchip/rk3368-orion-r68-meta.dts | 2 +- + .../boot/dts/rockchip/rk3368-px5-evb.dts | 2 +- + arch/arm64/boot/dts/rockchip/rk3368-r88.dts | 2 +- + .../boot/dts/rockchip/rk3399-firefly.dts | 2 +- + .../dts/rockchip/rk3399-gru-chromebook.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-gru-kevin.dts | 2 +- + .../boot/dts/rockchip/rk3399-gru-scarlet.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-khadas-edge.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-nanopi-r4s.dts | 4 +-- + .../boot/dts/rockchip/rk3399-nanopi4.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-orangepi.dts | 2 +- + .../boot/dts/rockchip/rk3399-pinebook-pro.dts | 4 +-- + .../boot/dts/rockchip/rk3399-roc-pc.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-rockpro64.dtsi | 2 +- + .../boot/dts/rockchip/rk3399-sapphire.dtsi | 2 +- + .../boot/dts/rockchip/rk3566-pinenote.dtsi | 2 +- + 21 files changed, 38 insertions(+), 38 deletions(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3308-evb.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3308-evb.dts +@@ -75,7 +75,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_LOW>; + linux,code = <KEY_POWER>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3326-odroid-go2.dts +@@ -71,82 +71,82 @@ + * |------------------------------------------------| + */ + +- sw1 { ++ button-sw1 { + gpios = <&gpio1 RK_PB4 GPIO_ACTIVE_LOW>; + label = "DPAD-UP"; + linux,code = <BTN_DPAD_UP>; + }; +- sw2 { ++ button-sw2 { + gpios = <&gpio1 RK_PB5 GPIO_ACTIVE_LOW>; + label = "DPAD-DOWN"; + linux,code = <BTN_DPAD_DOWN>; + }; +- sw3 { ++ button-sw3 { + gpios = <&gpio1 RK_PB6 GPIO_ACTIVE_LOW>; + label = "DPAD-LEFT"; + linux,code = <BTN_DPAD_LEFT>; + }; +- sw4 { ++ button-sw4 { + gpios = <&gpio1 RK_PB7 GPIO_ACTIVE_LOW>; + label = "DPAD-RIGHT"; + linux,code = <BTN_DPAD_RIGHT>; + }; +- sw5 { ++ button-sw5 { + gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_LOW>; + label = "BTN-A"; + linux,code = <BTN_EAST>; + }; +- sw6 { ++ button-sw6 { + gpios = <&gpio1 RK_PA5 GPIO_ACTIVE_LOW>; + label = "BTN-B"; + linux,code = <BTN_SOUTH>; + }; +- sw7 { ++ button-sw7 { + gpios = <&gpio1 RK_PA6 GPIO_ACTIVE_LOW>; + label = "BTN-Y"; + linux,code = <BTN_WEST>; + }; +- sw8 { ++ button-sw8 { + gpios = <&gpio1 RK_PA7 GPIO_ACTIVE_LOW>; + label = "BTN-X"; + linux,code = <BTN_NORTH>; + }; +- sw9 { ++ button-sw9 { + gpios = <&gpio2 RK_PA0 GPIO_ACTIVE_LOW>; + label = "F1"; + linux,code = <BTN_TRIGGER_HAPPY1>; + }; +- sw10 { ++ button-sw10 { + gpios = <&gpio2 RK_PA1 GPIO_ACTIVE_LOW>; + label = "F2"; + linux,code = <BTN_TRIGGER_HAPPY2>; + }; +- sw11 { ++ button-sw11 { + gpios = <&gpio2 RK_PA2 GPIO_ACTIVE_LOW>; + label = "F3"; + linux,code = <BTN_TRIGGER_HAPPY3>; + }; +- sw12 { ++ button-sw12 { + gpios = <&gpio2 RK_PA3 GPIO_ACTIVE_LOW>; + label = "F4"; + linux,code = <BTN_TRIGGER_HAPPY4>; + }; +- sw13 { ++ button-sw13 { + gpios = <&gpio2 RK_PA4 GPIO_ACTIVE_LOW>; + label = "F5"; + linux,code = <BTN_TRIGGER_HAPPY5>; + }; +- sw14 { ++ button-sw14 { + gpios = <&gpio2 RK_PA5 GPIO_ACTIVE_LOW>; + label = "F6"; + linux,code = <BTN_TRIGGER_HAPPY6>; + }; +- sw15 { ++ button-sw15 { + gpios = <&gpio2 RK_PA6 GPIO_ACTIVE_LOW>; + label = "TOP-LEFT"; + linux,code = <BTN_TL>; + }; +- sw16 { ++ button-sw16 { + gpios = <&gpio2 RK_PA7 GPIO_ACTIVE_LOW>; + label = "TOP-RIGHT"; + linux,code = <BTN_TR>; +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -34,7 +34,7 @@ + pinctrl-0 = <&reset_button_pin>; + pinctrl-names = "default"; + +- reset { ++ key-reset { + label = "reset"; + gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; + linux,code = <KEY_RESTART>; +--- a/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3368-evb.dtsi +@@ -76,7 +76,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + wakeup-source; + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3368-geekbox.dts +@@ -43,7 +43,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; + linux,code = <KEY_POWER>; +--- a/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3368-orion-r68-meta.dts +@@ -44,7 +44,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + wakeup-source; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; + label = "GPIO Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3368-px5-evb.dts +@@ -30,7 +30,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; + linux,code = <KEY_POWER>; +--- a/arch/arm64/boot/dts/rockchip/rk3368-r88.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3368-r88.dts +@@ -37,7 +37,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key>; + +- power { ++ key-power { + wakeup-source; + gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-firefly.dts +@@ -87,7 +87,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwrbtn>; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-chromebook.dtsi +@@ -206,7 +206,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&bt_host_wake_l>; + +- wake_on_bt: wake-on-bt { ++ wake_on_bt: key-wake-on-bt { + label = "Wake-on-Bluetooth"; + gpios = <&gpio0 3 GPIO_ACTIVE_LOW>; + linux,code = <KEY_WAKEUP>; +--- a/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dts +@@ -92,7 +92,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&bt_host_wake_l>, <&cpu1_pen_eject>; + +- pen-insert { ++ switch-pen-insert { + label = "Pen Insert"; + /* Insert = low, eject = high */ + gpios = <&gpio0 13 GPIO_ACTIVE_LOW>; +--- a/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-gru-scarlet.dtsi +@@ -183,7 +183,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pen_eject_odl>; + +- pen-insert { ++ switch-pen-insert { + label = "Pen Insert"; + /* Insert = low, eject = high */ + gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; +--- a/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-khadas-edge.dtsi +@@ -136,7 +136,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwrbtn>; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts +@@ -46,9 +46,9 @@ + gpio-keys { + pinctrl-0 = <&reset_button_pin>; + +- /delete-node/ power; ++ /delete-node/ key-power; + +- reset { ++ key-reset { + debounce-interval = <50>; + gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>; + label = "reset"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi +@@ -111,7 +111,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&power_key>; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-orangepi.dts +@@ -78,7 +78,7 @@ + compatible = "gpio-keys"; + autorepeat; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +@@ -76,7 +76,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&lidbtn_pin>; + +- lid { ++ switch-lid { + debounce-interval = <20>; + gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>; + label = "Lid"; +@@ -92,7 +92,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwrbtn_pin>; + +- power { ++ key-power { + debounce-interval = <20>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-roc-pc.dtsi +@@ -54,7 +54,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwr_key_l>; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-rockpro64.dtsi +@@ -42,7 +42,7 @@ + pinctrl-names = "default"; + pinctrl-0 = <&pwrbtn>; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Key Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +@@ -53,7 +53,7 @@ + compatible = "gpio-keys"; + autorepeat; + +- power { ++ key-power { + debounce-interval = <100>; + gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + label = "GPIO Power"; +--- a/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3566-pinenote.dtsi +@@ -49,7 +49,7 @@ + pinctrl-0 = <&hall_int_l>; + pinctrl-names = "default"; + +- cover { ++ switch-cover { + label = "cover"; + gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_LOW>; + linux,input-type = <EV_SW>; diff --git a/target/linux/rockchip/patches-5.19/0028-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rk3568-ev.patch b/target/linux/rockchip/patches-5.19/0028-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rk3568-ev.patch new file mode 100644 index 00000000000000..ed38b3cc617551 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0028-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rk3568-ev.patch @@ -0,0 +1,40 @@ +From ff2aa1ec6f09917d03959bc2250eccf5f9c24f0c Mon Sep 17 00:00:00 2001 +From: Michael Riesch <michael.riesch@wolfvision.net> +Date: Wed, 15 Jun 2022 01:03:53 +0200 +Subject: [PATCH 28/51] arm64: dts: rockchip: enable hdmi tx audio on + rk3568-evb1-v10 + +Enable the I2S0 controller and the hdmi-sound node on the Rockchip +RK3568 EVB1. + +Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> +Link: https://lore.kernel.org/r/20220614230354.3756364-1-michael.riesch@wolfvision.net +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-v10.dts +@@ -239,6 +239,10 @@ + }; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -496,6 +500,10 @@ + }; + }; + ++&i2s0_8ch { ++ status = "okay"; ++}; ++ + &i2s1_8ch { + rockchip,trcm-sync-tx-only; + status = "okay"; diff --git a/target/linux/rockchip/patches-5.19/0029-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rock-3a.patch b/target/linux/rockchip/patches-5.19/0029-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rock-3a.patch new file mode 100644 index 00000000000000..176ac8cb6dde31 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0029-arm64-dts-rockchip-enable-hdmi-tx-audio-on-rock-3a.patch @@ -0,0 +1,39 @@ +From f33757d7c1a25febc85546f9a398e23ad449de05 Mon Sep 17 00:00:00 2001 +From: Michael Riesch <michael.riesch@wolfvision.net> +Date: Wed, 15 Jun 2022 01:03:54 +0200 +Subject: [PATCH 29/51] arm64: dts: rockchip: enable hdmi tx audio on rock-3a + +Enable the I2S0 controller and the hdmi-sound node on the Radxa +ROCK3 Model A. + +Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> +Link: https://lore.kernel.org/r/20220614230354.3756364-2-michael.riesch@wolfvision.net +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +@@ -196,6 +196,10 @@ + }; + }; + ++&hdmi_sound { ++ status = "okay"; ++}; ++ + &i2c0 { + status = "okay"; + +@@ -436,6 +440,10 @@ + }; + }; + ++&i2s0_8ch { ++ status = "okay"; ++}; ++ + &i2s1_8ch { + rockchip,trcm-sync-tx-only; + status = "okay"; diff --git a/target/linux/rockchip/patches-5.19/0030-arm64-dts-rockchip-Add-mt7531-dsa-node-to-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0030-arm64-dts-rockchip-Add-mt7531-dsa-node-to-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..797c4538b90f27 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0030-arm64-dts-rockchip-Add-mt7531-dsa-node-to-BPI-R2-Pro.patch @@ -0,0 +1,72 @@ +From a502eafcfbed31cb01e71e23553f9348a08c3cfe Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Fri, 10 Jun 2022 19:05:41 +0200 +Subject: [PATCH 30/51] arm64: dts: rockchip: Add mt7531 dsa node to BPI-R2-Pro + board + +Add Device Tree node for mt7531 switch connected to gmac0. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> +Signed-off-by: Jakub Kicinski <kuba@kernel.org> +--- + .../boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 48 +++++++++++++++++++ + 1 file changed, 48 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -458,6 +458,54 @@ + status = "okay"; + }; + ++&mdio0 { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ switch@0 { ++ compatible = "mediatek,mt7531"; ++ reg = <0>; ++ ++ ports { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ port@1 { ++ reg = <1>; ++ label = "lan0"; ++ }; ++ ++ port@2 { ++ reg = <2>; ++ label = "lan1"; ++ }; ++ ++ port@3 { ++ reg = <3>; ++ label = "lan2"; ++ }; ++ ++ port@4 { ++ reg = <4>; ++ label = "lan3"; ++ }; ++ ++ port@5 { ++ reg = <5>; ++ label = "cpu"; ++ ethernet = <&gmac0>; ++ phy-mode = "rgmii"; ++ ++ fixed-link { ++ speed = <1000>; ++ full-duplex; ++ pause; ++ }; ++ }; ++ }; ++ }; ++}; ++ + &mdio1 { + rgmii_phy1: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; diff --git a/target/linux/rockchip/patches-5.19/0031-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch b/target/linux/rockchip/patches-5.19/0031-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch new file mode 100644 index 00000000000000..ba29830411603d --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0031-net-dsa-mt7530-rework-mt7530_hw_vlan_-add-del.patch @@ -0,0 +1,87 @@ +From fd0e3d705a8ee61e822c9f4e74c34567a9a31335 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Fri, 10 Jun 2022 19:05:37 +0200 +Subject: [PATCH 31/51] net: dsa: mt7530: rework mt7530_hw_vlan_{add,del} + +Rework vlan_add/vlan_del functions in preparation for dynamic cpu port. + +Currently BIT(MT7530_CPU_PORT) is added to new_members, even though +mt7530_port_vlan_add() will be called on the CPU port too. + +Let DSA core decide when to call port_vlan_add for the CPU port, rather +than doing it implicitly. + +We can do autonomous forwarding in a certain VLAN, but not add br0 to that +VLAN and avoid flooding the CPU with those packets, if software knows it +doesn't need to process them. + +Suggested-by: Vladimir Oltean <olteanv@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Reviewed-by: Vladimir Oltean <olteanv@gmail.com> +Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> +Signed-off-by: Jakub Kicinski <kuba@kernel.org> +--- + drivers/net/dsa/mt7530.c | 30 ++++++++++++------------------ + 1 file changed, 12 insertions(+), 18 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1527,11 +1527,11 @@ static void + mt7530_hw_vlan_add(struct mt7530_priv *priv, + struct mt7530_hw_vlan_entry *entry) + { ++ struct dsa_port *dp = dsa_to_port(priv->ds, entry->port); + u8 new_members; + u32 val; + +- new_members = entry->old_members | BIT(entry->port) | +- BIT(MT7530_CPU_PORT); ++ new_members = entry->old_members | BIT(entry->port); + + /* Validate the entry with independent learning, create egress tag per + * VLAN and joining the port as one of the port members. +@@ -1542,22 +1542,20 @@ mt7530_hw_vlan_add(struct mt7530_priv *p + + /* Decide whether adding tag or not for those outgoing packets from the + * port inside the VLAN. +- */ +- val = entry->untagged ? MT7530_VLAN_EGRESS_UNTAG : +- MT7530_VLAN_EGRESS_TAG; +- mt7530_rmw(priv, MT7530_VAWD2, +- ETAG_CTRL_P_MASK(entry->port), +- ETAG_CTRL_P(entry->port, val)); +- +- /* CPU port is always taken as a tagged port for serving more than one ++ * CPU port is always taken as a tagged port for serving more than one + * VLANs across and also being applied with egress type stack mode for + * that VLAN tags would be appended after hardware special tag used as + * DSA tag. + */ ++ if (dsa_port_is_cpu(dp)) ++ val = MT7530_VLAN_EGRESS_STACK; ++ else if (entry->untagged) ++ val = MT7530_VLAN_EGRESS_UNTAG; ++ else ++ val = MT7530_VLAN_EGRESS_TAG; + mt7530_rmw(priv, MT7530_VAWD2, +- ETAG_CTRL_P_MASK(MT7530_CPU_PORT), +- ETAG_CTRL_P(MT7530_CPU_PORT, +- MT7530_VLAN_EGRESS_STACK)); ++ ETAG_CTRL_P_MASK(entry->port), ++ ETAG_CTRL_P(entry->port, val)); + } + + static void +@@ -1576,11 +1574,7 @@ mt7530_hw_vlan_del(struct mt7530_priv *p + return; + } + +- /* If certain member apart from CPU port is still alive in the VLAN, +- * the entry would be kept valid. Otherwise, the entry is got to be +- * disabled. +- */ +- if (new_members && new_members != BIT(MT7530_CPU_PORT)) { ++ if (new_members) { + val = IVL_MAC | VTAG_EN | PORT_MEM(new_members) | + VLAN_VALID; + mt7530_write(priv, MT7530_VAWD1, val); diff --git a/target/linux/rockchip/patches-5.19/0032-net-dsa-mt7530-rework-mt753-01-_setup.patch b/target/linux/rockchip/patches-5.19/0032-net-dsa-mt7530-rework-mt753-01-_setup.patch new file mode 100644 index 00000000000000..0ce93ecd67c5cf --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0032-net-dsa-mt7530-rework-mt753-01-_setup.patch @@ -0,0 +1,75 @@ +From 65046fea942259fb22ae9cdfb86971d8c4e4237b Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Fri, 10 Jun 2022 19:05:38 +0200 +Subject: [PATCH 32/51] net: dsa: mt7530: rework mt753[01]_setup + +Enumerate available cpu-ports instead of using hardcoded constant. + +Suggested-by: Vladimir Oltean <olteanv@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Reviewed-by: Vladimir Oltean <olteanv@gmail.com> +Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> +Signed-off-by: Jakub Kicinski <kuba@kernel.org> +--- + drivers/net/dsa/mt7530.c | 25 +++++++++++++++++++++---- + 1 file changed, 21 insertions(+), 4 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -2092,11 +2092,12 @@ static int + mt7530_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; ++ struct device_node *dn = NULL; + struct device_node *phy_node; + struct device_node *mac_np; + struct mt7530_dummy_poll p; + phy_interface_t interface; +- struct device_node *dn; ++ struct dsa_port *cpu_dp; + u32 id, val; + int ret, i; + +@@ -2104,7 +2105,19 @@ mt7530_setup(struct dsa_switch *ds) + * controller also is the container for two GMACs nodes representing + * as two netdev instances. + */ +- dn = dsa_to_port(ds, MT7530_CPU_PORT)->master->dev.of_node->parent; ++ dsa_switch_for_each_cpu_port(cpu_dp, ds) { ++ dn = cpu_dp->master->dev.of_node->parent; ++ /* It doesn't matter which CPU port is found first, ++ * their masters should share the same parent OF node ++ */ ++ break; ++ } ++ ++ if (!dn) { ++ dev_err(ds->dev, "parent OF node of DSA master not found"); ++ return -EINVAL; ++ } ++ + ds->assisted_learning_on_cpu_port = true; + ds->mtu_enforcement_ingress = true; + +@@ -2266,6 +2279,7 @@ mt7531_setup(struct dsa_switch *ds) + { + struct mt7530_priv *priv = ds->priv; + struct mt7530_dummy_poll p; ++ struct dsa_port *cpu_dp; + u32 val, id; + int ret, i; + +@@ -2338,8 +2352,11 @@ mt7531_setup(struct dsa_switch *ds) + CORE_PLL_GROUP4, val); + + /* BPDU to CPU port */ +- mt7530_rmw(priv, MT7531_CFC, MT7531_CPU_PMAP_MASK, +- BIT(MT7530_CPU_PORT)); ++ dsa_switch_for_each_cpu_port(cpu_dp, ds) { ++ mt7530_rmw(priv, MT7531_CFC, MT7531_CPU_PMAP_MASK, ++ BIT(cpu_dp->index)); ++ break; ++ } + mt7530_rmw(priv, MT753X_BPC, MT753X_BPDU_PORT_FW_MASK, + MT753X_BPDU_CPU_ONLY); + diff --git a/target/linux/rockchip/patches-5.19/0033-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch b/target/linux/rockchip/patches-5.19/0033-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch new file mode 100644 index 00000000000000..d06f4703f41d20 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0033-net-dsa-mt7530-get-cpu-port-via-dp-cpu_dp-instead-of.patch @@ -0,0 +1,117 @@ +From 28650c65d8ca16a1b607a06fd0bce67371143069 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Fri, 10 Jun 2022 19:05:39 +0200 +Subject: [PATCH 33/51] net: dsa: mt7530: get cpu-port via dp->cpu_dp instead + of constant + +Replace last occurences of hardcoded cpu-port by cpu_dp member of +dsa_port struct. + +Now the constant can be dropped. + +Suggested-by: Vladimir Oltean <olteanv@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Reviewed-by: Vladimir Oltean <olteanv@gmail.com> +Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> +Signed-off-by: Jakub Kicinski <kuba@kernel.org> +--- + drivers/net/dsa/mt7530.c | 27 ++++++++++++++++++++------- + drivers/net/dsa/mt7530.h | 1 - + 2 files changed, 20 insertions(+), 8 deletions(-) + +--- a/drivers/net/dsa/mt7530.c ++++ b/drivers/net/dsa/mt7530.c +@@ -1038,6 +1038,7 @@ static int + mt7530_port_enable(struct dsa_switch *ds, int port, + struct phy_device *phy) + { ++ struct dsa_port *dp = dsa_to_port(ds, port); + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1046,7 +1047,11 @@ mt7530_port_enable(struct dsa_switch *ds + * restore the port matrix if the port is the member of a certain + * bridge. + */ +- priv->ports[port].pm |= PCR_MATRIX(BIT(MT7530_CPU_PORT)); ++ if (dsa_port_is_user(dp)) { ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ ++ priv->ports[port].pm |= PCR_MATRIX(BIT(cpu_dp->index)); ++ } + priv->ports[port].enable = true; + mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK, + priv->ports[port].pm); +@@ -1195,7 +1200,8 @@ mt7530_port_bridge_join(struct dsa_switc + struct netlink_ext_ack *extack) + { + struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; +- u32 port_bitmap = BIT(MT7530_CPU_PORT); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ u32 port_bitmap = BIT(cpu_dp->index); + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1272,9 +1278,12 @@ mt7530_port_set_vlan_unaware(struct dsa_ + * the CPU port get out of VLAN filtering mode. + */ + if (all_user_ports_removed) { +- mt7530_write(priv, MT7530_PCR_P(MT7530_CPU_PORT), ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ ++ mt7530_write(priv, MT7530_PCR_P(cpu_dp->index), + PCR_MATRIX(dsa_user_ports(priv->ds))); +- mt7530_write(priv, MT7530_PVC_P(MT7530_CPU_PORT), PORT_SPEC_TAG ++ mt7530_write(priv, MT7530_PVC_P(cpu_dp->index), PORT_SPEC_TAG + | PVC_EG_TAG(MT7530_VLAN_EG_CONSISTENT)); + } + } +@@ -1312,6 +1321,7 @@ mt7530_port_bridge_leave(struct dsa_swit + struct dsa_bridge bridge) + { + struct dsa_port *dp = dsa_to_port(ds, port), *other_dp; ++ struct dsa_port *cpu_dp = dp->cpu_dp; + struct mt7530_priv *priv = ds->priv; + + mutex_lock(&priv->reg_mutex); +@@ -1340,8 +1350,8 @@ mt7530_port_bridge_leave(struct dsa_swit + */ + if (priv->ports[port].enable) + mt7530_rmw(priv, MT7530_PCR_P(port), PCR_MATRIX_MASK, +- PCR_MATRIX(BIT(MT7530_CPU_PORT))); +- priv->ports[port].pm = PCR_MATRIX(BIT(MT7530_CPU_PORT)); ++ PCR_MATRIX(BIT(cpu_dp->index))); ++ priv->ports[port].pm = PCR_MATRIX(BIT(cpu_dp->index)); + + /* When a port is removed from the bridge, the port would be set up + * back to the default as is at initial boot which is a VLAN-unaware +@@ -1508,6 +1518,9 @@ static int + mt7530_port_vlan_filtering(struct dsa_switch *ds, int port, bool vlan_filtering, + struct netlink_ext_ack *extack) + { ++ struct dsa_port *dp = dsa_to_port(ds, port); ++ struct dsa_port *cpu_dp = dp->cpu_dp; ++ + if (vlan_filtering) { + /* The port is being kept as VLAN-unaware port when bridge is + * set up with vlan_filtering not being set, Otherwise, the +@@ -1515,7 +1528,7 @@ mt7530_port_vlan_filtering(struct dsa_sw + * for becoming a VLAN-aware port. + */ + mt7530_port_set_vlan_aware(ds, port); +- mt7530_port_set_vlan_aware(ds, MT7530_CPU_PORT); ++ mt7530_port_set_vlan_aware(ds, cpu_dp->index); + } else { + mt7530_port_set_vlan_unaware(ds, port); + } +--- a/drivers/net/dsa/mt7530.h ++++ b/drivers/net/dsa/mt7530.h +@@ -8,7 +8,6 @@ + + #define MT7530_NUM_PORTS 7 + #define MT7530_NUM_PHYS 5 +-#define MT7530_CPU_PORT 6 + #define MT7530_NUM_FDB_RECORDS 2048 + #define MT7530_ALL_MEMBERS 0xff + diff --git a/target/linux/rockchip/patches-5.19/0034-drm-rockchip-Fix-Kconfig-dependencies-for-display-po.patch b/target/linux/rockchip/patches-5.19/0034-drm-rockchip-Fix-Kconfig-dependencies-for-display-po.patch new file mode 100644 index 00000000000000..47cb28b7b92e47 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0034-drm-rockchip-Fix-Kconfig-dependencies-for-display-po.patch @@ -0,0 +1,46 @@ +From 83aef06999a8ee66444ef52986834780f5e4f94a Mon Sep 17 00:00:00 2001 +From: Ren Zhijie <renzhijie2@huawei.com> +Date: Sat, 7 May 2022 18:09:10 +0800 +Subject: [PATCH 34/51] drm/rockchip: Fix Kconfig dependencies for display-port + encoders + +The DP-helper module has been replaced by the display-helper module. +So the driver have to select it. + +Reported-by: Hulk Robot <hulkci@huawei.com> +Fixes: 1e0f66420b13("drm/display: Introduce a DRM display-helper module") +Signed-off-by: Ren Zhijie <renzhijie2@huawei.com> +Reviewed-by: Andy Yan <andy.yan@rock-chips.com> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/20220507100910.93705-1-renzhijie2@huawei.com +--- + drivers/gpu/drm/rockchip/Kconfig | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/rockchip/Kconfig ++++ b/drivers/gpu/drm/rockchip/Kconfig +@@ -2,7 +2,6 @@ + config DRM_ROCKCHIP + tristate "DRM Support for Rockchip" + depends on DRM && ROCKCHIP_IOMMU +- select DRM_DISPLAY_HELPER if ROCKCHIP_ANALOGIX_DP + select DRM_GEM_CMA_HELPER + select DRM_KMS_HELPER + select DRM_PANEL +@@ -38,6 +37,7 @@ config ROCKCHIP_VOP2 + config ROCKCHIP_ANALOGIX_DP + bool "Rockchip specific extensions for Analogix DP driver" + depends on ROCKCHIP_VOP ++ select DRM_DISPLAY_HELPER + select DRM_DISPLAY_DP_HELPER + help + This selects support for Rockchip SoC specific extensions +@@ -47,6 +47,8 @@ config ROCKCHIP_ANALOGIX_DP + config ROCKCHIP_CDN_DP + bool "Rockchip cdn DP" + depends on EXTCON=y || (EXTCON=m && DRM_ROCKCHIP=m) ++ select DRM_DISPLAY_HELPER ++ select DRM_DISPLAY_DP_HELPER + help + This selects support for Rockchip SoC specific extensions + for the cdn DP driver. If you want to enable Dp on diff --git a/target/linux/rockchip/patches-5.19/0035-drm-rockchip-remove-unneeded-semicolon-from-vop2-dri.patch b/target/linux/rockchip/patches-5.19/0035-drm-rockchip-remove-unneeded-semicolon-from-vop2-dri.patch new file mode 100644 index 00000000000000..86923bcc3f3278 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0035-drm-rockchip-remove-unneeded-semicolon-from-vop2-dri.patch @@ -0,0 +1,29 @@ +From 9226222a72f2a336495728d24cd9bff7685f1cbe Mon Sep 17 00:00:00 2001 +From: Yang Li <yang.lee@linux.alibaba.com> +Date: Fri, 6 May 2022 07:26:59 +0800 +Subject: [PATCH 35/51] drm/rockchip: remove unneeded semicolon from vop2 + driver + +Eliminate the following coccicheck warning: +./drivers/gpu/drm/rockchip/rockchip_drm_vop2.c:1476:2-3: Unneeded +semicolon + +Reported-by: Abaci Robot <abaci@linux.alibaba.com> +Signed-off-by: Yang Li <yang.lee@linux.alibaba.com> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/20220505232659.4405-1-yang.lee@linux.alibaba.com +--- + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +@@ -1473,7 +1473,7 @@ static void rk3568_set_intf_mux(struct v + default: + drm_err(vop2->drm, "Invalid interface id %d on vp%d\n", id, vp->id); + return; +- }; ++ } + + dip |= RK3568_DSP_IF_POL__CFG_DONE_IMD; + diff --git a/target/linux/rockchip/patches-5.19/0036-drm-rockchip-Fix-spelling-mistake-aligened-aligned.patch b/target/linux/rockchip/patches-5.19/0036-drm-rockchip-Fix-spelling-mistake-aligened-aligned.patch new file mode 100644 index 00000000000000..0b3925a6926eb5 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0036-drm-rockchip-Fix-spelling-mistake-aligened-aligned.patch @@ -0,0 +1,26 @@ +From c130c07b62dd4cc18c9b10ab65da6c6a5d41fcfa Mon Sep 17 00:00:00 2001 +From: Colin Ian King <colin.i.king@gmail.com> +Date: Thu, 5 May 2022 12:10:44 +0100 +Subject: [PATCH 36/51] drm/rockchip: Fix spelling mistake "aligened" -> + "aligned" + +There is a spelling mistake in a drm_err message. Fix it. + +Signed-off-by: Colin Ian King <colin.i.king@gmail.com> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/20220505111044.374174-1-colin.i.king@gmail.com +--- + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +@@ -1202,7 +1202,7 @@ static void vop2_plane_atomic_update(str + */ + stride = (fb->pitches[0] << 3) / bpp; + if ((stride & 0x3f) && (xmirror || rotate_90 || rotate_270)) +- drm_err(vop2->drm, "vp%d %s stride[%d] not 64 pixel aligened\n", ++ drm_err(vop2->drm, "vp%d %s stride[%d] not 64 pixel aligned\n", + vp->id, win->data->name, stride); + + rb_swap = vop2_afbc_rb_swap(fb->format->format); diff --git a/target/linux/rockchip/patches-5.19/0037-drm-rockchip-vop2-unlock-on-error-path-in-vop2_crtc_.patch b/target/linux/rockchip/patches-5.19/0037-drm-rockchip-vop2-unlock-on-error-path-in-vop2_crtc_.patch new file mode 100644 index 00000000000000..44b785076bfd84 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0037-drm-rockchip-vop2-unlock-on-error-path-in-vop2_crtc_.patch @@ -0,0 +1,27 @@ +From 118f07ebcff85e505941b9806171d2fab0cb7b8e Mon Sep 17 00:00:00 2001 +From: Dan Carpenter <dan.carpenter@oracle.com> +Date: Mon, 9 May 2022 12:05:05 +0300 +Subject: [PATCH 37/51] drm/rockchip: vop2: unlock on error path in + vop2_crtc_atomic_enable() + +This error path needs an unlock before returning. + +Fixes: 604be85547ce ("drm/rockchip: Add VOP2 driver") +Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> +Acked-by: Sascha Hauer <s.hauer@pengutronix.de> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/YnjZQRV9lpub2ET8@kili +--- + drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +@@ -1524,6 +1524,7 @@ static void vop2_crtc_atomic_enable(stru + if (ret < 0) { + drm_err(vop2->drm, "failed to enable dclk for video port%d - %d\n", + vp->id, ret); ++ vop2_unlock(vop2); + return; + } + diff --git a/target/linux/rockchip/patches-5.19/0038-drm-Drop-drm_edid.h-from-drm_crtc.h.patch b/target/linux/rockchip/patches-5.19/0038-drm-Drop-drm_edid.h-from-drm_crtc.h.patch new file mode 100644 index 00000000000000..95eb69b22e4378 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0038-drm-Drop-drm_edid.h-from-drm_crtc.h.patch @@ -0,0 +1,569 @@ +From 38666f6a53492c98e2224bb292b89671bc2ed866 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> +Date: Tue, 14 Jun 2022 12:02:45 +0300 +Subject: [PATCH 38/51] drm: Drop drm_edid.h from drm_crtc.h +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +drm_crtc.h has no need for drm_edid.h, so don't include it. +Avoids useless rebuilds of the entire universe when +touching drm_edid.h. + +Quite a few placs do currently depend on drm_edid.h without +actually including it directly. All of those need to be fixed +up. + +v2: Fix up i915 and msm some more +v3: Fix alphabetical ordering (Sam) + +Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> +Link: https://patchwork.freedesktop.org/patch/msgid/20220614090245.30283-1-ville.syrjala@linux.intel.com +Acked-by: Sam Ravnborg <sam@ravnborg.org> +Acked-by: Jani Nikula <jani.nikula@intel.com> +--- + drivers/gpu/drm/arm/malidp_mw.c | 1 + + drivers/gpu/drm/aspeed/aspeed_gfx_out.c | 1 + + drivers/gpu/drm/ast/ast_mode.c | 1 + + drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 1 + + drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c | 1 + + drivers/gpu/drm/bridge/lontium-lt8912b.c | 1 + + drivers/gpu/drm/bridge/parade-ps8640.c | 1 + + drivers/gpu/drm/bridge/simple-bridge.c | 1 + + drivers/gpu/drm/bridge/ti-tfp410.c | 1 + + drivers/gpu/drm/display/drm_dp_helper.c | 1 + + drivers/gpu/drm/display/drm_dp_mst_topology.c | 1 + + drivers/gpu/drm/drm_client_modeset.c | 1 + + drivers/gpu/drm/drm_kms_helper_common.c | 1 + + drivers/gpu/drm/drm_modes.c | 1 + + drivers/gpu/drm/exynos/exynos_mixer.c | 1 + + drivers/gpu/drm/gma500/cdv_intel_dp.c | 1 + + drivers/gpu/drm/gma500/oaktrail_hdmi.c | 1 + + drivers/gpu/drm/gma500/oaktrail_lvds.c | 1 + + drivers/gpu/drm/gma500/psb_intel_modes.c | 2 ++ + drivers/gpu/drm/gud/gud_connector.c | 1 + + drivers/gpu/drm/i915/display/intel_bios.c | 1 + + drivers/gpu/drm/i915/display/intel_dp.c | 1 + + drivers/gpu/drm/i915/display/intel_lspcon.c | 1 + + drivers/gpu/drm/i915/display/intel_opregion.c | 2 ++ + drivers/gpu/drm/imx/imx-ldb.c | 1 + + drivers/gpu/drm/imx/imx-tve.c | 1 + + drivers/gpu/drm/imx/parallel-display.c | 1 + + drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 2 ++ + drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 1 + + drivers/gpu/drm/omapdrm/dss/hdmi4.c | 1 + + drivers/gpu/drm/omapdrm/dss/hdmi5.c | 1 + + drivers/gpu/drm/panel/panel-edp.c | 1 + + drivers/gpu/drm/panel/panel-simple.c | 1 + + drivers/gpu/drm/qxl/qxl_display.c | 1 + + drivers/gpu/drm/rcar-du/rcar_du_writeback.c | 1 + + drivers/gpu/drm/rockchip/rk3066_hdmi.c | 1 + + drivers/gpu/drm/solomon/ssd130x.c | 1 + + drivers/gpu/drm/stm/ltdc.c | 1 + + drivers/gpu/drm/tiny/arcpgu.c | 1 + + drivers/gpu/drm/tiny/bochs.c | 1 + + drivers/gpu/drm/tiny/cirrus.c | 1 + + drivers/gpu/drm/tiny/gm12u320.c | 1 + + drivers/gpu/drm/udl/udl_connector.c | 1 + + drivers/gpu/drm/vboxvideo/vbox_mode.c | 1 + + drivers/gpu/drm/virtio/virtgpu_display.c | 1 + + drivers/gpu/drm/virtio/virtgpu_vq.c | 2 ++ + drivers/gpu/drm/vkms/vkms_output.c | 1 + + drivers/gpu/drm/vkms/vkms_writeback.c | 1 + + include/drm/drm_crtc.h | 1 - + 49 files changed, 52 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/arm/malidp_mw.c ++++ b/drivers/gpu/drm/arm/malidp_mw.c +@@ -9,6 +9,7 @@ + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_helper.h> + #include <drm/drm_crtc.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_cma_helper.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_cma_helper.h> +--- a/drivers/gpu/drm/aspeed/aspeed_gfx_out.c ++++ b/drivers/gpu/drm/aspeed/aspeed_gfx_out.c +@@ -4,6 +4,7 @@ + #include <drm/drm_atomic_helper.h> + #include <drm/drm_connector.h> + #include <drm/drm_crtc_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_probe_helper.h> + + #include "aspeed_gfx.h" +--- a/drivers/gpu/drm/ast/ast_mode.c ++++ b/drivers/gpu/drm/ast/ast_mode.c +@@ -36,6 +36,7 @@ + #include <drm/drm_atomic_state_helper.h> + #include <drm/drm_crtc.h> + #include <drm/drm_crtc_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_atomic_helper.h> + #include <drm/drm_gem_framebuffer_helper.h> +--- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c ++++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c +@@ -24,6 +24,7 @@ + #include <drm/drm_bridge.h> + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_panel.h> + #include <drm/drm_print.h> + #include <drm/drm_probe_helper.h> +--- a/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c ++++ b/drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c +@@ -43,6 +43,7 @@ + #include <drm/drm_bridge.h> + #include <drm/drm_connector.h> + #include <drm/drm_crtc_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_modeset_helper_vtables.h> + #include <drm/drm_print.h> + #include <drm/drm_probe_helper.h> +--- a/drivers/gpu/drm/bridge/lontium-lt8912b.c ++++ b/drivers/gpu/drm/bridge/lontium-lt8912b.c +@@ -11,6 +11,7 @@ + + #include <drm/drm_probe_helper.h> + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_mipi_dsi.h> + #include <drm/drm_of.h> + +--- a/drivers/gpu/drm/bridge/parade-ps8640.c ++++ b/drivers/gpu/drm/bridge/parade-ps8640.c +@@ -16,6 +16,7 @@ + #include <drm/display/drm_dp_aux_bus.h> + #include <drm/display/drm_dp_helper.h> + #include <drm/drm_bridge.h> ++#include <drm/drm_edid.h> + #include <drm/drm_mipi_dsi.h> + #include <drm/drm_of.h> + #include <drm/drm_panel.h> +--- a/drivers/gpu/drm/bridge/simple-bridge.c ++++ b/drivers/gpu/drm/bridge/simple-bridge.c +@@ -15,6 +15,7 @@ + #include <drm/drm_atomic_helper.h> + #include <drm/drm_bridge.h> + #include <drm/drm_crtc.h> ++#include <drm/drm_edid.h> + #include <drm/drm_print.h> + #include <drm/drm_probe_helper.h> + +--- a/drivers/gpu/drm/bridge/ti-tfp410.c ++++ b/drivers/gpu/drm/bridge/ti-tfp410.c +@@ -14,6 +14,7 @@ + #include <drm/drm_atomic_helper.h> + #include <drm/drm_bridge.h> + #include <drm/drm_crtc.h> ++#include <drm/drm_edid.h> + #include <drm/drm_print.h> + #include <drm/drm_probe_helper.h> + +--- a/drivers/gpu/drm/display/drm_dp_helper.c ++++ b/drivers/gpu/drm/display/drm_dp_helper.c +@@ -32,6 +32,7 @@ + + #include <drm/display/drm_dp_helper.h> + #include <drm/display/drm_dp_mst_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_print.h> + #include <drm/drm_vblank.h> + #include <drm/drm_panel.h> +--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c ++++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c +@@ -42,6 +42,7 @@ + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_helper.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_print.h> + #include <drm/drm_probe_helper.h> + +--- a/drivers/gpu/drm/drm_client_modeset.c ++++ b/drivers/gpu/drm/drm_client_modeset.c +@@ -19,6 +19,7 @@ + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_encoder.h> + #include <drm/drm_print.h> + +--- a/drivers/gpu/drm/drm_kms_helper_common.c ++++ b/drivers/gpu/drm/drm_kms_helper_common.c +@@ -27,6 +27,7 @@ + + #include <linux/module.h> + ++#include <drm/drm_edid.h> + #include <drm/drm_print.h> + + #include "drm_crtc_helper_internal.h" +--- a/drivers/gpu/drm/drm_modes.c ++++ b/drivers/gpu/drm/drm_modes.c +@@ -41,6 +41,7 @@ + + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_modes.h> + #include <drm/drm_print.h> + +--- a/drivers/gpu/drm/exynos/exynos_mixer.c ++++ b/drivers/gpu/drm/exynos/exynos_mixer.c +@@ -25,6 +25,7 @@ + #include <linux/spinlock.h> + #include <linux/wait.h> + ++#include <drm/drm_edid.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_vblank.h> + #include <drm/exynos_drm.h> +--- a/drivers/gpu/drm/gma500/cdv_intel_dp.c ++++ b/drivers/gpu/drm/gma500/cdv_intel_dp.c +@@ -32,6 +32,7 @@ + #include <drm/display/drm_dp_helper.h> + #include <drm/drm_crtc.h> + #include <drm/drm_crtc_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_simple_kms_helper.h> + + #include "gma_display.h" +--- a/drivers/gpu/drm/gma500/oaktrail_hdmi.c ++++ b/drivers/gpu/drm/gma500/oaktrail_hdmi.c +@@ -27,6 +27,7 @@ + #include <linux/delay.h> + + #include <drm/drm.h> ++#include <drm/drm_edid.h> + #include <drm/drm_simple_kms_helper.h> + + #include "psb_drv.h" +--- a/drivers/gpu/drm/gma500/oaktrail_lvds.c ++++ b/drivers/gpu/drm/gma500/oaktrail_lvds.c +@@ -13,6 +13,7 @@ + + #include <asm/intel-mid.h> + ++#include <drm/drm_edid.h> + #include <drm/drm_simple_kms_helper.h> + + #include "intel_bios.h" +--- a/drivers/gpu/drm/gma500/psb_intel_modes.c ++++ b/drivers/gpu/drm/gma500/psb_intel_modes.c +@@ -7,6 +7,8 @@ + + #include <linux/i2c.h> + ++#include <drm/drm_edid.h> ++ + #include "psb_intel_drv.h" + + /** +--- a/drivers/gpu/drm/gud/gud_connector.c ++++ b/drivers/gpu/drm/gud/gud_connector.c +@@ -10,6 +10,7 @@ + #include <drm/drm_atomic_state_helper.h> + #include <drm/drm_connector.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_encoder.h> + #include <drm/drm_file.h> + #include <drm/drm_modeset_helper_vtables.h> +--- a/drivers/gpu/drm/i915/display/intel_bios.c ++++ b/drivers/gpu/drm/i915/display/intel_bios.c +@@ -25,6 +25,7 @@ + * + */ + ++#include <drm/drm_edid.h> + #include <drm/display/drm_dp_helper.h> + #include <drm/display/drm_dsc_helper.h> + +--- a/drivers/gpu/drm/i915/display/intel_dp.c ++++ b/drivers/gpu/drm/i915/display/intel_dp.c +@@ -40,6 +40,7 @@ + #include <drm/display/drm_hdmi_helper.h> + #include <drm/drm_atomic_helper.h> + #include <drm/drm_crtc.h> ++#include <drm/drm_edid.h> + #include <drm/drm_probe_helper.h> + + #include "g4x_dp.h" +--- a/drivers/gpu/drm/i915/display/intel_lspcon.c ++++ b/drivers/gpu/drm/i915/display/intel_lspcon.c +@@ -26,6 +26,7 @@ + #include <drm/display/drm_dp_dual_mode_helper.h> + #include <drm/display/drm_hdmi_helper.h> + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + + #include "intel_de.h" + #include "intel_display_types.h" +--- a/drivers/gpu/drm/i915/display/intel_opregion.c ++++ b/drivers/gpu/drm/i915/display/intel_opregion.c +@@ -30,6 +30,8 @@ + #include <linux/firmware.h> + #include <acpi/video.h> + ++#include <drm/drm_edid.h> ++ + #include "i915_drv.h" + #include "intel_acpi.h" + #include "intel_backlight.h" +--- a/drivers/gpu/drm/imx/imx-ldb.c ++++ b/drivers/gpu/drm/imx/imx-ldb.c +@@ -21,6 +21,7 @@ + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_helper.h> + #include <drm/drm_bridge.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_managed.h> + #include <drm/drm_of.h> +--- a/drivers/gpu/drm/imx/imx-tve.c ++++ b/drivers/gpu/drm/imx/imx-tve.c +@@ -18,6 +18,7 @@ + #include <video/imx-ipu-v3.h> + + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_managed.h> + #include <drm/drm_probe_helper.h> +--- a/drivers/gpu/drm/imx/parallel-display.c ++++ b/drivers/gpu/drm/imx/parallel-display.c +@@ -14,6 +14,7 @@ + + #include <drm/drm_atomic_helper.h> + #include <drm/drm_bridge.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_managed.h> + #include <drm/drm_of.h> +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c +@@ -3,6 +3,8 @@ + * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + */ + ++#include <drm/drm_edid.h> ++ + #include "dpu_writeback.h" + + static int dpu_wb_conn_get_modes(struct drm_connector *connector) +--- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c ++++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +@@ -6,6 +6,7 @@ + + #include <linux/delay.h> + #include <drm/drm_bridge_connector.h> ++#include <drm/drm_edid.h> + + #include "msm_kms.h" + #include "hdmi.h" +--- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c ++++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c +@@ -29,6 +29,7 @@ + + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_state_helper.h> ++#include <drm/drm_edid.h> + + #include "omapdss.h" + #include "hdmi4_core.h" +--- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c ++++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c +@@ -32,6 +32,7 @@ + + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_state_helper.h> ++#include <drm/drm_edid.h> + + #include "omapdss.h" + #include "hdmi5_core.h" +--- a/drivers/gpu/drm/panel/panel-edp.c ++++ b/drivers/gpu/drm/panel/panel-edp.c +@@ -39,6 +39,7 @@ + #include <drm/display/drm_dp_helper.h> + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_panel.h> + + /** +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -35,6 +35,7 @@ + + #include <drm/drm_crtc.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_mipi_dsi.h> + #include <drm/drm_panel.h> + +--- a/drivers/gpu/drm/qxl/qxl_display.c ++++ b/drivers/gpu/drm/qxl/qxl_display.c +@@ -30,6 +30,7 @@ + #include <drm/drm_drv.h> + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_gem_framebuffer_helper.h> + #include <drm/drm_plane_helper.h> + #include <drm/drm_probe_helper.h> +--- a/drivers/gpu/drm/rcar-du/rcar_du_writeback.c ++++ b/drivers/gpu/drm/rcar-du/rcar_du_writeback.c +@@ -7,6 +7,7 @@ + + #include <drm/drm_atomic_helper.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_probe_helper.h> + #include <drm/drm_writeback.h> +--- a/drivers/gpu/drm/rockchip/rk3066_hdmi.c ++++ b/drivers/gpu/drm/rockchip/rk3066_hdmi.c +@@ -4,6 +4,7 @@ + * Zheng Yang <zhengyang@rock-chips.com> + */ + ++#include <drm/drm_edid.h> + #include <drm/drm_of.h> + #include <drm/drm_probe_helper.h> + #include <drm/drm_simple_kms_helper.h> +--- a/drivers/gpu/drm/solomon/ssd130x.c ++++ b/drivers/gpu/drm/solomon/ssd130x.c +@@ -20,6 +20,7 @@ + + #include <drm/drm_atomic_helper.h> + #include <drm/drm_damage_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_cma_helper.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_format_helper.h> +--- a/drivers/gpu/drm/stm/ltdc.c ++++ b/drivers/gpu/drm/stm/ltdc.c +@@ -25,6 +25,7 @@ + #include <drm/drm_atomic_helper.h> + #include <drm/drm_bridge.h> + #include <drm/drm_device.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_cma_helper.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_atomic_helper.h> +--- a/drivers/gpu/drm/tiny/arcpgu.c ++++ b/drivers/gpu/drm/tiny/arcpgu.c +@@ -10,6 +10,7 @@ + #include <drm/drm_debugfs.h> + #include <drm/drm_device.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_cma_helper.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_fourcc.h> +--- a/drivers/gpu/drm/tiny/bochs.c ++++ b/drivers/gpu/drm/tiny/bochs.c +@@ -5,6 +5,7 @@ + #include <drm/drm_aperture.h> + #include <drm/drm_atomic_helper.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_framebuffer_helper.h> +--- a/drivers/gpu/drm/tiny/cirrus.c ++++ b/drivers/gpu/drm/tiny/cirrus.c +@@ -29,6 +29,7 @@ + #include <drm/drm_connector.h> + #include <drm/drm_damage_helper.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_file.h> + #include <drm/drm_format_helper.h> +--- a/drivers/gpu/drm/tiny/gm12u320.c ++++ b/drivers/gpu/drm/tiny/gm12u320.c +@@ -11,6 +11,7 @@ + #include <drm/drm_connector.h> + #include <drm/drm_damage_helper.h> + #include <drm/drm_drv.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_file.h> + #include <drm/drm_format_helper.h> +--- a/drivers/gpu/drm/udl/udl_connector.c ++++ b/drivers/gpu/drm/udl/udl_connector.c +@@ -8,6 +8,7 @@ + */ + + #include <drm/drm_atomic_state_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_crtc_helper.h> + #include <drm/drm_probe_helper.h> + +--- a/drivers/gpu/drm/vboxvideo/vbox_mode.c ++++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c +@@ -15,6 +15,7 @@ + + #include <drm/drm_atomic.h> + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fb_helper.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_atomic_helper.h> +--- a/drivers/gpu/drm/virtio/virtgpu_display.c ++++ b/drivers/gpu/drm/virtio/virtgpu_display.c +@@ -27,6 +27,7 @@ + + #include <drm/drm_atomic_helper.h> + #include <drm/drm_damage_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_gem_framebuffer_helper.h> + #include <drm/drm_probe_helper.h> +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -31,6 +31,8 @@ + #include <linux/virtio_config.h> + #include <linux/virtio_ring.h> + ++#include <drm/drm_edid.h> ++ + #include "virtgpu_drv.h" + #include "virtgpu_trace.h" + +--- a/drivers/gpu/drm/vkms/vkms_output.c ++++ b/drivers/gpu/drm/vkms/vkms_output.c +@@ -2,6 +2,7 @@ + + #include "vkms_drv.h" + #include <drm/drm_atomic_helper.h> ++#include <drm/drm_edid.h> + #include <drm/drm_probe_helper.h> + #include <drm/drm_simple_kms_helper.h> + +--- a/drivers/gpu/drm/vkms/vkms_writeback.c ++++ b/drivers/gpu/drm/vkms/vkms_writeback.c +@@ -3,6 +3,7 @@ + #include <linux/iosys-map.h> + + #include <drm/drm_atomic.h> ++#include <drm/drm_edid.h> + #include <drm/drm_fourcc.h> + #include <drm/drm_writeback.h> + #include <drm/drm_probe_helper.h> +--- a/include/drm/drm_crtc.h ++++ b/include/drm/drm_crtc.h +@@ -41,7 +41,6 @@ + #include <drm/drm_connector.h> + #include <drm/drm_device.h> + #include <drm/drm_property.h> +-#include <drm/drm_edid.h> + #include <drm/drm_plane.h> + #include <drm/drm_blend.h> + #include <drm/drm_color_mgmt.h> diff --git a/target/linux/rockchip/patches-5.19/0039-drm-rockchip-vop-Don-t-crash-for-invalid-duplicate_s.patch b/target/linux/rockchip/patches-5.19/0039-drm-rockchip-vop-Don-t-crash-for-invalid-duplicate_s.patch new file mode 100644 index 00000000000000..4bc1c5b6cf928d --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0039-drm-rockchip-vop-Don-t-crash-for-invalid-duplicate_s.patch @@ -0,0 +1,33 @@ +From efaa0a55ce429107697f641921336cc51518693a Mon Sep 17 00:00:00 2001 +From: Brian Norris <briannorris@chromium.org> +Date: Fri, 17 Jun 2022 17:26:52 -0700 +Subject: [PATCH 39/51] drm/rockchip: vop: Don't crash for invalid + duplicate_state() + +It's possible for users to try to duplicate the CRTC state even when the +state doesn't exist. drm_atomic_helper_crtc_duplicate_state() (and other +users of __drm_atomic_helper_crtc_duplicate_state()) already guard this +with a WARN_ON() instead of crashing, so let's do that here too. + +Fixes: 4e257d9eee23 ("drm/rockchip: get rid of rockchip_drm_crtc_mode_config") +Signed-off-by: Brian Norris <briannorris@chromium.org> +Reviewed-by: Sean Paul <seanpaul@chromium.org> +Reviewed-by: Douglas Anderson <dianders@chromium.org> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/20220617172623.1.I62db228170b1559ada60b8d3e1637e1688424926@changeid +--- + drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +@@ -1570,6 +1570,9 @@ static struct drm_crtc_state *vop_crtc_d + { + struct rockchip_crtc_state *rockchip_state; + ++ if (WARN_ON(!crtc->state)) ++ return NULL; ++ + rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL); + if (!rockchip_state) + return NULL; diff --git a/target/linux/rockchip/patches-5.19/0040-drm-rockchip-Fix-an-error-handling-path-rockchip_dp_.patch b/target/linux/rockchip/patches-5.19/0040-drm-rockchip-Fix-an-error-handling-path-rockchip_dp_.patch new file mode 100644 index 00000000000000..9843250604df75 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0040-drm-rockchip-Fix-an-error-handling-path-rockchip_dp_.patch @@ -0,0 +1,36 @@ +From 189fcc50d8531f4904a96aac754fd61c26c4dd3c Mon Sep 17 00:00:00 2001 +From: Christophe JAILLET <christophe.jaillet@wanadoo.fr> +Date: Sat, 18 Jun 2022 19:08:05 +0200 +Subject: [PATCH 40/51] drm/rockchip: Fix an error handling path + rockchip_dp_probe() + +Should component_add() fail, we should call analogix_dp_remove() in the +error handling path, as already done in the remove function. + +Fixes: 152cce0006ab ("drm/bridge: analogix_dp: Split bind() into probe() and real bind()") +Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr> +Signed-off-by: Heiko Stuebner <heiko@sntech.de> +Link: https://patchwork.freedesktop.org/patch/msgid/b719d9061bb97eb85145fbd3c5e63f4549f2e13e.1655572071.git.christophe.jaillet@wanadoo.fr +--- + drivers/gpu/drm/rockchip/analogix_dp-rockchip.c | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +--- a/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c ++++ b/drivers/gpu/drm/rockchip/analogix_dp-rockchip.c +@@ -408,7 +408,15 @@ static int rockchip_dp_probe(struct plat + if (IS_ERR(dp->adp)) + return PTR_ERR(dp->adp); + +- return component_add(dev, &rockchip_dp_component_ops); ++ ret = component_add(dev, &rockchip_dp_component_ops); ++ if (ret) ++ goto err_dp_remove; ++ ++ return 0; ++ ++err_dp_remove: ++ analogix_dp_remove(dp->adp); ++ return ret; + } + + static int rockchip_dp_remove(struct platform_device *pdev) diff --git a/target/linux/rockchip/patches-5.19/0042-phy-rockchip-inno-usb2-Prevent-incorrect-error-on-pr.patch b/target/linux/rockchip/patches-5.19/0042-phy-rockchip-inno-usb2-Prevent-incorrect-error-on-pr.patch new file mode 100644 index 00000000000000..09ce9f00a16603 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0042-phy-rockchip-inno-usb2-Prevent-incorrect-error-on-pr.patch @@ -0,0 +1,28 @@ +From cc4992ccf916a3040c349d51ad40f2a2dd2e4e0c Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Sat, 25 Jun 2022 17:27:11 -0400 +Subject: [PATCH 42/51] phy: rockchip-inno-usb2: Prevent incorrect error on + probe + +If a phy supply is designated but isn't available at probe time, an +EPROBE_DEFER is returned. Use dev_err_probe to prevent this from +incorrectly printing during boot. + +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Link: https://lore.kernel.org/r/20220625212711.558495-1-pgwipeout@gmail.com +Signed-off-by: Vinod Koul <vkoul@kernel.org> +--- + drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c ++++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +@@ -1283,7 +1283,7 @@ static int rockchip_usb2phy_probe(struct + + phy = devm_phy_create(dev, child_np, &rockchip_usb2phy_ops); + if (IS_ERR(phy)) { +- dev_err(dev, "failed to create phy\n"); ++ dev_err_probe(dev, PTR_ERR(phy), "failed to create phy\n"); + ret = PTR_ERR(phy); + goto put_child; + } diff --git a/target/linux/rockchip/patches-5.19/0043-phy-rockchip-inno-usb2-Sync-initial-otg-state.patch b/target/linux/rockchip/patches-5.19/0043-phy-rockchip-inno-usb2-Sync-initial-otg-state.patch new file mode 100644 index 00000000000000..2435844a0a3e88 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0043-phy-rockchip-inno-usb2-Sync-initial-otg-state.patch @@ -0,0 +1,33 @@ +From c65316cf05c7597c0d8dc23373b840aafd34ffb8 Mon Sep 17 00:00:00 2001 +From: Peter Geis <pgwipeout@gmail.com> +Date: Tue, 21 Jun 2022 20:31:40 -0400 +Subject: [PATCH 43/51] phy: rockchip-inno-usb2: Sync initial otg state + +The initial otg state for the phy defaults to device mode. The actual +state isn't detected until an ID IRQ fires. Fix this by syncing the ID +state during initialization. + +Fixes: 51a9b2c03dd3 ("phy: rockchip-inno-usb2: Handle ID IRQ") +Signed-off-by: Peter Geis <pgwipeout@gmail.com> +Reviewed-by: Samuel Holland <samuel@sholland.org> +Link: https://lore.kernel.org/r/20220622003140.30365-1-pgwipeout@gmail.com +Signed-off-by: Vinod Koul <vkoul@kernel.org> +--- + drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c ++++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +@@ -1162,6 +1162,12 @@ static int rockchip_usb2phy_otg_port_ini + EXTCON_USB_HOST, &rport->event_nb); + if (ret) + dev_err(rphy->dev, "register USB HOST notifier failed\n"); ++ ++ if (!of_property_read_bool(rphy->dev->of_node, "extcon")) { ++ /* do initial sync of usb state */ ++ ret = property_enabled(rphy->grf, &rport->port_cfg->utmi_id); ++ extcon_set_state_sync(rphy->edev, EXTCON_USB_HOST, !ret); ++ } + } + + out: diff --git a/target/linux/rockchip/patches-5.19/0044-dt-bindings-phy-rockchip-add-PCIe-v3-phy.patch b/target/linux/rockchip/patches-5.19/0044-dt-bindings-phy-rockchip-add-PCIe-v3-phy.patch new file mode 100644 index 00000000000000..39daf9fd85ec60 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0044-dt-bindings-phy-rockchip-add-PCIe-v3-phy.patch @@ -0,0 +1,97 @@ +From dd3c111b13d57d95d69c345897460ef65a6aaefd Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Sun, 19 Jun 2022 10:26:01 +0200 +Subject: [PATCH 44/51] dt-bindings: phy: rockchip: add PCIe v3 phy + +Add a new binding file for Rockchip PCIe v3 phy driver. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +--- + .../bindings/phy/rockchip,pcie3-phy.yaml | 80 +++++++++++++++++++ + 1 file changed, 80 insertions(+) + create mode 100644 Documentation/devicetree/bindings/phy/rockchip,pcie3-phy.yaml + +--- /dev/null ++++ b/Documentation/devicetree/bindings/phy/rockchip,pcie3-phy.yaml +@@ -0,0 +1,80 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/phy/rockchip,pcie3-phy.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Rockchip PCIe v3 phy ++ ++maintainers: ++ - Heiko Stuebner <heiko@sntech.de> ++ ++properties: ++ compatible: ++ enum: ++ - rockchip,rk3568-pcie3-phy ++ ++ reg: ++ maxItems: 1 ++ ++ clocks: ++ minItems: 3 ++ maxItems: 3 ++ ++ clock-names: ++ items: ++ - const: refclk_m ++ - const: refclk_n ++ - const: pclk ++ ++ data-lanes: ++ description: which lanes (by position) should be mapped to which ++ controller (value). 0 means lane disabled, higher value means used. ++ (controller-number +1 ) ++ $ref: /schemas/types.yaml#/definitions/uint32-array ++ minItems: 2 ++ maxItems: 16 ++ items: ++ minimum: 0 ++ maximum: 16 ++ ++ "#phy-cells": ++ const: 0 ++ ++ resets: ++ maxItems: 1 ++ ++ reset-names: ++ const: phy ++ ++ rockchip,phy-grf: ++ $ref: /schemas/types.yaml#/definitions/phandle ++ description: phandle to the syscon managing the phy "general register files" ++ ++ rockchip,pipe-grf: ++ $ref: /schemas/types.yaml#/definitions/phandle ++ description: phandle to the syscon managing the pipe "general register files" ++ ++required: ++ - compatible ++ - reg ++ - rockchip,phy-grf ++ - "#phy-cells" ++ ++additionalProperties: false ++ ++examples: ++ - | ++ #include <dt-bindings/clock/rk3568-cru.h> ++ pcie30phy: phy@fe8c0000 { ++ compatible = "rockchip,rk3568-pcie3-phy"; ++ reg = <0xfe8c0000 0x20000>; ++ #phy-cells = <0>; ++ clocks = <&pmucru CLK_PCIE30PHY_REF_M>, ++ <&pmucru CLK_PCIE30PHY_REF_N>, ++ <&cru PCLK_PCIE30PHY>; ++ clock-names = "refclk_m", "refclk_n", "pclk"; ++ resets = <&cru SRST_PCIE30PHY>; ++ reset-names = "phy"; ++ rockchip,phy-grf = <&pcie30_phy_grf>; ++ }; diff --git a/target/linux/rockchip/patches-5.19/0045-dt-bindings-soc-grf-add-pcie30-phy-pipe-grf.patch b/target/linux/rockchip/patches-5.19/0045-dt-bindings-soc-grf-add-pcie30-phy-pipe-grf.patch new file mode 100644 index 00000000000000..d1980cd6734191 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0045-dt-bindings-soc-grf-add-pcie30-phy-pipe-grf.patch @@ -0,0 +1,28 @@ +From 566b57d307a104490a476a74866b507682443da6 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Sun, 19 Jun 2022 10:26:02 +0200 +Subject: [PATCH 45/51] dt-bindings: soc: grf: add pcie30-{phy,pipe}-grf + +Add compatibles for PCIe v3 General Register Files. + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> +--- + Documentation/devicetree/bindings/soc/rockchip/grf.yaml | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/Documentation/devicetree/bindings/soc/rockchip/grf.yaml ++++ b/Documentation/devicetree/bindings/soc/rockchip/grf.yaml +@@ -16,9 +16,12 @@ properties: + - enum: + - rockchip,rk3288-sgrf + - rockchip,rk3566-pipe-grf ++ - rockchip,rk3568-pcie3-phy-grf + - rockchip,rk3568-pipe-grf + - rockchip,rk3568-pipe-phy-grf + - rockchip,rk3568-usb2phy-grf ++ - rockchip,rk3588-pcie3-phy-grf ++ - rockchip,rk3588-pcie3-pipe-grf + - rockchip,rv1108-usbgrf + - const: syscon + - items: diff --git a/target/linux/rockchip/patches-5.19/0046-phy-rockchip-Support-PCIe-v3.patch b/target/linux/rockchip/patches-5.19/0046-phy-rockchip-Support-PCIe-v3.patch new file mode 100644 index 00000000000000..d774aaa1045807 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0046-phy-rockchip-Support-PCIe-v3.patch @@ -0,0 +1,390 @@ +From 46207bac2522eab8dd18f4ecd18c2597c841534e Mon Sep 17 00:00:00 2001 +From: Shawn Lin <shawn.lin@rock-chips.com> +Date: Sun, 19 Jun 2022 10:26:03 +0200 +Subject: [PATCH 46/51] phy: rockchip: Support PCIe v3 + +RK3568 supports PCIe v3 using not Combphy like PCIe v2 on rk3566. +It use a dedicated PCIe-phy. Add support for this. + +Initial support by Shawn Lin, modifications by Peter Geis and Frank +Wunderlich. + +Add data-lanes property for splitting pcie-lanes across controllers. + +The data-lanes is an array where x=0 means lane is disabled and x > 0 +means controller x is assigned to phy lane. + +Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com> +Suggested-by: Peter Geis <pgwipeout@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +--- + drivers/phy/rockchip/Kconfig | 9 + + drivers/phy/rockchip/Makefile | 1 + + .../phy/rockchip/phy-rockchip-snps-pcie3.c | 317 ++++++++++++++++++ + include/linux/phy/pcie.h | 12 + + 4 files changed, 339 insertions(+) + create mode 100644 drivers/phy/rockchip/phy-rockchip-snps-pcie3.c + create mode 100644 include/linux/phy/pcie.h + +--- a/drivers/phy/rockchip/Kconfig ++++ b/drivers/phy/rockchip/Kconfig +@@ -83,6 +83,15 @@ config PHY_ROCKCHIP_PCIE + help + Enable this to support the Rockchip PCIe PHY. + ++config PHY_ROCKCHIP_SNPS_PCIE3 ++ tristate "Rockchip Snps PCIe3 PHY Driver" ++ depends on (ARCH_ROCKCHIP && OF) || COMPILE_TEST ++ depends on HAS_IOMEM ++ select GENERIC_PHY ++ select MFD_SYSCON ++ help ++ Enable this to support the Rockchip snps PCIe3 PHY. ++ + config PHY_ROCKCHIP_TYPEC + tristate "Rockchip TYPEC PHY Driver" + depends on OF && (ARCH_ROCKCHIP || COMPILE_TEST) +--- a/drivers/phy/rockchip/Makefile ++++ b/drivers/phy/rockchip/Makefile +@@ -8,5 +8,6 @@ obj-$(CONFIG_PHY_ROCKCHIP_INNO_HDMI) += + obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2) += phy-rockchip-inno-usb2.o + obj-$(CONFIG_PHY_ROCKCHIP_NANENG_COMBO_PHY) += phy-rockchip-naneng-combphy.o + obj-$(CONFIG_PHY_ROCKCHIP_PCIE) += phy-rockchip-pcie.o ++obj-$(CONFIG_PHY_ROCKCHIP_SNPS_PCIE3) += phy-rockchip-snps-pcie3.o + obj-$(CONFIG_PHY_ROCKCHIP_TYPEC) += phy-rockchip-typec.o + obj-$(CONFIG_PHY_ROCKCHIP_USB) += phy-rockchip-usb.o +--- /dev/null ++++ b/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c +@@ -0,0 +1,317 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * Rockchip PCIE3.0 phy driver ++ * ++ * Copyright (C) 2020 Rockchip Electronics Co., Ltd. ++ */ ++ ++#include <linux/clk.h> ++#include <linux/delay.h> ++#include <linux/io.h> ++#include <linux/iopoll.h> ++#include <linux/kernel.h> ++#include <linux/mfd/syscon.h> ++#include <linux/module.h> ++#include <linux/of_device.h> ++#include <linux/phy/pcie.h> ++#include <linux/phy/phy.h> ++#include <linux/regmap.h> ++#include <linux/reset.h> ++ ++/* Register for RK3568 */ ++#define GRF_PCIE30PHY_CON1 0x4 ++#define GRF_PCIE30PHY_CON6 0x18 ++#define GRF_PCIE30PHY_CON9 0x24 ++#define GRF_PCIE30PHY_STATUS0 0x80 ++#define SRAM_INIT_DONE(reg) (reg & BIT(14)) ++ ++#define RK3568_BIFURCATION_LANE_0_1 BIT(0) ++ ++/* Register for RK3588 */ ++#define PHP_GRF_PCIESEL_CON 0x100 ++#define RK3588_PCIE3PHY_GRF_CMN_CON0 0x0 ++#define RK3588_PCIE3PHY_GRF_PHY0_STATUS1 0x904 ++#define RK3588_PCIE3PHY_GRF_PHY1_STATUS1 0xa04 ++#define RK3588_SRAM_INIT_DONE(reg) (reg & BIT(0)) ++ ++#define RK3588_BIFURCATION_LANE_0_1 BIT(0) ++#define RK3588_BIFURCATION_LANE_2_3 BIT(1) ++#define RK3588_LANE_AGGREGATION BIT(2) ++ ++struct rockchip_p3phy_ops; ++ ++struct rockchip_p3phy_priv { ++ const struct rockchip_p3phy_ops *ops; ++ void __iomem *mmio; ++ /* mode: RC, EP */ ++ int mode; ++ /* pcie30_phymode: Aggregation, Bifurcation */ ++ int pcie30_phymode; ++ struct regmap *phy_grf; ++ struct regmap *pipe_grf; ++ struct reset_control *p30phy; ++ struct phy *phy; ++ struct clk_bulk_data *clks; ++ int num_clks; ++ int num_lanes; ++ u32 lanes[4]; ++}; ++ ++struct rockchip_p3phy_ops { ++ int (*phy_init)(struct rockchip_p3phy_priv *priv); ++}; ++ ++static int rockchip_p3phy_set_mode(struct phy *phy, enum phy_mode mode, int submode) ++{ ++ struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy); ++ ++ /* Actually We don't care EP/RC mode, but just record it */ ++ switch (submode) { ++ case PHY_MODE_PCIE_RC: ++ priv->mode = PHY_MODE_PCIE_RC; ++ break; ++ case PHY_MODE_PCIE_EP: ++ priv->mode = PHY_MODE_PCIE_EP; ++ break; ++ default: ++ dev_err(&phy->dev, "%s, invalid mode\n", __func__); ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static int rockchip_p3phy_rk3568_init(struct rockchip_p3phy_priv *priv) ++{ ++ struct phy *phy = priv->phy; ++ bool bifurcation = false; ++ int ret; ++ u32 reg; ++ ++ /* Deassert PCIe PMA output clamp mode */ ++ regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON9, BIT(15) | BIT(31)); ++ ++ for (int i = 0; i < priv->num_lanes; i++) { ++ dev_info(&phy->dev, "lane number %d, val %d\n", i, priv->lanes[i]); ++ if (priv->lanes[i] > 1) ++ bifurcation = true; ++ } ++ ++ /* Set bifurcation if needed, and it doesn't care RC/EP */ ++ if (bifurcation) { ++ dev_info(&phy->dev, "bifurcation enabled\n"); ++ regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6, ++ (0xf << 16) | RK3568_BIFURCATION_LANE_0_1); ++ regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON1, ++ BIT(15) | BIT(31)); ++ } else { ++ dev_info(&phy->dev, "bifurcation disabled\n"); ++ regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON6, ++ (0xf << 16) & ~RK3568_BIFURCATION_LANE_0_1); ++ } ++ ++ reset_control_deassert(priv->p30phy); ++ ++ ret = regmap_read_poll_timeout(priv->phy_grf, ++ GRF_PCIE30PHY_STATUS0, ++ reg, SRAM_INIT_DONE(reg), ++ 0, 500); ++ if (ret) ++ dev_err(&priv->phy->dev, "%s: lock failed 0x%x, check input refclk and power supply\n", ++ __func__, reg); ++ return ret; ++} ++ ++static const struct rockchip_p3phy_ops rk3568_ops = { ++ .phy_init = rockchip_p3phy_rk3568_init, ++}; ++ ++static int rockchip_p3phy_rk3588_init(struct rockchip_p3phy_priv *priv) ++{ ++ u32 reg = 0; ++ u8 mode = 0; ++ int ret; ++ ++ /* Deassert PCIe PMA output clamp mode */ ++ regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0, BIT(8) | BIT(24)); ++ ++ /* Set bifurcation if needed */ ++ for (int i = 0; i < priv->num_lanes; i++) { ++ if (!priv->lanes[i]) ++ mode |= (BIT(i) << 3); ++ ++ if (priv->lanes[i] > 1) ++ mode |= (BIT(i) >> 1); ++ } ++ ++ if (!mode) ++ reg = RK3588_LANE_AGGREGATION; ++ else { ++ if (mode & (BIT(0) | BIT(1))) ++ reg |= RK3588_BIFURCATION_LANE_0_1; ++ ++ if (mode & (BIT(2) | BIT(3))) ++ reg |= RK3588_BIFURCATION_LANE_2_3; ++ } ++ ++ regmap_write(priv->phy_grf, RK3588_PCIE3PHY_GRF_CMN_CON0, (0x7<<16) | reg); ++ ++ /* Set pcie1ln_sel in PHP_GRF_PCIESEL_CON */ ++ if (!IS_ERR(priv->pipe_grf)) { ++ reg = (mode & (BIT(6) | BIT(7))) >> 6; ++ if (reg) ++ regmap_write(priv->pipe_grf, PHP_GRF_PCIESEL_CON, ++ (reg << 16) | reg); ++ } ++ ++ reset_control_deassert(priv->p30phy); ++ ++ ret = regmap_read_poll_timeout(priv->phy_grf, ++ RK3588_PCIE3PHY_GRF_PHY0_STATUS1, ++ reg, RK3588_SRAM_INIT_DONE(reg), ++ 0, 500); ++ ret |= regmap_read_poll_timeout(priv->phy_grf, ++ RK3588_PCIE3PHY_GRF_PHY1_STATUS1, ++ reg, RK3588_SRAM_INIT_DONE(reg), ++ 0, 500); ++ if (ret) ++ pr_err("%s: lock failed 0x%x, check input refclk and power supply\n", ++ __func__, reg); ++ return ret; ++} ++ ++static const struct rockchip_p3phy_ops rk3588_ops = { ++ .phy_init = rockchip_p3phy_rk3588_init, ++}; ++ ++static int rochchip_p3phy_init(struct phy *phy) ++{ ++ struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy); ++ int ret; ++ ++ ret = clk_bulk_prepare_enable(priv->num_clks, priv->clks); ++ if (ret) { ++ pr_err("failed to enable PCIe bulk clks %d\n", ret); ++ return ret; ++ } ++ ++ reset_control_assert(priv->p30phy); ++ udelay(1); ++ ++ if (priv->ops->phy_init) { ++ ret = priv->ops->phy_init(priv); ++ if (ret) ++ clk_bulk_disable_unprepare(priv->num_clks, priv->clks); ++ } ++ ++ return ret; ++} ++ ++static int rochchip_p3phy_exit(struct phy *phy) ++{ ++ struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy); ++ ++ clk_bulk_disable_unprepare(priv->num_clks, priv->clks); ++ reset_control_assert(priv->p30phy); ++ return 0; ++} ++ ++static const struct phy_ops rochchip_p3phy_ops = { ++ .init = rochchip_p3phy_init, ++ .exit = rochchip_p3phy_exit, ++ .set_mode = rockchip_p3phy_set_mode, ++ .owner = THIS_MODULE, ++}; ++ ++static int rockchip_p3phy_probe(struct platform_device *pdev) ++{ ++ struct phy_provider *phy_provider; ++ struct device *dev = &pdev->dev; ++ struct rockchip_p3phy_priv *priv; ++ struct device_node *np = dev->of_node; ++ struct resource *res; ++ int ret; ++ ++ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ++ if (!priv) ++ return -ENOMEM; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ priv->mmio = devm_ioremap_resource(dev, res); ++ if (IS_ERR(priv->mmio)) { ++ ret = PTR_ERR(priv->mmio); ++ return ret; ++ } ++ ++ priv->ops = of_device_get_match_data(&pdev->dev); ++ if (!priv->ops) { ++ dev_err(&pdev->dev, "no of match data provided\n"); ++ return -EINVAL; ++ } ++ ++ priv->phy_grf = syscon_regmap_lookup_by_phandle(np, "rockchip,phy-grf"); ++ if (IS_ERR(priv->phy_grf)) { ++ dev_err(dev, "failed to find rockchip,phy_grf regmap\n"); ++ return PTR_ERR(priv->phy_grf); ++ } ++ ++ priv->pipe_grf = syscon_regmap_lookup_by_phandle(dev->of_node, ++ "rockchip,pipe-grf"); ++ if (IS_ERR(priv->pipe_grf)) ++ dev_info(dev, "failed to find rockchip,pipe_grf regmap\n"); ++ ++ priv->num_lanes = of_property_read_variable_u32_array(dev->of_node, "data-lanes", ++ priv->lanes, 2, ++ ARRAY_SIZE(priv->lanes)); ++ ++ /* if no data-lanes assume aggregation */ ++ if (priv->num_lanes == -EINVAL) { ++ dev_dbg(dev, "no data-lanes property found\n"); ++ priv->num_lanes = 1; ++ priv->lanes[0] = 1; ++ } else if (priv->num_lanes < 0) { ++ dev_err(dev, "failed to read data-lanes property %d\n", priv->num_lanes); ++ return priv->num_lanes; ++ } ++ ++ priv->phy = devm_phy_create(dev, NULL, &rochchip_p3phy_ops); ++ if (IS_ERR(priv->phy)) { ++ dev_err(dev, "failed to create combphy\n"); ++ return PTR_ERR(priv->phy); ++ } ++ ++ priv->p30phy = devm_reset_control_get_optional_exclusive(dev, "phy"); ++ if (IS_ERR(priv->p30phy)) { ++ return dev_err_probe(dev, PTR_ERR(priv->p30phy), ++ "failed to get phy reset control\n"); ++ } ++ if (!priv->p30phy) ++ dev_info(dev, "no phy reset control specified\n"); ++ ++ priv->num_clks = devm_clk_bulk_get_all(dev, &priv->clks); ++ if (priv->num_clks < 1) ++ return -ENODEV; ++ ++ dev_set_drvdata(dev, priv); ++ phy_set_drvdata(priv->phy, priv); ++ phy_provider = devm_of_phy_provider_register(dev, of_phy_simple_xlate); ++ return PTR_ERR_OR_ZERO(phy_provider); ++} ++ ++static const struct of_device_id rockchip_p3phy_of_match[] = { ++ { .compatible = "rockchip,rk3568-pcie3-phy", .data = &rk3568_ops }, ++ { .compatible = "rockchip,rk3588-pcie3-phy", .data = &rk3588_ops }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, rockchip_p3phy_of_match); ++ ++static struct platform_driver rockchip_p3phy_driver = { ++ .probe = rockchip_p3phy_probe, ++ .driver = { ++ .name = "rockchip-snps-pcie3-phy", ++ .of_match_table = rockchip_p3phy_of_match, ++ }, ++}; ++module_platform_driver(rockchip_p3phy_driver); ++MODULE_DESCRIPTION("Rockchip Synopsys PCIe 3.0 PHY driver"); ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/include/linux/phy/pcie.h +@@ -0,0 +1,12 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++/* ++ * Copyright (c) 2021 Rockchip Electronics Co., Ltd. ++ */ ++#ifndef __PHY_PCIE_H ++#define __PHY_PCIE_H ++ ++#define PHY_MODE_PCIE_RC 20 ++#define PHY_MODE_PCIE_EP 21 ++#define PHY_MODE_PCIE_BIFURCATION 22 ++ ++#endif diff --git a/target/linux/rockchip/patches-5.19/0047-arm64-dts-rockchip-rk3568-Add-PCIe-v3-nodes.patch b/target/linux/rockchip/patches-5.19/0047-arm64-dts-rockchip-rk3568-Add-PCIe-v3-nodes.patch new file mode 100644 index 00000000000000..be8b38690eebc2 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0047-arm64-dts-rockchip-rk3568-Add-PCIe-v3-nodes.patch @@ -0,0 +1,144 @@ +From a465b1f69305f3ce3f46e642412c0f6dcb13a618 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Sun, 19 Jun 2022 10:26:04 +0200 +Subject: [PATCH 47/51] arm64: dts: rockchip: rk3568: Add PCIe v3 nodes + +Add nodes to rk356x devicetree to support PCIe v3. + +Co-developed-by: Peter Geis <pgwipeout@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +--- + arch/arm64/boot/dts/rockchip/rk3568.dtsi | 122 +++++++++++++++++++++++ + 1 file changed, 122 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3568.dtsi +@@ -42,6 +42,128 @@ + reg = <0x0 0xfe190200 0x0 0x20>; + }; + ++ pcie30_phy_grf: syscon@fdcb8000 { ++ compatible = "rockchip,rk3568-pcie3-phy-grf", "syscon"; ++ reg = <0x0 0xfdcb8000 0x0 0x10000>; ++ }; ++ ++ pcie30phy: phy@fe8c0000 { ++ compatible = "rockchip,rk3568-pcie3-phy"; ++ reg = <0x0 0xfe8c0000 0x0 0x20000>; ++ #phy-cells = <0>; ++ clocks = <&pmucru CLK_PCIE30PHY_REF_M>, <&pmucru CLK_PCIE30PHY_REF_N>, ++ <&cru PCLK_PCIE30PHY>; ++ clock-names = "refclk_m", "refclk_n", "pclk"; ++ resets = <&cru SRST_PCIE30PHY>; ++ reset-names = "phy"; ++ rockchip,phy-grf = <&pcie30_phy_grf>; ++ status = "disabled"; ++ }; ++ ++ pcie3x1: pcie@fe270000 { ++ compatible = "rockchip,rk3568-pcie"; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ bus-range = <0x0 0xf>; ++ clocks = <&cru ACLK_PCIE30X1_MST>, <&cru ACLK_PCIE30X1_SLV>, ++ <&cru ACLK_PCIE30X1_DBI>, <&cru PCLK_PCIE30X1>, ++ <&cru CLK_PCIE30X1_AUX_NDFT>; ++ clock-names = "aclk_mst", "aclk_slv", ++ "aclk_dbi", "pclk", "aux"; ++ device_type = "pci"; ++ interrupts = <GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 159 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 158 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 156 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-names = "sys", "pmc", "msg", "legacy", "err"; ++ #interrupt-cells = <1>; ++ interrupt-map-mask = <0 0 0 7>; ++ interrupt-map = <0 0 0 1 &pcie3x1_intc 0>, ++ <0 0 0 2 &pcie3x1_intc 1>, ++ <0 0 0 3 &pcie3x1_intc 2>, ++ <0 0 0 4 &pcie3x1_intc 3>; ++ linux,pci-domain = <1>; ++ num-ib-windows = <6>; ++ num-ob-windows = <2>; ++ max-link-speed = <3>; ++ msi-map = <0x0 &gic 0x1000 0x1000>; ++ num-lanes = <1>; ++ phys = <&pcie30phy>; ++ phy-names = "pcie-phy"; ++ power-domains = <&power RK3568_PD_PIPE>; ++ reg = <0x3 0xc0400000 0x0 0x00400000>, ++ <0x0 0xfe270000 0x0 0x00010000>, ++ <0x3 0x7f000000 0x0 0x01000000>; ++ ranges = <0x01000000 0x0 0x3ef00000 0x3 0x7ef00000 0x0 0x00100000>, ++ <0x02000000 0x0 0x00000000 0x3 0x40000000 0x0 0x3ef00000>; ++ reg-names = "dbi", "apb", "config"; ++ resets = <&cru SRST_PCIE30X1_POWERUP>; ++ reset-names = "pipe"; ++ /* bifurcation; lane1 when using 1+1 */ ++ status = "disabled"; ++ ++ pcie3x1_intc: legacy-interrupt-controller { ++ interrupt-controller; ++ #address-cells = <0>; ++ #interrupt-cells = <1>; ++ interrupt-parent = <&gic>; ++ interrupts = <GIC_SPI 157 IRQ_TYPE_EDGE_RISING>; ++ }; ++ }; ++ ++ pcie3x2: pcie@fe280000 { ++ compatible = "rockchip,rk3568-pcie"; ++ #address-cells = <3>; ++ #size-cells = <2>; ++ bus-range = <0x0 0xf>; ++ clocks = <&cru ACLK_PCIE30X2_MST>, <&cru ACLK_PCIE30X2_SLV>, ++ <&cru ACLK_PCIE30X2_DBI>, <&cru PCLK_PCIE30X2>, ++ <&cru CLK_PCIE30X2_AUX_NDFT>; ++ clock-names = "aclk_mst", "aclk_slv", ++ "aclk_dbi", "pclk", "aux"; ++ device_type = "pci"; ++ interrupts = <GIC_SPI 165 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>, ++ <GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>; ++ interrupt-names = "sys", "pmc", "msg", "legacy", "err"; ++ #interrupt-cells = <1>; ++ interrupt-map-mask = <0 0 0 7>; ++ interrupt-map = <0 0 0 1 &pcie3x2_intc 0>, ++ <0 0 0 2 &pcie3x2_intc 1>, ++ <0 0 0 3 &pcie3x2_intc 2>, ++ <0 0 0 4 &pcie3x2_intc 3>; ++ linux,pci-domain = <2>; ++ num-ib-windows = <6>; ++ num-ob-windows = <2>; ++ max-link-speed = <3>; ++ msi-map = <0x0 &gic 0x2000 0x1000>; ++ num-lanes = <2>; ++ phys = <&pcie30phy>; ++ phy-names = "pcie-phy"; ++ power-domains = <&power RK3568_PD_PIPE>; ++ reg = <0x3 0xc0800000 0x0 0x00400000>, ++ <0x0 0xfe280000 0x0 0x00010000>, ++ <0x3 0xbf000000 0x0 0x01000000>; ++ ranges = <0x01000000 0x0 0x3ef00000 0x3 0xbef00000 0x0 0x00100000>, ++ <0x02000000 0x0 0x00000000 0x3 0x80000000 0x0 0x3ef00000>; ++ reg-names = "dbi", "apb", "config"; ++ resets = <&cru SRST_PCIE30X2_POWERUP>; ++ reset-names = "pipe"; ++ /* bifurcation; lane0 when using 1+1 */ ++ status = "disabled"; ++ ++ pcie3x2_intc: legacy-interrupt-controller { ++ interrupt-controller; ++ #address-cells = <0>; ++ #interrupt-cells = <1>; ++ interrupt-parent = <&gic>; ++ interrupts = <GIC_SPI 162 IRQ_TYPE_EDGE_RISING>; ++ }; ++ }; ++ + gmac0: ethernet@fe2a0000 { + compatible = "rockchip,rk3568-gmac", "snps,dwmac-4.20a"; + reg = <0x0 0xfe2a0000 0x0 0x10000>; diff --git a/target/linux/rockchip/patches-5.19/0048-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0048-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..bc1e26bd379f09 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0048-arm64-dts-rockchip-Add-PCIe-v3-nodes-to-BPI-R2-Pro.patch @@ -0,0 +1,127 @@ +From fa0c39b4564ea4cdbda88dc701b51ce615a11342 Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Sun, 19 Jun 2022 10:26:05 +0200 +Subject: [PATCH 48/51] arm64: dts: rockchip: Add PCIe v3 nodes to BPI-R2-Pro + +Add Nodes to Bananapi-R2-Pro board to support PCIe v3 and +set PCIe related regulators to always on. + +Suggested-by: Peter Geis <pgwipeout@gmail.com> +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +--- + .../boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 90 +++++++++++++++++++ + 1 file changed, 90 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -86,6 +86,62 @@ + vin-supply = <&dc_12v>; + }; + ++ pcie30_avdd0v9: pcie30-avdd0v9 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd0v9"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ pcie30_avdd1v8: pcie30-avdd1v8 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ /* pi6c pcie clock generator feeds both ports */ ++ vcc3v3_pi6c_05: vcc3v3-pi6c-05-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_pcie"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <200000>; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++ ++ /* actually fed by vcc3v3_sys, dependent on pi6c clock generator */ ++ vcc3v3_minipcie: vcc3v3-minipcie-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_minipcie"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <50000>; ++ vin-supply = <&vcc3v3_pi6c_05>; ++ }; ++ ++ /* actually fed by vcc3v3_sys, dependent on pi6c clock generator */ ++ vcc3v3_ngff: vcc3v3-ngff-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_ngff"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpio = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <50000>; ++ vin-supply = <&vcc3v3_pi6c_05>; ++ }; ++ + vcc5v0_usb: vcc5v0_usb { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_usb"; +@@ -513,6 +569,27 @@ + }; + }; + ++&pcie30phy { ++ data-lanes = <1 2>; ++ status = "okay"; ++}; ++ ++&pcie3x1 { ++ /* M.2 slot */ ++ num-lanes = <1>; ++ reset-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&vcc3v3_ngff>; ++ status = "okay"; ++}; ++ ++&pcie3x2 { ++ /* mPCIe slot */ ++ num-lanes = <1>; ++ reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&vcc3v3_minipcie>; ++ status = "okay"; ++}; ++ + &pinctrl { + leds { + blue_led_pin: blue-led-pin { +@@ -708,6 +785,19 @@ + status = "okay"; + }; + ++&usb2phy1 { ++ /* USB for PCIe/M2 */ ++ status = "okay"; ++}; ++ ++&usb2phy1_host { ++ status = "okay"; ++}; ++ ++&usb2phy1_otg { ++ status = "okay"; ++}; ++ + &vop { + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; + assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; diff --git a/target/linux/rockchip/patches-5.19/0049-phy-rockchip-inno-usb2-Ignore-OTG-IRQs-in-host-mode.patch b/target/linux/rockchip/patches-5.19/0049-phy-rockchip-inno-usb2-Ignore-OTG-IRQs-in-host-mode.patch new file mode 100644 index 00000000000000..575a59b6ffe8ef --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0049-phy-rockchip-inno-usb2-Ignore-OTG-IRQs-in-host-mode.patch @@ -0,0 +1,34 @@ +From 3ddee7849f0ab4b4edcc812c6569236b53796640 Mon Sep 17 00:00:00 2001 +From: Samuel Holland <samuel@sholland.org> +Date: Fri, 8 Jul 2022 01:14:34 -0500 +Subject: [PATCH 49/51] phy: rockchip-inno-usb2: Ignore OTG IRQs in host mode + +When the OTG port is fixed to host mode, the driver does not request its +IRQs, nor does it enable those IRQs in hardware. Similarly, the driver +should ignore the OTG port IRQs when handling the shared interrupt. + +Otherwise, it would update the extcon based on an ID pin which may be in +an undefined state, or try to queue a uninitialized work item. + +Fixes: 6a98df08ccd5 ("phy: rockchip-inno-usb2: Fix muxed interrupt support") +Reported-by: Frank Wunderlich <frank-w@public-files.de> +Signed-off-by: Samuel Holland <samuel@sholland.org> +Tested-by: Frank Wunderlich <frank-w@public-files.de> +Tested-by: Peter Geis <pgwipeout@gmail.com> +--- + drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c ++++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c +@@ -978,7 +978,9 @@ static irqreturn_t rockchip_usb2phy_irq( + + switch (rport->port_id) { + case USB2PHY_PORT_OTG: +- ret |= rockchip_usb2phy_otg_mux_irq(irq, rport); ++ if (rport->mode != USB_DR_MODE_HOST && ++ rport->mode != USB_DR_MODE_UNKNOWN) ++ ret |= rockchip_usb2phy_otg_mux_irq(irq, rport); + break; + case USB2PHY_PORT_HOST: + ret |= rockchip_usb2phy_linestate_irq(irq, rport); diff --git a/target/linux/rockchip/patches-5.19/0050-arm64-dts-rk356x-fix-upper-usb-port-on-BPI-R2-Pro.patch b/target/linux/rockchip/patches-5.19/0050-arm64-dts-rk356x-fix-upper-usb-port-on-BPI-R2-Pro.patch new file mode 100644 index 00000000000000..c79420f0a61f7d --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0050-arm64-dts-rk356x-fix-upper-usb-port-on-BPI-R2-Pro.patch @@ -0,0 +1,28 @@ +From c4e625e488b938bd312cde239cd902c479cba02e Mon Sep 17 00:00:00 2001 +From: Frank Wunderlich <frank-w@public-files.de> +Date: Fri, 8 Jul 2022 15:27:06 +0200 +Subject: [PATCH 50/51] arm64: dts: rk356x: fix upper usb port on BPI-R2-Pro + +- extcon is no more needed in 5.19 - so drop it + commit 51a9b2c03dd3 ("phy: rockchip-inno-usb2: Handle ID IRQ") +- dr_mode was changed from host to otg in rk356x.dtsi + commit bc405bb3eeee ("arm64: dts: rockchip: enable otg/drd + operation of usb_host0_xhci in rk356x") + change it back on board level as id-pin on r2pro is not connected + +Signed-off-by: Frank Wunderlich <frank-w@public-files.de> +--- + arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-bpi-r2-pro.dts +@@ -755,7 +755,7 @@ + }; + + &usb_host0_xhci { +- extcon = <&usb2phy0>; ++ dr_mode = "host"; + status = "okay"; + }; + diff --git a/target/linux/rockchip/patches-5.19/0051-rockchip-add-pci3-for-rock3-a.patch b/target/linux/rockchip/patches-5.19/0051-rockchip-add-pci3-for-rock3-a.patch new file mode 100644 index 00000000000000..204d3881b77af3 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0051-rockchip-add-pci3-for-rock3-a.patch @@ -0,0 +1,211 @@ +From 18b08ab3fd6216d62a96cc8033ad5bb915fd5fcf Mon Sep 17 00:00:00 2001 +From: Marty Jones <mj8263788@gmail.com> +Date: Mon, 11 Jul 2022 08:51:36 -0400 +Subject: [PATCH 51/51] rockchip: add pci3 for rock3 a + +Signed-off-by: Marty Jones <mj8263788@gmail.com> +--- + .../boot/dts/rockchip/rk3568-rock-3a.dts | 93 ++++++++++++++++--- + 1 file changed, 78 insertions(+), 15 deletions(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3568-rock-3a.dts +@@ -87,7 +87,40 @@ + vin-supply = <&vcc12v_dcin>; + }; + +- vcc5v0_usb: vcc5v0-usb { ++ pcie30_avdd0v9: pcie30-avdd0v9 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd0v9"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ pcie30_avdd1v8: pcie30-avdd1v8 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ pcie30_3v3: gpio-regulator { ++ compatible = "regulator-gpio"; ++ regulator-name = "pcie30_3v3"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <100000>; ++ regulator-max-microvolt = <3300000>; ++ gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; ++ gpios-states = <0x1>; ++ states = <100000 0x0 ++ 3300000 0x1>; ++ }; ++ ++ vcc5v0_usb: vcc5v0_usb { + compatible = "regulator-fixed"; + regulator-name = "vcc5v0_usb"; + regulator-always-on; +@@ -109,7 +142,7 @@ + vin-supply = <&vcc5v0_usb>; + }; + +- vcc5v0_usb_hub: vcc5v0-usb-hub-regulator { ++ vcc5v0_usb_hub: vcc5v0-usb-hub { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PD5 GPIO_ACTIVE_HIGH>; +@@ -120,7 +153,7 @@ + vin-supply = <&vcc5v0_usb>; + }; + +- vcc5v0_usb_otg: vcc5v0-usb-otg-regulator { ++ vcc5v0_usb_otg: vcc5v0-usb-otg { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; +@@ -141,6 +174,10 @@ + status = "okay"; + }; + ++&combphy2 { ++ status = "okay"; ++}; ++ + &cpu0 { + cpu-supply = <&vdd_cpu>; + }; +@@ -159,17 +196,25 @@ + + &gmac1 { + assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; +- assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>; +- assigned-clock-rates = <0>, <125000000>; ++ assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&cru CLK_MAC1_2TOP>; + clock_in_out = "output"; + phy-handle = <&rgmii_phy1>; +- phy-mode = "rgmii-id"; ++ phy-mode = "rgmii"; + pinctrl-names = "default"; + pinctrl-0 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; ++ ++ snps,reset-gpio = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; ++ snps,reset-active-low; ++ /* Reset time is 20ms, 100ms for rtl8211f */ ++ snps,reset-delays-us = <0 20000 100000>; ++ ++ tx_delay = <0x3c>; ++ rx_delay = <0x2f>; ++ + status = "okay"; + }; + +@@ -313,6 +358,7 @@ + + vdda0v9_image: LDO_REG1 { + regulator-name = "vdda0v9_image"; ++ regulator-always-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + +@@ -349,6 +395,7 @@ + vccio_acodec: LDO_REG4 { + regulator-name = "vccio_acodec"; + regulator-always-on; ++ regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + +@@ -407,6 +454,7 @@ + + vcca1v8_image: LDO_REG9 { + regulator-name = "vcca1v8_image"; ++ regulator-always-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + +@@ -427,6 +475,7 @@ + + vcc3v3_sd: SWITCH_REG2 { + regulator-name = "vcc3v3_sd"; ++ regulator-always-on; + + regulator-state-mem { + regulator-off-in-suspend; +@@ -453,14 +502,30 @@ + rgmii_phy1: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0x0>; +- pinctrl-names = "default"; +- pinctrl-0 = <ð_phy_rst>; +- reset-assert-us = <20000>; +- reset-deassert-us = <100000>; +- reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>; + }; + }; + ++&pcie30phy { ++ status = "okay"; ++}; ++ ++&pcie3x2 { ++ reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&pcie30_3v3>; ++ //num-lanes = <2>; ++ pinctrl-0 = <&pcie30x2m1_pins>; ++ bus-scan-delay-ms = <1000>; ++ status = "okay"; ++}; ++ ++&pcie2x1 { ++ reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&pcie30_3v3>; ++ pinctrl-0 = <&pcie20m1_pins>; ++ bus-scan-delay-ms = <1000>; ++ status = "okay"; ++}; ++ + &pinctrl { + ethernet { + eth_phy_rst: eth_phy_rst { +@@ -555,7 +620,7 @@ + }; + + &usb_host0_xhci { +- extcon = <&usb2phy0>; ++ dr_mode = "host"; + status = "okay"; + }; + +@@ -581,7 +646,7 @@ + }; + + &usb2phy0_otg { +- vbus-supply = <&vcc5v0_usb_otg>; ++ phy-supply = <&vcc5v0_usb_otg>; + status = "okay"; + }; + +@@ -590,12 +655,10 @@ + }; + + &usb2phy1_host { +- phy-supply = <&vcc5v0_usb_host>; + status = "okay"; + }; + + &usb2phy1_otg { +- phy-supply = <&vcc5v0_usb_host>; + status = "okay"; + }; + diff --git a/target/linux/rockchip/patches-5.19/0052-rockchip-add-FriendlyElec-NanoPi-R5S-rk3568-board.patch b/target/linux/rockchip/patches-5.19/0052-rockchip-add-FriendlyElec-NanoPi-R5S-rk3568-board.patch new file mode 100644 index 00000000000000..bef12c6478a282 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0052-rockchip-add-FriendlyElec-NanoPi-R5S-rk3568-board.patch @@ -0,0 +1,844 @@ +From 9303b0a0fa722689633cf2f09ba4f8fcaaff13c9 Mon Sep 17 00:00:00 2001 +From: Marty Jones <mj8263788@gmail.com> +Date: Sun, 31 Jul 2022 02:31:59 -0400 +Subject: [PATCH] rockchip: add FriendlyElec NanoPi R5S rk3568 board + +Signed-off-by: Marty Jones <mj8263788@gmail.com> +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../boot/dts/rockchip/rk3568-nanopi-r5s.dts | 821 ++++++++++++++++++ + 2 files changed, 822 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -65,4 +65,5 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-ro + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-soquartz-cm4.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-bpi-r2-pro.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-evb1-v10.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-rock-3a.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3568-nanopi-r5s.dts +@@ -0,0 +1,821 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++ ++ ++/dts-v1/; ++#include <dt-bindings/gpio/gpio.h> ++#include <dt-bindings/leds/common.h> ++#include <dt-bindings/pinctrl/rockchip.h> ++#include <dt-bindings/soc/rockchip,vop2.h> ++#include "rk3568.dtsi" ++ ++/ { ++ model = "FriendlyElec NanoPi R5S"; ++ compatible = "friendlyelec,nanopi-r5s", "rockchip,rk3568"; ++ ++ aliases { ++ ethernet0 = &gmac0; ++ mmc0 = &sdmmc0; ++ mmc1 = &sdhci; ++ }; ++ ++ chosen: chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ fan: pwm-fan { ++ compatible = "pwm-fan"; ++ cooling-levels = <0 18 102 170 255>; ++ #cooling-cells = <2>; ++ fan-supply = <&vcc5v0_sysp>; ++ pwms = <&pwm0 0 50000 0>; ++ }; ++ ++ firmware { ++ optee: optee { ++ compatible = "linaro,optee-tz"; ++ method = "smc"; ++ }; ++ }; ++ ++ cspmu: cspmu@fd90c000 { ++ compatible = "rockchip,cspmu"; ++ reg = <0x0 0xfd90c000 0x0 0x1000>, ++ <0x0 0xfd90d000 0x0 0x1000>, ++ <0x0 0xfd90e000 0x0 0x1000>, ++ <0x0 0xfd90f000 0x0 0x1000>; ++ }; ++ ++ gpio-key { ++ compatible = "gpio-key"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&key1_pin>; ++ ++ button@1 { ++ debounce-interval = <50>; ++ gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; ++ wakeup-source; ++ }; ++ }; ++ ++ gpio-leds { ++ compatible = "gpio-leds"; ++ ++ sys_led: led-sys { ++ gpios = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; ++ label = "red:power"; ++ linux,default-trigger = "heartbeat"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sys_led_pin>; ++ }; ++ ++ wan_led: led-wan { ++ gpios = <&gpio2 RK_PC1 GPIO_ACTIVE_HIGH>; ++ label = "green:wan"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&wan_led_pin>; ++ }; ++ ++ lan1_led: led-lan1 { ++ gpios = <&gpio3 RK_PD6 GPIO_ACTIVE_HIGH>; ++ label = "green:lan1"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lan1_led_pin>; ++ }; ++ ++ lan2_led: led-lan2 { ++ gpios = <&gpio3 RK_PD7 GPIO_ACTIVE_HIGH>; ++ label = "green:lan2"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&lan2_led_pin>; ++ }; ++ }; ++ ++ hdmi-con { ++ compatible = "hdmi-connector"; ++ type = "a"; ++ ++ port { ++ hdmi_con_in: endpoint { ++ remote-endpoint = <&hdmi_out_con>; ++ }; ++ }; ++ }; ++ ++ vdd_usbc: vdd-usbc { ++ compatible = "regulator-fixed"; ++ regulator-name = "vdd_usbc"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++ ++ vcc3v3_sys: vcc3v3-sys { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_sys"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ vin-supply = <&vdd_usbc>; ++ }; ++ ++ vcc5v0_sys: vcc5v0-sys { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc5v0_sys"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&vdd_usbc>; ++ }; ++ ++ pcie30_avdd0v9: pcie30-avdd0v9 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd0v9"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ pcie30_avdd1v8: pcie30-avdd1v8 { ++ compatible = "regulator-fixed"; ++ regulator-name = "pcie30_avdd1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ vcc3v3_pcie: vcc3v3-pcie-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_pcie"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpios = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <200000>; ++ vin-supply = <&vcc5v0_sys>; ++ }; ++ ++ vcc3v3_pcie: vcc3v3-pcie-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_pcie"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpio = <&gpio0 RK_PC6 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <50000>; ++ vin-supply = <&vcc3v3_pcie>; ++ }; ++ ++ vcc3v3_ngff: vcc3v3-ngff-regulator { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc3v3_ngff"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ enable-active-high; ++ gpio = <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; ++ startup-delay-us = <50000>; ++ vin-supply = <&vcc3v3_pcie>; ++ }; ++ ++ vcc5v0_usb: vcc5v0_usb { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc5v0_usb"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&vdd_usbc>; ++ }; ++ ++ vcc5v0_usb_host: vcc5v0-usb-host { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&vcc5v0_usb_host_en>; ++ regulator-name = "vcc5v0_usb_host"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&vcc5v0_usb>; ++ }; ++ ++ vcc5v0_sysp: vcc5v0-sysp { ++ compatible = "regulator-fixed"; ++ regulator-name = "vcc5v0_sysp"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&vcc3v3_sys>; ++ }; ++ ++ vcc5v0_usb_otg: vcc5v0-usb-otg { ++ compatible = "regulator-fixed"; ++ enable-active-high; ++ gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&vcc5v0_usb_otg_en>; ++ regulator-name = "vcc5v0_usb_otg"; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ vin-supply = <&vcc5v0_usb>; ++ }; ++}; ++ ++&combphy0 { ++ status = "okay"; ++}; ++ ++&combphy1 { ++ status = "okay"; ++}; ++ ++&combphy2 { ++ status = "okay"; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_cpu>; ++}; ++ ++&gmac0 { ++ phy-mode = "rgmii"; ++ clock_in_out = "output"; ++ ++ snps,reset-gpio = <&gpio0 RK_PC5 GPIO_ACTIVE_LOW>; ++ snps,reset-active-low; ++ /* Reset time is 20ms, 100ms for rtl8211f */ ++ snps,reset-delays-us = <0 20000 100000>; ++ ++ assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>; ++ assigned-clock-parents = <&cru SCLK_GMAC0_RGMII_SPEED>, <&cru CLK_MAC0_2TOP>; ++ ++ pinctrl-names = "default"; ++ pinctrl-0 = <&gmac0_miim ++ &gmac0_tx_bus2 ++ &gmac0_rx_bus2 ++ &gmac0_rgmii_clk ++ &gmac0_rgmii_bus>; ++ ++ tx_delay = <0x3c>; ++ rx_delay = <0x2f>; ++ ++ phy-handle = <&rgmii_phy0>; ++ status = "okay"; ++}; ++ ++ ++&gpu { ++ mali-supply = <&vdd_gpu>; ++ status = "okay"; ++}; ++ ++&hdmi { ++ avdd-0v9-supply = <&vdda0v9_image>; ++ avdd-1v8-supply = <&vcca1v8_image>; ++ status = "okay"; ++}; ++ ++&hdmi_in { ++ hdmi_in_vp0: endpoint { ++ remote-endpoint = <&vp0_out_hdmi>; ++ }; ++}; ++ ++&hdmi_out { ++ hdmi_out_con: endpoint { ++ remote-endpoint = <&hdmi_con_in>; ++ }; ++}; ++ ++&hdmi_sound { ++ status = "okay"; ++}; ++ ++&i2c0 { ++ status = "okay"; ++ ++ vdd_cpu: regulator@1c { ++ compatible = "tcs,tcs4525"; ++ reg = <0x1c>; ++ fcs,suspend-voltage-selector = <1>; ++ regulator-name = "vdd_cpu"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <800000>; ++ regulator-max-microvolt = <1150000>; ++ regulator-ramp-delay = <2300>; ++ vin-supply = <&vcc5v0_sys>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ rk809: pmic@20 { ++ compatible = "rockchip,rk809"; ++ reg = <0x20>; ++ interrupt-parent = <&gpio0>; ++ interrupts = <RK_PA3 IRQ_TYPE_LEVEL_LOW>; ++ #clock-cells = <1>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pmic_int>; ++ rockchip,system-power-controller; ++ vcc1-supply = <&vcc3v3_sys>; ++ vcc2-supply = <&vcc3v3_sys>; ++ vcc3-supply = <&vcc3v3_sys>; ++ vcc4-supply = <&vcc3v3_sys>; ++ vcc5-supply = <&vcc3v3_sys>; ++ vcc6-supply = <&vcc3v3_sys>; ++ vcc7-supply = <&vcc3v3_sys>; ++ vcc8-supply = <&vcc3v3_sys>; ++ vcc9-supply = <&vcc3v3_sys>; ++ wakeup-source; ++ ++ regulators { ++ vdd_logic: DCDC_REG1 { ++ regulator-name = "vdd_logic"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-init-microvolt = <900000>; ++ regulator-initial-mode = <0x2>; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdd_gpu: DCDC_REG2 { ++ regulator-name = "vdd_gpu"; ++ regulator-always-on; ++ regulator-init-microvolt = <900000>; ++ regulator-initial-mode = <0x2>; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-name = "vcc_ddr"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-initial-mode = <0x2>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vdd_npu: DCDC_REG4 { ++ regulator-name = "vdd_npu"; ++ regulator-init-microvolt = <900000>; ++ regulator-initial-mode = <0x2>; ++ regulator-min-microvolt = <500000>; ++ regulator-max-microvolt = <1350000>; ++ regulator-ramp-delay = <6001>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc_1v8: DCDC_REG5 { ++ regulator-name = "vcc_1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdda0v9_image: LDO_REG1 { ++ regulator-name = "vdda0v9_image"; ++ regulator-always-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdda_0v9: LDO_REG2 { ++ regulator-name = "vdda_0v9"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vdda0v9_pmu: LDO_REG3 { ++ regulator-name = "vdda0v9_pmu"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <900000>; ++ regulator-max-microvolt = <900000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <900000>; ++ }; ++ }; ++ ++ vccio_acodec: LDO_REG4 { ++ regulator-name = "vccio_acodec"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vccio_sd: LDO_REG5 { ++ regulator-name = "vccio_sd"; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc3v3_pmu: LDO_REG6 { ++ regulator-name = "vcc3v3_pmu"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcca_1v8: LDO_REG7 { ++ regulator-name = "vcca_1v8"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcca1v8_pmu: LDO_REG8 { ++ regulator-name = "vcca1v8_pmu"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vcca1v8_image: LDO_REG9 { ++ regulator-name = "vcca1v8_image"; ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc_3v3: SWITCH_REG1 { ++ regulator-name = "vcc_3v3"; ++ regulator-always-on; ++ regulator-boot-on; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ ++ vcc3v3_sd: SWITCH_REG2 { ++ regulator-name = "vcc3v3_sd"; ++ regulator-always-on; ++ ++ regulator-state-mem { ++ regulator-off-in-suspend; ++ }; ++ }; ++ }; ++ }; ++}; ++ ++ ++&i2c5 { ++ status = "okay"; ++ ++ hym8563: hym8563@51 { ++ compatible = "haoyu,hym8563"; ++ reg = <0x51>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&rtc_int>; ++ interrupt-parent = <&gpio0>; ++ interrupts = <RK_PD3 IRQ_TYPE_LEVEL_LOW>; ++ wakeup-source; ++ }; ++}; ++ ++&i2s0_8ch { ++ status = "okay"; ++}; ++ ++&i2s1_8ch { ++ rockchip,trcm-sync-tx-only; ++ status = "okay"; ++}; ++ ++ ++&mdio0 { ++ rgmii_phy0: ethernet-phy@1 { ++ compatible = "ethernet-phy-ieee802.3-c22"; ++ reg = <0x1>; ++ interrupt-parent = <&gpio0>; ++ interrupts = <RK_PC4 IRQ_TYPE_LEVEL_LOW>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&gmac_int>; ++ }; ++}; ++ ++&pcie30phy { ++ data-lanes = <1 2>; ++ status = "okay"; ++}; ++ ++&pcie3x1 { ++ num-lanes = <1>; ++ reset-gpios = <&gpio3 RK_PA1 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&vcc3v3_ngff>; ++ status = "okay"; ++}; ++ ++&pcie3x2 { ++ num-lanes = <1>; ++ reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>; ++ vpcie3v3-supply = <&vcc3v3_pcie>; ++ status = "okay"; ++}; ++ ++&pcie2x1 { ++ num-viewport = <4>; ++ reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_HIGH>; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ gpio-leds { ++ ++ sys_led_pin: sys-led-pin { ++ rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ wan_led_pin: wan-led-pin { ++ rockchip,pins = <2 RK_PC1 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ lan1_led_pin: lan1-led-pin { ++ rockchip,pins = <3 RK_PD6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ lan2_led_pin: lan2-led-pin { ++ rockchip,pins = <3 RK_PD7 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gmac { ++ gmac_int: gmac-int { ++ rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ gpio-key { ++ key1_pin: key1-pin { ++ rockchip,pins = <4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int: pmic_int { ++ rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ rtc { ++ rtc_int: rtc-int { ++ rockchip,pins = <0 RK_PD3 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ usb { ++ vcc5v0_usb_host_en: vcc5v0-usb-host-en { ++ rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ ++ vcc5v0_usb_otg_en: vcc5v0-usb-otg-en { ++ rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++}; ++ ++&pmu_io_domains { ++ pmuio1-supply = <&vcc3v3_pmu>; ++ pmuio2-supply = <&vcc3v3_pmu>; ++ vccio1-supply = <&vccio_acodec>; ++ vccio3-supply = <&vccio_sd>; ++ vccio4-supply = <&vcc_1v8>; ++ vccio5-supply = <&vcc_3v3>; ++ vccio6-supply = <&vcc_1v8>; ++ vccio7-supply = <&vcc_3v3>; ++ status = "okay"; ++}; ++ ++&pwm0 { ++ status = "okay"; ++}; ++ ++&pwm4 { ++ status = "disabled"; ++}; ++ ++&pwm5 { ++ status = "disabled"; ++}; ++ ++&pwm7 { ++ status = "disabled"; ++}; ++ ++&saradc { ++ vref-supply = <&vcca_1v8>; ++ status = "okay"; ++}; ++ ++&sata2 { ++ status = "disabled"; ++}; ++ ++&sdhci { ++ bus-width = <8>; ++ no-sdio; ++ no-sd; ++ non-removable; ++ max-frequency = <200000000>; ++ status = "okay"; ++}; ++ ++&sdmmc0 { ++ max-frequency = <150000000>; ++ no-sdio; ++ no-mmc; ++ bus-width = <4>; ++ cap-mmc-highspeed; ++ cap-sd-highspeed; ++ disable-wp; ++ sd-uhs-sdr104; ++ vmmc-supply = <&vcc3v3_sd>; ++ vqmmc-supply = <&vccio_sd>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd &sdmmc0_det>; ++ status = "okay"; ++}; ++ ++&spi3 { ++ pinctrl-0 = <&spi3m1_pins>; ++ status = "disabled"; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <1>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&uart0 { ++ status = "disabled"; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&uart7 { ++ pinctrl-0 = <&uart7m1_xfer>; ++ status = "disabled"; ++}; ++ ++&uart9 { ++ pinctrl-0 = <&uart9m1_xfer>; ++ status = "disabled"; ++}; ++ ++&usb_host0_ehci { ++ status = "okay"; ++}; ++ ++&usb_host0_ohci { ++ status = "okay"; ++}; ++ ++&usb_host0_xhci { ++ dr_mode = "host"; ++ status = "okay"; ++}; ++ ++&usb_host1_ehci { ++ status = "okay"; ++}; ++ ++&usb_host1_ohci { ++ status = "okay"; ++}; ++ ++&usb_host1_xhci { ++ status = "okay"; ++}; ++ ++&usb2phy0 { ++ status = "okay"; ++}; ++ ++&usb2phy0_host { ++ phy-supply = <&vcc5v0_usb_host>; ++ status = "okay"; ++}; ++ ++&usb2phy0_otg { ++ phy-supply = <&vcc5v0_usb_otg>; ++ status = "okay"; ++}; ++ ++&usb2phy1 { ++ status = "okay"; ++}; ++ ++&usb2phy1_host { ++ status = "okay"; ++}; ++ ++&usb2phy1_otg { ++ status = "okay"; ++}; ++ ++&vop { ++ assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; ++ assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; ++ status = "okay"; ++}; ++ ++&vop_mmu { ++ status = "okay"; ++}; ++ ++&vp0 { ++ vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { ++ reg = <ROCKCHIP_VOP2_EP_HDMI0>; ++ remote-endpoint = <&hdmi_in_vp0>; ++ }; ++}; diff --git a/target/linux/rockchip/patches-5.19/0053-rockchip-use-system-LED-for-OpenWrt.patch b/target/linux/rockchip/patches-5.19/0053-rockchip-use-system-LED-for-OpenWrt.patch new file mode 100644 index 00000000000000..5ec7952bfeaf88 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0053-rockchip-use-system-LED-for-OpenWrt.patch @@ -0,0 +1,31 @@ +From 6731d2c9039fbe1ecf21915eab3acee0a999508a Mon Sep 17 00:00:00 2001 +From: David Bauer <mail@david-bauer.net> +Date: Fri, 10 Jul 2020 21:38:20 +0200 +Subject: [PATCH] rockchip: use system LED for OpenWrt + +Use the SYS LED on the casing for showing system status. + +This patch is kept separate from the NanoPi R2S support patch, as i plan +on submitting the device support upstream. + +Signed-off-by: David Bauer <mail@david-bauer.net> +--- + arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -18,6 +18,13 @@ + mmc0 = &sdmmc; + }; + ++ aliases { ++ led-boot = &sys_led; ++ led-failsafe = &sys_led; ++ led-running = &sys_led; ++ led-upgrade = &sys_led; ++ }; ++ + chosen { + stdout-path = "serial2:1500000n8"; + }; diff --git a/target/linux/rockchip/patches-5.19/0054-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch b/target/linux/rockchip/patches-5.19/0054-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch new file mode 100644 index 00000000000000..06e593a5a2b1c3 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0054-arm64-rockchip-add-OF-node-for-USB-eth-on-NanoPi-R2S.patch @@ -0,0 +1,24 @@ +From 2795c8b31a686bdb8338f9404d18ef7a154f0d75 Mon Sep 17 00:00:00 2001 +From: David Bauer <mail@david-bauer.net> +Date: Sun, 26 Jul 2020 13:32:59 +0200 +Subject: [PATCH] arm64: rockchip: add OF node for USB eth on NanoPi R2S + +This adds the OF node for the USB3 ethernet adapter on the FriendlyARM +NanoPi R2S. Add the correct value for the RTL8153 LED configuration +register to match the blink behavior of the other port on the device. + +Signed-off-by: David Bauer <mail@david-bauer.net> +--- + arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -404,6 +404,7 @@ + rtl8153: device@2 { + compatible = "usbbda,8153"; + reg = <2>; ++ realtek,led-data = <0x87>; + }; + }; + diff --git a/target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch b/target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch new file mode 100644 index 00000000000000..f3ad8e18075cda --- /dev/null +++ b/target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch @@ -0,0 +1,397 @@ +From ac8fa7a4d6e548cd4d4719f12cefb664191a41c2 Mon Sep 17 00:00:00 2001 +From: Marty Jones <mj8263788@gmail.com> +Date: Wed, 12 May 2021 13:04:20 -0400 +Subject: [PATCH] rockchip: rk3328: add support for FriendlyARM NanoPi NEO3 + +This patch adds support for FriendlyARM NanoPi NEO3 + +Soc: RockChip RK3328 +RAM: 1GB/2GB DDR4 +LAN: 10/100/1000M Ethernet with unique MAC +USB Host: 1x USB3.0 Type A and 2x USB2.0 on 2.54mm pin header +MicroSD: x 1 for system boot and storage +LED: Power LED x 1, System LED x 1 +Key: User Button x 1 +Fan: 2 Pin JST ZH 1.5mm Connector for 5V Fan +GPIO: 26 pin-header, include I2C, UART, SPI, I2S, GPIO +Power: 5V/1A, via Type-C or GPIO + +Signed-off-by: Marty Jones <mj8263788@gmail.com> +--- + arch/arm64/boot/dts/rockchip/Makefile | 1 + + .../boot/dts/rockchip/rk3328-nanopi-neo3.dts | 359 ++++++++++++++++++ + 2 files changed, 360 insertions(+) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-nanopi-neo3.dts + +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9 + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-neo3.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb +--- /dev/null ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-neo3.dts +@@ -0,0 +1,359 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR MIT) ++/* ++ * Copyright (c) 2020 David Bauer <mail@david-bauer.net> ++ */ ++ ++/dts-v1/; ++ ++#include <dt-bindings/input/input.h> ++#include <dt-bindings/gpio/gpio.h> ++#include "rk3328.dtsi" ++ ++/ { ++ model = "FriendlyElec NanoPi NEO3"; ++ compatible = "friendlyarm,nanopi-neo3", "rockchip,rk3328"; ++ ++ chosen { ++ stdout-path = "serial2:1500000n8"; ++ }; ++ ++ gmac_clk: gmac-clock { ++ compatible = "fixed-clock"; ++ clock-frequency = <125000000>; ++ clock-output-names = "gmac_clkin"; ++ #clock-cells = <0>; ++ }; ++ ++ keys { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&reset_button_pin>; ++ pinctrl-names = "default"; ++ ++ reset { ++ label = "reset"; ++ gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>; ++ linux,code = <KEY_RESTART>; ++ debounce-interval = <50>; ++ }; ++ }; ++ ++ leds { ++ compatible = "gpio-leds"; ++ pinctrl-0 = <&stat_led_pin>; ++ pinctrl-names = "default"; ++ ++ stat_led: led-1 { ++ gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; ++ label = "nanopi-neo3:green:stat"; ++ }; ++ }; ++ ++ vcc_io_sdio: sdmmcio-regulator { ++ compatible = "regulator-gpio"; ++ enable-active-high; ++ gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>; ++ pinctrl-0 = <&sdio_vcc_pin>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc_io_sdio"; ++ regulator-always-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-settling-time-us = <5000>; ++ regulator-type = "voltage"; ++ startup-delay-us = <2000>; ++ states = <1800000 0x1>, ++ <3300000 0x0>; ++ vin-supply = <&vcc_io_33>; ++ }; ++ ++ vcc_sd: sdmmc-regulator { ++ compatible = "regulator-fixed"; ++ gpio = <&gpio0 RK_PD6 GPIO_ACTIVE_LOW>; ++ pinctrl-0 = <&sdmmc0m1_pin>; ++ pinctrl-names = "default"; ++ regulator-name = "vcc_sd"; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ vin-supply = <&vcc_io_33>; ++ }; ++ ++ vdd_5v: vdd-5v { ++ compatible = "regulator-fixed"; ++ regulator-name = "vdd_5v"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <5000000>; ++ regulator-max-microvolt = <5000000>; ++ }; ++}; ++ ++&cpu0 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu1 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu2 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&cpu3 { ++ cpu-supply = <&vdd_arm>; ++}; ++ ++&display_subsystem { ++ status = "disabled"; ++}; ++ ++&gmac2io { ++ assigned-clocks = <&cru SCLK_MAC2IO>, <&cru SCLK_MAC2IO_EXT>; ++ assigned-clock-parents = <&gmac_clk>, <&gmac_clk>; ++ clock_in_out = "input"; ++ phy-handle = <&rtl8211e>; ++ phy-mode = "rgmii"; ++ phy-supply = <&vcc_io_33>; ++ pinctrl-0 = <&rgmiim1_pins>; ++ pinctrl-names = "default"; ++ rx_delay = <0x18>; ++ snps,aal; ++ tx_delay = <0x24>; ++ status = "okay"; ++ ++ mdio { ++ compatible = "snps,dwmac-mdio"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ rtl8211e: ethernet-phy@1 { ++ reg = <1>; ++ pinctrl-0 = <ð_phy_reset_pin>; ++ pinctrl-names = "default"; ++ reset-assert-us = <10000>; ++ reset-deassert-us = <50000>; ++ reset-gpios = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; ++ }; ++ }; ++}; ++ ++&i2c1 { ++ status = "okay"; ++ ++ rk805: pmic@18 { ++ compatible = "rockchip,rk805"; ++ reg = <0x18>; ++ interrupt-parent = <&gpio1>; ++ interrupts = <24 IRQ_TYPE_LEVEL_LOW>; ++ #clock-cells = <1>; ++ clock-output-names = "xin32k", "rk805-clkout2"; ++ gpio-controller; ++ #gpio-cells = <2>; ++ pinctrl-0 = <&pmic_int_l>; ++ pinctrl-names = "default"; ++ rockchip,system-power-controller; ++ wakeup-source; ++ ++ vcc1-supply = <&vdd_5v>; ++ vcc2-supply = <&vdd_5v>; ++ vcc3-supply = <&vdd_5v>; ++ vcc4-supply = <&vdd_5v>; ++ vcc5-supply = <&vcc_io_33>; ++ vcc6-supply = <&vdd_5v>; ++ ++ regulators { ++ vdd_log: DCDC_REG1 { ++ regulator-name = "vdd_log"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ ++ vdd_arm: DCDC_REG2 { ++ regulator-name = "vdd_arm"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <712500>; ++ regulator-max-microvolt = <1450000>; ++ regulator-ramp-delay = <12500>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <950000>; ++ }; ++ }; ++ ++ vcc_ddr: DCDC_REG3 { ++ regulator-name = "vcc_ddr"; ++ regulator-always-on; ++ regulator-boot-on; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ }; ++ }; ++ ++ vcc_io_33: DCDC_REG4 { ++ regulator-name = "vcc_io_33"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <3300000>; ++ }; ++ }; ++ ++ vcc_18: LDO_REG1 { ++ regulator-name = "vcc_18"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vcc18_emmc: LDO_REG2 { ++ regulator-name = "vcc18_emmc"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1800000>; ++ }; ++ }; ++ ++ vdd_10: LDO_REG3 { ++ regulator-name = "vdd_10"; ++ regulator-always-on; ++ regulator-boot-on; ++ regulator-min-microvolt = <1000000>; ++ regulator-max-microvolt = <1000000>; ++ ++ regulator-state-mem { ++ regulator-on-in-suspend; ++ regulator-suspend-microvolt = <1000000>; ++ }; ++ }; ++ }; ++ }; ++}; ++ ++&io_domains { ++ pmuio-supply = <&vcc_io_33>; ++ vccio1-supply = <&vcc_io_33>; ++ vccio2-supply = <&vcc18_emmc>; ++ vccio3-supply = <&vcc_io_sdio>; ++ vccio4-supply = <&vcc_18>; ++ vccio5-supply = <&vcc_io_33>; ++ vccio6-supply = <&vcc_io_33>; ++ status = "okay"; ++}; ++ ++&pinctrl { ++ button { ++ reset_button_pin: reset-button-pin { ++ rockchip,pins = <0 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ gmac2io { ++ eth_phy_reset_pin: eth-phy-reset-pin { ++ rockchip,pins = <1 RK_PC2 RK_FUNC_GPIO &pcfg_pull_down>; ++ }; ++ }; ++ ++ leds { ++ stat_led_pin: stat-led-pin { ++ rockchip,pins = <0 RK_PA2 RK_FUNC_GPIO &pcfg_pull_none>; ++ }; ++ }; ++ ++ pmic { ++ pmic_int_l: pmic-int-l { ++ rockchip,pins = <1 RK_PD0 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++ ++ sd { ++ sdio_vcc_pin: sdio-vcc-pin { ++ rockchip,pins = <1 RK_PD4 RK_FUNC_GPIO &pcfg_pull_up>; ++ }; ++ }; ++}; ++ ++&pwm2 { ++ status = "okay"; ++}; ++ ++&sdmmc { ++ bus-width = <4>; ++ cap-sd-highspeed; ++ disable-wp; ++ pinctrl-0 = <&sdmmc0_clk>, <&sdmmc0_cmd>, <&sdmmc0_dectn>, <&sdmmc0_bus4>; ++ pinctrl-names = "default"; ++ sd-uhs-sdr12; ++ sd-uhs-sdr25; ++ sd-uhs-sdr50; ++ sd-uhs-sdr104; ++ vmmc-supply = <&vcc_sd>; ++ vqmmc-supply = <&vcc_io_sdio>; ++ status = "okay"; ++}; ++ ++&tsadc { ++ rockchip,hw-tshut-mode = <0>; ++ rockchip,hw-tshut-polarity = <0>; ++ status = "okay"; ++}; ++ ++&u2phy { ++ status = "okay"; ++}; ++ ++&u2phy_host { ++ status = "okay"; ++}; ++ ++&u2phy_otg { ++ status = "okay"; ++}; ++ ++&uart2 { ++ status = "okay"; ++}; ++ ++&usb20_otg { ++ status = "okay"; ++ dr_mode = "host"; ++}; ++ ++&usb_host0_ehci { ++ status = "okay"; ++}; ++ ++&usb_host0_ohci { ++ status = "okay"; ++}; ++ ++&usbdrd3 { ++ dr_mode = "host"; ++ status = "okay"; ++}; From f861ce8a61cddfd44f873ad9a4c9c14381c9d080 Mon Sep 17 00:00:00 2001 From: coolsnowwolf <coolsowwolf@gmail.com> Date: Fri, 5 Aug 2022 06:38:54 +0000 Subject: [PATCH 5/9] rockchip: refresh 5.19 patch --- target/linux/rockchip/Makefile | 2 +- ...dd-support-for-FriendlyARM-NanoPi-N.patch} | 0 ...add-driver-for-Motorcomm-YT85xx+PHYs.patch | 2243 +++++++++++++++ ...ip-add-hardware-random-number-genera.patch | 50 + ...ip-add-devfreq-driver-for-rk3328-dmc.patch | 44 + ...setting-ddr-clock-via-SIP-Version-2-.patch | 210 ++ ...eq-rockchip-dfi-add-more-soc-support.patch | 662 +++++ ...m64-dts-rockchip-rk3328-add-dfi-node.patch | 27 + ...anopi-r2s-add-rk3328-dmc-relate-node.patch | 126 + ...drv-net-phy-add-JLSemi-jl2xxx-driver.patch | 702 +++++ .../0900-arm-boot-add-dts-files.patch | 34 + ...overclock-to-2.2-1.8-GHz-for-NanoPi4.patch | 21 + ...ip-add-more-cpu-operating-points-for.patch | 44 + ...o-rockchip-permit-to-pass-self-tests.patch | 2419 +++++++++++++++++ 14 files changed, 6583 insertions(+), 1 deletion(-) rename target/linux/rockchip/patches-5.19/{111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch => 0055-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch} (100%) create mode 100644 target/linux/rockchip/patches-5.19/0056-add-driver-for-Motorcomm-YT85xx+PHYs.patch create mode 100644 target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch create mode 100644 target/linux/rockchip/patches-5.19/0058-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch create mode 100644 target/linux/rockchip/patches-5.19/0059-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch create mode 100644 target/linux/rockchip/patches-5.19/0060-PM-devfreq-rockchip-dfi-add-more-soc-support.patch create mode 100644 target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch create mode 100644 target/linux/rockchip/patches-5.19/0062-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch create mode 100644 target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch create mode 100644 target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch create mode 100644 target/linux/rockchip/patches-5.19/0901-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch create mode 100644 target/linux/rockchip/patches-5.19/0902-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch create mode 100644 target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch diff --git a/target/linux/rockchip/Makefile b/target/linux/rockchip/Makefile index e616ba05cbd241..82ac5ef9da12c8 100644 --- a/target/linux/rockchip/Makefile +++ b/target/linux/rockchip/Makefile @@ -8,7 +8,7 @@ FEATURES:=ext4 audio usb usbgadget display gpio fpu pci pcie rootfs-part boot-pa SUBTARGETS:=armv8 KERNEL_PATCHVER=5.15 -KERNEL_TESTING_PATCHVER=5.4 +KERNEL_TESTING_PATCHVER=5.19 define Target/Description Build firmware image for Rockchip SoC devices. diff --git a/target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch b/target/linux/rockchip/patches-5.19/0055-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch similarity index 100% rename from target/linux/rockchip/patches-5.19/111-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch rename to target/linux/rockchip/patches-5.19/0055-rockchip-rk3328-add-support-for-FriendlyARM-NanoPi-N.patch diff --git a/target/linux/rockchip/patches-5.19/0056-add-driver-for-Motorcomm-YT85xx+PHYs.patch b/target/linux/rockchip/patches-5.19/0056-add-driver-for-Motorcomm-YT85xx+PHYs.patch new file mode 100644 index 00000000000000..26227e020481cd --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0056-add-driver-for-Motorcomm-YT85xx+PHYs.patch @@ -0,0 +1,2243 @@ +--- a/drivers/net/phy/motorcomm.c ++++ b/drivers/net/phy/motorcomm.c +@@ -1,137 +1,1540 @@ +-// SPDX-License-Identifier: GPL-2.0+ + /* ++ * drivers/net/phy/motorcomm.c ++ * + * Driver for Motorcomm PHYs + * +- * Author: Peter Geis <pgwipeout@gmail.com> ++ * Author: Leilei Zhao <leilei.zhao@motorcomm.com> ++ * ++ * Copyright (c) 2019 Motorcomm, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ * Support : Motorcomm Phys: ++ * Giga phys: yt8511, yt8521 ++ * 100/10 Phys : yt8512, yt8512b, yt8510 ++ * Automotive 100Mb Phys : yt8010 ++ * Automotive 100/10 hyper range Phys: yt8510 + */ + + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/phy.h> ++#include <linux/motorcomm_phy.h> ++#include <linux/of.h> ++#include <linux/clk.h> ++#include <linux/delay.h> ++#ifndef LINUX_VERSION_CODE ++#include <linux/version.h> ++#else ++#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) ++#endif ++/*for wol, 20210604*/ ++#include <linux/netdevice.h> ++ ++#include "yt8614-phy.h" ++ ++/**** configuration section begin ***********/ ++ ++/* if system depends on ethernet packet to restore from sleep, please define this macro to 1 ++ * otherwise, define it to 0. ++ */ ++#define SYS_WAKEUP_BASED_ON_ETH_PKT 1 ++ ++/* to enable system WOL of phy, please define this macro to 1 ++ * otherwise, define it to 0. ++ */ ++#define YTPHY_ENABLE_WOL 0 ++ ++/* some GMAC need clock input from PHY, for eg., 125M, please enable this macro ++ * by degault, it is set to 0 ++ * NOTE: this macro will need macro SYS_WAKEUP_BASED_ON_ETH_PKT to set to 1 ++ */ ++#define GMAC_CLOCK_INPUT_NEEDED 1 + +-#define PHY_ID_YT8511 0x0000010a + +-#define YT8511_PAGE_SELECT 0x1e +-#define YT8511_PAGE 0x1f +-#define YT8511_EXT_CLK_GATE 0x0c +-#define YT8511_EXT_DELAY_DRIVE 0x0d +-#define YT8511_EXT_SLEEP_CTRL 0x27 +- +-/* 2b00 25m from pll +- * 2b01 25m from xtl *default* +- * 2b10 62.m from pll +- * 2b11 125m from pll +- */ +-#define YT8511_CLK_125M (BIT(2) | BIT(1)) +-#define YT8511_PLLON_SLP BIT(14) +- +-/* RX Delay enabled = 1.8ns 1000T, 8ns 10/100T */ +-#define YT8511_DELAY_RX BIT(0) +- +-/* TX Gig-E Delay is bits 7:4, default 0x5 +- * TX Fast-E Delay is bits 15:12, default 0xf +- * Delay = 150ps * N - 250ps +- * On = 2000ps, off = 50ps +- */ +-#define YT8511_DELAY_GE_TX_EN (0xf << 4) +-#define YT8511_DELAY_GE_TX_DIS (0x2 << 4) +-#define YT8511_DELAY_FE_TX_EN (0xf << 12) +-#define YT8511_DELAY_FE_TX_DIS (0x2 << 12) ++#define YT8521_PHY_MODE_FIBER 1 //fiber mode only ++#define YT8521_PHY_MODE_UTP 2 //utp mode only ++#define YT8521_PHY_MODE_POLL 3 //fiber and utp, poll mode + +-static int yt8511_read_page(struct phy_device *phydev) ++/* please make choice according to system design ++ * for Fiber only system, please define YT8521_PHY_MODE_CURR 1 ++ * for UTP only system, please define YT8521_PHY_MODE_CURR 2 ++ * for combo system, please define YT8521_PHY_MODE_CURR 3 ++ */ ++#define YT8521_PHY_MODE_CURR 3 ++ ++/**** configuration section end ***********/ ++ ++ ++/* no need to change below */ ++ ++#if (YTPHY_ENABLE_WOL) ++#undef SYS_WAKEUP_BASED_ON_ETH_PKT ++#define SYS_WAKEUP_BASED_ON_ETH_PKT 1 ++#endif ++ ++/* workaround for 8521 fiber 100m mode */ ++static int link_mode_8521 = 0; //0: no link; 1: utp; 32: fiber. traced that 1000m fiber uses 32. ++static int link_mode_8614[4] = {0}; //0: no link; 1: utp; 32: fiber. traced that 1000m fiber uses 32. ++ ++/* for multiple port phy, base phy address */ ++static unsigned int yt_mport_base_phy_addr = 0xff; //0xff: invalid; for 8618 ++static unsigned int yt_mport_base_phy_addr_8614 = 0xff; //0xff: invalid; ++ ++int phy_yt8531_led_fixup(struct mii_bus *bus, int addr); ++int yt8511_config_out_125m(struct mii_bus *bus, int phy_id); ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(5,0,0) ) ++int genphy_config_init(struct phy_device *phydev) + { +- return __phy_read(phydev, YT8511_PAGE_SELECT); +-}; ++ int ret; ++ ++ printk (KERN_INFO "yzhang..read phyaddr=%d, phyid=%08x\n",phydev->mdio.addr, phydev->phy_id); + +-static int yt8511_write_page(struct phy_device *phydev, int page) ++ if(phydev->phy_id == 0x4f51e91b) ++ { ++ printk (KERN_INFO "yzhang..get YT8511, abt to set 125m clk out, phyaddr=%d, phyid=%08x\n",phydev->mdio.addr, phydev->phy_id); ++ ret = yt8511_config_out_125m(phydev->mdio.bus, phydev->mdio.addr); ++ printk (KERN_INFO "yzhang..8511 set 125m clk out, reg=%#04x\n",phydev->mdio.bus->read(phydev->mdio.bus,phydev->mdio.addr,0x1f)/*double check as delay*/); ++ if (ret<0) ++ printk (KERN_INFO "yzhang..failed to set 125m clk out, ret=%d\n",ret); ++ ++ phy_yt8531_led_fixup(phydev->mdio.bus, phydev->mdio.addr); ++ } ++ return genphy_read_abilities(phydev); ++} ++#endif ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++static int ytphy_config_init(struct phy_device *phydev) + { +- return __phy_write(phydev, YT8511_PAGE_SELECT, page); +-}; ++ return 0; ++} ++#endif ++ ++static int ytphy_read_ext(struct phy_device *phydev, u32 regnum) ++{ ++ int ret; ++ int val; ++ ++ ret = phy_write(phydev, REG_DEBUG_ADDR_OFFSET, regnum); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_DEBUG_DATA); ++ ++ return val; ++} ++ ++static int ytphy_write_ext(struct phy_device *phydev, u32 regnum, u16 val) ++{ ++ int ret; ++ ++ ret = phy_write(phydev, REG_DEBUG_ADDR_OFFSET, regnum); ++ if (ret < 0) ++ return ret; ++ ++ ret = phy_write(phydev, REG_DEBUG_DATA, val); ++ ++ return ret; ++} ++ ++static int yt8010_config_aneg(struct phy_device *phydev) ++{ ++ phydev->speed = SPEED_100; ++ return 0; ++} ++ ++static int yt8512_clk_init(struct phy_device *phydev) ++{ ++ int ret; ++ int val; ++ ++ val = ytphy_read_ext(phydev, YT8512_EXTREG_AFE_PLL); ++ if (val < 0) ++ return val; ++ ++ val |= YT8512_CONFIG_PLL_REFCLK_SEL_EN; ++ ++ ret = ytphy_write_ext(phydev, YT8512_EXTREG_AFE_PLL, val); ++ if (ret < 0) ++ return ret; ++ ++ val = ytphy_read_ext(phydev, YT8512_EXTREG_EXTEND_COMBO); ++ if (val < 0) ++ return val; ++ ++ val |= YT8512_CONTROL1_RMII_EN; ++ ++ ret = ytphy_write_ext(phydev, YT8512_EXTREG_EXTEND_COMBO, val); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, MII_BMCR); ++ if (val < 0) ++ return val; ++ ++ val |= YT_SOFTWARE_RESET; ++ ret = phy_write(phydev, MII_BMCR, val); ++ ++ return ret; ++} ++ ++static int yt8512_led_init(struct phy_device *phydev) ++{ ++ int ret; ++ int val; ++ int mask; ++ ++ val = ytphy_read_ext(phydev, YT8512_EXTREG_LED0); ++ if (val < 0) ++ return val; ++ ++ val |= YT8512_LED0_ACT_BLK_IND; ++ ++ mask = YT8512_LED0_DIS_LED_AN_TRY | YT8512_LED0_BT_BLK_EN | ++ YT8512_LED0_HT_BLK_EN | YT8512_LED0_COL_BLK_EN | ++ YT8512_LED0_BT_ON_EN; ++ val &= ~mask; ++ ++ ret = ytphy_write_ext(phydev, YT8512_EXTREG_LED0, val); ++ if (ret < 0) ++ return ret; ++ ++ val = ytphy_read_ext(phydev, YT8512_EXTREG_LED1); ++ if (val < 0) ++ return val; ++ ++ val |= YT8512_LED1_BT_ON_EN; ++ ++ mask = YT8512_LED1_TXACT_BLK_EN | YT8512_LED1_RXACT_BLK_EN; ++ val &= ~mask; ++ ++ ret = ytphy_write_ext(phydev, YT8512_LED1_BT_ON_EN, val); ++ ++ return ret; ++} ++ ++static int yt8512_config_init(struct phy_device *phydev) ++{ ++ int ret; ++ int val; ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ ret = ytphy_config_init(phydev); ++#else ++ ret = genphy_config_init(phydev); ++#endif ++ if (ret < 0) ++ return ret; ++ ++ ret = yt8512_clk_init(phydev); ++ if (ret < 0) ++ return ret; ++ ++ ret = yt8512_led_init(phydev); ++ ++ /* disable auto sleep */ ++ val = ytphy_read_ext(phydev, YT8512_EXTREG_SLEEP_CONTROL1); ++ if (val < 0) ++ return val; ++ ++ val &= (~BIT(YT8512_EN_SLEEP_SW_BIT)); ++ ++ ret = ytphy_write_ext(phydev, YT8512_EXTREG_SLEEP_CONTROL1, val); ++ if (ret < 0) ++ return ret; ++ ++ return ret; ++} ++ ++static int yt8512_read_status(struct phy_device *phydev) ++{ ++ int ret; ++ int val; ++ int speed, speed_mode, duplex; ++ ++ ret = genphy_update_link(phydev); ++ if (ret) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ duplex = (val & YT8512_DUPLEX) >> YT8512_DUPLEX_BIT; ++ speed_mode = (val & YT8512_SPEED_MODE) >> YT8512_SPEED_MODE_BIT; ++ switch (speed_mode) { ++ case 0: ++ speed = SPEED_10; ++ break; ++ case 1: ++ speed = SPEED_100; ++ break; ++ case 2: ++ case 3: ++ default: ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ speed = -1; ++#else ++ speed = SPEED_UNKNOWN; ++#endif ++ break; ++ } ++ ++ phydev->speed = speed; ++ phydev->duplex = duplex; ++ ++ return 0; ++} ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++#if 0 ++int yt8521_soft_reset(struct phy_device *phydev) ++{ ++ int ret; ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ret = genphy_soft_reset(phydev); ++ if (ret < 0) ++ return ret; ++ ++ ytphy_write_ext(phydev, 0xa000, 2); ++ ret = genphy_soft_reset(phydev); ++ if (ret < 0) { ++ ytphy_write_ext(phydev, 0xa000, 0); ++ return ret; ++ } ++ ++ return 0; ++} ++#else ++/* qingsong feedback 2 genphy_soft_reset will cause problem. ++ * and this is the reduction version ++ */ ++int yt8521_soft_reset(struct phy_device *phydev) ++{ ++ int ret, val; ++ ++ val = ytphy_read_ext(phydev, 0xa001); ++ ytphy_write_ext(phydev, 0xa001, (val & ~0x8000)); ++ ++ ret = genphy_soft_reset(phydev); ++ if (ret < 0) ++ return ret; ++ ++ return 0; ++} ++#endif ++ ++#endif ++ ++#if GMAC_CLOCK_INPUT_NEEDED ++static int ytphy_mii_rd_ext(struct mii_bus *bus, int phy_id, u32 regnum) ++{ ++ int ret; ++ int val; ++ ++ ret = bus->write(bus, phy_id, REG_DEBUG_ADDR_OFFSET, regnum); ++ if (ret < 0) ++ return ret; ++ ++ val = bus->read(bus, phy_id, REG_DEBUG_DATA); ++ ++ return val; ++} ++ ++static int ytphy_mii_wr_ext(struct mii_bus *bus, int phy_id, u32 regnum, u16 val) ++{ ++ int ret; ++ ++ ret = bus->write(bus, phy_id, REG_DEBUG_ADDR_OFFSET, regnum); ++ if (ret < 0) ++ return ret; ++ ++ ret = bus->write(bus, phy_id, REG_DEBUG_DATA, val); ++ ++ return ret; ++} ++ ++int yt8511_config_dis_txdelay(struct mii_bus *bus, int phy_id) ++{ ++ int ret; ++ int val; ++ ++ /* disable auto sleep */ ++ val = ytphy_mii_rd_ext(bus, phy_id, 0x27); ++ if (val < 0) ++ return val; ++ ++ val &= (~BIT(15)); ++ ++ ret = ytphy_mii_wr_ext(bus, phy_id, 0x27, val); ++ if (ret < 0) ++ return ret; ++ ++ /* enable RXC clock when no wire plug */ ++ val = ytphy_mii_rd_ext(bus, phy_id, 0xc); ++ if (val < 0) ++ return val; ++ ++ /* ext reg 0xc b[7:4] ++ Tx Delay time = 150ps * N - 250ps ++ */ ++ val &= ~(0xf << 4); ++ ret = ytphy_mii_wr_ext(bus, phy_id, 0xc, val); ++ printk("yt8511_config_dis_txdelay..phy txdelay, val=%#08x\n",val); ++ ++ return ret; ++} ++ ++int phy_yt8531_led_fixup(struct mii_bus *bus, int addr) ++{ ++ printk("%s in\n", __func__); ++ ++ ytphy_mii_wr_ext(bus, addr, 0xa00d, 0x670); ++ ytphy_mii_wr_ext(bus, addr, 0xa00e, 0x2070); ++ ytphy_mii_wr_ext(bus, addr, 0xa00f, 0x7e); ++ ++ return 0; ++} ++ ++int yt8511_config_out_125m(struct mii_bus *bus, int addr) ++{ ++ int ret; ++ int val; ++ ++ mdelay(50); ++ ret = ytphy_mii_wr_ext(bus, addr, 0xa012, 0xd0); ++ ++ mdelay(100); ++ val = ytphy_mii_rd_ext(bus, addr, 0xa012); ++ ++ if(val != 0xd0) ++ { ++ printk("yt8511_config_out_125m error\n"); ++ return -1; ++ } ++ ++ /* disable auto sleep */ ++ val = ytphy_mii_rd_ext(bus, addr, 0x27); ++ if (val < 0) ++ return val; ++ ++ val &= (~BIT(15)); ++ ++ ret = ytphy_mii_wr_ext(bus, addr, 0x27, val); ++ if (ret < 0) ++ return ret; ++ ++ /* enable RXC clock when no wire plug */ ++ val = ytphy_mii_rd_ext(bus, addr, 0xc); ++ if (val < 0) ++ return val; ++ ++ /* ext reg 0xc.b[2:1] ++ 00-----25M from pll; ++ 01---- 25M from xtl;(default) ++ 10-----62.5M from pll; ++ 11----125M from pll(here set to this value) ++ */ ++ val |= (3 << 1); ++ ret = ytphy_mii_wr_ext(bus, addr, 0xc, val); ++ printk("yt8511_config_out_125m, phy clk out, val=%#08x\n",val); ++ ++#if 0 ++ /* for customer, please enable it based on demand. ++ * configure to master ++ */ ++ val = bus->read(bus, phy_id, 0x9/*master/slave config reg*/); ++ val |= (0x3<<11); //to be manual config and force to be master ++ ret = bus->write(bus, phy_id, 0x9, val); //take effect until phy soft reset ++ if (ret < 0) ++ return ret; ++ ++ printk("yt8511_config_out_125m, phy to be master, val=%#08x\n",val); ++#endif ++ ++ return ret; ++} ++ ++EXPORT_SYMBOL(yt8511_config_out_125m); + + static int yt8511_config_init(struct phy_device *phydev) + { +- int oldpage, ret = 0; +- unsigned int ge, fe; ++ int ret; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ ret = ytphy_config_init(phydev); ++#else ++ ret = genphy_config_init(phydev); ++#endif ++ ++ return ret; ++} ++#endif /*GMAC_CLOCK_INPUT_NEEDED*/ ++ ++#if (YTPHY_ENABLE_WOL) ++static int ytphy_switch_reg_space(struct phy_device *phydev, int space) ++{ ++ int ret; ++ ++ if (space == YTPHY_REG_SPACE_UTP){ ++ ret = ytphy_write_ext(phydev, 0xa000, 0); ++ }else{ ++ ret = ytphy_write_ext(phydev, 0xa000, 2); ++ } ++ ++ return ret; ++} ++ ++static int ytphy_wol_en_cfg(struct phy_device *phydev, ytphy_wol_cfg_t wol_cfg) ++{ ++ int ret=0; ++ int val=0; ++ ++ val = ytphy_read_ext(phydev, YTPHY_WOL_CFG_REG); ++ if (val < 0) ++ return val; ++ ++ if(wol_cfg.enable) { ++ val |= YTPHY_WOL_CFG_EN; ++ ++ if(wol_cfg.type == YTPHY_WOL_TYPE_LEVEL) { ++ val &= ~YTPHY_WOL_CFG_TYPE; ++ val &= ~YTPHY_WOL_CFG_INTR_SEL; ++ } else if(wol_cfg.type == YTPHY_WOL_TYPE_PULSE) { ++ val |= YTPHY_WOL_CFG_TYPE; ++ val |= YTPHY_WOL_CFG_INTR_SEL; ++ ++ if(wol_cfg.width == YTPHY_WOL_WIDTH_84MS) { ++ val &= ~YTPHY_WOL_CFG_WIDTH1; ++ val &= ~YTPHY_WOL_CFG_WIDTH2; ++ } else if(wol_cfg.width == YTPHY_WOL_WIDTH_168MS) { ++ val |= YTPHY_WOL_CFG_WIDTH1; ++ val &= ~YTPHY_WOL_CFG_WIDTH2; ++ } else if(wol_cfg.width == YTPHY_WOL_WIDTH_336MS) { ++ val &= ~YTPHY_WOL_CFG_WIDTH1; ++ val |= YTPHY_WOL_CFG_WIDTH2; ++ } else if(wol_cfg.width == YTPHY_WOL_WIDTH_672MS) { ++ val |= YTPHY_WOL_CFG_WIDTH1; ++ val |= YTPHY_WOL_CFG_WIDTH2; ++ } ++ } ++ } else { ++ val &= ~YTPHY_WOL_CFG_EN; ++ val &= ~YTPHY_WOL_CFG_INTR_SEL; ++ } ++ ++ ret = ytphy_write_ext(phydev, YTPHY_WOL_CFG_REG, val); ++ if (ret < 0) ++ return ret; ++ ++ return 0; ++} ++ ++static void ytphy_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) ++{ ++ int val = 0; ++ ++ wol->supported = WAKE_MAGIC; ++ wol->wolopts = 0; ++ ++ val = ytphy_read_ext(phydev, YTPHY_WOL_CFG_REG); ++ if (val < 0) ++ return; ++ ++ if (val & YTPHY_WOL_CFG_EN) ++ wol->wolopts |= WAKE_MAGIC; ++ ++ return; ++} ++ ++static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) ++{ ++ int ret, pre_page, val; ++ ytphy_wol_cfg_t wol_cfg; ++ struct net_device *p_attached_dev = phydev->attached_dev; ++ ++ memset(&wol_cfg,0,sizeof(ytphy_wol_cfg_t)); ++ pre_page = ytphy_read_ext(phydev, 0xa000); ++ if (pre_page < 0) ++ return pre_page; ++ ++ /* Switch to phy UTP page */ ++ ret = ytphy_switch_reg_space(phydev, YTPHY_REG_SPACE_UTP); ++ if (ret < 0) ++ return ret; ++ ++ if (wol->wolopts & WAKE_MAGIC) { ++ ++ /* Enable the WOL interrupt */ ++ val = phy_read(phydev, YTPHY_UTP_INTR_REG); ++ val |= YTPHY_WOL_INTR; ++ ret = phy_write(phydev, YTPHY_UTP_INTR_REG, val); ++ if (ret < 0) ++ return ret; ++ ++ /* Set the WOL config */ ++ wol_cfg.enable = 1; //enable ++ wol_cfg.type= YTPHY_WOL_TYPE_PULSE; ++ wol_cfg.width= YTPHY_WOL_WIDTH_672MS; ++ ret = ytphy_wol_en_cfg(phydev, wol_cfg); ++ if (ret < 0) ++ return ret; ++ ++ /* Store the device address for the magic packet */ ++ ret = ytphy_write_ext(phydev, YTPHY_MAGIC_PACKET_MAC_ADDR2, ++ ((p_attached_dev->dev_addr[0] << 8) | ++ p_attached_dev->dev_addr[1])); ++ if (ret < 0) ++ return ret; ++ ret = ytphy_write_ext(phydev, YTPHY_MAGIC_PACKET_MAC_ADDR1, ++ ((p_attached_dev->dev_addr[2] << 8) | ++ p_attached_dev->dev_addr[3])); ++ if (ret < 0) ++ return ret; ++ ret = ytphy_write_ext(phydev, YTPHY_MAGIC_PACKET_MAC_ADDR0, ++ ((p_attached_dev->dev_addr[4] << 8) | ++ p_attached_dev->dev_addr[5])); ++ if (ret < 0) ++ return ret; ++ } else { ++ wol_cfg.enable = 0; //disable ++ wol_cfg.type= YTPHY_WOL_TYPE_MAX; ++ wol_cfg.width= YTPHY_WOL_WIDTH_MAX; ++ ret = ytphy_wol_en_cfg(phydev, wol_cfg); ++ if (ret < 0) ++ return ret; ++ } ++ ++ /* Recover to previous register space page */ ++ ret = ytphy_switch_reg_space(phydev, pre_page); ++ if (ret < 0) ++ return ret; ++ ++ return 0; ++} ++ ++#endif /*(YTPHY_ENABLE_WOL)*/ ++ ++static int yt8521_config_init(struct phy_device *phydev) ++{ ++ int ret; ++ int val; + +- oldpage = phy_select_page(phydev, YT8511_EXT_CLK_GATE); +- if (oldpage < 0) +- goto err_restore_page; ++ phydev->irq = PHY_POLL; + +- /* set rgmii delay mode */ +- switch (phydev->interface) { +- case PHY_INTERFACE_MODE_RGMII: +- ge = YT8511_DELAY_GE_TX_DIS; +- fe = YT8511_DELAY_FE_TX_DIS; ++ ytphy_write_ext(phydev, 0xa000, 0); ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ ret = ytphy_config_init(phydev); ++#else ++ ret = genphy_config_init(phydev); ++#endif ++ if (ret < 0) ++ return ret; ++ ++ /* disable auto sleep */ ++ val = ytphy_read_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1); ++ if (val < 0) ++ return val; ++ ++ val &= (~BIT(YT8521_EN_SLEEP_SW_BIT)); ++ ++ ret = ytphy_write_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1, val); ++ if (ret < 0) ++ return ret; ++ ++ /* enable RXC clock when no wire plug */ ++ ret = ytphy_write_ext(phydev, 0xa000, 0); ++ if (ret < 0) ++ return ret; ++ ++ val = ytphy_read_ext(phydev, 0xc); ++ if (val < 0) ++ return val; ++ val &= ~(1 << 12); ++ ret = ytphy_write_ext(phydev, 0xc, val); ++ if (ret < 0) ++ return ret; ++ ++ printk (KERN_INFO "yt8521_config_init, 8521 init call out.\n"); ++ return ret; ++} ++ ++/* ++ * for fiber mode, there is no 10M speed mode and ++ * this function is for this purpose. ++ */ ++static int yt8521_adjust_status(struct phy_device *phydev, int val, int is_utp) ++{ ++ int speed_mode, duplex; ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ int speed = -1; ++#else ++ int speed = SPEED_UNKNOWN; ++#endif ++ ++ duplex = (val & YT8512_DUPLEX) >> YT8521_DUPLEX_BIT; ++ speed_mode = (val & YT8521_SPEED_MODE) >> YT8521_SPEED_MODE_BIT; ++ switch (speed_mode) { ++ case 0: ++ if (is_utp) ++ speed = SPEED_10; + break; +- case PHY_INTERFACE_MODE_RGMII_RXID: +- ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_DIS; +- fe = YT8511_DELAY_FE_TX_DIS; ++ case 1: ++ speed = SPEED_100; + break; +- case PHY_INTERFACE_MODE_RGMII_TXID: +- ge = YT8511_DELAY_GE_TX_EN; +- fe = YT8511_DELAY_FE_TX_EN; ++ case 2: ++ speed = SPEED_1000; + break; +- case PHY_INTERFACE_MODE_RGMII_ID: +- ge = YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN; +- fe = YT8511_DELAY_FE_TX_EN; ++ case 3: + break; +- default: /* do not support other modes */ +- ret = -EOPNOTSUPP; +- goto err_restore_page; ++ default: ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ speed = -1; ++#else ++ speed = SPEED_UNKNOWN; ++#endif ++ break; ++ } ++ ++ phydev->speed = speed; ++ phydev->duplex = duplex; ++ //printk (KERN_INFO "yt8521_adjust_status call out,regval=0x%04x,mode=%s,speed=%dm...\n", val,is_utp?"utp":"fiber", phydev->speed); ++ ++ return 0; ++} ++ ++/* ++ * for fiber mode, when speed is 100M, there is no definition for autonegotiation, and ++ * this function handles this case and return 1 per linux kernel's polling. ++ */ ++int yt8521_aneg_done (struct phy_device *phydev) ++{ ++ ++ //printk("yt8521_aneg_done callin,speed=%dm,linkmoded=%d\n", phydev->speed,link_mode_8521); ++ ++ if((32 == link_mode_8521) && (SPEED_100 == phydev->speed)) ++ { ++ return 1/*link_mode_8521*/; ++ } ++ ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(3,11,0) ) ++ return genphy_aneg_done(phydev); ++#else ++ return 1; ++#endif ++} ++ ++static int yt8521_read_status(struct phy_device *phydev) ++{ ++ int ret; ++ volatile int val, yt8521_fiber_latch_val, yt8521_fiber_curr_val; ++ volatile int link; ++ int link_utp = 0, link_fiber = 0; ++ ++#if (YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ /* reading UTP */ ++ ret = ytphy_write_ext(phydev, 0xa000, 0); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ link = val & (BIT(YT8521_LINK_STATUS_BIT)); ++ if (link) { ++ link_utp = 1; ++ link_mode_8521 = 1; ++ yt8521_adjust_status(phydev, val, 1); ++ } else { ++ link_utp = 0; ++ } ++#endif //(YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ ++#if (YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_UTP) ++ /* reading Fiber */ ++ ret = ytphy_write_ext(phydev, 0xa000, 2); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ //note: below debug information is used to check multiple PHy ports. ++ //printk (KERN_INFO "yt8521_read_status, fiber status=%04x,macbase=0x%08lx\n", val,(unsigned long)phydev->attached_dev); ++ ++ /* for fiber, from 1000m to 100m, there is not link down from 0x11, and check reg 1 to identify such case ++ * this is important for Linux kernel for that, missing linkdown event will cause problem. ++ */ ++ yt8521_fiber_latch_val = phy_read(phydev, MII_BMSR); ++ yt8521_fiber_curr_val = phy_read(phydev, MII_BMSR); ++ link = val & (BIT(YT8521_LINK_STATUS_BIT)); ++ if((link) && (yt8521_fiber_latch_val != yt8521_fiber_curr_val)) ++ { ++ link = 0; ++ printk (KERN_INFO "yt8521_read_status, fiber link down detect,latch=%04x,curr=%04x\n", yt8521_fiber_latch_val,yt8521_fiber_curr_val); ++ } ++ ++ if (link) { ++ link_fiber = 1; ++ yt8521_adjust_status(phydev, val, 0); ++ link_mode_8521 = 32; //fiber mode ++ ++ ++ } else { ++ link_fiber = 0; ++ } ++#endif //(YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_UTP) ++ ++ if (link_utp || link_fiber) { ++ phydev->link = 1; ++ } else { ++ phydev->link = 0; ++ link_mode_8521 = 0; ++ } ++ ++#if (YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ if (link_utp) { ++ ytphy_write_ext(phydev, 0xa000, 0); + } ++#endif + +- ret = __phy_modify(phydev, YT8511_PAGE, (YT8511_DELAY_RX | YT8511_DELAY_GE_TX_EN), ge); ++ //printk (KERN_INFO "yzhang..8521 read status call out,link=%d,linkmode=%d\n", phydev->link, link_mode_8521 ); ++ return 0; ++} ++ ++int yt8521_suspend(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 2); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} ++ ++int yt8521_resume(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ int ret; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); ++ ++ /* disable auto sleep */ ++ value = ytphy_read_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1); ++ if (value < 0) ++ return value; ++ ++ value &= (~BIT(YT8521_EN_SLEEP_SW_BIT)); ++ ret = ytphy_write_ext(phydev, YT8521_EXTREG_SLEEP_CONTROL1, value); + if (ret < 0) +- goto err_restore_page; ++ return ret; + +- /* set clock mode to 125mhz */ +- ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_CLK_125M); ++ /* enable RXC clock when no wire plug */ ++ value = ytphy_read_ext(phydev, 0xc); ++ if (value < 0) ++ return value; ++ value &= ~(1 << 12); ++ ret = ytphy_write_ext(phydev, 0xc, value); + if (ret < 0) +- goto err_restore_page; ++ return ret; ++ ++ ytphy_write_ext(phydev, 0xa000, 2); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); ++ ++#if (YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ ytphy_write_ext(phydev, 0xa000, 0); ++#endif ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} + +- /* fast ethernet delay is in a separate page */ +- ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_DELAY_DRIVE); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++int yt8618_soft_reset(struct phy_device *phydev) ++{ ++ int ret; ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ret = genphy_soft_reset(phydev); + if (ret < 0) +- goto err_restore_page; ++ return ret; + +- ret = __phy_modify(phydev, YT8511_PAGE, YT8511_DELAY_FE_TX_EN, fe); ++ return 0; ++} ++ ++int yt8614_soft_reset(struct phy_device *phydev) ++{ ++ int ret; ++ ++ /* utp */ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ret = genphy_soft_reset(phydev); + if (ret < 0) +- goto err_restore_page; ++ return ret; ++ ++ /* qsgmii */ ++ ytphy_write_ext(phydev, 0xa000, 2); ++ ret = genphy_soft_reset(phydev); ++ if (ret < 0) { ++ ytphy_write_ext(phydev, 0xa000, 0); //back to utp mode ++ return ret; ++ } ++ ++ /* sgmii */ ++ ytphy_write_ext(phydev, 0xa000, 3); ++ ret = genphy_soft_reset(phydev); ++ if (ret < 0) { ++ ytphy_write_ext(phydev, 0xa000, 0); //back to utp mode ++ return ret; ++ } + +- /* leave pll enabled in sleep */ +- ret = __phy_write(phydev, YT8511_PAGE_SELECT, YT8511_EXT_SLEEP_CTRL); ++ return 0; ++} ++ ++#endif ++ ++static int yt8618_config_init(struct phy_device *phydev) ++{ ++ int ret; ++ int val; ++ ++ phydev->irq = PHY_POLL; ++ ++ if(0xff == yt_mport_base_phy_addr) ++ /* by default, we think the first phy should be the base phy addr. for mul */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ { ++ yt_mport_base_phy_addr = phydev->addr; ++ }else if (yt_mport_base_phy_addr > phydev->addr) { ++ printk (KERN_INFO "yzhang..8618 init, phy address mismatch, base=%d, cur=%d\n", yt_mport_base_phy_addr, phydev->addr); ++ } ++#else ++ { ++ yt_mport_base_phy_addr = phydev->mdio.addr; ++ }else if (yt_mport_base_phy_addr > phydev->mdio.addr) { ++ printk (KERN_INFO "yzhang..8618 init, phy address mismatch, base=%d, cur=%d\n", yt_mport_base_phy_addr, phydev->mdio.addr); ++ } ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ ret = ytphy_config_init(phydev); ++#else ++ ret = genphy_config_init(phydev); ++#endif + if (ret < 0) +- goto err_restore_page; ++ return ret; + +- ret = __phy_modify(phydev, YT8511_PAGE, 0, YT8511_PLLON_SLP); ++ /* for utp to optimize signal */ ++ ret = ytphy_write_ext(phydev, 0x41, 0x33); ++ if (ret < 0) ++ return ret; ++ ret = ytphy_write_ext(phydev, 0x42, 0x66); + if (ret < 0) +- goto err_restore_page; ++ return ret; ++ ret = ytphy_write_ext(phydev, 0x43, 0xaa); ++ if (ret < 0) ++ return ret; ++ ret = ytphy_write_ext(phydev, 0x44, 0xd0d); ++ if (ret < 0) ++ return ret; ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ if((phydev->addr > yt_mport_base_phy_addr) && ((2 == phydev->addr - yt_mport_base_phy_addr) || (5 == phydev->addr - yt_mport_base_phy_addr))) ++#else ++ if((phydev->mdio.addr > yt_mport_base_phy_addr) && ((2 == phydev->mdio.addr - yt_mport_base_phy_addr) || (5 == phydev->mdio.addr - yt_mport_base_phy_addr))) ++#endif ++ { ++ ret = ytphy_write_ext(phydev, 0x44, 0x2929); ++ if (ret < 0) ++ return ret; ++ } ++ ++ val = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, val | BMCR_RESET); + +-err_restore_page: +- return phy_restore_page(phydev, oldpage, ret); ++ printk (KERN_INFO "yt8618_config_init call out.\n"); ++ return ret; + } + +-static struct phy_driver motorcomm_phy_drvs[] = { ++static int yt8614_config_init(struct phy_device *phydev) ++{ ++ int ret = 0; ++ ++ phydev->irq = PHY_POLL; ++ ++ if(0xff == yt_mport_base_phy_addr_8614) ++ /* by default, we think the first phy should be the base phy addr. for mul */ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) + { +- PHY_ID_MATCH_EXACT(PHY_ID_YT8511), ++ yt_mport_base_phy_addr_8614 = (unsigned int)phydev->addr; ++ }else if (yt_mport_base_phy_addr_8614 > (unsigned int)phydev->addr) { ++ printk (KERN_INFO "yzhang..8618 init, phy address mismatch, base=%u, cur=%d\n", yt_mport_base_phy_addr_8614, phydev->addr); ++ } ++#else ++ { ++ yt_mport_base_phy_addr_8614 = (unsigned int)phydev->mdio.addr; ++ }else if (yt_mport_base_phy_addr_8614 > (unsigned int)phydev->mdio.addr) { ++ printk (KERN_INFO "yzhang..8618 init, phy address mismatch, base=%u, cur=%d\n", yt_mport_base_phy_addr_8614, phydev->mdio.addr); ++ } ++#endif ++ return ret; ++} ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#define yt8614_get_port_from_phydev(phydev) ((0xff == yt_mport_base_phy_addr_8614) && (yt_mport_base_phy_addr_8614 <= (phydev)->addr) ? 0 : (unsigned int)((phydev)->addr) - yt_mport_base_phy_addr_8614) ++#else ++#define yt8614_get_port_from_phydev(phydev) ((0xff == yt_mport_base_phy_addr_8614) && (yt_mport_base_phy_addr_8614 <= (phydev)->mdio.addr) ? 0 : (unsigned int)((phydev)->mdio.addr) - yt_mport_base_phy_addr_8614) ++#endif ++ ++int yt8618_aneg_done (struct phy_device *phydev) ++{ ++ ++ return genphy_aneg_done(phydev); ++} ++ ++int yt8614_aneg_done (struct phy_device *phydev) ++{ ++ int port = yt8614_get_port_from_phydev(phydev); ++ ++ /*it should be used for 8614 fiber*/ ++ if((32 == link_mode_8614[port]) && (SPEED_100 == phydev->speed)) ++ { ++ return 1; ++ } ++ ++ return genphy_aneg_done(phydev); ++} ++ ++static int yt8614_read_status(struct phy_device *phydev) ++{ ++ //int i; ++ int ret; ++ volatile int val, yt8614_fiber_latch_val, yt8614_fiber_curr_val; ++ volatile int link; ++ int link_utp = 0, link_fiber = 0; ++ int port = yt8614_get_port_from_phydev(phydev); ++ ++#if (YT8614_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ /* switch to utp and reading regs */ ++ ret = ytphy_write_ext(phydev, 0xa000, 0); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ link = val & (BIT(YT8521_LINK_STATUS_BIT)); ++ if (link) { ++ link_utp = 1; ++ // here is same as 8521 and re-use the function; ++ yt8521_adjust_status(phydev, val, 1); ++ } else { ++ link_utp = 0; ++ } ++#endif //(YT8614_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ ++#if (YT8614_PHY_MODE_CURR != YT8521_PHY_MODE_UTP) ++ /* reading Fiber/sgmii */ ++ ret = ytphy_write_ext(phydev, 0xa000, 3); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ //printk (KERN_INFO "yzhang..8614 read fiber status=%04x,macbase=0x%08lx\n", val,(unsigned long)phydev->attached_dev); ++ ++ /* for fiber, from 1000m to 100m, there is not link down from 0x11, and check reg 1 to identify such case */ ++ yt8614_fiber_latch_val = phy_read(phydev, MII_BMSR); ++ yt8614_fiber_curr_val = phy_read(phydev, MII_BMSR); ++ link = val & (BIT(YT8521_LINK_STATUS_BIT)); ++ if((link) && (yt8614_fiber_latch_val != yt8614_fiber_curr_val)) ++ { ++ link = 0; ++ printk (KERN_INFO "yt8614_read_status, fiber link down detect,latch=%04x,curr=%04x\n", yt8614_fiber_latch_val,yt8614_fiber_curr_val); ++ } ++ ++ if (link) { ++ link_fiber = 1; ++ yt8521_adjust_status(phydev, val, 0); ++ link_mode_8614[port] = 32; //fiber mode ++ ++ ++ } else { ++ link_fiber = 0; ++ } ++#endif //(YT8521_PHY_MODE_CURR != YT8521_PHY_MODE_UTP) ++ ++ if (link_utp || link_fiber) { ++ phydev->link = 1; ++ } else { ++ phydev->link = 0; ++ link_mode_8614[port] = 0; ++ } ++ ++#if (YT8614_PHY_MODE_CURR != YT8521_PHY_MODE_FIBER) ++ if (link_utp) { ++ ytphy_write_ext(phydev, 0xa000, 0); ++ } ++#endif ++ //printk (KERN_INFO "yt8614_read_status call out,link=%d,linkmode=%d\n", phydev->link, link_mode_8614[port] ); ++ ++ return 0; ++} ++ ++static int yt8618_read_status(struct phy_device *phydev) ++{ ++ int ret; ++ volatile int val; //maybe for 8614 yt8521_fiber_latch_val, yt8521_fiber_curr_val; ++ volatile int link; ++ int link_utp = 0, link_fiber = 0; ++ ++ /* switch to utp and reading regs */ ++ ret = ytphy_write_ext(phydev, 0xa000, 0); ++ if (ret < 0) ++ return ret; ++ ++ val = phy_read(phydev, REG_PHY_SPEC_STATUS); ++ if (val < 0) ++ return val; ++ ++ link = val & (BIT(YT8521_LINK_STATUS_BIT)); ++ if (link) { ++ link_utp = 1; ++ yt8521_adjust_status(phydev, val, 1); ++ } else { ++ link_utp = 0; ++ } ++ ++ if (link_utp || link_fiber) { ++ phydev->link = 1; ++ } else { ++ phydev->link = 0; ++ } ++ ++ return 0; ++} ++ ++int yt8618_suspend(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} ++ ++int yt8618_resume(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} ++ ++int yt8614_suspend(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 3); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value | BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} ++ ++int yt8614_resume(struct phy_device *phydev) ++{ ++#if !(SYS_WAKEUP_BASED_ON_ETH_PKT) ++ int value; ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_lock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 3); ++ value = phy_read(phydev, MII_BMCR); ++ phy_write(phydev, MII_BMCR, value & ~BMCR_PDOWN); ++ ++ ytphy_write_ext(phydev, 0xa000, 0); ++ ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ mutex_unlock(&phydev->lock); ++#else ++ /* no need lock/unlock in 4.19 */ ++#endif ++#endif /*!(SYS_WAKEUP_BASED_ON_ETH_PKT)*/ ++ ++ return 0; ++} ++ ++ ++static struct phy_driver ytphy_drvs[] = { ++ { ++ .phy_id = PHY_ID_YT8010, ++ .name = "YT8010 Automotive Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = yt8010_config_aneg, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ .config_init = ytphy_config_init, ++#else ++ .config_init = genphy_config_init, ++#endif ++ .read_status = genphy_read_status, ++ }, { ++ .phy_id = PHY_ID_YT8510, ++ .name = "YT8510 100/10Mb Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ .config_init = ytphy_config_init, ++#else ++ .config_init = genphy_config_init, ++#endif ++ .read_status = genphy_read_status, ++ }, { ++ .phy_id = PHY_ID_YT8511, + .name = "YT8511 Gigabit Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_GBIT_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if GMAC_CLOCK_INPUT_NEEDED + .config_init = yt8511_config_init, ++#else ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ .config_init = ytphy_config_init, ++#else ++ .config_init = genphy_config_init, ++#endif ++#endif ++ .read_status = genphy_read_status, + .suspend = genphy_suspend, + .resume = genphy_resume, +- .read_page = yt8511_read_page, +- .write_page = yt8511_write_page, +- }, ++ }, { ++ .phy_id = PHY_ID_YT8512, ++ .name = "YT8512 Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = genphy_config_aneg, ++ .config_init = yt8512_config_init, ++ .read_status = yt8512_read_status, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, ++ }, { ++ .phy_id = PHY_ID_YT8512B, ++ .name = "YT8512B Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = genphy_config_aneg, ++ .config_init = yt8512_config_init, ++ .read_status = yt8512_read_status, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, ++ }, { ++ .phy_id = PHY_ID_YT8521, ++ .name = "YT8521 Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES | PHY_GBIT_FEATURES, ++#endif ++ .flags = PHY_POLL, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++ .soft_reset = yt8521_soft_reset, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(3,11,0) ) ++ .aneg_done = yt8521_aneg_done, ++#endif ++ .config_init = yt8521_config_init, ++ .read_status = yt8521_read_status, ++ .suspend = yt8521_suspend, ++ .resume = yt8521_resume, ++#if (YTPHY_ENABLE_WOL) ++ .get_wol = &ytphy_get_wol, ++ .set_wol = &ytphy_set_wol, ++#endif ++ },{ ++ /* same as 8521 */ ++ .phy_id = PHY_ID_YT8531S, ++ .name = "YT8531S Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES | PHY_GBIT_FEATURES, ++#endif ++ .flags = PHY_POLL, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++ .soft_reset = yt8521_soft_reset, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(3,11,0) ) ++ .aneg_done = yt8521_aneg_done, ++#endif ++ .config_init = yt8521_config_init, ++ .read_status = yt8521_read_status, ++ .suspend = yt8521_suspend, ++ .resume = yt8521_resume, ++#if (YTPHY_ENABLE_WOL) ++ .get_wol = &ytphy_get_wol, ++ .set_wol = &ytphy_set_wol, ++#endif ++ }, { ++ /* same as 8511 */ ++ .phy_id = PHY_ID_YT8531, ++ .name = "YT8531 Gigabit Ethernet", ++ .phy_id_mask = MOTORCOMM_PHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES | PHY_GBIT_FEATURES, ++ .flags = PHY_HAS_INTERRUPT, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++ .config_init = ytphy_config_init, ++#else ++ .config_init = genphy_config_init, ++#endif ++ .read_status = genphy_read_status, ++ .suspend = genphy_suspend, ++ .resume = genphy_resume, ++#if (YTPHY_ENABLE_WOL) ++ .get_wol = &ytphy_get_wol, ++ .set_wol = &ytphy_set_wol, ++#endif ++ }, { ++ .phy_id = PHY_ID_YT8618, ++ .name = "YT8618 Ethernet", ++ .phy_id_mask = MOTORCOMM_MPHY_ID_MASK, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES | PHY_GBIT_FEATURES, ++#endif ++ .flags = PHY_POLL, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++ .soft_reset = yt8618_soft_reset, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(3,11,0) ) ++ .aneg_done = yt8618_aneg_done, ++#endif ++ .config_init = yt8618_config_init, ++ .read_status = yt8618_read_status, ++ .suspend = yt8618_suspend, ++ .resume = yt8618_resume, ++ }, { ++ .phy_id = PHY_ID_YT8614, ++ .name = "YT8614 Ethernet", ++ .phy_id_mask = MOTORCOMM_MPHY_ID_MASK_8614, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) ) ++ .features = PHY_BASIC_FEATURES | PHY_GBIT_FEATURES, ++#endif ++ .flags = PHY_POLL, ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++#else ++ .soft_reset = yt8614_soft_reset, ++#endif ++ .config_aneg = genphy_config_aneg, ++#if ( LINUX_VERSION_CODE > KERNEL_VERSION(3,11,0) ) ++ .aneg_done = yt8614_aneg_done, ++#endif ++ .config_init = yt8614_config_init, ++ .read_status = yt8614_read_status, ++ .suspend = yt8614_suspend, ++ .resume = yt8614_resume, ++ }, + }; + +-module_phy_driver(motorcomm_phy_drvs); ++#if ( LINUX_VERSION_CODE < KERNEL_VERSION(4,0,0) ) ++static int ytphy_drivers_register(struct phy_driver* phy_drvs, int size) ++{ ++ int i, j; ++ int ret; ++ ++ for (i = 0; i < size; i++) { ++ ret = phy_driver_register(&phy_drvs[i]); ++ if (ret) ++ goto err; ++ } ++ ++ return 0; ++ ++err: ++ for (j = 0; j < i; j++) ++ phy_driver_unregister(&phy_drvs[j]); ++ ++ return ret; ++} ++ ++static void ytphy_drivers_unregister(struct phy_driver* phy_drvs, int size) ++{ ++ int i; ++ ++ for (i = 0; i < size; i++) { ++ phy_driver_unregister(&phy_drvs[i]); ++ } ++} ++ ++static int __init ytphy_init(void) ++{ ++ printk("motorcomm phy register\n"); ++ return ytphy_drivers_register(ytphy_drvs, ARRAY_SIZE(ytphy_drvs)); ++} ++ ++static void __exit ytphy_exit(void) ++{ ++ printk("motorcomm phy unregister\n"); ++ ytphy_drivers_unregister(ytphy_drvs, ARRAY_SIZE(ytphy_drvs)); ++} ++ ++module_init(ytphy_init); ++module_exit(ytphy_exit); ++#else ++/* for linux 4.x */ ++module_phy_driver(ytphy_drvs); ++#endif + + MODULE_DESCRIPTION("Motorcomm PHY driver"); +-MODULE_AUTHOR("Peter Geis"); ++MODULE_AUTHOR("Leilei Zhao"); + MODULE_LICENSE("GPL"); + +-static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { +- { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, +- { /* sentinal */ } ++static struct mdio_device_id __maybe_unused motorcomm_tbl[] = { ++ { PHY_ID_YT8010, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8510, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8511, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8512, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8512B, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8521, MOTORCOMM_PHY_ID_MASK }, ++ { PHY_ID_YT8531S, MOTORCOMM_PHY_ID_8531_MASK }, ++ { PHY_ID_YT8531, MOTORCOMM_PHY_ID_8531_MASK }, ++ { PHY_ID_YT8618, MOTORCOMM_MPHY_ID_MASK }, ++ { PHY_ID_YT8614, MOTORCOMM_MPHY_ID_MASK_8614 }, ++ { } + }; + + MODULE_DEVICE_TABLE(mdio, motorcomm_tbl); ++ ++ +--- /dev/null ++++ b/drivers/net/phy/yt8614-phy.h +@@ -0,0 +1,491 @@ ++#ifndef _PHY_H_ ++#define _PHY_H_ ++ ++ ++/* configuration for driver */ ++ ++#define YT8614_MAX_LPORT_ID 3 ++ ++#define YT8614_PHY_MODE_FIBER 1 //fiber mode only ++#define YT8614_PHY_MODE_UTP 2 //utp mode only ++#define YT8614_PHY_MODE_POLL 3 //fiber and utp, poll mode ++ ++/* please make choice according to system design ++ * for Fiber only system, please define YT8614_PHY_MODE_CURR 1 ++ * for UTP only system, please define YT8614_PHY_MODE_CURR 2 ++ * for combo system, please define YT8614_PHY_MODE_CURR 3 ++ */ ++#define YT8614_PHY_MODE_CURR 3 ++ ++ ++ ++/* pls dont modify below lines */ ++ ++#define PHY_ID_YT8614 0x4F51E899 //serdes ++#define MOTORCOMM_MPHY_ID_MASK_8614 0xffffffff ++ ++#ifndef BOOL ++#define BOOL unsigned int ++#endif ++ ++#ifndef FALSE ++#define FALSE 0 ++#endif ++ ++#ifndef TRUE ++#define TRUE 1 ++#endif ++ ++#ifndef SPEED_1000M ++#define SPEED_1000M 2 ++#endif ++#ifndef SPEED_100M ++#define SPEED_100M 1 ++#endif ++#ifndef SPEED_10M ++#define SPEED_10M 0 ++#endif ++ ++#ifndef SPEED_UNKNOWN ++#define SPEED_UNKNOWN 0xffff ++#endif ++ ++#ifndef DUPLEX_FULL ++#define DUPLEX_FULL 1 ++#endif ++#ifndef DUPLEX_HALF ++#define DUPLEX_HALF 0 ++#endif ++ ++#ifndef BIT ++#define BIT(n) (0x1<<(n)) ++#endif ++#ifndef s32 ++typedef int s32; ++typedef unsigned int u32; ++typedef unsigned short u16; ++typedef unsigned char u8; ++#endif ++ ++#ifndef REG_PHY_SPEC_STATUS ++#define REG_PHY_SPEC_STATUS 0x11 ++#define REG_DEBUG_ADDR_OFFSET 0x1e ++#define REG_DEBUG_DATA 0x1f ++#endif ++ ++/**********YT8614************************************************/ ++ ++#define YT8614_SMI_SEL_PHY 0x0 ++#define YT8614_SMI_SEL_SDS_QSGMII 0x02 ++#define YT8614_SMI_SEL_SDS_SGMII 0x03 ++ ++/* yt8614 register type */ ++#define YT8614_TYPE_COMMON 0x01 ++#define YT8614_TYPE_UTP_MII 0x02 ++#define YT8614_TYPE_UTP_EXT 0x03 ++#define YT8614_TYPE_LDS_MII 0x04 ++#define YT8614_TYPE_UTP_MMD 0x05 ++#define YT8614_TYPE_SDS_QSGMII_MII 0x06 ++#define YT8614_TYPE_SDS_SGMII_MII 0x07 ++#define YT8614_TYPE_SDS_QSGMII_EXT 0x08 ++#define YT8614_TYPE_SDS_SGMII_EXT 0x09 ++ ++/* YT8614 extended common register */ ++#define YT8614_REG_COM_SMI_MUX 0xA000 ++#define YT8614_REG_COM_SLED_CFG0 0xA001 ++#define YT8614_REG_COM_PHY_ID 0xA002 ++#define YT8614_REG_COM_CHIP_VER 0xA003 ++#define YT8614_REG_COM_SLED_CFG 0xA004 ++#define YT8614_REG_COM_MODE_CHG_RESET 0xA005 ++#define YT8614_REG_COM_SYNCE0_CFG 0xA006 ++#define YT8614_REG_COM_CHIP_MODE 0xA007 ++ ++#define YT8614_REG_COM_HIDE_SPEED 0xA009 ++ ++#define YT8614_REG_COM_SYNCE1_CFG 0xA00E ++ ++#define YT8614_REG_COM_HIDE_FIBER_MODE 0xA019 ++ ++ ++#define YT8614_REG_COM_HIDE_SEL1 0xA054 ++#define YT8614_REG_COM_HIDE_LED_CFG2 0xB8 ++#define YT8614_REG_COM_HIDE_LED_CFG3 0xB9 ++#define YT8614_REG_COM_HIDE_LED_CFG5 0xBB ++ ++#define YT8614_REG_COM_HIDE_LED_CFG4 0xBA //not used currently ++ ++#if 0 ++#define YT8614_REG_COM_HIDE_LED12_CFG 0xA060 //not used currently ++#define YT8614_REG_COM_HIDE_LED13_CFG 0xA061 ++#define YT8614_REG_COM_HIDE_LED14_CFG 0xA062 ++#define YT8614_REG_COM_HIDE_LED15_CFG 0xA063 ++#define YT8614_REG_COM_HIDE_LED16_CFG 0xA064 ++#define YT8614_REG_COM_HIDE_LED17_CFG 0xA065 ++#define YT8614_REG_COM_HIDE_LED18_CFG 0xA066 ++#define YT8614_REG_COM_HIDE_LED19_CFG 0xA067 ++#define YT8614_REG_COM_HIDE_LED20_CFG 0xA068 ++#define YT8614_REG_COM_HIDE_LED21_CFG 0xA069 ++#define YT8614_REG_COM_HIDE_LED22_CFG 0xA06A ++#define YT8614_REG_COM_HIDE_LED23_CFG 0xA06B ++#define YT8614_REG_COM_HIDE_LED24_CFG 0xA06C ++#define YT8614_REG_COM_HIDE_LED25_CFG 0xA06D ++#define YT8614_REG_COM_HIDE_LED26_CFG 0xA06E ++#define YT8614_REG_COM_HIDE_LED27_CFG 0xA06F ++#endif ++ ++#define YT8614_REG_COM_HIDE_LED28_CFG 0xA070 ++#define YT8614_REG_COM_HIDE_LED29_CFG 0xA071 ++#define YT8614_REG_COM_HIDE_LED30_CFG 0xA072 ++#define YT8614_REG_COM_HIDE_LED31_CFG 0xA073 ++#define YT8614_REG_COM_HIDE_LED32_CFG 0xA074 ++#define YT8614_REG_COM_HIDE_LED33_CFG 0xA075 ++#define YT8614_REG_COM_HIDE_LED34_CFG 0xA076 ++#define YT8614_REG_COM_HIDE_LED35_CFG 0xA077 ++ ++#define YT8614_REG_COM_PKG_CFG0 0xA0A0 ++#define YT8614_REG_COM_PKG_CFG1 0xA0A1 ++#define YT8614_REG_COM_PKG_CFG2 0xA0A2 ++#define YT8614_REG_COM_PKG_RX_VALID0 0xA0A3 ++#define YT8614_REG_COM_PKG_RX_VALID1 0xA0A4 ++#define YT8614_REG_COM_PKG_RX_OS0 0xA0A5 ++#define YT8614_REG_COM_PKG_RX_OS1 0xA0A6 ++#define YT8614_REG_COM_PKG_RX_US0 0xA0A7 ++#define YT8614_REG_COM_PKG_RX_US1 0xA0A8 ++#define YT8614_REG_COM_PKG_RX_ERR 0xA0A9 ++#define YT8614_REG_COM_PKG_RX_OS_BAD 0xA0AA ++#define YT8614_REG_COM_PKG_RX_FRAG 0xA0AB ++#define YT8614_REG_COM_PKG_RX_NOSFD 0xA0AC ++#define YT8614_REG_COM_PKG_TX_VALID0 0xA0AD ++#define YT8614_REG_COM_PKG_TX_VALID1 0xA0AE ++#define YT8614_REG_COM_PKG_TX_OS0 0xA0AF ++ ++#define YT8614_REG_COM_PKG_TX_OS1 0xA0B0 ++#define YT8614_REG_COM_PKG_TX_US0 0xA0B1 ++#define YT8614_REG_COM_PKG_TX_US1 0xA0B2 ++#define YT8614_REG_COM_PKG_TX_ERR 0xA0B3 ++#define YT8614_REG_COM_PKG_TX_OS_BAD 0xA0B4 ++#define YT8614_REG_COM_PKG_TX_FRAG 0xA0B5 ++#define YT8614_REG_COM_PKG_TX_NOSFD 0xA0B6 ++#define YT8614_REG_COM_PKG_CFG3 0xA0B7 ++#define YT8614_REG_COM_PKG_AZ_CFG 0xA0B8 ++#define YT8614_REG_COM_PKG_DA_SA_CFG3 0xA0B9 ++ ++#define YT8614_REG_COM_MANU_HW_RESET 0xA0C0 ++ ++/* YT8614 UTP MII register: same as generic phy register definitions */ ++#define REG_MII_BMCR 0x00 /* Basic mode control register */ ++#define REG_MII_BMSR 0x01 /* Basic mode status register */ ++#define REG_MII_PHYSID1 0x02 /* PHYS ID 1 */ ++#define REG_MII_PHYSID2 0x03 /* PHYS ID 2 */ ++#define REG_MII_ADVERTISE 0x04 /* Advertisement control reg */ ++#define REG_MII_LPA 0x05 /* Link partner ability reg */ ++#define REG_MII_EXPANSION 0x06 /* Expansion register */ ++#define REG_MII_NEXT_PAGE 0x07 /* Next page register */ ++#define REG_MII_LPR_NEXT_PAGE 0x08 /* LPR next page register */ ++#define REG_MII_CTRL1000 0x09 /* 1000BASE-T control */ ++#define REG_MII_STAT1000 0x0A /* 1000BASE-T status */ ++ ++#define REG_MII_MMD_CTRL 0x0D /* MMD access control register */ ++#define REG_MII_MMD_DATA 0x0E /* MMD access data register */ ++ ++#define REG_MII_ESTATUS 0x0F /* Extended Status */ ++#define REG_MII_SPEC_CTRL 0x10 /* PHY specific func control */ ++#define REG_MII_SPEC_STATUS 0x11 /* PHY specific status */ ++#define REG_MII_INT_MASK 0x12 /* Interrupt mask register */ ++#define REG_MII_INT_STATUS 0x13 /* Interrupt status register */ ++#define REG_MII_DOWNG_CTRL 0x14 /* Speed auto downgrade control*/ ++#define REG_MII_RERRCOUNTER 0x15 /* Receive error counter */ ++ ++#define REG_MII_EXT_ADDR 0x1E /* Extended reg's address */ ++#define REG_MII_EXT_DATA 0x1F /* Extended reg's date */ ++ ++#ifndef MII_BMSR ++#define MII_BMSR REG_MII_BMSR ++#endif ++ ++#ifndef YT8614_SPEED_MODE_BIT ++#define YT8614_SPEED_MODE 0xc000 ++#define YT8614_DUPLEX 0x2000 ++#define YT8614_SPEED_MODE_BIT 14 ++#define YT8614_DUPLEX_BIT 13 ++#define YT8614_LINK_STATUS_BIT 10 ++ ++#endif ++ ++#define YT8614_REG_COM_HIDE_SPEED_CMB_PRI 0x2000 ++ ++/* YT8614 UTP MMD register */ ++#define YT8614_REG_UTP_MMD_CTRL1 0x00 /* PCS control 1 register */ ++#define YT8614_REG_UTP_MMD_STATUS1 0x01 /* PCS status 1 register */ ++#define YT8614_REG_UTP_MMD_EEE_CTRL 0x14 /* EEE control and capability */ ++#define YT8614_REG_UTP_MMD_EEE_WK_ERR_CNT 0x16 /* EEE wake error counter */ ++#define YT8614_REG_UTP_MMD_EEE_LOCAL_ABI 0x3C /* local device EEE ability */ ++#define YT8614_REG_UTP_MMD_EEE_LP_ABI 0x3D /* link partner EEE ability */ ++#define YT8614_REG_UTP_MMD_EEE_AUTONEG_RES 0x8000 /* autoneg result of EEE */ ++ ++/* YT8614 UTP EXT register */ ++#define YT8614_REG_UTP_EXT_LPBK 0x0A ++#define YT8614_REG_UTP_EXT_SLEEP_CTRL1 0x27 ++#define YT8614_REG_UTP_EXT_DEBUG_MON1 0x5A ++#define YT8614_REG_UTP_EXT_DEBUG_MON2 0x5B ++#define YT8614_REG_UTP_EXT_DEBUG_MON3 0x5C ++#define YT8614_REG_UTP_EXT_DEBUG_MON4 0x5D ++ ++/* YT8614 SDS(1.25G/5G) MII register: same as YT8521S */ ++#define REG_SDS_BMCR 0x00 /* Basic mode control register */ ++#define REG_SDS_BMSR 0x01 /* Basic mode status register */ ++#define REG_SDS_PHYSID1 0x02 /* PHYS ID 1 */ ++#define REG_SDS_PHYSID2 0x03 /* PHYS ID 2 */ ++#define REG_SDS_ADVERTISE 0x04 /* Advertisement control reg */ ++#define REG_SDS_LPA 0x05 /* Link partner ability reg */ ++#define REG_SDS_EXPANSION 0x06 /* Expansion register */ ++#define REG_SDS_NEXT_PAGE 0x07 /* Next page register */ ++#define REG_SDS_LPR_NEXT_PAGE 0x08 /* LPR next page register */ ++ ++#define REG_SDS_ESTATUS 0x0F /* Extended Status */ ++#define REG_SDS_SPEC_STATUS 0x11 /* SDS specific status */ ++ ++#define REG_SDS_100FX_CFG 0x14 /* 100fx cfg */ ++#define REG_SDS_RERRCOUNTER 0x15 /* Receive error counter */ ++#define REG_SDS_LINT_FAIL_CNT 0x16 /* Lint fail counter mon */ ++ ++/* YT8614 SDS(5G) EXT register */ ++#define YT8614_REG_QSGMII_EXT_ANA_DIG_CFG 0x02 /* sds analog digital interface cfg */ ++#define YT8614_REG_QSGMII_EXT_PRBS_CFG1 0x05 /* sds prbs cfg1 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_CFG2_1 0x06 /* sds prbs cfg2 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_CFG2_2 0x07 /* sds prbs cfg2 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_MON1 0x08 /* sds prbs mon1 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_MON2 0x09 /* sds prbs mon2 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_MON3 0x0A /* sds prbs mon3 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_MON4 0x0B /* sds prbs mon4 */ ++#define YT8614_REG_QSGMII_EXT_PRBS_MON5 0x0C /* sds prbs mon5 */ ++#define YT8614_REG_QSGMII_EXT_ANA_CFG2 0xA1 /* Analog cfg2 */ ++ ++/* YT8614 SDS(1.25G) EXT register */ ++#define YT8614_REG_SGMII_EXT_PRBS_CFG1 0x05 /* sds prbs cfg1 */ ++#define YT8614_REG_SGMII_EXT_PRBS_CFG2 0x06 /* sds prbs cfg2 */ ++#define YT8614_REG_SGMII_EXT_PRBS_MON1 0x08 /* sds prbs mon1 */ ++#define YT8614_REG_SGMII_EXT_PRBS_MON2 0x09 /* sds prbs mon2 */ ++#define YT8614_REG_SGMII_EXT_PRBS_MON3 0x0A /* sds prbs mon3 */ ++#define YT8614_REG_SGMII_EXT_PRBS_MON4 0x0B /* sds prbs mon4 */ ++#define YT8614_REG_SGMII_EXT_PRBS_MON5 0x0C /* sds prbs mon5 */ ++#define YT8614_REG_SGMII_EXT_ANA_CFG2 0xA1 /* Analog cfg2 */ ++#define YT8614_REG_SGMII_EXT_HIDE_AUTO_SEN 0xA5 /* Fiber auto sensing */ ++ ++//////////////////////////////////////////////////////////////////// ++#define YT8614_MMD_DEV_ADDR1 0x1 ++#define YT8614_MMD_DEV_ADDR3 0x3 ++#define YT8614_MMD_DEV_ADDR7 0x7 ++#define YT8614_MMD_DEV_ADDR_NONE 0xFF ++ ++/**********YT8521S************************************************/ ++/* Basic mode control register(0x00) */ ++#define BMCR_RESV 0x003f /* Unused... */ ++#define BMCR_SPEED1000 0x0040 /* MSB of Speed (1000) */ ++#define BMCR_CTST 0x0080 /* Collision test */ ++#define BMCR_FULLDPLX 0x0100 /* Full duplex */ ++#define BMCR_ANRESTART 0x0200 /* Auto negotiation restart */ ++#define BMCR_ISOLATE 0x0400 /* Disconnect DP83840 from MII */ ++#define BMCR_PDOWN 0x0800 /* Powerdown the DP83840 */ ++#define BMCR_ANENABLE 0x1000 /* Enable auto negotiation */ ++#define BMCR_SPEED100 0x2000 /* Select 100Mbps */ ++#define BMCR_LOOPBACK 0x4000 /* TXD loopback bits */ ++#define BMCR_RESET 0x8000 /* Reset the DP83840 */ ++ ++/* Basic mode status register(0x01) */ ++#define BMSR_ERCAP 0x0001 /* Ext-reg capability */ ++#define BMSR_JCD 0x0002 /* Jabber detected */ ++#define BMSR_LSTATUS 0x0004 /* Link status */ ++#define BMSR_ANEGCAPABLE 0x0008 /* Able to do auto-negotiation */ ++#define BMSR_RFAULT 0x0010 /* Remote fault detected */ ++#define BMSR_ANEGCOMPLETE 0x0020 /* Auto-negotiation complete */ ++#define BMSR_RESV 0x00c0 /* Unused... */ ++#define BMSR_ESTATEN 0x0100 /* Extended Status in R15 */ ++#define BMSR_100HALF2 0x0200 /* Can do 100BASE-T2 HDX */ ++#define BMSR_100FULL2 0x0400 /* Can do 100BASE-T2 FDX */ ++#define BMSR_10HALF 0x0800 /* Can do 10mbps, half-duplex */ ++#define BMSR_10FULL 0x1000 /* Can do 10mbps, full-duplex */ ++#define BMSR_100HALF 0x2000 /* Can do 100mbps, half-duplex */ ++#define BMSR_100FULL 0x4000 /* Can do 100mbps, full-duplex */ ++#define BMSR_100BASE4 0x8000 /* Can do 100mbps, 4k packets */ ++ ++/* Advertisement control register(0x04) */ ++#define ADVERTISE_SLCT 0x001f /* Selector bits */ ++#define ADVERTISE_CSMA 0x0001 /* Only selector supported */ ++#define ADVERTISE_10HALF 0x0020 /* Try for 10mbps half-duplex */ ++#define ADVERTISE_1000XFULL 0x0020 /* Try for 1000BASE-X full-duplex */ ++#define ADVERTISE_10FULL 0x0040 /* Try for 10mbps full-duplex */ ++#define ADVERTISE_1000XHALF 0x0040 /* Try for 1000BASE-X half-duplex */ ++#define ADVERTISE_100HALF 0x0080 /* Try for 100mbps half-duplex */ ++#define ADVERTISE_1000XPAUSE 0x0080 /* Try for 1000BASE-X pause */ ++#define ADVERTISE_100FULL 0x0100 /* Try for 100mbps full-duplex */ ++#define ADVERTISE_1000XPSE_ASYM 0x0100 /* Try for 1000BASE-X asym pause */ ++#define ADVERTISE_100BASE4 0x0200 /* Try for 100mbps 4k packets */ ++#define ADVERTISE_PAUSE_CAP 0x0400 /* Try for pause */ ++#define ADVERTISE_PAUSE_ASYM 0x0800 /* Try for asymetric pause */ ++#define ADVERTISE_RESV 0x1000 /* Unused... */ ++#define ADVERTISE_RFAULT 0x2000 /* Say we can detect faults */ ++#define ADVERTISE_LPACK 0x4000 /* Ack link partners response */ ++#define ADVERTISE_NPAGE 0x8000 /* Next page bit */ ++ ++#define ADVERTISE_FULL (ADVERTISE_100FULL | ADVERTISE_10FULL | ADVERTISE_CSMA) ++#define ADVERTISE_ALL (ADVERTISE_10HALF | ADVERTISE_10FULL | \ ++ ADVERTISE_100HALF | ADVERTISE_100FULL) ++ ++/* Link partner ability register(0x05) */ ++#define LPA_SLCT 0x001f /* Same as advertise selector */ ++#define LPA_10HALF 0x0020 /* Can do 10mbps half-duplex */ ++#define LPA_1000XFULL 0x0020 /* Can do 1000BASE-X full-duplex */ ++#define LPA_10FULL 0x0040 /* Can do 10mbps full-duplex */ ++#define LPA_1000XHALF 0x0040 /* Can do 1000BASE-X half-duplex */ ++#define LPA_100HALF 0x0080 /* Can do 100mbps half-duplex */ ++#define LPA_1000XPAUSE 0x0080 /* Can do 1000BASE-X pause */ ++#define LPA_100FULL 0x0100 /* Can do 100mbps full-duplex */ ++#define LPA_1000XPAUSE_ASYM 0x0100 /* Can do 1000BASE-X pause asym */ ++#define LPA_100BASE4 0x0200 /* Can do 100mbps 4k packets */ ++#define LPA_PAUSE_CAP 0x0400 /* Can pause */ ++#define LPA_PAUSE_ASYM 0x0800 /* Can pause asymetrically */ ++#define LPA_RESV 0x1000 /* Unused... */ ++#define LPA_RFAULT 0x2000 /* Link partner faulted */ ++#define LPA_LPACK 0x4000 /* Link partner acked us */ ++#define LPA_NPAGE 0x8000 /* Next page bit */ ++ ++/* 1000BASE-T Control register(0x09) */ ++#define ADVERTISE_1000FULL 0x0200 /* Advertise 1000BASE-T full duplex */ ++#define ADVERTISE_1000HALF 0x0100 /* Advertise 1000BASE-T half duplex */ ++#define CTL1000_AS_MASTER 0x0800 ++#define CTL1000_ENABLE_MASTER 0x1000 ++ ++/* 1000BASE-T Status register(0x0A) */ ++#define LPA_1000LOCALRXOK 0x2000 /* Link partner local receiver status */ ++#define LPA_1000REMRXOK 0x1000 /* Link partner remote receiver status */ ++#define LPA_1000FULL 0x0800 /* Link partner 1000BASE-T full duplex */ ++#define LPA_1000HALF 0x0400 /* Link partner 1000BASE-T half duplex */ ++ ++/**********YT8614************************************************/ ++/* Basic mode control register(0x00) */ ++#define FIBER_BMCR_RESV 0x001f /* b[4:0] Unused... */ ++#define FIBER_BMCR_EN_UNIDIR 0x0020 /* b[5] Valid when bit 0.12 is zero and bit 0.8 is one */ ++#define FIBER_BMCR_SPEED1000 0x0040 /* b[6] MSB of Speed (1000) */ ++#define FIBER_BMCR_CTST 0x0080 /* b[7] Collision test */ ++#define FIBER_BMCR_DUPLEX_MODE 0x0100 /* b[8] Duplex mode */ ++#define FIBER_BMCR_ANRESTART 0x0200 /* b[9] Auto negotiation restart */ ++#define FIBER_BMCR_ISOLATE 0x0400 /* b[10] Isolate phy from RGMII/SGMII/FIBER */ ++#define FIBER_BMCR_PDOWN 0x0800 /* b[11] 1: Power down */ ++#define FIBER_BMCR_ANENABLE 0x1000 /* b[12] Enable auto negotiation */ ++#define FIBER_BMCR_SPEED100 0x2000 /* b[13] LSB of Speed (100) */ ++#define FIBER_BMCR_LOOPBACK 0x4000 /* b[14] Internal loopback control */ ++#define FIBER_BMCR_RESET 0x8000 /* b[15] PHY Software Reset(self-clear) */ ++ ++/* Sds specific status register(0x11) */ ++#define FIBER_SSR_ERCAP 0x0001 /* b[0] realtime syncstatus */ ++#define FIBER_SSR_XMIT 0x000E /* b[3:1] realtime transmit statemachine. ++ 001: Xmit Idle; ++ 010: Xmit Config; ++ 100: Xmit Data. */ ++#define FIBER_SSR_SER_MODE_CFG 0x0030 /* b[5:4] realtime serdes working mode. ++ 00: SG_MAC; ++ 01: SG_PHY; ++ 10: FIB_1000; ++ 11: FIB_100. */ ++#define FIBER_SSR_EN_FLOWCTRL_TX 0x0040 /* b[6] realtime en_flowctrl_tx */ ++#define FIBER_SSR_EN_FLOWCTRL_RX 0x0080 /* b[7] realtime en_flowctrl_rx */ ++#define FIBER_SSR_DUPLEX_ERROR 0x0100 /* b[8] realtime deplex error */ ++#define FIBER_SSR_RX_LPI_ACTIVE 0x0200 /* b[9] rx lpi is active */ ++#define FIBER_SSR_LSTATUS 0x0400 /* b[10] Link status real-time */ ++#define FIBER_SSR_PAUSE 0x1800 /* b[12:11] Pause to mac */ ++#define FIBER_SSR_DUPLEX 0x2000 /* b[13] This status bit is valid only when bit10 is 1. ++ 1: full duplex ++ 0: half duplex */ ++#define FIBER_SSR_SPEED_MODE 0xC000 /* b[15:14] These status bits are valid only when bit10 is 1. ++ 10---1000M ++ 01---100M */ ++ ++/* SLED cfg0 (ext 0xA001) */ ++#define FIBER_SLED_CFG0_EN_CTRL 0x00FF /* b[7:0] Control to enable the eight ports' SLED */ ++#define FIBER_SLED_CFG0_BIT_MASK 0x0700 /* b[10:8] 1: enable the pin output */ ++#define FIBER_SLED_CFG0_ACT_LOW 0x0800 /* b[11] control SLED's polarity. 1: active low; 0: active high */ ++#define FIBER_SLED_CFG0_MANU_ST 0x7000 /* b[14:12] SLEDs' manul status, corresponding to each port's 3 SLEDs */ ++#define FIBER_SLED_CFG0_MANU_EN 0x8000 /* b[15] to control serial LEDs status manually */ ++ ++/**********YT8614************************************************/ ++/* Fiber auto sensing(sgmii ext 0xA5) */ ++#define FIBER_AUTO_SEN_ENABLE 0x8000 /* b[15] Enable fiber auto sensing */ ++ ++/* Fiber force speed(common ext 0xA009) */ ++#define FIBER_FORCE_1000M 0x0001 /* b[0] 1:1000BX 0:100FX */ ++ ++#ifndef NULL ++#define NULL 0 ++#endif ++ ++/* errno */ ++enum ytphy_8614_errno_e ++{ ++ SYS_E_NONE, ++ SYS_E_PARAM, ++ SYS_E_MAX ++}; ++ ++/* errno */ ++enum ytphy_8614_combo_speed_e ++{ ++ YT8614_COMBO_FIBER_1000M, ++ YT8614_COMBO_FIBER_100M, ++ YT8614_COMBO_UTP_ONLY, ++ YT8614_COMBO_SPEED_MAX ++}; ++ ++/* definition for porting */ ++/* phy registers access */ ++typedef struct ++{ ++ u16 reg; /* the offset of the phy internal address */ ++ u16 val; /* the value of the register */ ++ u8 regType; /* register type */ ++} phy_data_s; ++ ++/* for porting use. ++ * pls over-write member function read/write for mdio access ++ */ ++typedef struct phy_info_str ++{ ++#if 0 ++ struct phy_device *phydev; ++ int mdio_base; ++#endif ++ unsigned int lport; ++ unsigned int bus_id; ++ unsigned int phy_addr; ++ ++ s32 (*read)(struct phy_info_str *info, phy_data_s *param); ++ s32 (*write)(struct phy_info_str *info, phy_data_s *param); ++}phy_info_s; ++ ++/* get phy access method */ ++s32 yt8614_read_reg(struct phy_info_str *info, phy_data_s *param); ++s32 yt8614_write_reg(struct phy_info_str *info, phy_data_s *param); ++s32 yt8614_phy_soft_reset(u32 lport); ++s32 yt8614_phy_init(u32 lport); ++s32 yt8614_fiber_enable(u32 lport, BOOL enable); ++s32 yt8614_utp_enable(u32 lport, BOOL enable); ++s32 yt8614_fiber_unidirection_set(u32 lport, int speed, BOOL enable); ++s32 yt8614_fiber_autosensing_set(u32 lport, BOOL enable); ++s32 yt8614_fiber_speed_set(u32 lport, int fiber_speed); ++s32 yt8614_qsgmii_autoneg_set(u32 lport, BOOL enable); ++s32 yt8614_sgmii_autoneg_set(u32 lport, BOOL enable); ++s32 yt8614_qsgmii_sgmii_link_status_get(u32 lport, BOOL *enable, BOOL if_qsgmii); ++int yt8614_combo_media_priority_set (u32 lport, int fiber); ++int yt8614_combo_media_priority_get (u32 lport, int *fiber); ++s32 yt8614_utp_autoneg_set(u32 lport, BOOL enable); ++s32 yt8614_utp_autoneg_get(u32 lport, BOOL *enable); ++s32 yt8614_utp_autoneg_ability_set(u32 lport, unsigned int cap_mask); ++s32 yt8614_utp_autoneg_ability_get(u32 lport, unsigned int *cap_mask); ++s32 yt8614_utp_force_duplex_set(u32 lport, BOOL full); ++s32 yt8614_utp_force_duplex_get(u32 lport, BOOL *full); ++s32 yt8614_utp_force_speed_set(u32 lport, unsigned int speed); ++s32 yt8614_utp_force_speed_get(u32 lport, unsigned int *speed); ++int yt8614_autoneg_done_get (u32 lport, int speed, int *aneg); ++int yt8614_media_status_get(u32 lport, int* speed, int* duplex, int* ret_link, int *media); ++ ++#endif +--- /dev/null ++++ b/include/linux/motorcomm_phy.h +@@ -0,0 +1,119 @@ ++/* ++ * include/linux/motorcomm_phy.h ++ * ++ * Motorcomm PHY IDs ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ */ ++ ++#ifndef _MOTORCOMM_PHY_H ++#define _MOTORCOMM_PHY_H ++ ++#define MOTORCOMM_PHY_ID_MASK 0x00000fff ++#define MOTORCOMM_PHY_ID_8531_MASK 0xffffffff ++#define MOTORCOMM_MPHY_ID_MASK 0x0000ffff ++ ++#define PHY_ID_YT8010 0x00000309 ++#define PHY_ID_YT8510 0x00000109 ++#define PHY_ID_YT8511 0x0000010a ++#define PHY_ID_YT8512 0x00000118 ++#define PHY_ID_YT8512B 0x00000128 ++#define PHY_ID_YT8521 0x0000011a ++#define PHY_ID_YT8531S 0x4f51e91a ++#define PHY_ID_YT8531 0x4f51e91b ++//#define PHY_ID_YT8614 0x0000e899 ++#define PHY_ID_YT8618 0x0000e889 ++ ++#define REG_PHY_SPEC_STATUS 0x11 ++#define REG_DEBUG_ADDR_OFFSET 0x1e ++#define REG_DEBUG_DATA 0x1f ++ ++#define YT8512_EXTREG_AFE_PLL 0x50 ++#define YT8512_EXTREG_EXTEND_COMBO 0x4000 ++#define YT8512_EXTREG_LED0 0x40c0 ++#define YT8512_EXTREG_LED1 0x40c3 ++ ++#define YT8512_EXTREG_SLEEP_CONTROL1 0x2027 ++ ++#define YT_SOFTWARE_RESET 0x8000 ++ ++#define YT8512_CONFIG_PLL_REFCLK_SEL_EN 0x0040 ++#define YT8512_CONTROL1_RMII_EN 0x0001 ++#define YT8512_LED0_ACT_BLK_IND 0x1000 ++#define YT8512_LED0_DIS_LED_AN_TRY 0x0001 ++#define YT8512_LED0_BT_BLK_EN 0x0002 ++#define YT8512_LED0_HT_BLK_EN 0x0004 ++#define YT8512_LED0_COL_BLK_EN 0x0008 ++#define YT8512_LED0_BT_ON_EN 0x0010 ++#define YT8512_LED1_BT_ON_EN 0x0010 ++#define YT8512_LED1_TXACT_BLK_EN 0x0100 ++#define YT8512_LED1_RXACT_BLK_EN 0x0200 ++#define YT8512_SPEED_MODE 0xc000 ++#define YT8512_DUPLEX 0x2000 ++ ++#define YT8512_SPEED_MODE_BIT 14 ++#define YT8512_DUPLEX_BIT 13 ++#define YT8512_EN_SLEEP_SW_BIT 15 ++ ++#define YT8521_EXTREG_SLEEP_CONTROL1 0x27 ++#define YT8521_EN_SLEEP_SW_BIT 15 ++ ++#define YT8521_SPEED_MODE 0xc000 ++#define YT8521_DUPLEX 0x2000 ++#define YT8521_SPEED_MODE_BIT 14 ++#define YT8521_DUPLEX_BIT 13 ++#define YT8521_LINK_STATUS_BIT 10 ++ ++/* based on yt8521 wol config register */ ++#define YTPHY_UTP_INTR_REG 0x12 ++/* WOL Event Interrupt Enable */ ++#define YTPHY_WOL_INTR BIT(6) ++ ++/* Magic Packet MAC address registers */ ++#define YTPHY_MAGIC_PACKET_MAC_ADDR2 0xa007 ++#define YTPHY_MAGIC_PACKET_MAC_ADDR1 0xa008 ++#define YTPHY_MAGIC_PACKET_MAC_ADDR0 0xa009 ++ ++#define YTPHY_WOL_CFG_REG 0xa00a ++#define YTPHY_WOL_CFG_TYPE BIT(0) /* WOL TYPE */ ++#define YTPHY_WOL_CFG_EN BIT(3) /* WOL Enable */ ++#define YTPHY_WOL_CFG_INTR_SEL BIT(6) /* WOL Event Interrupt Enable */ ++#define YTPHY_WOL_CFG_WIDTH1 BIT(1) /* WOL Pulse Width */ ++#define YTPHY_WOL_CFG_WIDTH2 BIT(2) ++ ++#define YTPHY_REG_SPACE_UTP 0 ++#define YTPHY_REG_SPACE_FIBER 2 ++ ++enum ytphy_wol_type_e ++{ ++ YTPHY_WOL_TYPE_LEVEL, ++ YTPHY_WOL_TYPE_PULSE, ++ YTPHY_WOL_TYPE_MAX ++}; ++typedef enum ytphy_wol_type_e ytphy_wol_type_t; ++ ++enum ytphy_wol_width_e ++{ ++ YTPHY_WOL_WIDTH_84MS, ++ YTPHY_WOL_WIDTH_168MS, ++ YTPHY_WOL_WIDTH_336MS, ++ YTPHY_WOL_WIDTH_672MS, ++ YTPHY_WOL_WIDTH_MAX ++}; ++typedef enum ytphy_wol_width_e ytphy_wol_width_t; ++ ++struct ytphy_wol_cfg_s ++{ ++ int enable; ++ int type; ++ int width; ++}; ++typedef struct ytphy_wol_cfg_s ytphy_wol_cfg_t; ++ ++#endif /* _MOTORCOMM_PHY_H */ ++ ++ diff --git a/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch new file mode 100644 index 00000000000000..266b8b28dec86e --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch @@ -0,0 +1,50 @@ +From e5b5361651940ff5c0c1784dfd0130abec7ab535 Mon Sep 17 00:00:00 2001 +From: wevsty <ty@wevs.org> +Date: Mon, 24 Aug 2020 02:27:11 +0800 +Subject: [PATCH] arm64: dts: rockchip: add hardware random number generator + for RK3328 and RK3399 + +Adding Hardware Random Number Generator Resources to the RK3328 and RK3399. + +Signed-off-by: wevsty <ty@wevs.org> +--- + +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -279,6 +279,17 @@ + status = "disabled"; + }; + ++ rng: rng@ff060000 { ++ compatible = "rockchip,cryptov1-rng"; ++ reg = <0x0 0xff060000 0x0 0x4000>; ++ ++ clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>; ++ clock-names = "clk_crypto", "hclk_crypto"; ++ assigned-clocks = <&cru SCLK_CRYPTO>, <&cru HCLK_CRYPTO_SLV>; ++ assigned-clock-rates = <150000000>, <100000000>; ++ status = "disabled"; ++ }; ++ + grf: syscon@ff100000 { + compatible = "rockchip,rk3328-grf", "syscon", "simple-mfd"; + reg = <0x0 0xff100000 0x0 0x1000>; +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -2017,6 +2017,16 @@ + }; + }; + ++ rng: rng@ff8b8000 { ++ compatible = "rockchip,cryptov1-rng"; ++ reg = <0x0 0xff8b8000 0x0 0x1000>; ++ clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>; ++ clock-names = "clk_crypto", "hclk_crypto"; ++ assigned-clocks = <&cru SCLK_CRYPTO1>, <&cru HCLK_S_CRYPTO1>; ++ assigned-clock-rates = <150000000>, <100000000>; ++ status = "okay"; ++ }; ++ + gpu: gpu@ff9a0000 { + compatible = "rockchip,rk3399-mali", "arm,mali-t860"; + reg = <0x0 0xff9a0000 0x0 0x10000>; diff --git a/target/linux/rockchip/patches-5.19/0058-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch b/target/linux/rockchip/patches-5.19/0058-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch new file mode 100644 index 00000000000000..643c994f2fa91f --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0058-PM-devfreq-rockchip-add-devfreq-driver-for-rk3328-dmc.patch @@ -0,0 +1,44 @@ +From fcd9629c05f373771e85920e1c1d0ab252617878 Mon Sep 17 00:00:00 2001 +From: hmz007 <hmz007@gmail.com> +Date: Tue, 19 Nov 2019 13:53:25 +0800 +Subject: [PATCH] PM / devfreq: rockchip: add devfreq driver for rk3328 dmc + +Signed-off-by: hmz007 <hmz007@gmail.com> +--- + drivers/devfreq/Kconfig | 18 +- + drivers/devfreq/Makefile | 1 + + drivers/devfreq/rk3328_dmc.c | 846 +++++++++++++++++++++++++++++++++++ + 3 files changed, 862 insertions(+), 3 deletions(-) + create mode 100644 drivers/devfreq/rk3328_dmc.c + +--- a/drivers/devfreq/Kconfig ++++ b/drivers/devfreq/Kconfig +@@ -120,6 +120,18 @@ config ARM_TEGRA_DEVFREQ + It reads ACTMON counters of memory controllers and adjusts the + operating frequencies and voltages with OPP support. + ++config ARM_RK3328_DMC_DEVFREQ ++ tristate "ARM RK3328 DMC DEVFREQ Driver" ++ depends on ARCH_ROCKCHIP ++ select DEVFREQ_EVENT_ROCKCHIP_DFI ++ select DEVFREQ_GOV_SIMPLE_ONDEMAND ++ select PM_DEVFREQ_EVENT ++ select PM_OPP ++ help ++ This adds the DEVFREQ driver for the RK3328 DMC(Dynamic Memory Controller). ++ It sets the frequency for the memory controller and reads the usage counts ++ from hardware. ++ + config ARM_RK3399_DMC_DEVFREQ + tristate "ARM RK3399 DMC DEVFREQ Driver" + depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \ +--- a/drivers/devfreq/Makefile ++++ b/drivers/devfreq/Makefile +@@ -11,6 +11,7 @@ obj-$(CONFIG_DEVFREQ_GOV_PASSIVE) += gov + obj-$(CONFIG_ARM_EXYNOS_BUS_DEVFREQ) += exynos-bus.o + obj-$(CONFIG_ARM_IMX_BUS_DEVFREQ) += imx-bus.o + obj-$(CONFIG_ARM_IMX8M_DDRC_DEVFREQ) += imx8m-ddrc.o ++obj-$(CONFIG_ARM_RK3328_DMC_DEVFREQ) += rk3328_dmc.o + obj-$(CONFIG_ARM_RK3399_DMC_DEVFREQ) += rk3399_dmc.o + obj-$(CONFIG_ARM_SUN8I_A33_MBUS_DEVFREQ) += sun8i-a33-mbus.o + obj-$(CONFIG_ARM_TEGRA_DEVFREQ) += tegra30-devfreq.o diff --git a/target/linux/rockchip/patches-5.19/0059-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch b/target/linux/rockchip/patches-5.19/0059-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch new file mode 100644 index 00000000000000..0408a0a73ac8a5 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0059-clk-rockchip-support-setting-ddr-clock-via-SIP-Version-2-.patch @@ -0,0 +1,210 @@ +From ce6d3614888e6358466f0e84e248177a6bca5258 Mon Sep 17 00:00:00 2001 +From: Tang Yun ping <typ@rock-chips.com> +Date: Thu, 4 May 2017 20:49:58 +0800 +Subject: [PATCH] clk: rockchip: support setting ddr clock via SIP Version 2 + APIs + +commit 764e893ee82321938fc6f4349e9e7caf06a04410 rockchip. + +Signed-off-by: Tang Yun ping <typ@rock-chips.com> +Signed-off-by: hmz007 <hmz007@gmail.com> +--- + drivers/clk/rockchip/clk-ddr.c | 130 ++++++++++++++++++++++++++++ + drivers/clk/rockchip/clk-rk3328.c | 7 +- + drivers/clk/rockchip/clk.h | 3 +- + include/soc/rockchip/rockchip_sip.h | 11 +++ + 4 files changed, 147 insertions(+), 4 deletions(-) + +--- a/drivers/clk/rockchip/clk-ddr.c ++++ b/drivers/clk/rockchip/clk-ddr.c +@@ -87,6 +87,133 @@ static const struct clk_ops rockchip_ddr + .get_parent = rockchip_ddrclk_get_parent, + }; + ++/* See v4.4/include/dt-bindings/display/rk_fb.h */ ++#define SCREEN_NULL 0 ++#define SCREEN_HDMI 6 ++ ++static inline int rk_drm_get_lcdc_type(void) ++{ ++ return SCREEN_NULL; ++} ++ ++struct share_params { ++ u32 hz; ++ u32 lcdc_type; ++ u32 vop; ++ u32 vop_dclk_mode; ++ u32 sr_idle_en; ++ u32 addr_mcu_el3; ++ /* ++ * 1: need to wait flag1 ++ * 0: never wait flag1 ++ */ ++ u32 wait_flag1; ++ /* ++ * 1: need to wait flag1 ++ * 0: never wait flag1 ++ */ ++ u32 wait_flag0; ++ u32 complt_hwirq; ++ /* if need, add parameter after */ ++}; ++ ++struct rockchip_ddrclk_data { ++ u32 inited_flag; ++ void __iomem *share_memory; ++}; ++ ++static struct rockchip_ddrclk_data ddr_data; ++ ++static void rockchip_ddrclk_data_init(void) ++{ ++ struct arm_smccc_res res; ++ ++ arm_smccc_smc(ROCKCHIP_SIP_SHARE_MEM, ++ 1, SHARE_PAGE_TYPE_DDR, 0, ++ 0, 0, 0, 0, &res); ++ ++ if (!res.a0) { ++ ddr_data.share_memory = (void __iomem *)ioremap(res.a1, 1<<12); ++ ddr_data.inited_flag = 1; ++ } ++} ++ ++static int rockchip_ddrclk_sip_set_rate_v2(struct clk_hw *hw, ++ unsigned long drate, ++ unsigned long prate) ++{ ++ struct share_params *p; ++ struct arm_smccc_res res; ++ ++ if (!ddr_data.inited_flag) ++ rockchip_ddrclk_data_init(); ++ ++ p = (struct share_params *)ddr_data.share_memory; ++ ++ p->hz = drate; ++ p->lcdc_type = rk_drm_get_lcdc_type(); ++ p->wait_flag1 = 1; ++ p->wait_flag0 = 1; ++ ++ arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, ++ SHARE_PAGE_TYPE_DDR, 0, ++ ROCKCHIP_SIP_CONFIG_DRAM_SET_RATE, ++ 0, 0, 0, 0, &res); ++ ++ if ((int)res.a1 == -6) { ++ pr_err("%s: timeout, drate = %lumhz\n", __func__, drate/1000000); ++ /* TODO: rockchip_dmcfreq_wait_complete(); */ ++ } ++ ++ return res.a0; ++} ++ ++static unsigned long rockchip_ddrclk_sip_recalc_rate_v2 ++ (struct clk_hw *hw, unsigned long parent_rate) ++{ ++ struct arm_smccc_res res; ++ ++ arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, ++ SHARE_PAGE_TYPE_DDR, 0, ++ ROCKCHIP_SIP_CONFIG_DRAM_GET_RATE, ++ 0, 0, 0, 0, &res); ++ if (!res.a0) ++ return res.a1; ++ else ++ return 0; ++} ++ ++static long rockchip_ddrclk_sip_round_rate_v2(struct clk_hw *hw, ++ unsigned long rate, ++ unsigned long *prate) ++{ ++ struct share_params *p; ++ struct arm_smccc_res res; ++ ++ if (!ddr_data.inited_flag) ++ rockchip_ddrclk_data_init(); ++ ++ p = (struct share_params *)ddr_data.share_memory; ++ ++ p->hz = rate; ++ ++ arm_smccc_smc(ROCKCHIP_SIP_DRAM_FREQ, ++ SHARE_PAGE_TYPE_DDR, 0, ++ ROCKCHIP_SIP_CONFIG_DRAM_ROUND_RATE, ++ 0, 0, 0, 0, &res); ++ if (!res.a0) ++ return res.a1; ++ else ++ return 0; ++} ++ ++static const struct clk_ops rockchip_ddrclk_sip_ops_v2 = { ++ .recalc_rate = rockchip_ddrclk_sip_recalc_rate_v2, ++ .set_rate = rockchip_ddrclk_sip_set_rate_v2, ++ .round_rate = rockchip_ddrclk_sip_round_rate_v2, ++ .get_parent = rockchip_ddrclk_get_parent, ++}; ++ + struct clk *rockchip_clk_register_ddrclk(const char *name, int flags, + const char *const *parent_names, + u8 num_parents, int mux_offset, +@@ -114,6 +241,9 @@ struct clk *rockchip_clk_register_ddrclk + case ROCKCHIP_DDRCLK_SIP: + init.ops = &rockchip_ddrclk_sip_ops; + break; ++ case ROCKCHIP_DDRCLK_SIP_V2: ++ init.ops = &rockchip_ddrclk_sip_ops_v2; ++ break; + default: + pr_err("%s: unsupported ddrclk type %d\n", __func__, ddr_flag); + kfree(ddrclk); +--- a/drivers/clk/rockchip/clk-rk3328.c ++++ b/drivers/clk/rockchip/clk-rk3328.c +@@ -315,9 +315,10 @@ static struct rockchip_clk_branch rk3328 + RK3328_CLKGATE_CON(14), 1, GFLAGS), + + /* PD_DDR */ +- COMPOSITE(0, "clk_ddr", mux_ddrphy_p, CLK_IGNORE_UNUSED, +- RK3328_CLKSEL_CON(3), 8, 2, MFLAGS, 0, 3, DFLAGS | CLK_DIVIDER_POWER_OF_TWO, +- RK3328_CLKGATE_CON(0), 4, GFLAGS), ++ COMPOSITE_DDRCLK(SCLK_DDRCLK, "sclk_ddrc", mux_ddrphy_p, 0, ++ RK3328_CLKSEL_CON(3), 8, 2, 0, 3, ++ ROCKCHIP_DDRCLK_SIP_V2), ++ + GATE(0, "clk_ddrmsch", "clk_ddr", CLK_IGNORE_UNUSED, + RK3328_CLKGATE_CON(18), 6, GFLAGS), + GATE(0, "clk_ddrupctl", "clk_ddr", CLK_IGNORE_UNUSED, +--- a/drivers/clk/rockchip/clk.h ++++ b/drivers/clk/rockchip/clk.h +@@ -399,7 +399,8 @@ struct clk *rockchip_clk_register_mmc(co + * DDRCLK flags, including method of setting the rate + * ROCKCHIP_DDRCLK_SIP: use SIP call to bl31 to change ddrclk rate. + */ +-#define ROCKCHIP_DDRCLK_SIP BIT(0) ++#define ROCKCHIP_DDRCLK_SIP 0x01 ++#define ROCKCHIP_DDRCLK_SIP_V2 0x03 + + struct clk *rockchip_clk_register_ddrclk(const char *name, int flags, + const char *const *parent_names, +--- a/include/soc/rockchip/rockchip_sip.h ++++ b/include/soc/rockchip/rockchip_sip.h +@@ -16,5 +16,16 @@ + #define ROCKCHIP_SIP_CONFIG_DRAM_CLR_IRQ 0x06 + #define ROCKCHIP_SIP_CONFIG_DRAM_SET_PARAM 0x07 + #define ROCKCHIP_SIP_CONFIG_DRAM_SET_ODT_PD 0x08 ++#define ROCKCHIP_SIP_CONFIG_DRAM_GET_VERSION 0x08 ++ ++#define ROCKCHIP_SIP_SHARE_MEM 0x82000009 ++ ++/* Share mem page types */ ++typedef enum { ++ SHARE_PAGE_TYPE_INVALID = 0, ++ SHARE_PAGE_TYPE_UARTDBG, ++ SHARE_PAGE_TYPE_DDR, ++ SHARE_PAGE_TYPE_MAX, ++} share_page_type_t; + + #endif diff --git a/target/linux/rockchip/patches-5.19/0060-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-5.19/0060-PM-devfreq-rockchip-dfi-add-more-soc-support.patch new file mode 100644 index 00000000000000..283e4abd2f8b5a --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0060-PM-devfreq-rockchip-dfi-add-more-soc-support.patch @@ -0,0 +1,662 @@ +From 4db93c6dad0c71750b86163df2fdb21c35f00d9a Mon Sep 17 00:00:00 2001 +From: hmz007 <hmz007@gmail.com> +Date: Tue, 19 Nov 2019 12:49:48 +0800 +Subject: [PATCH] PM / devfreq: rockchip-dfi: add more soc support + +Signed-off-by: hmz007 <hmz007@gmail.com> +--- + drivers/devfreq/event/rockchip-dfi.c | 554 ++++++++++++++++++++++++--- + 1 file changed, 505 insertions(+), 49 deletions(-) + +--- a/drivers/devfreq/event/rockchip-dfi.c ++++ b/drivers/devfreq/event/rockchip-dfi.c +@@ -18,25 +18,66 @@ + #include <linux/list.h> + #include <linux/of.h> + +-#include <soc/rockchip/rk3399_grf.h> +- +-#define RK3399_DMC_NUM_CH 2 ++#define PX30_PMUGRF_OS_REG2 0x208 + ++#define RK3128_GRF_SOC_CON0 0x140 ++#define RK3128_GRF_OS_REG1 0x1cc ++#define RK3128_GRF_DFI_WRNUM 0x220 ++#define RK3128_GRF_DFI_RDNUM 0x224 ++#define RK3128_GRF_DFI_TIMERVAL 0x22c ++#define RK3128_DDR_MONITOR_EN ((1 << (16 + 6)) + (1 << 6)) ++#define RK3128_DDR_MONITOR_DISB ((1 << (16 + 6)) + (0 << 6)) ++ ++#define RK3288_PMU_SYS_REG2 0x9c ++#define RK3288_GRF_SOC_CON4 0x254 ++#define RK3288_GRF_SOC_STATUS(n) (0x280 + (n) * 4) ++#define RK3288_DFI_EN (0x30003 << 14) ++#define RK3288_DFI_DIS (0x30000 << 14) ++#define RK3288_LPDDR_SEL (0x10001 << 13) ++#define RK3288_DDR3_SEL (0x10000 << 13) ++ ++#define RK3328_GRF_OS_REG2 0x5d0 ++ ++#define RK3368_GRF_DDRC0_CON0 0x600 ++#define RK3368_GRF_SOC_STATUS5 0x494 ++#define RK3368_GRF_SOC_STATUS6 0x498 ++#define RK3368_GRF_SOC_STATUS8 0x4a0 ++#define RK3368_GRF_SOC_STATUS9 0x4a4 ++#define RK3368_GRF_SOC_STATUS10 0x4a8 ++#define RK3368_DFI_EN (0x30003 << 5) ++#define RK3368_DFI_DIS (0x30000 << 5) ++ ++#define MAX_DMC_NUM_CH 2 ++#define READ_DRAMTYPE_INFO(n) (((n) >> 13) & 0x7) ++#define READ_CH_INFO(n) (((n) >> 28) & 0x3) + /* DDRMON_CTRL */ +-#define DDRMON_CTRL 0x04 +-#define CLR_DDRMON_CTRL (0x1f0000 << 0) +-#define LPDDR4_EN (0x10001 << 4) +-#define HARDWARE_EN (0x10001 << 3) +-#define LPDDR3_EN (0x10001 << 2) +-#define SOFTWARE_EN (0x10001 << 1) +-#define SOFTWARE_DIS (0x10000 << 1) +-#define TIME_CNT_EN (0x10001 << 0) ++#define DDRMON_CTRL 0x04 ++#define CLR_DDRMON_CTRL (0x3f0000 << 0) ++#define DDR4_EN (0x10001 << 5) ++#define LPDDR4_EN (0x10001 << 4) ++#define HARDWARE_EN (0x10001 << 3) ++#define LPDDR2_3_EN (0x10001 << 2) ++#define SOFTWARE_EN (0x10001 << 1) ++#define SOFTWARE_DIS (0x10000 << 1) ++#define TIME_CNT_EN (0x10001 << 0) + + #define DDRMON_CH0_COUNT_NUM 0x28 + #define DDRMON_CH0_DFI_ACCESS_NUM 0x2c + #define DDRMON_CH1_COUNT_NUM 0x3c + #define DDRMON_CH1_DFI_ACCESS_NUM 0x40 + ++/* pmu grf */ ++#define PMUGRF_OS_REG2 0x308 ++ ++enum { ++ DDR4 = 0, ++ DDR3 = 3, ++ LPDDR2 = 5, ++ LPDDR3 = 6, ++ LPDDR4 = 7, ++ UNUSED = 0xFF ++}; ++ + struct dmc_usage { + u32 access; + u32 total; +@@ -50,33 +91,261 @@ struct dmc_usage { + struct rockchip_dfi { + struct devfreq_event_dev *edev; + struct devfreq_event_desc *desc; +- struct dmc_usage ch_usage[RK3399_DMC_NUM_CH]; ++ struct dmc_usage ch_usage[MAX_DMC_NUM_CH]; + struct device *dev; + void __iomem *regs; + struct regmap *regmap_pmu; ++ struct regmap *regmap_grf; ++ struct regmap *regmap_pmugrf; + struct clk *clk; ++ u32 dram_type; ++ /* ++ * available mask, 1: available, 0: not available ++ * each bit represent a channel ++ */ ++ u32 ch_msk; ++}; ++ ++static void rk3128_dfi_start_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, ++ RK3128_GRF_SOC_CON0, ++ RK3128_DDR_MONITOR_EN); ++} ++ ++static void rk3128_dfi_stop_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, ++ RK3128_GRF_SOC_CON0, ++ RK3128_DDR_MONITOR_DISB); ++} ++ ++static int rk3128_dfi_disable(struct devfreq_event_dev *edev) ++{ ++ rk3128_dfi_stop_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3128_dfi_enable(struct devfreq_event_dev *edev) ++{ ++ rk3128_dfi_start_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3128_dfi_set_event(struct devfreq_event_dev *edev) ++{ ++ return 0; ++} ++ ++static int rk3128_dfi_get_event(struct devfreq_event_dev *edev, ++ struct devfreq_event_data *edata) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ unsigned long flags; ++ u32 dfi_wr, dfi_rd, dfi_timer; ++ ++ local_irq_save(flags); ++ ++ rk3128_dfi_stop_hardware_counter(edev); ++ ++ regmap_read(info->regmap_grf, RK3128_GRF_DFI_WRNUM, &dfi_wr); ++ regmap_read(info->regmap_grf, RK3128_GRF_DFI_RDNUM, &dfi_rd); ++ regmap_read(info->regmap_grf, RK3128_GRF_DFI_TIMERVAL, &dfi_timer); ++ ++ edata->load_count = (dfi_wr + dfi_rd) * 4; ++ edata->total_count = dfi_timer; ++ ++ rk3128_dfi_start_hardware_counter(edev); ++ ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++static const struct devfreq_event_ops rk3128_dfi_ops = { ++ .disable = rk3128_dfi_disable, ++ .enable = rk3128_dfi_enable, ++ .get_event = rk3128_dfi_get_event, ++ .set_event = rk3128_dfi_set_event, ++}; ++ ++static void rk3288_dfi_start_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_EN); ++} ++ ++static void rk3288_dfi_stop_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, RK3288_GRF_SOC_CON4, RK3288_DFI_DIS); ++} ++ ++static int rk3288_dfi_disable(struct devfreq_event_dev *edev) ++{ ++ rk3288_dfi_stop_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3288_dfi_enable(struct devfreq_event_dev *edev) ++{ ++ rk3288_dfi_start_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3288_dfi_set_event(struct devfreq_event_dev *edev) ++{ ++ return 0; ++} ++ ++static int rk3288_dfi_get_busier_ch(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ u32 tmp, max = 0; ++ u32 i, busier_ch = 0; ++ u32 rd_count, wr_count, total_count; ++ ++ rk3288_dfi_stop_hardware_counter(edev); ++ ++ /* Find out which channel is busier */ ++ for (i = 0; i < MAX_DMC_NUM_CH; i++) { ++ if (!(info->ch_msk & BIT(i))) ++ continue; ++ regmap_read(info->regmap_grf, ++ RK3288_GRF_SOC_STATUS(11 + i * 4), &wr_count); ++ regmap_read(info->regmap_grf, ++ RK3288_GRF_SOC_STATUS(12 + i * 4), &rd_count); ++ regmap_read(info->regmap_grf, ++ RK3288_GRF_SOC_STATUS(14 + i * 4), &total_count); ++ info->ch_usage[i].access = (wr_count + rd_count) * 4; ++ info->ch_usage[i].total = total_count; ++ tmp = info->ch_usage[i].access; ++ if (tmp > max) { ++ busier_ch = i; ++ max = tmp; ++ } ++ } ++ rk3288_dfi_start_hardware_counter(edev); ++ ++ return busier_ch; ++} ++ ++static int rk3288_dfi_get_event(struct devfreq_event_dev *edev, ++ struct devfreq_event_data *edata) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ int busier_ch; ++ unsigned long flags; ++ ++ local_irq_save(flags); ++ busier_ch = rk3288_dfi_get_busier_ch(edev); ++ local_irq_restore(flags); ++ ++ edata->load_count = info->ch_usage[busier_ch].access; ++ edata->total_count = info->ch_usage[busier_ch].total; ++ ++ return 0; ++} ++ ++static const struct devfreq_event_ops rk3288_dfi_ops = { ++ .disable = rk3288_dfi_disable, ++ .enable = rk3288_dfi_enable, ++ .get_event = rk3288_dfi_get_event, ++ .set_event = rk3288_dfi_set_event, ++}; ++ ++static void rk3368_dfi_start_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_EN); ++} ++ ++static void rk3368_dfi_stop_hardware_counter(struct devfreq_event_dev *edev) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ ++ regmap_write(info->regmap_grf, RK3368_GRF_DDRC0_CON0, RK3368_DFI_DIS); ++} ++ ++static int rk3368_dfi_disable(struct devfreq_event_dev *edev) ++{ ++ rk3368_dfi_stop_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3368_dfi_enable(struct devfreq_event_dev *edev) ++{ ++ rk3368_dfi_start_hardware_counter(edev); ++ ++ return 0; ++} ++ ++static int rk3368_dfi_set_event(struct devfreq_event_dev *edev) ++{ ++ return 0; ++} ++ ++static int rk3368_dfi_get_event(struct devfreq_event_dev *edev, ++ struct devfreq_event_data *edata) ++{ ++ struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); ++ unsigned long flags; ++ u32 dfi0_wr, dfi0_rd, dfi1_wr, dfi1_rd, dfi_timer; ++ ++ local_irq_save(flags); ++ ++ rk3368_dfi_stop_hardware_counter(edev); ++ ++ regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS5, &dfi0_wr); ++ regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS6, &dfi0_rd); ++ regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS9, &dfi1_wr); ++ regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS10, &dfi1_rd); ++ regmap_read(info->regmap_grf, RK3368_GRF_SOC_STATUS8, &dfi_timer); ++ ++ edata->load_count = (dfi0_wr + dfi0_rd + dfi1_wr + dfi1_rd) * 2; ++ edata->total_count = dfi_timer; ++ ++ rk3368_dfi_start_hardware_counter(edev); ++ ++ local_irq_restore(flags); ++ ++ return 0; ++} ++ ++static const struct devfreq_event_ops rk3368_dfi_ops = { ++ .disable = rk3368_dfi_disable, ++ .enable = rk3368_dfi_enable, ++ .get_event = rk3368_dfi_get_event, ++ .set_event = rk3368_dfi_set_event, + }; + + static void rockchip_dfi_start_hardware_counter(struct devfreq_event_dev *edev) + { + struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); + void __iomem *dfi_regs = info->regs; +- u32 val; +- u32 ddr_type; +- +- /* get ddr type */ +- regmap_read(info->regmap_pmu, RK3399_PMUGRF_OS_REG2, &val); +- ddr_type = (val >> RK3399_PMUGRF_DDRTYPE_SHIFT) & +- RK3399_PMUGRF_DDRTYPE_MASK; + + /* clear DDRMON_CTRL setting */ + writel_relaxed(CLR_DDRMON_CTRL, dfi_regs + DDRMON_CTRL); + + /* set ddr type to dfi */ +- if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR3) +- writel_relaxed(LPDDR3_EN, dfi_regs + DDRMON_CTRL); +- else if (ddr_type == RK3399_PMUGRF_DDRTYPE_LPDDR4) ++ if (info->dram_type == LPDDR3 || info->dram_type == LPDDR2) ++ writel_relaxed(LPDDR2_3_EN, dfi_regs + DDRMON_CTRL); ++ else if (info->dram_type == LPDDR4) + writel_relaxed(LPDDR4_EN, dfi_regs + DDRMON_CTRL); ++ else if (info->dram_type == DDR4) ++ writel_relaxed(DDR4_EN, dfi_regs + DDRMON_CTRL); + + /* enable count, use software mode */ + writel_relaxed(SOFTWARE_EN, dfi_regs + DDRMON_CTRL); +@@ -100,12 +369,22 @@ static int rockchip_dfi_get_busier_ch(st + rockchip_dfi_stop_hardware_counter(edev); + + /* Find out which channel is busier */ +- for (i = 0; i < RK3399_DMC_NUM_CH; i++) { +- info->ch_usage[i].access = readl_relaxed(dfi_regs + +- DDRMON_CH0_DFI_ACCESS_NUM + i * 20) * 4; ++ for (i = 0; i < MAX_DMC_NUM_CH; i++) { ++ if (!(info->ch_msk & BIT(i))) ++ continue; ++ + info->ch_usage[i].total = readl_relaxed(dfi_regs + + DDRMON_CH0_COUNT_NUM + i * 20); +- tmp = info->ch_usage[i].access; ++ ++ /* LPDDR4 BL = 16,other DDR type BL = 8 */ ++ tmp = readl_relaxed(dfi_regs + ++ DDRMON_CH0_DFI_ACCESS_NUM + i * 20); ++ if (info->dram_type == LPDDR4) ++ tmp *= 8; ++ else ++ tmp *= 4; ++ info->ch_usage[i].access = tmp; ++ + if (tmp > max) { + busier_ch = i; + max = tmp; +@@ -121,7 +400,8 @@ static int rockchip_dfi_disable(struct d + struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); + + rockchip_dfi_stop_hardware_counter(edev); +- clk_disable_unprepare(info->clk); ++ if (info->clk) ++ clk_disable_unprepare(info->clk); + + return 0; + } +@@ -131,10 +411,13 @@ static int rockchip_dfi_enable(struct de + struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); + int ret; + +- ret = clk_prepare_enable(info->clk); +- if (ret) { +- dev_err(&edev->dev, "failed to enable dfi clk: %d\n", ret); +- return ret; ++ if (info->clk) { ++ ret = clk_prepare_enable(info->clk); ++ if (ret) { ++ dev_err(&edev->dev, "failed to enable dfi clk: %d\n", ++ ret); ++ return ret; ++ } + } + + rockchip_dfi_start_hardware_counter(edev); +@@ -151,8 +434,11 @@ static int rockchip_dfi_get_event(struct + { + struct rockchip_dfi *info = devfreq_event_get_drvdata(edev); + int busier_ch; ++ unsigned long flags; + ++ local_irq_save(flags); + busier_ch = rockchip_dfi_get_busier_ch(edev); ++ local_irq_restore(flags); + + edata->load_count = info->ch_usage[busier_ch].access; + edata->total_count = info->ch_usage[busier_ch].total; +@@ -167,22 +453,116 @@ static const struct devfreq_event_ops ro + .set_event = rockchip_dfi_set_event, + }; + +-static const struct of_device_id rockchip_dfi_id_match[] = { +- { .compatible = "rockchip,rk3399-dfi" }, +- { }, +-}; +-MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match); ++static __init int px30_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) ++{ ++ struct device_node *np = pdev->dev.of_node, *node; ++ struct resource *res; ++ u32 val; + +-static int rockchip_dfi_probe(struct platform_device *pdev) ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ data->regs = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(data->regs)) ++ return PTR_ERR(data->regs); ++ ++ node = of_parse_phandle(np, "rockchip,pmugrf", 0); ++ if (node) { ++ data->regmap_pmugrf = syscon_node_to_regmap(node); ++ if (IS_ERR(data->regmap_pmugrf)) ++ return PTR_ERR(data->regmap_pmugrf); ++ } ++ ++ regmap_read(data->regmap_pmugrf, PX30_PMUGRF_OS_REG2, &val); ++ data->dram_type = READ_DRAMTYPE_INFO(val); ++ data->ch_msk = 1; ++ data->clk = NULL; ++ ++ desc->ops = &rockchip_dfi_ops; ++ ++ return 0; ++} ++ ++static __init int rk3128_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) + { +- struct device *dev = &pdev->dev; +- struct rockchip_dfi *data; +- struct devfreq_event_desc *desc; + struct device_node *np = pdev->dev.of_node, *node; + +- data = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL); +- if (!data) +- return -ENOMEM; ++ node = of_parse_phandle(np, "rockchip,grf", 0); ++ if (node) { ++ data->regmap_grf = syscon_node_to_regmap(node); ++ if (IS_ERR(data->regmap_grf)) ++ return PTR_ERR(data->regmap_grf); ++ } ++ ++ desc->ops = &rk3128_dfi_ops; ++ ++ return 0; ++} ++ ++static __init int rk3288_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) ++{ ++ struct device_node *np = pdev->dev.of_node, *node; ++ u32 val; ++ ++ node = of_parse_phandle(np, "rockchip,pmu", 0); ++ if (node) { ++ data->regmap_pmu = syscon_node_to_regmap(node); ++ if (IS_ERR(data->regmap_pmu)) ++ return PTR_ERR(data->regmap_pmu); ++ } ++ ++ node = of_parse_phandle(np, "rockchip,grf", 0); ++ if (node) { ++ data->regmap_grf = syscon_node_to_regmap(node); ++ if (IS_ERR(data->regmap_grf)) ++ return PTR_ERR(data->regmap_grf); ++ } ++ ++ regmap_read(data->regmap_pmu, RK3288_PMU_SYS_REG2, &val); ++ data->dram_type = READ_DRAMTYPE_INFO(val); ++ data->ch_msk = READ_CH_INFO(val); ++ ++ if (data->dram_type == DDR3) ++ regmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4, ++ RK3288_DDR3_SEL); ++ else ++ regmap_write(data->regmap_grf, RK3288_GRF_SOC_CON4, ++ RK3288_LPDDR_SEL); ++ ++ desc->ops = &rk3288_dfi_ops; ++ ++ return 0; ++} ++ ++static __init int rk3368_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) ++{ ++ struct device *dev = &pdev->dev; ++ ++ if (!dev->parent || !dev->parent->of_node) ++ return -EINVAL; ++ ++ data->regmap_grf = syscon_node_to_regmap(dev->parent->of_node); ++ if (IS_ERR(data->regmap_grf)) ++ return PTR_ERR(data->regmap_grf); ++ ++ desc->ops = &rk3368_dfi_ops; ++ ++ return 0; ++} ++ ++static __init int rockchip_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) ++{ ++ struct device *dev = &pdev->dev; ++ struct device_node *np = pdev->dev.of_node, *node; ++ u32 val; + + data->regs = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(data->regs)) +@@ -202,21 +582,97 @@ static int rockchip_dfi_probe(struct pla + if (IS_ERR(data->regmap_pmu)) + return PTR_ERR(data->regmap_pmu); + } +- data->dev = dev; ++ ++ regmap_read(data->regmap_pmu, PMUGRF_OS_REG2, &val); ++ data->dram_type = READ_DRAMTYPE_INFO(val); ++ data->ch_msk = READ_CH_INFO(val); ++ ++ desc->ops = &rockchip_dfi_ops; ++ ++ return 0; ++} ++ ++static __init int rk3328_dfi_init(struct platform_device *pdev, ++ struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc) ++{ ++ struct device_node *np = pdev->dev.of_node, *node; ++ struct resource *res; ++ u32 val; ++ ++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ data->regs = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(data->regs)) ++ return PTR_ERR(data->regs); ++ ++ node = of_parse_phandle(np, "rockchip,grf", 0); ++ if (node) { ++ data->regmap_grf = syscon_node_to_regmap(node); ++ if (IS_ERR(data->regmap_grf)) ++ return PTR_ERR(data->regmap_grf); ++ } ++ ++ regmap_read(data->regmap_grf, RK3328_GRF_OS_REG2, &val); ++ data->dram_type = READ_DRAMTYPE_INFO(val); ++ data->ch_msk = 1; ++ data->clk = NULL; ++ ++ desc->ops = &rockchip_dfi_ops; ++ ++ return 0; ++} ++ ++static const struct of_device_id rockchip_dfi_id_match[] = { ++ { .compatible = "rockchip,px30-dfi", .data = px30_dfi_init }, ++ { .compatible = "rockchip,rk1808-dfi", .data = px30_dfi_init }, ++ { .compatible = "rockchip,rk3128-dfi", .data = rk3128_dfi_init }, ++ { .compatible = "rockchip,rk3288-dfi", .data = rk3288_dfi_init }, ++ { .compatible = "rockchip,rk3328-dfi", .data = rk3328_dfi_init }, ++ { .compatible = "rockchip,rk3368-dfi", .data = rk3368_dfi_init }, ++ { .compatible = "rockchip,rk3399-dfi", .data = rockchip_dfi_init }, ++ { }, ++}; ++MODULE_DEVICE_TABLE(of, rockchip_dfi_id_match); ++ ++static int rockchip_dfi_probe(struct platform_device *pdev) ++{ ++ struct device *dev = &pdev->dev; ++ struct rockchip_dfi *data; ++ struct devfreq_event_desc *desc; ++ struct device_node *np = pdev->dev.of_node; ++ const struct of_device_id *match; ++ int (*init)(struct platform_device *pdev, struct rockchip_dfi *data, ++ struct devfreq_event_desc *desc); ++ ++ data = devm_kzalloc(dev, sizeof(struct rockchip_dfi), GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; + + desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); + if (!desc) + return -ENOMEM; + +- desc->ops = &rockchip_dfi_ops; ++ match = of_match_node(rockchip_dfi_id_match, pdev->dev.of_node); ++ if (match) { ++ init = match->data; ++ if (init) { ++ if (init(pdev, data, desc)) ++ return -EINVAL; ++ } else { ++ return 0; ++ } ++ } else { ++ return 0; ++ } ++ + desc->driver_data = data; + desc->name = np->name; + data->desc = desc; ++ data->dev = dev; + +- data->edev = devm_devfreq_event_add_edev(&pdev->dev, desc); ++ data->edev = devm_devfreq_event_add_edev(dev, desc); + if (IS_ERR(data->edev)) { +- dev_err(&pdev->dev, +- "failed to add devfreq-event device\n"); ++ dev_err(dev, "failed to add devfreq-event device\n"); + return PTR_ERR(data->edev); + } + diff --git a/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch new file mode 100644 index 00000000000000..2ab20487a0fe98 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch @@ -0,0 +1,27 @@ +From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001 +From: hmz007 <hmz007@gmail.com> +Date: Tue, 19 Nov 2019 14:21:51 +0800 +Subject: [PATCH] arm64: dts: rockchip: rk3328: add dfi node + +Signed-off-by: hmz007 <hmz007@gmail.com> +[adjusted commit title] +Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org> +--- + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 7 +++++++ + +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -1005,6 +1005,13 @@ + status = "disabled"; + }; + ++ dfi: dfi@ff790000 { ++ reg = <0x00 0xff790000 0x00 0x400>; ++ compatible = "rockchip,rk3328-dfi"; ++ rockchip,grf = <&grf>; ++ status = "disabled"; ++ }; ++ + gic: interrupt-controller@ff811000 { + compatible = "arm,gic-400"; + #interrupt-cells = <3>; diff --git a/target/linux/rockchip/patches-5.19/0062-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch b/target/linux/rockchip/patches-5.19/0062-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch new file mode 100644 index 00000000000000..2e36792accd22c --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0062-arm64-dts-nanopi-r2s-add-rk3328-dmc-relate-node.patch @@ -0,0 +1,126 @@ +From f9ae6e992d3d9e80357fee7d65ba0fe2dd37ae1f Mon Sep 17 00:00:00 2001 +From: hmz007 <hmz007@gmail.com> +Date: Tue, 19 Nov 2019 14:21:51 +0800 +Subject: [PATCH] arm64: dts: nanopi-r2: add rk3328-dmc relate node + +Signed-off-by: hmz007 <hmz007@gmail.com> +--- + .../rockchip/rk3328-dram-default-timing.dtsi | 311 ++++++++++++++++++ + .../dts/rockchip/rk3328-nanopi-r2-common.dtsi | 85 ++++- + include/dt-bindings/clock/rockchip-ddr.h | 63 ++++ + include/dt-bindings/memory/rk3328-dram.h | 159 +++++++++ + 4 files changed, 617 insertions(+), 1 deletion(-) + create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-dram-default-timing.dtsi + create mode 100644 include/dt-bindings/clock/rockchip-ddr.h + create mode 100644 include/dt-bindings/memory/rk3328-dram.h + +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -7,6 +7,7 @@ + + #include <dt-bindings/input/input.h> + #include <dt-bindings/gpio/gpio.h> ++#include "rk3328-dram-nanopi2-timing.dtsi" + #include "rk3328.dtsi" + + / { +@@ -121,6 +122,72 @@ + regulator-boot-on; + vin-supply = <&vdd_5v>; + }; ++ ++ dmc: dmc { ++ compatible = "rockchip,rk3328-dmc"; ++ devfreq-events = <&dfi>; ++ center-supply = <&vdd_log>; ++ clocks = <&cru SCLK_DDRCLK>; ++ clock-names = "dmc_clk"; ++ operating-points-v2 = <&dmc_opp_table>; ++ ddr_timing = <&ddr_timing>; ++ upthreshold = <40>; ++ downdifferential = <20>; ++ auto-min-freq = <786000>; ++ auto-freq-en = <0>; ++ #cooling-cells = <2>; ++ status = "okay"; ++ ++ ddr_power_model: ddr_power_model { ++ compatible = "ddr_power_model"; ++ dynamic-power-coefficient = <120>; ++ static-power-coefficient = <200>; ++ ts = <32000 4700 (-80) 2>; ++ thermal-zone = "soc-thermal"; ++ }; ++ }; ++ ++ dmc_opp_table: dmc-opp-table { ++ compatible = "operating-points-v2"; ++ ++ rockchip,leakage-voltage-sel = < ++ 1 10 0 ++ 11 254 1 ++ >; ++ nvmem-cells = <&logic_leakage>; ++ nvmem-cell-names = "ddr_leakage"; ++ ++ opp-786000000 { ++ opp-hz = /bits/ 64 <786000000>; ++ opp-microvolt = <1075000>; ++ opp-microvolt-L0 = <1075000>; ++ opp-microvolt-L1 = <1050000>; ++ }; ++ opp-798000000 { ++ opp-hz = /bits/ 64 <798000000>; ++ opp-microvolt = <1075000>; ++ opp-microvolt-L0 = <1075000>; ++ opp-microvolt-L1 = <1050000>; ++ }; ++ opp-840000000 { ++ opp-hz = /bits/ 64 <840000000>; ++ opp-microvolt = <1075000>; ++ opp-microvolt-L0 = <1075000>; ++ opp-microvolt-L1 = <1050000>; ++ }; ++ opp-924000000 { ++ opp-hz = /bits/ 64 <924000000>; ++ opp-microvolt = <1100000>; ++ opp-microvolt-L0 = <1100000>; ++ opp-microvolt-L1 = <1075000>; ++ }; ++ opp-1056000000 { ++ opp-hz = /bits/ 64 <1056000000>; ++ opp-microvolt = <1175000>; ++ opp-microvolt-L0 = <1175000>; ++ opp-microvolt-L1 = <1150000>; ++ }; ++ }; + }; + + &cpu0 { +@@ -139,6 +206,10 @@ + cpu-supply = <&vdd_arm>; + }; + ++&dfi { ++ status = "okay"; ++}; ++ + &display_subsystem { + status = "disabled"; + }; +@@ -202,6 +273,7 @@ + regulator-name = "vdd_log"; + regulator-always-on; + regulator-boot-on; ++ regulator-init-microvolt = <1075000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1450000>; + regulator-ramp-delay = <12500>; +@@ -216,6 +288,7 @@ + regulator-name = "vdd_arm"; + regulator-always-on; + regulator-boot-on; ++ regulator-init-microvolt = <1225000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1450000>; + regulator-ramp-delay = <12500>; diff --git a/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch b/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch new file mode 100644 index 00000000000000..e2fb70694228e1 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch @@ -0,0 +1,702 @@ +--- a/drivers/net/phy/Kconfig ++++ b/drivers/net/phy/Kconfig +@@ -260,6 +260,11 @@ config INTEL_XWAY_PHY + PEF 7061, PEF 7071 and PEF 7072 or integrated into the Intel + SoCs xRX200, xRX300, xRX330, xRX350 and xRX550. + ++config JLSEMI_JL2XX1_PHY ++ tristate "JLSemi JL2XX1 PHYs" ++ help ++ Currently supports the JLSemi jl2xx1 PHYs. ++ + config LSI_ET1011C_PHY + tristate "LSI ET1011C PHY" + help +--- a/drivers/net/phy/Makefile ++++ b/drivers/net/phy/Makefile +@@ -72,6 +72,8 @@ obj-$(CONFIG_DP83TC811_PHY) += dp83tc811 + obj-$(CONFIG_FIXED_PHY) += fixed_phy.o + obj-$(CONFIG_ICPLUS_PHY) += icplus.o + obj-$(CONFIG_INTEL_XWAY_PHY) += intel-xway.o ++obj-$(CONFIG_JLSEMI_JL2XX1_PHY) += jl2xx1.o ++jl2xx1-objs := jl2xxx.o jl2xxx-core.o + obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o + obj-$(CONFIG_LXT_PHY) += lxt.o + obj-$(CONFIG_MARVELL_10G_PHY) += marvell10g.o +--- /dev/null ++++ b/drivers/net/phy/jl2xxx-core.c +@@ -0,0 +1,438 @@ ++/* ++ * Copyright (C) 2021 JLSemi Corporation ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation version 2. ++ * ++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any ++ * kind, whether express or implied; without even the implied warranty ++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ */ ++#include "jl2xxx-core.h" ++#include <linux/phy.h> ++#include <linux/module.h> ++#include <linux/version.h> ++#include <linux/netdevice.h> ++ ++#define RGMII_CTRL_PAGE 171 ++#define RGMII_CTRL_REG 17 ++#define RGMII_TX_SW_RSTN BIT(14) ++#define RGMII_ERR_STAS BIT(3) ++#define RGMII_TX_CTR_EN BIT(1) ++ ++#define RGMII_STATUS_PAGE 166 ++#define RGMII_STATUS_REG 18 ++ ++#define BASIC_PAGE 0 ++#define BMCR_REG 0 ++#define SOFT_RESET BIT(15) ++#define SPEED_LSB BIT(13) ++#define AUTONEG_EN BIT(12) ++#define SPEED_MSB BIT(6) ++ ++#define DIG_PAGE 201 ++#define DIG_REG 17 ++#define CLK_10M_EN BIT(15) ++#define DAC_OUT_SEL_MSB BIT(1) ++#define DAC_OUT_SEL_LSB BIT(0) ++ ++/************************* Configuration section *************************/ ++ ++ ++/************************* JLSemi iteration code *************************/ ++ ++/* Patch for version: def2 */ ++uint32_t init_data[] = { ++ 0x1f00a0, 0x1903f3, 0x1f0012, 0x150100, 0x1f00ad, 0x100000, 0x11e0c6, 0x1f00a0, 0x1903fb, 0x1903fb, ++ 0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1903fb, 0x1f00ad, 0x110000, 0x120400, 0x130093, ++ 0x140000, 0x150193, 0x160000, 0x170213, 0x180000, 0x12040c, 0x130293, 0x140000, 0x150313, 0x160000, ++ 0x170393, 0x180000, 0x120418, 0x130413, 0x140000, 0x150493, 0x160000, 0x170513, 0x180000, 0x120424, ++ 0x130593, 0x140000, 0x150613, 0x160000, 0x170693, 0x180000, 0x120430, 0x130713, 0x140000, 0x150793, ++ 0x160000, 0x171137, 0x180000, 0x12043c, 0x13006f, 0x140060, 0x15a001, 0x160113, 0x17fd41, 0x18d026, ++ 0x120448, 0x13d406, 0x14d222, 0x1517b7, 0x160800, 0x17aa23, 0x189407, 0x120454, 0x130713, 0x1430f0, ++ 0x1567b7, 0x160800, 0x17a423, 0x1846e7, 0x120460, 0x13a703, 0x14a587, 0x156685, 0x168f55, 0x17ac23, ++ 0x18a4e7, 0x12046c, 0x1367b9, 0x145737, 0x150800, 0x168793, 0x17ef27, 0x182023, 0x120478, 0x1374f7, ++ 0x1407b7, 0x150800, 0x165bfc, 0x17d493, 0x180037, 0x120484, 0x13f493, 0x141f04, 0x15f793, 0x1607f7, ++ 0x178fc5, 0x18c03e, 0x120490, 0x134702, 0x140793, 0x150210, 0x160763, 0x1700f7, 0x180793, 0x12049c, ++ 0x130270, 0x140c63, 0x1530f7, 0x16a001, 0x1707b7, 0x180002, 0x1204a8, 0x138793, 0x146967, 0x15c83e, ++ 0x1617b7, 0x170002, 0x188793, 0x1204b4, 0x13e567, 0x14c43e, 0x1537b7, 0x160002, 0x178793, 0x186867, ++ 0x1204c0, 0x13c23e, 0x1447b7, 0x150002, 0x168793, 0x17e9a7, 0x1866b7, 0x1204cc, 0x130800, 0x14ca3e, ++ 0x15a783, 0x166d86, 0x1775c1, 0x188713, 0x1204d8, 0x130ff5, 0x148ff9, 0x156735, 0x160713, 0x178007, ++ 0x188fd9, 0x1204e4, 0x13ac23, 0x146cf6, 0x15a783, 0x1665c6, 0x175737, 0x180800, 0x1204f0, 0x136611, ++ 0x14f793, 0x15f0f7, 0x16e793, 0x170807, 0x18ae23, 0x1204fc, 0x1364f6, 0x142783, 0x155c47, 0x169bf5, ++ 0x172223, 0x185cf7, 0x120508, 0x13a703, 0x14f5c6, 0x158f51, 0x16ae23, 0x17f4e6, 0x180737, 0x120514, ++ 0x130809, 0x14433c, 0x158fd1, 0x16c33c, 0x170637, 0x180800, 0x120520, 0x134a74, 0x14679d, 0x158793, ++ 0x160e07, 0x179ae1, 0x18e693, 0x12052c, 0x130036, 0x14ca74, 0x154678, 0x1676e1, 0x178693, 0x185006, ++ 0x120538, 0x138ff9, 0x148fd5, 0x1507c2, 0x168f6d, 0x1783c1, 0x188fd9, 0x120544, 0x13c67c, 0x140713, ++ 0x151000, 0x160793, 0x170000, 0x189c23, 0x120550, 0x1324e7, 0x140713, 0x151010, 0x169123, 0x1726e7, ++ 0x18470d, 0x12055c, 0x13c63a, 0x144702, 0x158d23, 0x162407, 0x17a223, 0x182607, 0x120568, 0x130793, ++ 0x140270, 0x150413, 0x160000, 0x171463, 0x1800f7, 0x120574, 0x134789, 0x14c63e, 0x154709, 0x16cc3a, ++ 0x174702, 0x180793, 0x120580, 0x130270, 0x141463, 0x1500f7, 0x16478d, 0x17cc3e, 0x180513, 0x12058c, ++ 0x130000, 0x144792, 0x154581, 0x164485, 0x179782, 0x184018, 0x120598, 0x131775, 0x14e563, 0x1502e4, ++ 0x162703, 0x170a04, 0x181163, 0x1205a4, 0x130297, 0x144818, 0x150563, 0x160097, 0x1747a2, 0x18c804, ++ 0x1205b0, 0x139782, 0x1466b7, 0x150800, 0x16a703, 0x174c46, 0x189b71, 0x1205bc, 0x136713, 0x140027, ++ 0x15a223, 0x164ce6, 0x174783, 0x180fd4, 0x1205c8, 0x13c7b9, 0x142683, 0x151004, 0x164745, 0x179763, ++ 0x1820e6, 0x1205d4, 0x133737, 0x140822, 0x152683, 0x163007, 0x177645, 0x18167d, 0x1205e0, 0x138ef1, ++ 0x142023, 0x1530d7, 0x162683, 0x172807, 0x18e693, 0x1205ec, 0x131006, 0x142023, 0x1528d7, 0x162683, ++ 0x173807, 0x18e693, 0x1205f8, 0x131006, 0x142023, 0x1538d7, 0x162683, 0x174007, 0x18e693, 0x120604, ++ 0x131006, 0x142023, 0x1540d7, 0x162683, 0x174807, 0x18e693, 0x120610, 0x131006, 0x142023, 0x1548d7, ++ 0x1656b7, 0x170800, 0x18a703, 0x12061c, 0x133486, 0x14830d, 0x158b05, 0x16cf01, 0x17a703, 0x185c46, ++ 0x120628, 0x137671, 0x14167d, 0x158f71, 0x166611, 0x17a223, 0x185ce6, 0x120634, 0x138f51, 0x14a223, ++ 0x155ce6, 0x162703, 0x171084, 0x1846b2, 0x120640, 0x131c63, 0x1402d7, 0x153737, 0x160822, 0x172683, ++ 0x182807, 0x12064c, 0x13e693, 0x140016, 0x152023, 0x1628d7, 0x172683, 0x183807, 0x120658, 0x13e693, ++ 0x140016, 0x152023, 0x1638d7, 0x172683, 0x184007, 0x120664, 0x13e693, 0x140016, 0x152023, 0x1640d7, ++ 0x172683, 0x184807, 0x120670, 0x13e693, 0x140016, 0x152023, 0x1648d7, 0x172703, 0x181004, 0x12067c, ++ 0x1346b2, 0x149c63, 0x151ae6, 0x160737, 0x170800, 0x184b78, 0x120688, 0x130693, 0x140ff0, 0x15463d, ++ 0x168b1d, 0x17ce3a, 0x1852b7, 0x120694, 0x130800, 0x144701, 0x154389, 0x16408d, 0x174311, 0x180537, ++ 0x1206a0, 0x130820, 0x141593, 0x150077, 0x1695aa, 0x17418c, 0x184572, 0x1206ac, 0x1305c2, 0x1481c1, ++ 0x1581a9, 0x167763, 0x1700b5, 0x189533, 0x1206b8, 0x1300e4, 0x144513, 0x15fff5, 0x168e69, 0x170537, ++ 0x180800, 0x1206c4, 0x134568, 0x148121, 0x15893d, 0x167463, 0x1702b5, 0x18a583, 0x1206d0, 0x1306c2, ++ 0x140763, 0x151277, 0x160a63, 0x171217, 0x1805c2, 0x1206dc, 0x1381c1, 0x14818d, 0x150d63, 0x161097, ++ 0x178985, 0x180586, 0x1206e8, 0x1395b3, 0x1400b4, 0x15c593, 0x16fff5, 0x178eed, 0x180705, 0x1206f4, ++ 0x1315e3, 0x14fa67, 0x1535b7, 0x160822, 0x17a703, 0x183005, 0x120700, 0x13757d, 0x148a3d, 0x150513, ++ 0x160ff5, 0x178f69, 0x180622, 0x12070c, 0x138e59, 0x14a023, 0x1530c5, 0x168637, 0x170800, 0x185a38, ++ 0x120718, 0x1375c1, 0x14f693, 0x150ff6, 0x168593, 0x170ff5, 0x188f6d, 0x120724, 0x1306a2, 0x148ed9, ++ 0x15da34, 0x164682, 0x170713, 0x180210, 0x120730, 0x139163, 0x140ee6, 0x154711, 0x16e391, 0x17471d, ++ 0x182023, 0x12073c, 0x1310e4, 0x142683, 0x150a04, 0x16471d, 0x179e63, 0x1800e6, 0x120748, 0x136737, ++ 0x140800, 0x152703, 0x164cc7, 0x170693, 0x184000, 0x120754, 0x137713, 0x144807, 0x151463, 0x1600d7, ++ 0x172223, 0x180e04, 0x120760, 0x134018, 0x141163, 0x150497, 0x165703, 0x1700c4, 0x181793, 0x12076c, ++ 0x130117, 0x14db63, 0x150207, 0x168737, 0x170800, 0x184778, 0x120778, 0x137713, 0x140807, 0x15e705, ++ 0x160513, 0x170000, 0x184792, 0x120784, 0x134581, 0x149782, 0x1547a2, 0x164711, 0x17c818, 0x18c004, ++ 0x120790, 0x130d23, 0x140094, 0x150ca3, 0x160004, 0x179782, 0x1856b7, 0x12079c, 0x130800, 0x1442b8, ++ 0x159b71, 0x16c2b8, 0x170513, 0x180000, 0x1207a8, 0x1347d2, 0x149782, 0x154703, 0x162684, 0x1703e3, ++ 0x18de07, 0x1207b4, 0x13bbd9, 0x1407b7, 0x150002, 0x168793, 0x1765c7, 0x18c83e, 0x1207c0, 0x1327b7, ++ 0x140002, 0x158793, 0x16dae7, 0x17c43e, 0x1847b7, 0x1207cc, 0x130002, 0x148793, 0x151427, 0x16c23e, ++ 0x1757b7, 0x180002, 0x1207d8, 0x138793, 0x149867, 0x15b1fd, 0x162683, 0x171504, 0x184709, 0x1207e4, ++ 0x1399e3, 0x14e2e6, 0x1536b7, 0x160822, 0x17a703, 0x183006, 0x1207f0, 0x13663d, 0x148f51, 0x15a023, ++ 0x1630e6, 0x17bd39, 0x18c593, 0x1207fc, 0x130015, 0x14b5dd, 0x158991, 0x1635b3, 0x1700b0, 0x180589, ++ 0x120808, 0x13bdf9, 0x148991, 0x15b593, 0x160015, 0x17bfdd, 0x180737, 0x120814, 0x130800, 0x144f28, ++ 0x15cf89, 0x1647c2, 0x17893d, 0x189782, 0x120820, 0x1347e2, 0x140713, 0x151000, 0x162223, 0x1710e4, ++ 0x182423, 0x12082c, 0x1310f4, 0x14474d, 0x15b729, 0x168111, 0x17b7dd, 0x1814e3, 0x120838, 0x13f097, ++ 0x140737, 0x150800, 0x164770, 0x171713, 0x180106, 0x120844, 0x135d63, 0x140607, 0x1585b7, 0x160800, ++ 0x17a683, 0x180d05, 0x120850, 0x1372c5, 0x147313, 0x1500f6, 0x1612fd, 0x17a703, 0x180d45, 0x12085c, ++ 0x131513, 0x1400c3, 0x15f6b3, 0x160056, 0x178ec9, 0x18757d, 0x120868, 0x130393, 0x140ff5, 0x151293, ++ 0x160083, 0x17f6b3, 0x180076, 0x120874, 0x139b41, 0x148211, 0x15e2b3, 0x160056, 0x171093, 0x180043, ++ 0x120880, 0x137693, 0x140016, 0x156333, 0x160067, 0x170613, 0x187ff5, 0x12088c, 0x139713, 0x1400b6, ++ 0x157633, 0x1600c3, 0x178e59, 0x189513, 0x120898, 0x1300a6, 0x147613, 0x159ff6, 0x169713, 0x170096, ++ 0x188e49, 0x1208a4, 0x13f293, 0x14f0f2, 0x158e59, 0x16e2b3, 0x170012, 0x1806a2, 0x1208b0, 0x137613, ++ 0x14eff6, 0x158e55, 0x16a823, 0x170c55, 0x18aa23, 0x1208bc, 0x130cc5, 0x1480e3, 0x15e807, 0x1646b7, ++ 0x170822, 0x18a703, 0x1208c8, 0x13f006, 0x149b61, 0x156713, 0x160027, 0x17a023, 0x18f0e6, 0x1208d4, ++ 0x13b5ad, 0x140000, 0x150000, 0x160000, 0x170000, 0x180000, 0x110000, 0x120400, 0x104000, 0x1f0000, ++}; ++ ++int jl2xxx_pre_init(struct phy_device *phydev) ++{ ++ int i, j; ++ int regaddr, val; ++ int length = sizeof(init_data)/sizeof(init_data[0]); ++ ++ for (i = 0; i < length; i++) { ++ regaddr = ((init_data[i] >> 16) & 0xff); ++ val = (init_data[i] & 0xffff); ++ phy_write(phydev, regaddr, val); ++ if (regaddr == 0x18) { ++ phy_write(phydev, 0x10, 0x8006); ++ for (j = 0; j < 8; j++) { ++ if (phy_read(phydev, 0x10) == 0) { ++ break; ++ } ++ } ++ } ++ } ++ ++ return 0; ++} ++ ++int enable_wol(struct phy_device *phydev) ++{ ++ jlsemi_set_bits(phydev, WOL_CTL_PAGE, ++ WOL_CTL_REG, WOL_EN); ++ ++ jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE, ++ WOL_CTL_STAS_REG, WOL_CTL_EN); ++ ++ return 0; ++} ++ ++int disable_wol(struct phy_device *phydev) ++{ ++ jlsemi_clear_bits(phydev, WOL_CTL_PAGE, ++ WOL_CTL_REG, WOL_EN); ++ ++ jlsemi_set_bits(phydev, BASIC_PAGE, BMCR_REG, SOFT_RESET); ++ /* wait soft reset complete*/ ++ msleep(20); ++ ++ return 0; ++} ++ ++int setup_wol_low_polarity(struct phy_device *phydev) ++{ ++ jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE, ++ WOL_CTL_STAS_REG, WOL_POLARITY); ++ return 0; ++} ++ ++int setup_wol_high_polarity(struct phy_device *phydev) ++{ ++ jlsemi_set_bits(phydev, WOL_CTL_STAS_PAGE, ++ WOL_CTL_STAS_REG, WOL_POLARITY); ++ return 0; ++} ++ ++int clear_wol_event(struct phy_device *phydev) ++{ ++ jlsemi_set_bits(phydev, WOL_CTL_STAS_PAGE, ++ WOL_CTL_STAS_REG, WOL_EVENT); ++ ++ jlsemi_clear_bits(phydev, WOL_CTL_STAS_PAGE, ++ WOL_CTL_STAS_REG, WOL_EVENT); ++ return 0; ++} ++ ++int store_mac_addr(struct phy_device *phydev) ++{ ++ int err; ++ ++ jlsemi_write_page(phydev, WOL_CTL_STAS_PAGE); ++ ++ /* Store the device address for the magic packet */ ++ err = phy_write(phydev, WOL_MAC_ADDR2_REG, ++ ((phydev->attached_dev->dev_addr[0] << 8) | ++ phydev->attached_dev->dev_addr[1])); ++ if (err < 0) ++ return err; ++ err = phy_write(phydev, WOL_MAC_ADDR1_REG, ++ ((phydev->attached_dev->dev_addr[2] << 8) | ++ phydev->attached_dev->dev_addr[3])); ++ if (err < 0) ++ return err; ++ err = phy_write(phydev, WOL_MAC_ADDR0_REG, ++ ((phydev->attached_dev->dev_addr[4] << 8) | ++ phydev->attached_dev->dev_addr[5])); ++ if (err < 0) ++ return err; ++ ++ /* change page to 0 */ ++ jlsemi_write_page(phydev, BASIC_PAGE); ++ ++ return 0; ++} ++ ++int config_phy_info(struct phy_device *phydev, ++ struct jl2xx1_priv *jl2xx1) ++{ ++ int val, major, minor; ++ ++ val = phy_read(phydev, 29); ++ if (val < 0) ++ return val; ++ ++ major = (val >> 7) & 0x1f; ++ minor = (val >> 0) & 0x7f; ++ /* major enlarge 10 */ ++ jl2xx1->sw_info = major * 10 + minor; ++ ++ return 0; ++} ++ ++/********************** Convenience function for phy **********************/ ++ ++/** ++ * jlsemi_write_page() - write the page register ++ * @phydev: a pointer to a &struct phy_device ++ * @page: page values ++ */ ++int jlsemi_write_page(struct phy_device *phydev, int page) ++{ ++ return phy_write(phydev, MII_JLSEMI_PHY_PAGE, page); ++} ++ ++/** ++ * jlsemi_read_page() - write the page register ++ * @phydev: a pointer to a &struct phy_device ++ * ++ * Return: get page values at present ++ */ ++int jlsemi_read_page(struct phy_device *phydev) ++{ ++ return phy_read(phydev, MII_JLSEMI_PHY_PAGE); ++} ++ ++/** ++ * __jlsemi_save_page() - save the page value ++ *@phydev: a pointer to a &struct phy_device ++ * ++ * Return: save page value ++ */ ++static inline int __jlsemi_save_page(struct phy_device *phydev) ++{ ++ return jlsemi_read_page(phydev); ++} ++ ++/** ++ * __jlsemi_select_page() - restore the page register ++ * @phydev: a pointer to a &struct phy_device ++ * @page: the page ++ * ++ * Return: ++ * @oldpgae: this is last page value ++ * @ret: if page is change it will return new page value ++ */ ++static inline int __jlsemi_select_page(struct phy_device *phydev, int page) ++{ ++ int ret, oldpage; ++ ++ oldpage = ret = __jlsemi_save_page(phydev); ++ if (ret < 0) ++ return ret; ++ ++ if (oldpage != page) { ++ ret = jlsemi_write_page(phydev, page); ++ if (ret < 0) ++ return ret; ++ } ++ ++ return oldpage; ++} ++ ++/** ++ * __jlsemi_restore_page() - restore the page register ++ * @phydev: a pointer to a &struct phy_device ++ * @oldpage: the old page, return value from __jlsemi_save_page() or ++ * __jlsemi_select_page() ++ * @ret: operation's return code ++ * ++ * Returns: ++ * @oldpage if it was a negative value, otherwise ++ * @ret if it was a negative errno value, otherwise ++ * phy_write_page()'s negative value if it were in error, otherwise ++ * @ret ++ */ ++static inline int __jlsemi_restore_page(struct phy_device *phydev, ++ int oldpage, int ret) ++{ ++ int r; ++ ++ if (oldpage >= 0) { ++ r = jlsemi_write_page(phydev, oldpage); ++ ++ /* Propagate the operation return code if the page write ++ * was successful. ++ */ ++ if (ret >= 0 && r < 0) ++ ret = r; ++ } else { ++ /* Propagate the phy page selection error code */ ++ ret = oldpage; ++ } ++ ++ return ret; ++} ++ ++/** ++ * __jlsemi_modify_reg() - Convenience function for modifying a PHY register ++ * @phydev: a pointer to a &struct phy_device ++ * @regnum: register number ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * Returns negative errno, 0 if there was no change, and 1 in case of change ++ */ ++static inline int __jlsemi_modify_reg(struct phy_device *phydev, ++ u32 regnum, u16 mask, u16 set) ++{ ++ int newval, ret; ++ ++ ret = phy_read(phydev, regnum); ++ if (ret < 0) ++ return ret; ++ ++ newval = (ret & ~mask) | set; ++ if (newval == ret) ++ return 0; ++ ++ ret = phy_write(phydev, regnum, newval); ++ ++ return ret < 0 ? ret : 1; ++} ++ ++/** ++ * jlsemi_modify_paged_reg() - Function for modifying a paged register ++ * @phydev: a pointer to a &struct phy_device ++ * @page: the page for the phy ++ * @regnum: register number ++ * @mask: bit mask of bits to clear ++ * @set: bit mask of bits to set ++ * ++ * Returns negative errno, 0 if there was no change, and 1 in case of change ++ */ ++int jlsemi_modify_paged_reg(struct phy_device *phydev, ++ int page, u32 regnum, ++ u16 mask, u16 set) ++{ ++ int ret = 0, oldpage; ++ ++ oldpage = __jlsemi_select_page(phydev, page); ++ if (oldpage >= 0) ++ ret = __jlsemi_modify_reg(phydev, regnum, mask, set); ++ ++ return __jlsemi_restore_page(phydev, oldpage, ret); ++} ++ ++/** ++ * jlsemi_set_bits() - Convenience function for setting bits in a PHY register ++ * @phydev: a pointer to a &struct phy_device ++ * @page: the page for the phy ++ * @regnum: register number to write ++ * @val: bits to set ++ */ ++int jlsemi_set_bits(struct phy_device *phydev, ++ int page, u32 regnum, u16 val) ++{ ++ return jlsemi_modify_paged_reg(phydev, page, regnum, 0, val); ++} ++ ++/** ++ * jlsemi_clear_bits - Convenience function for clearing bits in a PHY register ++ * @phydev: the phy_device struct ++ * @page: the page for the phy ++ * @regnum: register number to write ++ * @val: bits to clear ++ */ ++int jlsemi_clear_bits(struct phy_device *phydev, ++ int page, u32 regnum, u16 val) ++{ ++ return jlsemi_modify_paged_reg(phydev, page, regnum, val, 0); ++} ++ ++/** ++ * jlsemi_get_bit() - Convenience function for setting bits in a PHY register ++ * @phydev: a pointer to a &struct phy_device ++ * @page: the page for the phy ++ * @regnum: register number to write ++ * @val: bit to get ++ * ++ * Note: ++ * you only get one bit at meanwhile ++ * ++ */ ++int jlsemi_get_bit(struct phy_device *phydev, ++ int page, u32 regnum, u16 val) ++{ ++ int ret = 0, oldpage; ++ ++ oldpage = __jlsemi_select_page(phydev, page); ++ if (oldpage >= 0) ++ { ++ ret = phy_read(phydev, regnum); ++ if (ret < 0) ++ return ret; ++ ret = ((ret & val) == val) ? 1 : 0; ++ } ++ ++ return __jlsemi_restore_page(phydev, oldpage, ret); ++} +--- /dev/null ++++ b/drivers/net/phy/jl2xxx-core.h +@@ -0,0 +1,104 @@ ++/* ++ * Copyright (C) 2021 JLSemi Corporation ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License as ++ * published by the Free Software Foundation version 2. ++ * ++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any ++ * kind, whether express or implied; without even the implied warranty ++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ */ ++#ifndef _JLSEMI_CORE_H ++#define _JLSEMI_CORE_H ++ ++#include <linux/phy.h> ++#include <linux/version.h> ++#include <linux/kernel.h> ++ ++#define JL2XX1_PHY_ID 0x937c4030 ++#define JLSEMI_PHY_ID_MASK 0xfffffff0 ++ ++#define JL2101_PHY_ID 0x937c4032 ++ ++#define MII_JLSEMI_PHY_PAGE 0x1f ++ ++#define WOL_CTL_PAGE 18 ++#define WOL_CTL_REG 21 ++#define WOL_CTL_STAS_PAGE 4608 ++#define WOL_CTL_STAS_REG 16 ++#define WOL_MAC_ADDR2_REG 17 ++#define WOL_MAC_ADDR1_REG 18 ++#define WOL_MAC_ADDR0_REG 19 ++#define WOL_EVENT BIT(1) ++#define WOL_POLARITY BIT(14) ++#define WOL_EN BIT(6) ++#define WOL_CTL_EN BIT(15) ++ ++ ++/************************* Configuration section *************************/ ++ ++#define JLSEMI_WOL_EN 0 ++ ++ ++/************************* JLSemi iteration code *************************/ ++struct jl2xx1_priv { ++ u16 sw_info; ++}; ++ ++int jl2xxx_pre_init(struct phy_device *phydev); ++ ++int config_phy_info(struct phy_device *phydev, ++ struct jl2xx1_priv *jl2xx1); ++ ++int check_rgmii(struct phy_device *phydev); ++ ++int dis_rgmii_tx_ctrl(struct phy_device *phydev); ++ ++int config_suspend(struct phy_device *phydev); ++ ++int config_resume(struct phy_device *phydev); ++ ++int enable_wol(struct phy_device *phydev); ++ ++int disable_wol(struct phy_device *phydev); ++ ++int setup_wol_low_polarity(struct phy_device *phydev); ++ ++int setup_wol_high_polarity(struct phy_device *phydev); ++ ++int clear_wol_event(struct phy_device *phydev); ++ ++int store_mac_addr(struct phy_device *phydev); ++ ++int software_version(struct phy_device *phydev); ++ ++ ++/********************** Convenience function for phy **********************/ ++ ++/* Notice: You should change page 0 when you When you call it after*/ ++int jlsemi_write_page(struct phy_device *phydev, int page); ++ ++int jlsemi_read_page(struct phy_device *phydev); ++ ++int jlsemi_modify_paged_reg(struct phy_device *phydev, ++ int page, u32 regnum, ++ u16 mask, u16 set); ++ ++int jlsemi_set_bits(struct phy_device *phydev, ++ int page, u32 regnum, u16 val); ++ ++int jlsemi_clear_bits(struct phy_device *phydev, ++ int page, u32 regnum, u16 val); ++ ++int jlsemi_get_bit(struct phy_device *phydev, ++ int page, u32 regnum, u16 val); ++ ++int jlsemi_drivers_register(struct phy_driver *phydrvs, int size); ++ ++void jlsemi_drivers_unregister(struct phy_driver *phydrvs, int size); ++ ++#endif /* _JLSEMI_CORE_H */ ++ +--- /dev/null ++++ b/drivers/net/phy/jl2xxx.c +@@ -0,0 +1,126 @@ ++/* ++ * drivers/net/phy/jlsemi.c ++ * ++ * Driver for JLSemi PHYs ++ * ++ * Author: Gangqiao Kuang <gqkuang@jlsemi.com> ++ * ++ * Copyright (c) 2021 JingLue Semiconductor, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the ++ * Free Software Foundation; either version 2 of the License, or (at your ++ * option) any later version. ++ * ++ */ ++#include "jl2xxx-core.h" ++#include <linux/phy.h> ++#include <linux/module.h> ++#include <linux/netdevice.h> ++ ++ ++MODULE_DESCRIPTION("JLSemi PHY driver"); ++MODULE_AUTHOR("Gangqiao Kuang"); ++MODULE_LICENSE("GPL"); ++ ++static int jlsemi_probe(struct phy_device *phydev) ++{ ++ int err; ++ ++ err = jl2xxx_pre_init(phydev); ++ ++ /* wait load complete*/ ++ msleep(20); ++ ++ return (err < 0) ? err : 0; ++} ++ ++#if JLSEMI_WOL_EN ++static void jlsemi_get_wol(struct phy_device *phydev, ++ struct ethtool_wolinfo *wol) ++{ ++ int wol_en; ++ ++ wol->supported = WAKE_MAGIC; ++ wol->wolopts = 0; ++ ++ wol_en = jlsemi_get_bit(phydev, WOL_CTL_PAGE, ++ WOL_CTL_REG, WOL_EN); ++ ++ if (wol_en) ++ wol->wolopts |= WAKE_MAGIC; ++} ++ ++static int jlsemi_set_wol(struct phy_device *phydev, ++ struct ethtool_wolinfo *wol) ++{ ++ int err; ++ ++ if (wol->wolopts & WAKE_MAGIC) { ++ err = enable_wol(phydev); ++ if (err < 0) ++ return err; ++ ++ err = clear_wol_event(phydev); ++ if (err < 0) ++ return err; ++ ++ err = setup_wol_high_polarity(phydev); ++ if (err < 0) ++ return err; ++ ++ err = store_mac_addr(phydev); ++ if (err < 0) ++ return err; ++ } else { ++ err = disable_wol(phydev); ++ if (err < 0) ++ return err; ++ ++ err = setup_wol_high_polarity(phydev); ++ if (err < 0) ++ return err; ++ ++ err = clear_wol_event(phydev); ++ if (err < 0) ++ return err; ++ } ++ ++ return 0; ++} ++#endif ++ ++static struct phy_driver jlsemi_driver[] = { ++ { ++ PHY_ID_MATCH_EXACT(JL2101_PHY_ID), ++ .name = "JL2101 Gigabit Ethernet", ++ /* PHY_BASIC_FEATURES */ ++ .features = PHY_GBIT_FEATURES, ++ .probe = jlsemi_probe, ++ #if JLSEMI_WOL_EN ++ .get_wol = jlsemi_get_wol, ++ .set_wol = jlsemi_set_wol, ++ #endif ++ }, ++ { ++ PHY_ID_MATCH_MODEL(JL2XX1_PHY_ID), ++ .name = "JL2xx1 Gigabit Ethernet", ++ /* PHY_BASIC_FEATURES */ ++ .features = PHY_GBIT_FEATURES, ++ .probe = jlsemi_probe, ++ #if JLSEMI_WOL_EN ++ .get_wol = jlsemi_get_wol, ++ .set_wol = jlsemi_set_wol, ++ #endif ++ }, ++}; ++ ++module_phy_driver(jlsemi_driver); ++ ++static struct mdio_device_id __maybe_unused jlsemi_tbl[] = { ++ { PHY_ID_MATCH_EXACT(JL2101_PHY_ID) }, ++ { PHY_ID_MATCH_MODEL(JL2XX1_PHY_ID) }, ++ { } ++}; ++ ++MODULE_DEVICE_TABLE(mdio, jlsemi_tbl); diff --git a/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch b/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch new file mode 100644 index 00000000000000..eb2b744dca05b3 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch @@ -0,0 +1,34 @@ +--- a/arch/arm64/boot/dts/rockchip/Makefile ++++ b/arch/arm64/boot/dts/rockchip/Makefile +@@ -9,8 +9,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9 + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-doornet1.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-neo3.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2c.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-orangepi-r1-plus-lts.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb +@@ -22,6 +26,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-or + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-px5-evb.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-r88.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-evb.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-doornet2.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-doornet2-4gb.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ficus.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-firefly.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-bob.dtb +@@ -40,6 +46,9 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-na + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4b.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4se.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-guangmiao-g4c.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-rock-pi-4.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb + dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb diff --git a/target/linux/rockchip/patches-5.19/0901-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch b/target/linux/rockchip/patches-5.19/0901-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch new file mode 100644 index 00000000000000..87176a05385886 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0901-rockchip-rk3399-overclock-to-2.2-1.8-GHz-for-NanoPi4.patch @@ -0,0 +1,21 @@ +--- a/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-doornet2.dtsi +@@ -3,6 +3,7 @@ + /dts-v1/; + #include <dt-bindings/input/linux-event-codes.h> + #include "rk3399.dtsi" ++#include "rk3399-nanopi4-opp.dtsi" + + / { + chosen { +--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi4.dtsi +@@ -14,7 +14,7 @@ + /dts-v1/; + #include <dt-bindings/input/linux-event-codes.h> + #include "rk3399.dtsi" +-#include "rk3399-opp.dtsi" ++#include "rk3399-nanopi4-opp.dtsi" + + / { + aliases { diff --git a/target/linux/rockchip/patches-5.19/0902-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch b/target/linux/rockchip/patches-5.19/0902-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch new file mode 100644 index 00000000000000..d9145299e8769a --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0902-arm64-dts-rockchip-add-more-cpu-operating-points-for.patch @@ -0,0 +1,44 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Leonidas P. Papadakos <papadakospan@gmail.com> +Date: Fri, 1 Mar 2019 21:55:53 +0200 +Subject: [PATCH v2] arm64: dts: rockchip: add more cpu operating points for + RK3328 + +This allows for greater max frequency on rk3328 boards, +increasing performance. + +It has been included in Armbian (a linux distibution for ARM boards) +for a while now without any reported issues + +https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1392mhz-opp.patch +https://github.com/armbian/build/blob/master/patch/kernel/rockchip64-default/enable-1512mhz-opp.patch + +Signed-off-by: Leonidas P. Papadakos <papadakospan@gmail.com> +--- + arch/arm64/boot/dts/rockchip/rk3328.dtsi | 15 +++++++++++++++ + 1 files changed, 15 insertions(+) + +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -140,6 +140,21 @@ + opp-microvolt = <1300000>; + clock-latency-ns = <40000>; + }; ++ opp-1392000000 { ++ opp-hz = /bits/ 64 <1392000000>; ++ opp-microvolt = <1350000>; ++ clock-latency-ns = <40000>; ++ }; ++ opp-1512000000 { ++ opp-hz = /bits/ 64 <1512000000>; ++ opp-microvolt = <1400000>; ++ clock-latency-ns = <40000>; ++ }; ++ opp-1608000000 { ++ opp-hz = /bits/ 64 <1608000000>; ++ opp-microvolt = <1450000>; ++ clock-latency-ns = <40000>; ++ }; + }; + + analog_sound: analog-sound { diff --git a/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch b/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch new file mode 100644 index 00000000000000..af346f09d6bed5 --- /dev/null +++ b/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch @@ -0,0 +1,2419 @@ +From patchwork Wed Jul 6 09:03:40 2022 +Content-Type: text/plain; charset="utf-8" +MIME-Version: 1.0 +Content-Transfer-Encoding: 7bit +X-Patchwork-Submitter: LABBE Corentin <clabbe@baylibre.com> +X-Patchwork-Id: 12907886 +Return-Path: + <linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org> +X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on + aws-us-west-2-korg-lkml-1.web.codeaurora.org +Received: from bombadil.infradead.org (bombadil.infradead.org + [198.137.202.133]) + (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) + (No client certificate requested) + by smtp.lore.kernel.org (Postfix) with ESMTPS id 80701C43334 + for <linux-rockchip@archiver.kernel.org>; + Wed, 6 Jul 2022 10:21:13 +0000 (UTC) +DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; + d=lists.infradead.org; s=bombadil.20210309; h=Sender: + Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: + List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: + Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: + Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: + List-Owner; bh=w2ewNjuPH3tCNpBACI9xMFukG8dznlgGn9auxf/TbSQ=; b=NMnZMIilH6Rj6q + JBeFHcO/0vy9bRepjfvBprmkGHfP0tGg2cfWZeQccgiH3J4xRnkQ8JCi8RhG+amUdCBP677fEwXqL + XDvulNMteh+ACd3gAZ2pWy1qE0RBQIRDEIngwNqYTFB0IfP/7cMHrzRy4v5Ynx7nI/6rkfi7O2oWH + jUb0AaXqbIQFeD4t3sr8v5gFOHpbwbH2urceXPRviZtl67L3Ejc9yEpmZJBZc0u2/hI1MLLE5h8Ks + gnOq0NUJdvmH9pV3fxLEx5m5RPb5D6DaTAT05Sjbj3tICBtXcrvI0CfGiM6Py64YLwfHiJFFDbhp6 + ng01U9Kg047g0MgLntvw==; +Received: from localhost ([::1] helo=bombadil.infradead.org) + by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) + id 1o929R-008Ncf-Sj; Wed, 06 Jul 2022 10:20:58 +0000 +Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) + by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) + id 1o90xZ-007bjU-2s + for linux-rockchip@lists.infradead.org; Wed, 06 Jul 2022 09:04:39 +0000 +Received: by mail-wr1-x430.google.com with SMTP id s1so21047035wra.9 + for <linux-rockchip@lists.infradead.org>; + Wed, 06 Jul 2022 02:04:35 -0700 (PDT) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=baylibre-com.20210112.gappssmtp.com; s=20210112; + h=from:to:cc:subject:date:message-id:in-reply-to:references + :mime-version:content-transfer-encoding; + bh=2nwWkT4441Zvq5igIAOKA8C0HAjPPXDmTRADPlAyhok=; + b=Pr3IXa8ExRhTFh+SPH7MrhQizXMmrRN4KOZzHqdYpWENJ96Ms04oBik0WfZbJ27egJ + ldxRn/lKH+72j5pIK0nS2nYnViD4t7mh4Zb1sOqM2u2kO5jOs6YQUThf4H4eI2Km2Ujk + DwddZ86xRnFapyFfMRqcT6ohi+6e0uc4u1C7mMTTJA/fIR7ogqFH26AfqYtb+NPy09S6 + Lqsl7Gej6g7TLBDiNG7TJFSX2PL0SMt1IdS4uGkcq1ucTSIZUoDqeFV0sk0icX109eD0 + +evOAKZrJ8Fcpr+vITTRyd9o5yoYy0tl+3ssElJnyQ3+12HdNMnyGRJT/M/jsAeeXFrC + 2s1g== +X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; + d=1e100.net; s=20210112; + h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to + :references:mime-version:content-transfer-encoding; + bh=2nwWkT4441Zvq5igIAOKA8C0HAjPPXDmTRADPlAyhok=; + b=jrNkcu/YHsMg9g+c9DCMe2rYgZEjs2Kcrlvvla7WjME4uPIc42dSmgAaooVKGqfrOx + bmRlEpMseKnH+swTfgQT96HD72A1+GlBNgvGzgobVh9dE6qywC2hXeayy+6lvNQ04QDb + htuh/1tFPquCnMZrB6XkrBLtIoqngGlPObKutvylCovAOjcMfdpNkAbu6WXUdrVezesX + ipOA7nPpe1xK3xuRRarLWUtH0krfxDUMC3Zzv/ci7c9hqGq+wEV9+gofJqJnTbwHiAUU + XxtjOgZTFFruqo2Xh/aH1pz/dpOBlM77c+p9+BTiVbNjFR0uxH26+0CI2qLyeCpccvyL + Z5bg== +X-Gm-Message-State: AJIora+k2/Y0J3c5bRbTc8eO22Wszf2dEyzrIIniVBJBPx3Z+auKYN3q + rdqODKFBStTNE4iGSGyh2gI2yw== +X-Google-Smtp-Source: + AGRyM1uEESfBM2/+cx8O6PDi67ahL3H9B52KIeo6hugjBlO2PZU9E0Dg3m/zc4Jx7ArSkzmwQCEl3w== +X-Received: by 2002:a5d:6d0c:0:b0:21b:ccda:fc67 with SMTP id + e12-20020a5d6d0c000000b0021bccdafc67mr37250833wrq.246.1657098274092; + Wed, 06 Jul 2022 02:04:34 -0700 (PDT) +Received: from localhost.localdomain + (laubervilliers-658-1-213-31.w90-63.abo.wanadoo.fr. [90.63.244.31]) + by smtp.googlemail.com with ESMTPSA id + v11-20020adfe28b000000b0021d6ef34b2asm5230223wri.51.2022.07.06.02.04.33 + (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); + Wed, 06 Jul 2022 02:04:33 -0700 (PDT) +From: Corentin Labbe <clabbe@baylibre.com> +To: heiko@sntech.de, + herbert@gondor.apana.org.au, + krzysztof.kozlowski+dt@linaro.org, + mturquette@baylibre.com, + p.zabel@pengutronix.de, + robh+dt@kernel.org, + sboyd@kernel.org +Cc: linux-rockchip@lists.infradead.org, + devicetree@vger.kernel.org, + linux-arm-kernel@lists.infradead.org, + linux-clk@vger.kernel.org, + linux-crypto@vger.kernel.org, + linux-kernel@vger.kernel.org, + john@metanate.com, + didi.debian@cknow.org, + Corentin Labbe <clabbe@baylibre.com> +Subject: [PATCH v8 01/33] crypto: rockchip: use dev_err for error message + about interrupt +Date: Wed, 6 Jul 2022 09:03:40 +0000 +Message-Id: <20220706090412.806101-2-clabbe@baylibre.com> +X-Mailer: git-send-email 2.25.1 +In-Reply-To: <20220706090412.806101-1-clabbe@baylibre.com> +References: <20220706090412.806101-1-clabbe@baylibre.com> +MIME-Version: 1.0 +X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 +X-CRM114-CacheID: sfid-20220706_020437_385385_DD262621 +X-CRM114-Status: GOOD ( 11.86 ) +X-BeenThere: linux-rockchip@lists.infradead.org +X-Mailman-Version: 2.1.34 +Precedence: list +List-Id: Upstream kernel work for Rockchip platforms + <linux-rockchip.lists.infradead.org> +List-Unsubscribe: <http://lists.infradead.org/mailman/options/linux-rockchip>, + <mailto:linux-rockchip-request@lists.infradead.org?subject=unsubscribe> +List-Archive: <http://lists.infradead.org/pipermail/linux-rockchip/> +List-Post: <mailto:linux-rockchip@lists.infradead.org> +List-Help: <mailto:linux-rockchip-request@lists.infradead.org?subject=help> +List-Subscribe: <http://lists.infradead.org/mailman/listinfo/linux-rockchip>, + <mailto:linux-rockchip-request@lists.infradead.org?subject=subscribe> +Sender: "Linux-rockchip" <linux-rockchip-bounces@lists.infradead.org> +Errors-To: + linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org + +Interrupt is mandatory so the message should be printed as error. + +Reviewed-by: John Keeping <john@metanate.com> +Signed-off-by: Corentin Labbe <clabbe@baylibre.com> +--- + drivers/crypto/rockchip/rk3288_crypto.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/crypto/rockchip/rk3288_crypto.c ++++ b/drivers/crypto/rockchip/rk3288_crypto.c +@@ -14,235 +14,162 @@ + #include <linux/module.h> + #include <linux/platform_device.h> + #include <linux/of.h> ++#include <linux/of_device.h> + #include <linux/clk.h> + #include <linux/crypto.h> + #include <linux/reset.h> + +-static int rk_crypto_enable_clk(struct rk_crypto_info *dev) ++static struct rockchip_ip rocklist = { ++ .dev_list = LIST_HEAD_INIT(rocklist.dev_list), ++ .lock = __SPIN_LOCK_UNLOCKED(rocklist.lock), ++}; ++ ++struct rk_crypto_info *get_rk_crypto(void) + { +- int err; ++ struct rk_crypto_info *first; + +- err = clk_prepare_enable(dev->sclk); +- if (err) { +- dev_err(dev->dev, "[%s:%d], Couldn't enable clock sclk\n", +- __func__, __LINE__); +- goto err_return; +- } +- err = clk_prepare_enable(dev->aclk); +- if (err) { +- dev_err(dev->dev, "[%s:%d], Couldn't enable clock aclk\n", +- __func__, __LINE__); +- goto err_aclk; ++ spin_lock(&rocklist.lock); ++ first = list_first_entry_or_null(&rocklist.dev_list, ++ struct rk_crypto_info, list); ++ list_rotate_left(&rocklist.dev_list); ++ spin_unlock(&rocklist.lock); ++ return first; ++} ++ ++static const struct rk_variant rk3288_variant = { ++ .num_clks = 4, ++ .rkclks = { ++ { "sclk", 150000000}, + } +- err = clk_prepare_enable(dev->hclk); +- if (err) { +- dev_err(dev->dev, "[%s:%d], Couldn't enable clock hclk\n", +- __func__, __LINE__); +- goto err_hclk; +- } +- err = clk_prepare_enable(dev->dmaclk); +- if (err) { +- dev_err(dev->dev, "[%s:%d], Couldn't enable clock dmaclk\n", +- __func__, __LINE__); +- goto err_dmaclk; +- } +- return err; +-err_dmaclk: +- clk_disable_unprepare(dev->hclk); +-err_hclk: +- clk_disable_unprepare(dev->aclk); +-err_aclk: +- clk_disable_unprepare(dev->sclk); +-err_return: +- return err; +-} ++}; + +-static void rk_crypto_disable_clk(struct rk_crypto_info *dev) +-{ +- clk_disable_unprepare(dev->dmaclk); +- clk_disable_unprepare(dev->hclk); +- clk_disable_unprepare(dev->aclk); +- clk_disable_unprepare(dev->sclk); +-} +- +-static int check_alignment(struct scatterlist *sg_src, +- struct scatterlist *sg_dst, +- int align_mask) +-{ +- int in, out, align; +- +- in = IS_ALIGNED((uint32_t)sg_src->offset, 4) && +- IS_ALIGNED((uint32_t)sg_src->length, align_mask); +- if (!sg_dst) +- return in; +- out = IS_ALIGNED((uint32_t)sg_dst->offset, 4) && +- IS_ALIGNED((uint32_t)sg_dst->length, align_mask); +- align = in && out; +- +- return (align && (sg_src->length == sg_dst->length)); +-} +- +-static int rk_load_data(struct rk_crypto_info *dev, +- struct scatterlist *sg_src, +- struct scatterlist *sg_dst) +-{ +- unsigned int count; +- +- dev->aligned = dev->aligned ? +- check_alignment(sg_src, sg_dst, dev->align_size) : +- dev->aligned; +- if (dev->aligned) { +- count = min(dev->left_bytes, sg_src->length); +- dev->left_bytes -= count; +- +- if (!dma_map_sg(dev->dev, sg_src, 1, DMA_TO_DEVICE)) { +- dev_err(dev->dev, "[%s:%d] dma_map_sg(src) error\n", +- __func__, __LINE__); +- return -EINVAL; +- } +- dev->addr_in = sg_dma_address(sg_src); ++static const struct rk_variant rk3328_variant = { ++ .num_clks = 3, ++}; + +- if (sg_dst) { +- if (!dma_map_sg(dev->dev, sg_dst, 1, DMA_FROM_DEVICE)) { +- dev_err(dev->dev, +- "[%s:%d] dma_map_sg(dst) error\n", +- __func__, __LINE__); +- dma_unmap_sg(dev->dev, sg_src, 1, +- DMA_TO_DEVICE); +- return -EINVAL; +- } +- dev->addr_out = sg_dma_address(sg_dst); +- } +- } else { +- count = (dev->left_bytes > PAGE_SIZE) ? +- PAGE_SIZE : dev->left_bytes; +- +- if (!sg_pcopy_to_buffer(dev->first, dev->src_nents, +- dev->addr_vir, count, +- dev->total - dev->left_bytes)) { +- dev_err(dev->dev, "[%s:%d] pcopy err\n", +- __func__, __LINE__); +- return -EINVAL; +- } +- dev->left_bytes -= count; +- sg_init_one(&dev->sg_tmp, dev->addr_vir, count); +- if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1, DMA_TO_DEVICE)) { +- dev_err(dev->dev, "[%s:%d] dma_map_sg(sg_tmp) error\n", +- __func__, __LINE__); +- return -ENOMEM; +- } +- dev->addr_in = sg_dma_address(&dev->sg_tmp); ++static const struct rk_variant rk3399_variant = { ++ .num_clks = 3, ++}; ++ ++static int rk_crypto_get_clks(struct rk_crypto_info *dev) ++{ ++ int i, j, err; ++ unsigned long cr; + +- if (sg_dst) { +- if (!dma_map_sg(dev->dev, &dev->sg_tmp, 1, +- DMA_FROM_DEVICE)) { +- dev_err(dev->dev, +- "[%s:%d] dma_map_sg(sg_tmp) error\n", +- __func__, __LINE__); +- dma_unmap_sg(dev->dev, &dev->sg_tmp, 1, +- DMA_TO_DEVICE); +- return -ENOMEM; ++ dev->num_clks = devm_clk_bulk_get_all(dev->dev, &dev->clks); ++ if (dev->num_clks < dev->variant->num_clks) { ++ dev_err(dev->dev, "Missing clocks, got %d instead of %d\n", ++ dev->num_clks, dev->variant->num_clks); ++ return -EINVAL; ++ } ++ ++ for (i = 0; i < dev->num_clks; i++) { ++ cr = clk_get_rate(dev->clks[i].clk); ++ for (j = 0; j < ARRAY_SIZE(dev->variant->rkclks); j++) { ++ if (dev->variant->rkclks[j].max == 0) ++ continue; ++ if (strcmp(dev->variant->rkclks[j].name, dev->clks[i].id)) ++ continue; ++ if (cr > dev->variant->rkclks[j].max) { ++ err = clk_set_rate(dev->clks[i].clk, ++ dev->variant->rkclks[j].max); ++ if (err) ++ dev_err(dev->dev, "Fail downclocking %s from %lu to %lu\n", ++ dev->variant->rkclks[j].name, cr, ++ dev->variant->rkclks[j].max); ++ else ++ dev_info(dev->dev, "Downclocking %s from %lu to %lu\n", ++ dev->variant->rkclks[j].name, cr, ++ dev->variant->rkclks[j].max); + } +- dev->addr_out = sg_dma_address(&dev->sg_tmp); + } + } +- dev->count = count; + return 0; + } + +-static void rk_unload_data(struct rk_crypto_info *dev) ++static int rk_crypto_enable_clk(struct rk_crypto_info *dev) + { +- struct scatterlist *sg_in, *sg_out; ++ int err; + +- sg_in = dev->aligned ? dev->sg_src : &dev->sg_tmp; +- dma_unmap_sg(dev->dev, sg_in, 1, DMA_TO_DEVICE); ++ err = clk_bulk_prepare_enable(dev->num_clks, dev->clks); ++ if (err) ++ dev_err(dev->dev, "Could not enable clock clks\n"); + +- if (dev->sg_dst) { +- sg_out = dev->aligned ? dev->sg_dst : &dev->sg_tmp; +- dma_unmap_sg(dev->dev, sg_out, 1, DMA_FROM_DEVICE); +- } ++ return err; + } + +-static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id) ++static void rk_crypto_disable_clk(struct rk_crypto_info *dev) + { +- struct rk_crypto_info *dev = platform_get_drvdata(dev_id); +- u32 interrupt_status; ++ clk_bulk_disable_unprepare(dev->num_clks, dev->clks); ++} + +- spin_lock(&dev->lock); +- interrupt_status = CRYPTO_READ(dev, RK_CRYPTO_INTSTS); +- CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, interrupt_status); ++/* ++ * Power management strategy: The device is suspended until a request ++ * is handled. For avoiding suspend/resume yoyo, the autosuspend is set to 2s. ++ */ ++static int rk_crypto_pm_suspend(struct device *dev) ++{ ++ struct rk_crypto_info *rkdev = dev_get_drvdata(dev); + +- if (interrupt_status & 0x0a) { +- dev_warn(dev->dev, "DMA Error\n"); +- dev->err = -EFAULT; +- } +- tasklet_schedule(&dev->done_task); ++ rk_crypto_disable_clk(rkdev); ++ reset_control_assert(rkdev->rst); + +- spin_unlock(&dev->lock); +- return IRQ_HANDLED; ++ return 0; + } + +-static int rk_crypto_enqueue(struct rk_crypto_info *dev, +- struct crypto_async_request *async_req) ++static int rk_crypto_pm_resume(struct device *dev) + { +- unsigned long flags; ++ struct rk_crypto_info *rkdev = dev_get_drvdata(dev); + int ret; + +- spin_lock_irqsave(&dev->lock, flags); +- ret = crypto_enqueue_request(&dev->queue, async_req); +- if (dev->busy) { +- spin_unlock_irqrestore(&dev->lock, flags); ++ ret = rk_crypto_enable_clk(rkdev); ++ if (ret) + return ret; +- } +- dev->busy = true; +- spin_unlock_irqrestore(&dev->lock, flags); +- tasklet_schedule(&dev->queue_task); + +- return ret; +-} ++ reset_control_deassert(rkdev->rst); ++ return 0; + +-static void rk_crypto_queue_task_cb(unsigned long data) +-{ +- struct rk_crypto_info *dev = (struct rk_crypto_info *)data; +- struct crypto_async_request *async_req, *backlog; +- unsigned long flags; +- int err = 0; ++} + +- dev->err = 0; +- spin_lock_irqsave(&dev->lock, flags); +- backlog = crypto_get_backlog(&dev->queue); +- async_req = crypto_dequeue_request(&dev->queue); ++static const struct dev_pm_ops rk_crypto_pm_ops = { ++ SET_RUNTIME_PM_OPS(rk_crypto_pm_suspend, rk_crypto_pm_resume, NULL) ++}; + +- if (!async_req) { +- dev->busy = false; +- spin_unlock_irqrestore(&dev->lock, flags); +- return; +- } +- spin_unlock_irqrestore(&dev->lock, flags); ++static int rk_crypto_pm_init(struct rk_crypto_info *rkdev) ++{ ++ int err; + +- if (backlog) { +- backlog->complete(backlog, -EINPROGRESS); +- backlog = NULL; +- } ++ pm_runtime_use_autosuspend(rkdev->dev); ++ pm_runtime_set_autosuspend_delay(rkdev->dev, 2000); + +- dev->async_req = async_req; +- err = dev->start(dev); ++ err = pm_runtime_set_suspended(rkdev->dev); + if (err) +- dev->complete(dev->async_req, err); ++ return err; ++ pm_runtime_enable(rkdev->dev); ++ return err; + } + +-static void rk_crypto_done_task_cb(unsigned long data) ++static void rk_crypto_pm_exit(struct rk_crypto_info *rkdev) ++{ ++ pm_runtime_disable(rkdev->dev); ++} ++ ++static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id) + { +- struct rk_crypto_info *dev = (struct rk_crypto_info *)data; ++ struct rk_crypto_info *dev = platform_get_drvdata(dev_id); ++ u32 interrupt_status; ++ ++ interrupt_status = CRYPTO_READ(dev, RK_CRYPTO_INTSTS); ++ CRYPTO_WRITE(dev, RK_CRYPTO_INTSTS, interrupt_status); + +- if (dev->err) { +- dev->complete(dev->async_req, dev->err); +- return; ++ dev->status = 1; ++ if (interrupt_status & 0x0a) { ++ dev_warn(dev->dev, "DMA Error\n"); ++ dev->status = 0; + } ++ complete(&dev->complete); + +- dev->err = dev->update(dev); +- if (dev->err) +- dev->complete(dev->async_req, dev->err); ++ return IRQ_HANDLED; + } + + static struct rk_crypto_tmp *rk_cipher_algs[] = { +@@ -257,6 +184,62 @@ static struct rk_crypto_tmp *rk_cipher_a + &rk_ahash_md5, + }; + ++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG ++static int rk_crypto_debugfs_show(struct seq_file *seq, void *v) ++{ ++ struct rk_crypto_info *dd; ++ unsigned int i; ++ ++ spin_lock(&rocklist.lock); ++ list_for_each_entry(dd, &rocklist.dev_list, list) { ++ seq_printf(seq, "%s %s requests: %lu\n", ++ dev_driver_string(dd->dev), dev_name(dd->dev), ++ dd->nreq); ++ } ++ spin_unlock(&rocklist.lock); ++ ++ for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) { ++ if (!rk_cipher_algs[i]->dev) ++ continue; ++ switch (rk_cipher_algs[i]->type) { ++ case CRYPTO_ALG_TYPE_SKCIPHER: ++ seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n", ++ rk_cipher_algs[i]->alg.skcipher.base.cra_driver_name, ++ rk_cipher_algs[i]->alg.skcipher.base.cra_name, ++ rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb); ++ seq_printf(seq, "\tfallback due to length: %lu\n", ++ rk_cipher_algs[i]->stat_fb_len); ++ seq_printf(seq, "\tfallback due to alignment: %lu\n", ++ rk_cipher_algs[i]->stat_fb_align); ++ seq_printf(seq, "\tfallback due to SGs: %lu\n", ++ rk_cipher_algs[i]->stat_fb_sgdiff); ++ break; ++ case CRYPTO_ALG_TYPE_AHASH: ++ seq_printf(seq, "%s %s reqs=%lu fallback=%lu\n", ++ rk_cipher_algs[i]->alg.hash.halg.base.cra_driver_name, ++ rk_cipher_algs[i]->alg.hash.halg.base.cra_name, ++ rk_cipher_algs[i]->stat_req, rk_cipher_algs[i]->stat_fb); ++ break; ++ } ++ } ++ return 0; ++} ++ ++DEFINE_SHOW_ATTRIBUTE(rk_crypto_debugfs); ++#endif ++ ++static void register_debugfs(struct rk_crypto_info *crypto_info) ++{ ++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG ++ /* Ignore error of debugfs */ ++ rocklist.dbgfs_dir = debugfs_create_dir("rk3288_crypto", NULL); ++ rocklist.dbgfs_stats = debugfs_create_file("stats", 0444, ++ rocklist.dbgfs_dir, ++ &rocklist, ++ &rk_crypto_debugfs_fops); ++#endif ++} ++ + static int rk_crypto_register(struct rk_crypto_info *crypto_info) + { + unsigned int i, k; +@@ -264,12 +247,22 @@ static int rk_crypto_register(struct rk_ + + for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) { + rk_cipher_algs[i]->dev = crypto_info; +- if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER) +- err = crypto_register_skcipher( +- &rk_cipher_algs[i]->alg.skcipher); +- else +- err = crypto_register_ahash( +- &rk_cipher_algs[i]->alg.hash); ++ switch (rk_cipher_algs[i]->type) { ++ case CRYPTO_ALG_TYPE_SKCIPHER: ++ dev_info(crypto_info->dev, "Register %s as %s\n", ++ rk_cipher_algs[i]->alg.skcipher.base.cra_name, ++ rk_cipher_algs[i]->alg.skcipher.base.cra_driver_name); ++ err = crypto_register_skcipher(&rk_cipher_algs[i]->alg.skcipher); ++ break; ++ case CRYPTO_ALG_TYPE_AHASH: ++ dev_info(crypto_info->dev, "Register %s as %s\n", ++ rk_cipher_algs[i]->alg.hash.halg.base.cra_name, ++ rk_cipher_algs[i]->alg.hash.halg.base.cra_driver_name); ++ err = crypto_register_ahash(&rk_cipher_algs[i]->alg.hash); ++ break; ++ default: ++ dev_err(crypto_info->dev, "unknown algorithm\n"); ++ } + if (err) + goto err_cipher_algs; + } +@@ -277,7 +270,7 @@ static int rk_crypto_register(struct rk_ + + err_cipher_algs: + for (k = 0; k < i; k++) { +- if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER) ++ if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER) + crypto_unregister_skcipher(&rk_cipher_algs[k]->alg.skcipher); + else + crypto_unregister_ahash(&rk_cipher_algs[i]->alg.hash); +@@ -290,22 +283,23 @@ static void rk_crypto_unregister(void) + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(rk_cipher_algs); i++) { +- if (rk_cipher_algs[i]->type == ALG_TYPE_CIPHER) ++ if (rk_cipher_algs[i]->type == CRYPTO_ALG_TYPE_SKCIPHER) + crypto_unregister_skcipher(&rk_cipher_algs[i]->alg.skcipher); + else + crypto_unregister_ahash(&rk_cipher_algs[i]->alg.hash); + } + } + +-static void rk_crypto_action(void *data) +-{ +- struct rk_crypto_info *crypto_info = data; +- +- reset_control_assert(crypto_info->rst); +-} +- + static const struct of_device_id crypto_of_id_table[] = { +- { .compatible = "rockchip,rk3288-crypto" }, ++ { .compatible = "rockchip,rk3288-crypto", ++ .data = &rk3288_variant, ++ }, ++ { .compatible = "rockchip,rk3328-crypto", ++ .data = &rk3328_variant, ++ }, ++ { .compatible = "rockchip,rk3399-crypto", ++ .data = &rk3399_variant, ++ }, + {} + }; + MODULE_DEVICE_TABLE(of, crypto_of_id_table); +@@ -313,7 +307,7 @@ MODULE_DEVICE_TABLE(of, crypto_of_id_tab + static int rk_crypto_probe(struct platform_device *pdev) + { + struct device *dev = &pdev->dev; +- struct rk_crypto_info *crypto_info; ++ struct rk_crypto_info *crypto_info, *first; + int err = 0; + + crypto_info = devm_kzalloc(&pdev->dev, +@@ -323,7 +317,16 @@ static int rk_crypto_probe(struct platfo + goto err_crypto; + } + +- crypto_info->rst = devm_reset_control_get(dev, "crypto-rst"); ++ crypto_info->dev = &pdev->dev; ++ platform_set_drvdata(pdev, crypto_info); ++ ++ crypto_info->variant = of_device_get_match_data(&pdev->dev); ++ if (!crypto_info->variant) { ++ dev_err(&pdev->dev, "Missing variant\n"); ++ return -EINVAL; ++ } ++ ++ crypto_info->rst = devm_reset_control_array_get_exclusive(dev); + if (IS_ERR(crypto_info->rst)) { + err = PTR_ERR(crypto_info->rst); + goto err_crypto; +@@ -333,46 +336,19 @@ static int rk_crypto_probe(struct platfo + usleep_range(10, 20); + reset_control_deassert(crypto_info->rst); + +- err = devm_add_action_or_reset(dev, rk_crypto_action, crypto_info); +- if (err) +- goto err_crypto; +- +- spin_lock_init(&crypto_info->lock); +- + crypto_info->reg = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(crypto_info->reg)) { + err = PTR_ERR(crypto_info->reg); + goto err_crypto; + } + +- crypto_info->aclk = devm_clk_get(&pdev->dev, "aclk"); +- if (IS_ERR(crypto_info->aclk)) { +- err = PTR_ERR(crypto_info->aclk); +- goto err_crypto; +- } +- +- crypto_info->hclk = devm_clk_get(&pdev->dev, "hclk"); +- if (IS_ERR(crypto_info->hclk)) { +- err = PTR_ERR(crypto_info->hclk); +- goto err_crypto; +- } +- +- crypto_info->sclk = devm_clk_get(&pdev->dev, "sclk"); +- if (IS_ERR(crypto_info->sclk)) { +- err = PTR_ERR(crypto_info->sclk); +- goto err_crypto; +- } +- +- crypto_info->dmaclk = devm_clk_get(&pdev->dev, "apb_pclk"); +- if (IS_ERR(crypto_info->dmaclk)) { +- err = PTR_ERR(crypto_info->dmaclk); ++ err = rk_crypto_get_clks(crypto_info); ++ if (err) + goto err_crypto; +- } + + crypto_info->irq = platform_get_irq(pdev, 0); + if (crypto_info->irq < 0) { +- dev_warn(crypto_info->dev, +- "control Interrupt is not available.\n"); ++ dev_err(&pdev->dev, "control Interrupt is not available.\n"); + err = crypto_info->irq; + goto err_crypto; + } +@@ -382,49 +358,64 @@ static int rk_crypto_probe(struct platfo + "rk-crypto", pdev); + + if (err) { +- dev_err(crypto_info->dev, "irq request failed.\n"); ++ dev_err(&pdev->dev, "irq request failed.\n"); + goto err_crypto; + } + +- crypto_info->dev = &pdev->dev; +- platform_set_drvdata(pdev, crypto_info); ++ crypto_info->engine = crypto_engine_alloc_init(&pdev->dev, true); ++ crypto_engine_start(crypto_info->engine); ++ init_completion(&crypto_info->complete); + +- tasklet_init(&crypto_info->queue_task, +- rk_crypto_queue_task_cb, (unsigned long)crypto_info); +- tasklet_init(&crypto_info->done_task, +- rk_crypto_done_task_cb, (unsigned long)crypto_info); +- crypto_init_queue(&crypto_info->queue, 50); +- +- crypto_info->enable_clk = rk_crypto_enable_clk; +- crypto_info->disable_clk = rk_crypto_disable_clk; +- crypto_info->load_data = rk_load_data; +- crypto_info->unload_data = rk_unload_data; +- crypto_info->enqueue = rk_crypto_enqueue; +- crypto_info->busy = false; ++ err = rk_crypto_pm_init(crypto_info); ++ if (err) ++ goto err_pm; + +- err = rk_crypto_register(crypto_info); +- if (err) { +- dev_err(dev, "err in register alg"); +- goto err_register_alg; ++ spin_lock(&rocklist.lock); ++ first = list_first_entry_or_null(&rocklist.dev_list, ++ struct rk_crypto_info, list); ++ list_add_tail(&crypto_info->list, &rocklist.dev_list); ++ spin_unlock(&rocklist.lock); ++ ++ if (!first) { ++ err = rk_crypto_register(crypto_info); ++ if (err) { ++ dev_err(dev, "Fail to register crypto algorithms"); ++ goto err_register_alg; ++ } ++ ++ register_debugfs(crypto_info); + } + +- dev_info(dev, "Crypto Accelerator successfully registered\n"); + return 0; + + err_register_alg: +- tasklet_kill(&crypto_info->queue_task); +- tasklet_kill(&crypto_info->done_task); ++ rk_crypto_pm_exit(crypto_info); ++err_pm: ++ crypto_engine_exit(crypto_info->engine); + err_crypto: ++ dev_err(dev, "Crypto Accelerator not successfully registered\n"); + return err; + } + + static int rk_crypto_remove(struct platform_device *pdev) + { + struct rk_crypto_info *crypto_tmp = platform_get_drvdata(pdev); ++ struct rk_crypto_info *first; + +- rk_crypto_unregister(); +- tasklet_kill(&crypto_tmp->done_task); +- tasklet_kill(&crypto_tmp->queue_task); ++ spin_lock_bh(&rocklist.lock); ++ list_del(&crypto_tmp->list); ++ first = list_first_entry_or_null(&rocklist.dev_list, ++ struct rk_crypto_info, list); ++ spin_unlock_bh(&rocklist.lock); ++ ++ if (!first) { ++#ifdef CONFIG_CRYPTO_DEV_ROCKCHIP_DEBUG ++ debugfs_remove_recursive(rocklist.dbgfs_dir); ++#endif ++ rk_crypto_unregister(); ++ } ++ rk_crypto_pm_exit(crypto_tmp); ++ crypto_engine_exit(crypto_tmp->engine); + return 0; + } + +@@ -433,6 +424,7 @@ static struct platform_driver crypto_dri + .remove = rk_crypto_remove, + .driver = { + .name = "rk3288-crypto", ++ .pm = &rk_crypto_pm_ops, + .of_match_table = crypto_of_id_table, + }, + }; +--- a/drivers/crypto/rockchip/rk3288_crypto.h ++++ b/drivers/crypto/rockchip/rk3288_crypto.h +@@ -5,9 +5,13 @@ + #include <crypto/aes.h> + #include <crypto/internal/des.h> + #include <crypto/algapi.h> ++#include <linux/dma-mapping.h> + #include <linux/interrupt.h> ++#include <linux/debugfs.h> + #include <linux/delay.h> ++#include <linux/pm_runtime.h> + #include <linux/scatterlist.h> ++#include <crypto/engine.h> + #include <crypto/internal/hash.h> + #include <crypto/internal/skcipher.h> + +@@ -184,85 +188,91 @@ + #define CRYPTO_WRITE(dev, offset, val) \ + writel_relaxed((val), ((dev)->reg + (offset))) + ++#define RK_MAX_CLKS 4 ++ ++/* ++ * struct rockchip_ip - struct for managing a list of RK crypto instance ++ * @dev_list: Used for doing a list of rk_crypto_info ++ * @lock: Control access to dev_list ++ * @dbgfs_dir: Debugfs dentry for statistic directory ++ * @dbgfs_stats: Debugfs dentry for statistic counters ++ */ ++struct rockchip_ip { ++ struct list_head dev_list; ++ spinlock_t lock; /* Control access to dev_list */ ++ struct dentry *dbgfs_dir; ++ struct dentry *dbgfs_stats; ++}; ++ ++struct rk_clks { ++ const char *name; ++ unsigned long max; ++}; ++ ++struct rk_variant { ++ int num_clks; ++ struct rk_clks rkclks[RK_MAX_CLKS]; ++}; ++ + struct rk_crypto_info { ++ struct list_head list; + struct device *dev; +- struct clk *aclk; +- struct clk *hclk; +- struct clk *sclk; +- struct clk *dmaclk; ++ struct clk_bulk_data *clks; ++ int num_clks; + struct reset_control *rst; + void __iomem *reg; + int irq; +- struct crypto_queue queue; +- struct tasklet_struct queue_task; +- struct tasklet_struct done_task; +- struct crypto_async_request *async_req; +- int err; +- /* device lock */ +- spinlock_t lock; +- +- /* the public variable */ +- struct scatterlist *sg_src; +- struct scatterlist *sg_dst; +- struct scatterlist sg_tmp; +- struct scatterlist *first; +- unsigned int left_bytes; +- void *addr_vir; +- int aligned; +- int align_size; +- size_t src_nents; +- size_t dst_nents; +- unsigned int total; +- unsigned int count; +- dma_addr_t addr_in; +- dma_addr_t addr_out; +- bool busy; +- int (*start)(struct rk_crypto_info *dev); +- int (*update)(struct rk_crypto_info *dev); +- void (*complete)(struct crypto_async_request *base, int err); +- int (*enable_clk)(struct rk_crypto_info *dev); +- void (*disable_clk)(struct rk_crypto_info *dev); +- int (*load_data)(struct rk_crypto_info *dev, +- struct scatterlist *sg_src, +- struct scatterlist *sg_dst); +- void (*unload_data)(struct rk_crypto_info *dev); +- int (*enqueue)(struct rk_crypto_info *dev, +- struct crypto_async_request *async_req); ++ const struct rk_variant *variant; ++ unsigned long nreq; ++ struct crypto_engine *engine; ++ struct completion complete; ++ int status; + }; + + /* the private variable of hash */ + struct rk_ahash_ctx { +- struct rk_crypto_info *dev; ++ struct crypto_engine_ctx enginectx; + /* for fallback */ + struct crypto_ahash *fallback_tfm; + }; + +-/* the privete variable of hash for fallback */ ++/* the private variable of hash for fallback */ + struct rk_ahash_rctx { ++ struct rk_crypto_info *dev; + struct ahash_request fallback_req; + u32 mode; ++ int nrsg; + }; + + /* the private variable of cipher */ + struct rk_cipher_ctx { +- struct rk_crypto_info *dev; ++ struct crypto_engine_ctx enginectx; + unsigned int keylen; +- u32 mode; ++ u8 key[AES_MAX_KEY_SIZE]; + u8 iv[AES_BLOCK_SIZE]; ++ struct crypto_skcipher *fallback_tfm; + }; + +-enum alg_type { +- ALG_TYPE_HASH, +- ALG_TYPE_CIPHER, ++struct rk_cipher_rctx { ++ struct rk_crypto_info *dev; ++ u8 backup_iv[AES_BLOCK_SIZE]; ++ u32 mode; ++ struct skcipher_request fallback_req; // keep at the end + }; + + struct rk_crypto_tmp { +- struct rk_crypto_info *dev; ++ u32 type; ++ struct rk_crypto_info *dev; + union { + struct skcipher_alg skcipher; + struct ahash_alg hash; + } alg; +- enum alg_type type; ++ unsigned long stat_req; ++ unsigned long stat_fb; ++ unsigned long stat_fb_len; ++ unsigned long stat_fb_sglen; ++ unsigned long stat_fb_align; ++ unsigned long stat_fb_sgdiff; + }; + + extern struct rk_crypto_tmp rk_ecb_aes_alg; +@@ -276,4 +286,5 @@ extern struct rk_crypto_tmp rk_ahash_sha + extern struct rk_crypto_tmp rk_ahash_sha256; + extern struct rk_crypto_tmp rk_ahash_md5; + ++struct rk_crypto_info *get_rk_crypto(void); + #endif +--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c ++++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c +@@ -9,6 +9,8 @@ + * Some ideas are from marvell/cesa.c and s5p-sss.c driver. + */ + #include <linux/device.h> ++#include <asm/unaligned.h> ++#include <linux/iopoll.h> + #include "rk3288_crypto.h" + + /* +@@ -16,6 +18,44 @@ + * so we put the fixed hash out when met zero message. + */ + ++static bool rk_ahash_need_fallback(struct ahash_request *req) ++{ ++ struct scatterlist *sg; ++ ++ sg = req->src; ++ while (sg) { ++ if (!IS_ALIGNED(sg->offset, sizeof(u32))) { ++ return true; ++ } ++ if (sg->length % 4) { ++ return true; ++ } ++ sg = sg_next(sg); ++ } ++ return false; ++} ++ ++static int rk_ahash_digest_fb(struct ahash_request *areq) ++{ ++ struct rk_ahash_rctx *rctx = ahash_request_ctx(areq); ++ struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); ++ struct rk_ahash_ctx *tfmctx = crypto_ahash_ctx(tfm); ++ struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash); ++ ++ algt->stat_fb++; ++ ++ ahash_request_set_tfm(&rctx->fallback_req, tfmctx->fallback_tfm); ++ rctx->fallback_req.base.flags = areq->base.flags & ++ CRYPTO_TFM_REQ_MAY_SLEEP; ++ ++ rctx->fallback_req.nbytes = areq->nbytes; ++ rctx->fallback_req.src = areq->src; ++ rctx->fallback_req.result = areq->result; ++ ++ return crypto_ahash_digest(&rctx->fallback_req); ++} ++ + static int zero_message_process(struct ahash_request *req) + { + struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); +@@ -38,15 +78,9 @@ static int zero_message_process(struct a + return 0; + } + +-static void rk_ahash_crypto_complete(struct crypto_async_request *base, int err) +-{ +- if (base->complete) +- base->complete(base, err); +-} +- +-static void rk_ahash_reg_init(struct rk_crypto_info *dev) ++static void rk_ahash_reg_init(struct ahash_request *req, ++ struct rk_crypto_info *dev) + { +- struct ahash_request *req = ahash_request_cast(dev->async_req); + struct rk_ahash_rctx *rctx = ahash_request_ctx(req); + int reg_status; + +@@ -74,7 +108,7 @@ static void rk_ahash_reg_init(struct rk_ + RK_CRYPTO_BYTESWAP_BRFIFO | + RK_CRYPTO_BYTESWAP_BTFIFO); + +- CRYPTO_WRITE(dev, RK_CRYPTO_HASH_MSG_LEN, dev->total); ++ CRYPTO_WRITE(dev, RK_CRYPTO_HASH_MSG_LEN, req->nbytes); + } + + static int rk_ahash_init(struct ahash_request *req) +@@ -164,51 +198,80 @@ static int rk_ahash_export(struct ahash_ + + static int rk_ahash_digest(struct ahash_request *req) + { +- struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm); +- struct rk_crypto_info *dev = tctx->dev; ++ struct rk_ahash_rctx *rctx = ahash_request_ctx(req); ++ struct rk_crypto_info *dev; ++ struct crypto_engine *engine; ++ ++ if (rk_ahash_need_fallback(req)) ++ return rk_ahash_digest_fb(req); + + if (!req->nbytes) + return zero_message_process(req); +- else +- return dev->enqueue(dev, &req->base); ++ ++ dev = get_rk_crypto(); ++ ++ rctx->dev = dev; ++ engine = dev->engine; ++ ++ return crypto_transfer_hash_request_to_engine(engine, req); + } + +-static void crypto_ahash_dma_start(struct rk_crypto_info *dev) ++static void crypto_ahash_dma_start(struct rk_crypto_info *dev, struct scatterlist *sg) + { +- CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAS, dev->addr_in); +- CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAL, (dev->count + 3) / 4); ++ CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAS, sg_dma_address(sg)); ++ CRYPTO_WRITE(dev, RK_CRYPTO_HRDMAL, sg_dma_len(sg) / 4); + CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_HASH_START | + (RK_CRYPTO_HASH_START << 16)); + } + +-static int rk_ahash_set_data_start(struct rk_crypto_info *dev) ++static int rk_hash_prepare(struct crypto_engine *engine, void *breq) ++{ ++ struct ahash_request *areq = container_of(breq, struct ahash_request, base); ++ struct rk_ahash_rctx *rctx = ahash_request_ctx(areq); ++ struct rk_crypto_info *rkc = rctx->dev; ++ int ret; ++ ++ ret = dma_map_sg(rkc->dev, areq->src, sg_nents(areq->src), DMA_TO_DEVICE); ++ if (ret <= 0) ++ return -EINVAL; ++ ++ rctx->nrsg = ret; ++ ++ return 0; ++} ++ ++static int rk_hash_unprepare(struct crypto_engine *engine, void *breq) ++{ ++ struct ahash_request *areq = container_of(breq, struct ahash_request, base); ++ struct rk_ahash_rctx *rctx = ahash_request_ctx(areq); ++ struct rk_crypto_info *rkc = rctx->dev; ++ ++ dma_unmap_sg(rkc->dev, areq->src, rctx->nrsg, DMA_TO_DEVICE); ++ return 0; ++} ++ ++static int rk_hash_run(struct crypto_engine *engine, void *breq) + { +- int err; ++ struct ahash_request *areq = container_of(breq, struct ahash_request, base); ++ struct crypto_ahash *tfm = crypto_ahash_reqtfm(areq); ++ struct rk_ahash_rctx *rctx = ahash_request_ctx(areq); ++ struct ahash_alg *alg = __crypto_ahash_alg(tfm->base.__crt_alg); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash); ++ struct scatterlist *sg = areq->src; ++ struct rk_crypto_info *rkc = rctx->dev; ++ int err = 0; ++ int i; ++ u32 v; ++ ++ err = pm_runtime_resume_and_get(rkc->dev); ++ if (err) ++ return err; + +- err = dev->load_data(dev, dev->sg_src, NULL); +- if (!err) +- crypto_ahash_dma_start(dev); +- return err; +-} +- +-static int rk_ahash_start(struct rk_crypto_info *dev) +-{ +- struct ahash_request *req = ahash_request_cast(dev->async_req); +- struct crypto_ahash *tfm; +- struct rk_ahash_rctx *rctx; +- +- dev->total = req->nbytes; +- dev->left_bytes = req->nbytes; +- dev->aligned = 0; +- dev->align_size = 4; +- dev->sg_dst = NULL; +- dev->sg_src = req->src; +- dev->first = req->src; +- dev->src_nents = sg_nents(req->src); +- rctx = ahash_request_ctx(req); + rctx->mode = 0; + +- tfm = crypto_ahash_reqtfm(req); ++ algt->stat_req++; ++ rkc->nreq++; ++ + switch (crypto_ahash_digestsize(tfm)) { + case SHA1_DIGEST_SIZE: + rctx->mode = RK_CRYPTO_HASH_SHA1; +@@ -220,100 +283,88 @@ static int rk_ahash_start(struct rk_cryp + rctx->mode = RK_CRYPTO_HASH_MD5; + break; + default: +- return -EINVAL; ++ err = -EINVAL; ++ goto theend; + } + +- rk_ahash_reg_init(dev); +- return rk_ahash_set_data_start(dev); +-} +- +-static int rk_ahash_crypto_rx(struct rk_crypto_info *dev) +-{ +- int err = 0; +- struct ahash_request *req = ahash_request_cast(dev->async_req); +- struct crypto_ahash *tfm; ++ rk_ahash_reg_init(areq, rkc); + +- dev->unload_data(dev); +- if (dev->left_bytes) { +- if (dev->aligned) { +- if (sg_is_last(dev->sg_src)) { +- dev_warn(dev->dev, "[%s:%d], Lack of data\n", +- __func__, __LINE__); +- err = -ENOMEM; +- goto out_rx; +- } +- dev->sg_src = sg_next(dev->sg_src); ++ while (sg) { ++ reinit_completion(&rkc->complete); ++ rkc->status = 0; ++ crypto_ahash_dma_start(rkc, sg); ++ wait_for_completion_interruptible_timeout(&rkc->complete, ++ msecs_to_jiffies(2000)); ++ if (!rkc->status) { ++ dev_err(rkc->dev, "DMA timeout\n"); ++ err = -EFAULT; ++ goto theend; + } +- err = rk_ahash_set_data_start(dev); +- } else { +- /* +- * it will take some time to process date after last dma +- * transmission. +- * +- * waiting time is relative with the last date len, +- * so cannot set a fixed time here. +- * 10us makes system not call here frequently wasting +- * efficiency, and make it response quickly when dma +- * complete. +- */ +- while (!CRYPTO_READ(dev, RK_CRYPTO_HASH_STS)) +- udelay(10); +- +- tfm = crypto_ahash_reqtfm(req); +- memcpy_fromio(req->result, dev->reg + RK_CRYPTO_HASH_DOUT_0, +- crypto_ahash_digestsize(tfm)); +- dev->complete(dev->async_req, 0); +- tasklet_schedule(&dev->queue_task); ++ sg = sg_next(sg); ++ } ++ ++ /* ++ * it will take some time to process date after last dma ++ * transmission. ++ * ++ * waiting time is relative with the last date len, ++ * so cannot set a fixed time here. ++ * 10us makes system not call here frequently wasting ++ * efficiency, and make it response quickly when dma ++ * complete. ++ */ ++ readl_poll_timeout(rkc->reg + RK_CRYPTO_HASH_STS, v, v == 0, 10, 1000); ++ ++ for (i = 0; i < crypto_ahash_digestsize(tfm) / 4; i++) { ++ v = readl(rkc->reg + RK_CRYPTO_HASH_DOUT_0 + i * 4); ++ put_unaligned_le32(v, areq->result + i * 4); + } + +-out_rx: +- return err; ++theend: ++ pm_runtime_put_autosuspend(rkc->dev); ++ ++ local_bh_disable(); ++ crypto_finalize_hash_request(engine, breq, err); ++ local_bh_enable(); ++ ++ return 0; + } + + static int rk_cra_hash_init(struct crypto_tfm *tfm) + { + struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm); +- struct rk_crypto_tmp *algt; +- struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg); +- + const char *alg_name = crypto_tfm_alg_name(tfm); +- +- algt = container_of(alg, struct rk_crypto_tmp, alg.hash); +- +- tctx->dev = algt->dev; +- tctx->dev->addr_vir = (void *)__get_free_page(GFP_KERNEL); +- if (!tctx->dev->addr_vir) { +- dev_err(tctx->dev->dev, "failed to kmalloc for addr_vir\n"); +- return -ENOMEM; +- } +- tctx->dev->start = rk_ahash_start; +- tctx->dev->update = rk_ahash_crypto_rx; +- tctx->dev->complete = rk_ahash_crypto_complete; ++ struct ahash_alg *alg = __crypto_ahash_alg(tfm->__crt_alg); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.hash); + + /* for fallback */ + tctx->fallback_tfm = crypto_alloc_ahash(alg_name, 0, +- CRYPTO_ALG_NEED_FALLBACK); ++ CRYPTO_ALG_NEED_FALLBACK); + if (IS_ERR(tctx->fallback_tfm)) { +- dev_err(tctx->dev->dev, "Could not load fallback driver.\n"); ++ dev_err(algt->dev->dev, "Could not load fallback driver.\n"); + return PTR_ERR(tctx->fallback_tfm); + } ++ + crypto_ahash_set_reqsize(__crypto_ahash_cast(tfm), + sizeof(struct rk_ahash_rctx) + + crypto_ahash_reqsize(tctx->fallback_tfm)); + +- return tctx->dev->enable_clk(tctx->dev); ++ tctx->enginectx.op.do_one_request = rk_hash_run; ++ tctx->enginectx.op.prepare_request = rk_hash_prepare; ++ tctx->enginectx.op.unprepare_request = rk_hash_unprepare; ++ ++ return 0; + } + + static void rk_cra_hash_exit(struct crypto_tfm *tfm) + { + struct rk_ahash_ctx *tctx = crypto_tfm_ctx(tfm); + +- free_page((unsigned long)tctx->dev->addr_vir); +- return tctx->dev->disable_clk(tctx->dev); ++ crypto_free_ahash(tctx->fallback_tfm); + } + + struct rk_crypto_tmp rk_ahash_sha1 = { +- .type = ALG_TYPE_HASH, ++ .type = CRYPTO_ALG_TYPE_AHASH, + .alg.hash = { + .init = rk_ahash_init, + .update = rk_ahash_update, +@@ -337,13 +388,13 @@ struct rk_crypto_tmp rk_ahash_sha1 = { + .cra_init = rk_cra_hash_init, + .cra_exit = rk_cra_hash_exit, + .cra_module = THIS_MODULE, +- } +- } ++ } ++ } + } + }; + + struct rk_crypto_tmp rk_ahash_sha256 = { +- .type = ALG_TYPE_HASH, ++ .type = CRYPTO_ALG_TYPE_AHASH, + .alg.hash = { + .init = rk_ahash_init, + .update = rk_ahash_update, +@@ -367,13 +418,13 @@ struct rk_crypto_tmp rk_ahash_sha256 = { + .cra_init = rk_cra_hash_init, + .cra_exit = rk_cra_hash_exit, + .cra_module = THIS_MODULE, +- } +- } ++ } ++ } + } + }; + + struct rk_crypto_tmp rk_ahash_md5 = { +- .type = ALG_TYPE_HASH, ++ .type = CRYPTO_ALG_TYPE_AHASH, + .alg.hash = { + .init = rk_ahash_init, + .update = rk_ahash_update, +@@ -397,7 +448,7 @@ struct rk_crypto_tmp rk_ahash_md5 = { + .cra_init = rk_cra_hash_init, + .cra_exit = rk_cra_hash_exit, + .cra_module = THIS_MODULE, +- } + } ++ } + } + }; +--- a/drivers/crypto/rockchip/rk3288_crypto_skcipher.c ++++ b/drivers/crypto/rockchip/rk3288_crypto_skcipher.c +@@ -9,23 +9,94 @@ + * Some ideas are from marvell-cesa.c and s5p-sss.c driver. + */ + #include <linux/device.h> ++#include <crypto/scatterwalk.h> + #include "rk3288_crypto.h" + + #define RK_CRYPTO_DEC BIT(0) + +-static void rk_crypto_complete(struct crypto_async_request *base, int err) ++static int rk_cipher_need_fallback(struct skcipher_request *req) + { +- if (base->complete) +- base->complete(base, err); ++ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); ++ struct skcipher_alg *alg = crypto_skcipher_alg(tfm); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); ++ struct scatterlist *sgs, *sgd; ++ unsigned int stodo, dtodo, len; ++ unsigned int bs = crypto_skcipher_blocksize(tfm); ++ ++ if (!req->cryptlen) ++ return true; ++ ++ len = req->cryptlen; ++ sgs = req->src; ++ sgd = req->dst; ++ while (sgs && sgd) { ++ if (!IS_ALIGNED(sgs->offset, sizeof(u32))) { ++ algt->stat_fb_align++; ++ return true; ++ } ++ if (!IS_ALIGNED(sgd->offset, sizeof(u32))) { ++ algt->stat_fb_align++; ++ return true; ++ } ++ stodo = min(len, sgs->length); ++ if (stodo % bs) { ++ algt->stat_fb_len++; ++ return true; ++ } ++ dtodo = min(len, sgd->length); ++ if (dtodo % bs) { ++ algt->stat_fb_len++; ++ return true; ++ } ++ if (stodo != dtodo) { ++ algt->stat_fb_sgdiff++; ++ return true; ++ } ++ len -= stodo; ++ sgs = sg_next(sgs); ++ sgd = sg_next(sgd); ++ } ++ return false; + } + +-static int rk_handle_req(struct rk_crypto_info *dev, +- struct skcipher_request *req) ++static int rk_cipher_fallback(struct skcipher_request *areq) + { +- if (!IS_ALIGNED(req->cryptlen, dev->align_size)) +- return -EINVAL; ++ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq); ++ struct rk_cipher_ctx *op = crypto_skcipher_ctx(tfm); ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq); ++ struct skcipher_alg *alg = crypto_skcipher_alg(tfm); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); ++ int err; ++ ++ algt->stat_fb++; ++ ++ skcipher_request_set_tfm(&rctx->fallback_req, op->fallback_tfm); ++ skcipher_request_set_callback(&rctx->fallback_req, areq->base.flags, ++ areq->base.complete, areq->base.data); ++ skcipher_request_set_crypt(&rctx->fallback_req, areq->src, areq->dst, ++ areq->cryptlen, areq->iv); ++ if (rctx->mode & RK_CRYPTO_DEC) ++ err = crypto_skcipher_decrypt(&rctx->fallback_req); + else +- return dev->enqueue(dev, &req->base); ++ err = crypto_skcipher_encrypt(&rctx->fallback_req); ++ return err; ++} ++ ++static int rk_cipher_handle_req(struct skcipher_request *req) ++{ ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); ++ struct rk_crypto_info *rkc; ++ struct crypto_engine *engine; ++ ++ if (rk_cipher_need_fallback(req)) ++ return rk_cipher_fallback(req); ++ ++ rkc = get_rk_crypto(); ++ ++ engine = rkc->engine; ++ rctx->dev = rkc; ++ ++ return crypto_transfer_skcipher_request_to_engine(engine, req); + } + + static int rk_aes_setkey(struct crypto_skcipher *cipher, +@@ -38,8 +109,9 @@ static int rk_aes_setkey(struct crypto_s + keylen != AES_KEYSIZE_256) + return -EINVAL; + ctx->keylen = keylen; +- memcpy_toio(ctx->dev->reg + RK_CRYPTO_AES_KEY_0, key, keylen); +- return 0; ++ memcpy(ctx->key, key, keylen); ++ ++ return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen); + } + + static int rk_des_setkey(struct crypto_skcipher *cipher, +@@ -53,8 +125,9 @@ static int rk_des_setkey(struct crypto_s + return err; + + ctx->keylen = keylen; +- memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen); +- return 0; ++ memcpy(ctx->key, key, keylen); ++ ++ return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen); + } + + static int rk_tdes_setkey(struct crypto_skcipher *cipher, +@@ -68,161 +141,136 @@ static int rk_tdes_setkey(struct crypto_ + return err; + + ctx->keylen = keylen; +- memcpy_toio(ctx->dev->reg + RK_CRYPTO_TDES_KEY1_0, key, keylen); +- return 0; ++ memcpy(ctx->key, key, keylen); ++ ++ return crypto_skcipher_setkey(ctx->fallback_tfm, key, keylen); + } + + static int rk_aes_ecb_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_AES_ECB_MODE; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_AES_ECB_MODE; ++ return rk_cipher_handle_req(req); + } + + static int rk_aes_ecb_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_AES_ECB_MODE | RK_CRYPTO_DEC; ++ return rk_cipher_handle_req(req); + } + + static int rk_aes_cbc_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_AES_CBC_MODE; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_AES_CBC_MODE; ++ return rk_cipher_handle_req(req); + } + + static int rk_aes_cbc_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_AES_CBC_MODE | RK_CRYPTO_DEC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des_ecb_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = 0; +- return rk_handle_req(dev, req); ++ rctx->mode = 0; ++ return rk_cipher_handle_req(req); + } + + static int rk_des_ecb_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_DEC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des_cbc_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des_cbc_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_TDES_CHAINMODE_CBC | RK_CRYPTO_DEC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des3_ede_ecb_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_SELECT; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_TDES_SELECT; ++ return rk_cipher_handle_req(req); + } + + static int rk_des3_ede_ecb_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_DEC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des3_ede_cbc_encrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC; +- return rk_handle_req(dev, req); ++ rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC; ++ return rk_cipher_handle_req(req); + } + + static int rk_des3_ede_cbc_decrypt(struct skcipher_request *req) + { +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- struct rk_crypto_info *dev = ctx->dev; ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + +- ctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC | ++ rctx->mode = RK_CRYPTO_TDES_SELECT | RK_CRYPTO_TDES_CHAINMODE_CBC | + RK_CRYPTO_DEC; +- return rk_handle_req(dev, req); ++ return rk_cipher_handle_req(req); + } + +-static void rk_ablk_hw_init(struct rk_crypto_info *dev) ++static void rk_cipher_hw_init(struct rk_crypto_info *dev, struct skcipher_request *req) + { +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); + struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req); + struct crypto_tfm *tfm = crypto_skcipher_tfm(cipher); ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(req); + struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(cipher); +- u32 ivsize, block, conf_reg = 0; ++ u32 block, conf_reg = 0; + + block = crypto_tfm_alg_blocksize(tfm); +- ivsize = crypto_skcipher_ivsize(cipher); + + if (block == DES_BLOCK_SIZE) { +- ctx->mode |= RK_CRYPTO_TDES_FIFO_MODE | ++ rctx->mode |= RK_CRYPTO_TDES_FIFO_MODE | + RK_CRYPTO_TDES_BYTESWAP_KEY | + RK_CRYPTO_TDES_BYTESWAP_IV; +- CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, ctx->mode); +- memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, req->iv, ivsize); ++ CRYPTO_WRITE(dev, RK_CRYPTO_TDES_CTRL, rctx->mode); ++ memcpy_toio(dev->reg + RK_CRYPTO_TDES_KEY1_0, ctx->key, ctx->keylen); + conf_reg = RK_CRYPTO_DESSEL; + } else { +- ctx->mode |= RK_CRYPTO_AES_FIFO_MODE | ++ rctx->mode |= RK_CRYPTO_AES_FIFO_MODE | + RK_CRYPTO_AES_KEY_CHANGE | + RK_CRYPTO_AES_BYTESWAP_KEY | + RK_CRYPTO_AES_BYTESWAP_IV; + if (ctx->keylen == AES_KEYSIZE_192) +- ctx->mode |= RK_CRYPTO_AES_192BIT_key; ++ rctx->mode |= RK_CRYPTO_AES_192BIT_key; + else if (ctx->keylen == AES_KEYSIZE_256) +- ctx->mode |= RK_CRYPTO_AES_256BIT_key; +- CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, ctx->mode); +- memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, req->iv, ivsize); ++ rctx->mode |= RK_CRYPTO_AES_256BIT_key; ++ CRYPTO_WRITE(dev, RK_CRYPTO_AES_CTRL, rctx->mode); ++ memcpy_toio(dev->reg + RK_CRYPTO_AES_KEY_0, ctx->key, ctx->keylen); + } + conf_reg |= RK_CRYPTO_BYTESWAP_BTFIFO | + RK_CRYPTO_BYTESWAP_BRFIFO; +@@ -231,189 +279,196 @@ static void rk_ablk_hw_init(struct rk_cr + RK_CRYPTO_BCDMA_ERR_ENA | RK_CRYPTO_BCDMA_DONE_ENA); + } + +-static void crypto_dma_start(struct rk_crypto_info *dev) +-{ +- CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, dev->addr_in); +- CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, dev->count / 4); +- CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, dev->addr_out); ++static void crypto_dma_start(struct rk_crypto_info *dev, ++ struct scatterlist *sgs, ++ struct scatterlist *sgd, unsigned int todo) ++{ ++ CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAS, sg_dma_address(sgs)); ++ CRYPTO_WRITE(dev, RK_CRYPTO_BRDMAL, todo); ++ CRYPTO_WRITE(dev, RK_CRYPTO_BTDMAS, sg_dma_address(sgd)); + CRYPTO_WRITE(dev, RK_CRYPTO_CTRL, RK_CRYPTO_BLOCK_START | + _SBF(RK_CRYPTO_BLOCK_START, 16)); + } + +-static int rk_set_data_start(struct rk_crypto_info *dev) ++static int rk_cipher_run(struct crypto_engine *engine, void *async_req) + { +- int err; +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- u32 ivsize = crypto_skcipher_ivsize(tfm); +- u8 *src_last_blk = page_address(sg_page(dev->sg_src)) + +- dev->sg_src->offset + dev->sg_src->length - ivsize; +- +- /* Store the iv that need to be updated in chain mode. +- * And update the IV buffer to contain the next IV for decryption mode. +- */ +- if (ctx->mode & RK_CRYPTO_DEC) { +- memcpy(ctx->iv, src_last_blk, ivsize); +- sg_pcopy_to_buffer(dev->first, dev->src_nents, req->iv, +- ivsize, dev->total - ivsize); +- } +- +- err = dev->load_data(dev, dev->sg_src, dev->sg_dst); +- if (!err) +- crypto_dma_start(dev); +- return err; +-} +- +-static int rk_ablk_start(struct rk_crypto_info *dev) +-{ +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); +- unsigned long flags; ++ struct skcipher_request *areq = container_of(async_req, struct skcipher_request, base); ++ struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(areq); ++ struct rk_cipher_rctx *rctx = skcipher_request_ctx(areq); ++ struct scatterlist *sgs, *sgd; + int err = 0; ++ int ivsize = crypto_skcipher_ivsize(tfm); ++ int offset; ++ u8 iv[AES_BLOCK_SIZE]; ++ u8 biv[AES_BLOCK_SIZE]; ++ u8 *ivtouse = areq->iv; ++ unsigned int len = areq->cryptlen; ++ unsigned int todo; ++ struct skcipher_alg *alg = crypto_skcipher_alg(tfm); ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); ++ struct rk_crypto_info *rkc = rctx->dev; + +- dev->left_bytes = req->cryptlen; +- dev->total = req->cryptlen; +- dev->sg_src = req->src; +- dev->first = req->src; +- dev->src_nents = sg_nents(req->src); +- dev->sg_dst = req->dst; +- dev->dst_nents = sg_nents(req->dst); +- dev->aligned = 1; +- +- spin_lock_irqsave(&dev->lock, flags); +- rk_ablk_hw_init(dev); +- err = rk_set_data_start(dev); +- spin_unlock_irqrestore(&dev->lock, flags); +- return err; +-} ++ err = pm_runtime_resume_and_get(rkc->dev); ++ if (err) ++ return err; + +-static void rk_iv_copyback(struct rk_crypto_info *dev) +-{ +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- u32 ivsize = crypto_skcipher_ivsize(tfm); ++ algt->stat_req++; ++ rkc->nreq++; + +- /* Update the IV buffer to contain the next IV for encryption mode. */ +- if (!(ctx->mode & RK_CRYPTO_DEC)) { +- if (dev->aligned) { +- memcpy(req->iv, sg_virt(dev->sg_dst) + +- dev->sg_dst->length - ivsize, ivsize); +- } else { +- memcpy(req->iv, dev->addr_vir + +- dev->count - ivsize, ivsize); ++ ivsize = crypto_skcipher_ivsize(tfm); ++ if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) { ++ if (rctx->mode & RK_CRYPTO_DEC) { ++ offset = areq->cryptlen - ivsize; ++ scatterwalk_map_and_copy(rctx->backup_iv, areq->src, ++ offset, ivsize, 0); + } + } +-} + +-static void rk_update_iv(struct rk_crypto_info *dev) +-{ +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); +- struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req); +- struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); +- u32 ivsize = crypto_skcipher_ivsize(tfm); +- u8 *new_iv = NULL; ++ sgs = areq->src; ++ sgd = areq->dst; + +- if (ctx->mode & RK_CRYPTO_DEC) { +- new_iv = ctx->iv; +- } else { +- new_iv = page_address(sg_page(dev->sg_dst)) + +- dev->sg_dst->offset + dev->sg_dst->length - ivsize; ++ while (sgs && sgd && len) { ++ if (!sgs->length) { ++ sgs = sg_next(sgs); ++ sgd = sg_next(sgd); ++ continue; ++ } ++ if (rctx->mode & RK_CRYPTO_DEC) { ++ /* we backup last block of source to be used as IV at next step */ ++ offset = sgs->length - ivsize; ++ scatterwalk_map_and_copy(biv, sgs, offset, ivsize, 0); ++ } ++ if (sgs == sgd) { ++ err = dma_map_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL); ++ if (err <= 0) { ++ err = -EINVAL; ++ goto theend_iv; ++ } ++ } else { ++ err = dma_map_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE); ++ if (err <= 0) { ++ err = -EINVAL; ++ goto theend_iv; ++ } ++ err = dma_map_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE); ++ if (err <= 0) { ++ err = -EINVAL; ++ goto theend_sgs; ++ } ++ } ++ err = 0; ++ rk_cipher_hw_init(rkc, areq); ++ if (ivsize) { ++ if (ivsize == DES_BLOCK_SIZE) ++ memcpy_toio(rkc->reg + RK_CRYPTO_TDES_IV_0, ivtouse, ivsize); ++ else ++ memcpy_toio(rkc->reg + RK_CRYPTO_AES_IV_0, ivtouse, ivsize); ++ } ++ reinit_completion(&rkc->complete); ++ rkc->status = 0; ++ ++ todo = min(sg_dma_len(sgs), len); ++ len -= todo; ++ crypto_dma_start(rkc, sgs, sgd, todo / 4); ++ wait_for_completion_interruptible_timeout(&rkc->complete, ++ msecs_to_jiffies(2000)); ++ if (!rkc->status) { ++ dev_err(rkc->dev, "DMA timeout\n"); ++ err = -EFAULT; ++ goto theend; ++ } ++ if (sgs == sgd) { ++ dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL); ++ } else { ++ dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE); ++ dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE); ++ } ++ if (rctx->mode & RK_CRYPTO_DEC) { ++ memcpy(iv, biv, ivsize); ++ ivtouse = iv; ++ } else { ++ offset = sgd->length - ivsize; ++ scatterwalk_map_and_copy(iv, sgd, offset, ivsize, 0); ++ ivtouse = iv; ++ } ++ sgs = sg_next(sgs); ++ sgd = sg_next(sgd); + } + +- if (ivsize == DES_BLOCK_SIZE) +- memcpy_toio(dev->reg + RK_CRYPTO_TDES_IV_0, new_iv, ivsize); +- else if (ivsize == AES_BLOCK_SIZE) +- memcpy_toio(dev->reg + RK_CRYPTO_AES_IV_0, new_iv, ivsize); +-} ++ if (areq->iv && ivsize > 0) { ++ offset = areq->cryptlen - ivsize; ++ if (rctx->mode & RK_CRYPTO_DEC) { ++ memcpy(areq->iv, rctx->backup_iv, ivsize); ++ memzero_explicit(rctx->backup_iv, ivsize); ++ } else { ++ scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ++ ivsize, 0); ++ } ++ } + +-/* return: +- * true some err was occurred +- * fault no err, continue +- */ +-static int rk_ablk_rx(struct rk_crypto_info *dev) +-{ +- int err = 0; +- struct skcipher_request *req = +- skcipher_request_cast(dev->async_req); ++theend: ++ pm_runtime_put_autosuspend(rkc->dev); + +- dev->unload_data(dev); +- if (!dev->aligned) { +- if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents, +- dev->addr_vir, dev->count, +- dev->total - dev->left_bytes - +- dev->count)) { +- err = -EINVAL; +- goto out_rx; +- } +- } +- if (dev->left_bytes) { +- rk_update_iv(dev); +- if (dev->aligned) { +- if (sg_is_last(dev->sg_src)) { +- dev_err(dev->dev, "[%s:%d] Lack of data\n", +- __func__, __LINE__); +- err = -ENOMEM; +- goto out_rx; +- } +- dev->sg_src = sg_next(dev->sg_src); +- dev->sg_dst = sg_next(dev->sg_dst); +- } +- err = rk_set_data_start(dev); ++ local_bh_disable(); ++ crypto_finalize_skcipher_request(engine, areq, err); ++ local_bh_enable(); ++ return 0; ++ ++theend_sgs: ++ if (sgs == sgd) { ++ dma_unmap_sg(rkc->dev, sgs, 1, DMA_BIDIRECTIONAL); + } else { +- rk_iv_copyback(dev); +- /* here show the calculation is over without any err */ +- dev->complete(dev->async_req, 0); +- tasklet_schedule(&dev->queue_task); ++ dma_unmap_sg(rkc->dev, sgs, 1, DMA_TO_DEVICE); ++ dma_unmap_sg(rkc->dev, sgd, 1, DMA_FROM_DEVICE); + } +-out_rx: ++theend_iv: + return err; + } + +-static int rk_ablk_init_tfm(struct crypto_skcipher *tfm) ++static int rk_cipher_tfm_init(struct crypto_skcipher *tfm) + { + struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); ++ const char *name = crypto_tfm_alg_name(&tfm->base); + struct skcipher_alg *alg = crypto_skcipher_alg(tfm); +- struct rk_crypto_tmp *algt; ++ struct rk_crypto_tmp *algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); + +- algt = container_of(alg, struct rk_crypto_tmp, alg.skcipher); ++ ctx->fallback_tfm = crypto_alloc_skcipher(name, 0, CRYPTO_ALG_NEED_FALLBACK); ++ if (IS_ERR(ctx->fallback_tfm)) { ++ dev_err(algt->dev->dev, "ERROR: Cannot allocate fallback for %s %ld\n", ++ name, PTR_ERR(ctx->fallback_tfm)); ++ return PTR_ERR(ctx->fallback_tfm); ++ } ++ ++ tfm->reqsize = sizeof(struct rk_cipher_rctx) + ++ crypto_skcipher_reqsize(ctx->fallback_tfm); + +- ctx->dev = algt->dev; +- ctx->dev->align_size = crypto_tfm_alg_alignmask(crypto_skcipher_tfm(tfm)) + 1; +- ctx->dev->start = rk_ablk_start; +- ctx->dev->update = rk_ablk_rx; +- ctx->dev->complete = rk_crypto_complete; +- ctx->dev->addr_vir = (char *)__get_free_page(GFP_KERNEL); ++ ctx->enginectx.op.do_one_request = rk_cipher_run; + +- return ctx->dev->addr_vir ? ctx->dev->enable_clk(ctx->dev) : -ENOMEM; ++ return 0; + } + +-static void rk_ablk_exit_tfm(struct crypto_skcipher *tfm) ++static void rk_cipher_tfm_exit(struct crypto_skcipher *tfm) + { + struct rk_cipher_ctx *ctx = crypto_skcipher_ctx(tfm); + +- free_page((unsigned long)ctx->dev->addr_vir); +- ctx->dev->disable_clk(ctx->dev); ++ memzero_explicit(ctx->key, ctx->keylen); ++ crypto_free_skcipher(ctx->fallback_tfm); + } + + struct rk_crypto_tmp rk_ecb_aes_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "ecb(aes)", + .base.cra_driver_name = "ecb-aes-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x0f, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = AES_MIN_KEY_SIZE, + .max_keysize = AES_MAX_KEY_SIZE, + .setkey = rk_aes_setkey, +@@ -423,19 +478,19 @@ struct rk_crypto_tmp rk_ecb_aes_alg = { + }; + + struct rk_crypto_tmp rk_cbc_aes_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "cbc(aes)", + .base.cra_driver_name = "cbc-aes-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = AES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x0f, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = AES_MIN_KEY_SIZE, + .max_keysize = AES_MAX_KEY_SIZE, + .ivsize = AES_BLOCK_SIZE, +@@ -446,19 +501,19 @@ struct rk_crypto_tmp rk_cbc_aes_alg = { + }; + + struct rk_crypto_tmp rk_ecb_des_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "ecb(des)", + .base.cra_driver_name = "ecb-des-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = DES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x07, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = DES_KEY_SIZE, + .max_keysize = DES_KEY_SIZE, + .setkey = rk_des_setkey, +@@ -468,19 +523,19 @@ struct rk_crypto_tmp rk_ecb_des_alg = { + }; + + struct rk_crypto_tmp rk_cbc_des_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "cbc(des)", + .base.cra_driver_name = "cbc-des-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = DES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x07, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = DES_KEY_SIZE, + .max_keysize = DES_KEY_SIZE, + .ivsize = DES_BLOCK_SIZE, +@@ -491,19 +546,19 @@ struct rk_crypto_tmp rk_cbc_des_alg = { + }; + + struct rk_crypto_tmp rk_ecb_des3_ede_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "ecb(des3_ede)", + .base.cra_driver_name = "ecb-des3-ede-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = DES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x07, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = DES3_EDE_KEY_SIZE, + .max_keysize = DES3_EDE_KEY_SIZE, + .setkey = rk_tdes_setkey, +@@ -513,19 +568,19 @@ struct rk_crypto_tmp rk_ecb_des3_ede_alg + }; + + struct rk_crypto_tmp rk_cbc_des3_ede_alg = { +- .type = ALG_TYPE_CIPHER, ++ .type = CRYPTO_ALG_TYPE_SKCIPHER, + .alg.skcipher = { + .base.cra_name = "cbc(des3_ede)", + .base.cra_driver_name = "cbc-des3-ede-rk", + .base.cra_priority = 300, +- .base.cra_flags = CRYPTO_ALG_ASYNC, ++ .base.cra_flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, + .base.cra_blocksize = DES_BLOCK_SIZE, + .base.cra_ctxsize = sizeof(struct rk_cipher_ctx), + .base.cra_alignmask = 0x07, + .base.cra_module = THIS_MODULE, + +- .init = rk_ablk_init_tfm, +- .exit = rk_ablk_exit_tfm, ++ .init = rk_cipher_tfm_init, ++ .exit = rk_cipher_tfm_exit, + .min_keysize = DES3_EDE_KEY_SIZE, + .max_keysize = DES3_EDE_KEY_SIZE, + .ivsize = DES_BLOCK_SIZE, +--- a/drivers/crypto/Kconfig ++++ b/drivers/crypto/Kconfig +@@ -784,7 +784,12 @@ config CRYPTO_DEV_IMGTEC_HASH + config CRYPTO_DEV_ROCKCHIP + tristate "Rockchip's Cryptographic Engine driver" + depends on OF && ARCH_ROCKCHIP ++ depends on PM ++ select CRYPTO_ECB ++ select CRYPTO_CBC ++ select CRYPTO_DES + select CRYPTO_AES ++ select CRYPTO_ENGINE + select CRYPTO_LIB_DES + select CRYPTO_MD5 + select CRYPTO_SHA1 +@@ -796,6 +801,16 @@ config CRYPTO_DEV_ROCKCHIP + This driver interfaces with the hardware crypto accelerator. + Supporting cbc/ecb chainmode, and aes/des/des3_ede cipher mode. + ++config CRYPTO_DEV_ROCKCHIP_DEBUG ++ bool "Enable Rockchip crypto stats" ++ depends on CRYPTO_DEV_ROCKCHIP ++ depends on DEBUG_FS ++ help ++ Say y to enable Rockchip crypto debug stats. ++ This will create /sys/kernel/debug/rk3288_crypto/stats for displaying ++ the number of requests per algorithm and other internal stats. ++ ++ + config CRYPTO_DEV_ZYNQMP_AES + tristate "Support for Xilinx ZynqMP AES hw accelerator" + depends on ZYNQMP_FIRMWARE || COMPILE_TEST +--- a/MAINTAINERS ++++ b/MAINTAINERS +@@ -16972,6 +16972,13 @@ F: Documentation/ABI/*/sysfs-driver-hid- + F: drivers/hid/hid-roccat* + F: include/linux/hid-roccat* + ++ROCKCHIP CRYPTO DRIVERS ++M: Corentin Labbe <clabbe@baylibre.com> ++L: linux-crypto@vger.kernel.org ++S: Maintained ++F: Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml ++F: drivers/crypto/rockchip/ ++ + ROCKCHIP I2S TDM DRIVER + M: Nicolas Frattaroli <frattaroli.nicolas@gmail.com> + L: linux-rockchip@lists.infradead.org +--- /dev/null ++++ b/Documentation/devicetree/bindings/crypto/rockchip,rk3288-crypto.yaml +@@ -0,0 +1,133 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/crypto/rockchip,rk3288-crypto.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Rockchip Electronics Security Accelerator ++ ++maintainers: ++ - Heiko Stuebner <heiko@sntech.de> ++ ++properties: ++ compatible: ++ enum: ++ - rockchip,rk3288-crypto ++ - rockchip,rk3328-crypto ++ - rockchip,rk3399-crypto ++ ++ reg: ++ maxItems: 1 ++ ++ interrupts: ++ maxItems: 1 ++ ++ clocks: ++ minItems: 3 ++ maxItems: 4 ++ ++ clock-names: ++ minItems: 3 ++ maxItems: 4 ++ ++ resets: ++ minItems: 1 ++ maxItems: 3 ++ ++ reset-names: ++ minItems: 1 ++ maxItems: 3 ++ ++allOf: ++ - if: ++ properties: ++ compatible: ++ contains: ++ const: rockchip,rk3288-crypto ++ then: ++ properties: ++ clocks: ++ minItems: 4 ++ clock-names: ++ items: ++ - const: aclk ++ - const: hclk ++ - const: sclk ++ - const: apb_pclk ++ minItems: 4 ++ resets: ++ maxItems: 1 ++ reset-names: ++ items: ++ - const: crypto-rst ++ maxItems: 1 ++ - if: ++ properties: ++ compatible: ++ contains: ++ const: rockchip,rk3328-crypto ++ then: ++ properties: ++ clocks: ++ maxItems: 3 ++ clock-names: ++ items: ++ - const: hclk_master ++ - const: hclk_slave ++ - const: sclk ++ maxItems: 3 ++ resets: ++ maxItems: 1 ++ reset-names: ++ items: ++ - const: crypto-rst ++ maxItems: 1 ++ - if: ++ properties: ++ compatible: ++ contains: ++ const: rockchip,rk3399-crypto ++ then: ++ properties: ++ clocks: ++ maxItems: 3 ++ clock-names: ++ items: ++ - const: hclk_master ++ - const: hclk_slave ++ - const: sclk ++ maxItems: 3 ++ resets: ++ minItems: 3 ++ reset-names: ++ items: ++ - const: rst_master ++ - const: rst_slave ++ - const: crypto-rst ++ minItems: 3 ++ ++required: ++ - compatible ++ - reg ++ - interrupts ++ - clocks ++ - clock-names ++ - resets ++ - reset-names ++ ++additionalProperties: false ++ ++examples: ++ - | ++ #include <dt-bindings/interrupt-controller/arm-gic.h> ++ #include <dt-bindings/clock/rk3288-cru.h> ++ crypto@ff8a0000 { ++ compatible = "rockchip,rk3288-crypto"; ++ reg = <0xff8a0000 0x4000>; ++ interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&cru ACLK_CRYPTO>, <&cru HCLK_CRYPTO>, ++ <&cru SCLK_CRYPTO>, <&cru ACLK_DMAC1>; ++ clock-names = "aclk", "hclk", "sclk", "apb_pclk"; ++ resets = <&cru SRST_CRYPTO>; ++ reset-names = "crypto-rst"; ++ }; +--- a/Documentation/devicetree/bindings/crypto/rockchip-crypto.txt ++++ /dev/null +@@ -1,28 +0,0 @@ +-Rockchip Electronics And Security Accelerator +- +-Required properties: +-- compatible: Should be "rockchip,rk3288-crypto" +-- reg: Base physical address of the engine and length of memory mapped +- region +-- interrupts: Interrupt number +-- clocks: Reference to the clocks about crypto +-- clock-names: "aclk" used to clock data +- "hclk" used to clock data +- "sclk" used to clock crypto accelerator +- "apb_pclk" used to clock dma +-- resets: Must contain an entry for each entry in reset-names. +- See ../reset/reset.txt for details. +-- reset-names: Must include the name "crypto-rst". +- +-Examples: +- +- crypto: cypto-controller@ff8a0000 { +- compatible = "rockchip,rk3288-crypto"; +- reg = <0xff8a0000 0x4000>; +- interrupts = <GIC_SPI 48 IRQ_TYPE_LEVEL_HIGH>; +- clocks = <&cru ACLK_CRYPTO>, <&cru HCLK_CRYPTO>, +- <&cru SCLK_CRYPTO>, <&cru ACLK_DMAC1>; +- clock-names = "aclk", "hclk", "sclk", "apb_pclk"; +- resets = <&cru SRST_CRYPTO>; +- reset-names = "crypto-rst"; +- }; +--- a/include/dt-bindings/clock/rk3399-cru.h ++++ b/include/dt-bindings/clock/rk3399-cru.h +@@ -547,8 +547,8 @@ + #define SRST_H_PERILP0 171 + #define SRST_H_PERILP0_NOC 172 + #define SRST_ROM 173 +-#define SRST_CRYPTO_S 174 +-#define SRST_CRYPTO_M 175 ++#define SRST_CRYPTO0_S 174 ++#define SRST_CRYPTO0_M 175 + + /* cru_softrst_con11 */ + #define SRST_P_DCF 176 +@@ -556,7 +556,7 @@ + #define SRST_CM0S 178 + #define SRST_CM0S_DBG 179 + #define SRST_CM0S_PO 180 +-#define SRST_CRYPTO 181 ++#define SRST_CRYPTO0 181 + #define SRST_P_PERILP1_SGRF 182 + #define SRST_P_PERILP1_GRF 183 + #define SRST_CRYPTO1_S 184 +--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi +@@ -1040,6 +1040,17 @@ + (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; + }; + ++ crypto: crypto@ff060000 { ++ compatible = "rockchip,rk3328-crypto"; ++ reg = <0x0 0xff060000 0x0 0x4000>; ++ interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>; ++ clocks = <&cru HCLK_CRYPTO_MST>, <&cru HCLK_CRYPTO_SLV>, ++ <&cru SCLK_CRYPTO>; ++ clock-names = "hclk_master", "hclk_slave", "sclk"; ++ resets = <&cru SRST_CRYPTO>; ++ reset-names = "crypto-rst"; ++ }; ++ + pinctrl: pinctrl { + compatible = "rockchip,rk3328-pinctrl"; + rockchip,grf = <&grf>; +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -573,6 +573,26 @@ + status = "disabled"; + }; + ++ crypto0: crypto@ff8b0000 { ++ compatible = "rockchip,rk3399-crypto"; ++ reg = <0x0 0xff8b0000 0x0 0x4000>; ++ interrupts = <GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH 0>; ++ clocks = <&cru HCLK_M_CRYPTO0>, <&cru HCLK_S_CRYPTO0>, <&cru SCLK_CRYPTO0>; ++ clock-names = "hclk_master", "hclk_slave", "sclk"; ++ resets = <&cru SRST_CRYPTO0>, <&cru SRST_CRYPTO0_S>, <&cru SRST_CRYPTO0_M>; ++ reset-names = "rst_master", "rst_slave", "crypto-rst"; ++ }; ++ ++ crypto1: crypto@ff8b8000 { ++ compatible = "rockchip,rk3399-crypto"; ++ reg = <0x0 0xff8b8000 0x0 0x4000>; ++ interrupts = <GIC_SPI 135 IRQ_TYPE_LEVEL_HIGH 0>; ++ clocks = <&cru HCLK_M_CRYPTO1>, <&cru HCLK_S_CRYPTO1>, <&cru SCLK_CRYPTO1>; ++ clock-names = "hclk_master", "hclk_slave", "sclk"; ++ resets = <&cru SRST_CRYPTO1>, <&cru SRST_CRYPTO1_S>, <&cru SRST_CRYPTO1_M>; ++ reset-names = "rst_master", "rst_slave", "crypto-rst"; ++ }; ++ + i2c1: i2c@ff110000 { + compatible = "rockchip,rk3399-i2c"; + reg = <0x0 0xff110000 0x0 0x1000>; From 2e53ea674178254f86f9537bed965fd3c79fb303 Mon Sep 17 00:00:00 2001 From: cuiyf5516 <48861298+cuiyf5516@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:21:54 +0800 Subject: [PATCH 6/9] rockchip: 5.19: disable ntfs option (#9889) --- target/linux/rockchip/armv8/config-5.19 | 2 -- 1 file changed, 2 deletions(-) diff --git a/target/linux/rockchip/armv8/config-5.19 b/target/linux/rockchip/armv8/config-5.19 index 1591ae509a122e..e15fef802dbc48 100644 --- a/target/linux/rockchip/armv8/config-5.19 +++ b/target/linux/rockchip/armv8/config-5.19 @@ -513,8 +513,6 @@ CONFIG_NLS_ISO8859_1=y CONFIG_NOP_USB_XCEIV=y CONFIG_NO_HZ_COMMON=y CONFIG_NO_HZ_IDLE=y -CONFIG_NTFS_FS=y -CONFIG_NTFS_RW=y CONFIG_NVMEM=y CONFIG_NVMEM_SYSFS=y CONFIG_NVME_CORE=y From e99155a6e1fd2e63511d5ea0e3e06175d6ccd727 Mon Sep 17 00:00:00 2001 From: aakkll <94471752+aakkll@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:22:41 +0800 Subject: [PATCH 7/9] kernel: refresh 5.19 patch (#9890) Signed-off-by: aakkll <94471752+aakkll@users.noreply.github.com> --- .../generic/hack-5.19/902-debloat_proc.patch | 4 ++-- .../generic/hack-5.19/904-debloat_dma_buf.patch | 4 ++-- ...rack-events-support-multiple-registrant.patch | 16 ++++++++-------- ...tch-linux-kernel-to-support-shortcut-fe.patch | 14 +++++++------- ...node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 2 +- ...cting-with-source-address-failed-policy.patch | 2 +- ...kchip-add-hardware-random-number-genera.patch | 2 +- ...-arm64-dts-rockchip-rk3328-add-dfi-node.patch | 2 +- ...63-drv-net-phy-add-JLSemi-jl2xxx-driver.patch | 4 ++-- .../0900-arm-boot-add-dts-files.patch | 6 +++--- ...ypto-rockchip-permit-to-pass-self-tests.patch | 10 +++++----- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/target/linux/generic/hack-5.19/902-debloat_proc.patch b/target/linux/generic/hack-5.19/902-debloat_proc.patch index a2b60e02d094ad..769cb67d7e80e3 100644 --- a/target/linux/generic/hack-5.19/902-debloat_proc.patch +++ b/target/linux/generic/hack-5.19/902-debloat_proc.patch @@ -341,7 +341,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -3026,11 +3026,13 @@ static const struct seq_operations fib_r +@@ -3029,11 +3029,13 @@ static const struct seq_operations fib_r int __net_init fib_proc_init(struct net *net) { @@ -357,7 +357,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> fib_triestat_seq_show, NULL)) goto out2; -@@ -3041,17 +3043,21 @@ int __net_init fib_proc_init(struct net +@@ -3044,17 +3046,21 @@ int __net_init fib_proc_init(struct net return 0; out3: diff --git a/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch b/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch index e2803e15a209c2..5163d5f3825871 100644 --- a/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch +++ b/target/linux/generic/hack-5.19/904-debloat_dma_buf.patch @@ -64,7 +64,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> +dma-shared-buffer-objs := $(dma-buf-objs-y) --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c -@@ -1459,4 +1459,5 @@ static void __exit dma_buf_deinit(void) +@@ -1473,4 +1473,5 @@ static void __exit dma_buf_deinit(void) kern_unmount(dma_buf_mnt); dma_buf_uninit_sysfs_statistics(); } @@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> +MODULE_LICENSE("GPL"); --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -4287,6 +4287,7 @@ int wake_up_state(struct task_struct *p, +@@ -4284,6 +4284,7 @@ int wake_up_state(struct task_struct *p, { return try_to_wake_up(p, state, 0); } diff --git a/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch index acf8deb7d2ab4c..abb339c03a882d 100644 --- a/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch +++ b/target/linux/generic/hack-5.19/952-add-net-conntrack-events-support-multiple-registrant.patch @@ -22,7 +22,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> --- a/include/net/netfilter/nf_conntrack_ecache.h +++ b/include/net/netfilter/nf_conntrack_ecache.h -@@ -81,9 +81,14 @@ struct nf_ct_event_notifier { +@@ -65,9 +65,14 @@ struct nf_ct_event_notifier { int (*exp_event)(unsigned int events, const struct nf_exp_event *item); }; @@ -38,7 +38,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> void nf_ct_deliver_cached_events(struct nf_conn *ct); int nf_conntrack_eventmask_report(unsigned int eventmask, struct nf_conn *ct, -@@ -109,11 +114,13 @@ static inline void +@@ -98,11 +103,13 @@ static inline void nf_conntrack_event_cache(enum ip_conntrack_events event, struct nf_conn *ct) { #ifdef CONFIG_NF_CONNTRACK_EVENTS @@ -53,7 +53,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> e = nf_ct_ecache_find(ct); if (e == NULL) -@@ -117,20 +124,24 @@ +@@ -117,20 +124,24 @@ nf_conntrack_event_report(enum ip_conntr u32 portid, int report) { #ifdef CONFIG_NF_CONNTRACK_EVENTS @@ -80,9 +80,9 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> #ifdef CONFIG_NF_CONNTRACK_EVENTS --- a/include/net/netns/conntrack.h +++ b/include/net/netns/conntrack.h -@@ -112,6 +112,9 @@ struct netns_ct { +@@ -107,6 +107,9 @@ struct netns_ct { + u8 sysctl_checksum; - struct ct_pcpu __percpu *pcpu_lists; struct ip_conntrack_stat __percpu *stat; +#ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS + struct atomic_notifier_head nf_conntrack_chain; @@ -109,7 +109,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> depends on NETFILTER_ADVANCED --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c -@@ -2837,6 +2837,10 @@ int nf_conntrack_init_net(struct net *ne +@@ -2802,6 +2802,10 @@ int nf_conntrack_init_net(struct net *ne nf_conntrack_helper_pernet_init(net); nf_conntrack_proto_pernet_init(net); @@ -305,7 +305,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> struct nf_conn *ct = item->ct; struct sk_buff *skb; unsigned int type; -@@ -3825,11 +3832,17 @@ static int ctnetlink_stat_exp_cpu(struct +@@ -3791,11 +3798,17 @@ static int ctnetlink_stat_exp_cpu(struct } #ifdef CONFIG_NF_CONNTRACK_EVENTS @@ -323,7 +323,7 @@ Signed-off-by: Zhi Chen <zhichen@codeaurora.org> static const struct nfnl_callback ctnl_cb[IPCTNL_MSG_MAX] = { [IPCTNL_MSG_CT_NEW] = { -@@ -3928,8 +3941,12 @@ static int __net_init ctnetlink_net_init +@@ -3894,8 +3907,12 @@ static int __net_init ctnetlink_net_init static void ctnetlink_net_pre_exit(struct net *net) { #ifdef CONFIG_NF_CONNTRACK_EVENTS diff --git a/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch index c7346c36a84f49..1d50ba2d2d737d 100644 --- a/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch +++ b/target/linux/generic/hack-5.19/953-net-patch-linux-kernel-to-support-shortcut-fe.patch @@ -12,7 +12,7 @@ struct list_head *br_ip_list); --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h -@@ -1022,6 +1022,10 @@ struct sk_buff { +@@ -1146,6 +1146,10 @@ struct sk_buff { __u8 slow_gro:1; __u8 csum_not_inet:1; @@ -38,7 +38,7 @@ #endif --- a/include/net/netfilter/nf_conntrack_ecache.h +++ b/include/net/netfilter/nf_conntrack_ecache.h -@@ -84,6 +84,8 @@ struct nf_ct_event_notifier { +@@ -68,6 +68,8 @@ struct nf_ct_event_notifier { #ifdef CONFIG_NF_CONNTRACK_CHAIN_EVENTS extern int nf_conntrack_register_notifier(struct net *net, struct notifier_block *nb); extern int nf_conntrack_unregister_notifier(struct net *net, struct notifier_block *nb); @@ -92,7 +92,7 @@ struct net_bridge_port *p; --- a/net/core/dev.c +++ b/net/core/dev.c -@@ -3532,9 +3532,17 @@ static int xmit_one(struct sk_buff *skb, +@@ -3581,9 +3581,17 @@ static int xmit_one(struct sk_buff *skb, { unsigned int len; int rc; @@ -110,8 +110,8 @@ +#endif len = skb->len; - PRANDOM_ADD_NOISE(skb, dev, txq, len + jiffies); -@@ -5161,6 +5169,11 @@ void netdev_rx_handler_unregister(struct + trace_net_dev_start_xmit(skb, dev); +@@ -5232,6 +5240,11 @@ void netdev_rx_handler_unregister(struct } EXPORT_SYMBOL_GPL(netdev_rx_handler_unregister); @@ -123,7 +123,7 @@ /* * Limit the use of PFMEMALLOC reserves to those protocols that implement * the special handling of PFMEMALLOC skbs. -@@ -5209,6 +5222,10 @@ static int __netif_receive_skb_core(stru +@@ -5280,6 +5293,10 @@ static int __netif_receive_skb_core(stru int ret = NET_RX_DROP; __be16 type; @@ -134,7 +134,7 @@ net_timestamp_check(!netdev_tstamp_prequeue, skb); trace_netif_receive_skb(skb); -@@ -5246,6 +5263,15 @@ another_round: +@@ -5317,6 +5334,15 @@ another_round: goto out; } diff --git a/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch index 7adb2c7be3e1e0..3bdfb9baa9f482 100644 --- a/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ b/target/linux/generic/pending-5.19/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de> --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -7698,7 +7698,7 @@ static void __init alloc_node_mem_map(st +@@ -7702,7 +7702,7 @@ static void __init alloc_node_mem_map(st if (pgdat == NODE_DATA(0)) { mem_map = NODE_DATA(0)->node_mem_map; if (page_to_pfn(mem_map) != pgdat->node_start_pfn) diff --git a/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch index bb7eef0b20dde9..c3980518aa07c2 100644 --- a/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch +++ b/target/linux/generic/pending-5.19/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch @@ -66,7 +66,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org> static void rt_fibinfo_free(struct rtable __rcu **rtp) --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -2773,6 +2773,7 @@ static const char *const rtn_type_names[ +@@ -2776,6 +2776,7 @@ static const char *const rtn_type_names[ [RTN_THROW] = "THROW", [RTN_NAT] = "NAT", [RTN_XRESOLVE] = "XRESOLVE", diff --git a/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch b/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch index 266b8b28dec86e..4e9be328ee462c 100644 --- a/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch +++ b/target/linux/rockchip/patches-5.19/0057-arm64-dts-rockchip-add-hardware-random-number-genera.patch @@ -31,7 +31,7 @@ Signed-off-by: wevsty <ty@wevs.org> reg = <0x0 0xff100000 0x0 0x1000>; --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -@@ -2017,6 +2017,16 @@ +@@ -2042,6 +2042,16 @@ }; }; diff --git a/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch b/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch index 2ab20487a0fe98..6d8ce8da4ab433 100644 --- a/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch +++ b/target/linux/rockchip/patches-5.19/0061-arm64-dts-rockchip-rk3328-add-dfi-node.patch @@ -11,7 +11,7 @@ Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org> --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -1005,6 +1005,13 @@ +@@ -1023,6 +1023,13 @@ status = "disabled"; }; diff --git a/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch b/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch index e2fb70694228e1..c879e16b056397 100644 --- a/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch +++ b/target/linux/rockchip/patches-5.19/0063-drv-net-phy-add-JLSemi-jl2xxx-driver.patch @@ -1,6 +1,6 @@ --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig -@@ -260,6 +260,11 @@ config INTEL_XWAY_PHY +@@ -267,6 +267,11 @@ config INTEL_XWAY_PHY PEF 7061, PEF 7071 and PEF 7072 or integrated into the Intel SoCs xRX200, xRX300, xRX330, xRX350 and xRX550. @@ -14,7 +14,7 @@ help --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile -@@ -72,6 +72,8 @@ obj-$(CONFIG_DP83TC811_PHY) += dp83tc811 +@@ -74,6 +74,8 @@ obj-$(CONFIG_DP83TD510_PHY) += dp83td510 obj-$(CONFIG_FIXED_PHY) += fixed_phy.o obj-$(CONFIG_ICPLUS_PHY) += icplus.o obj-$(CONFIG_INTEL_XWAY_PHY) += intel-xway.o diff --git a/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch b/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch index eb2b744dca05b3..4ccb5cd31afaec 100644 --- a/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch +++ b/target/linux/rockchip/patches-5.19/0900-arm-boot-add-dts-files.patch @@ -1,6 +1,6 @@ --- a/arch/arm64/boot/dts/rockchip/Makefile +++ b/arch/arm64/boot/dts/rockchip/Makefile -@@ -9,8 +9,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9 +@@ -10,8 +10,12 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3318-a9 dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb @@ -13,7 +13,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb -@@ -22,6 +26,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-or +@@ -23,6 +27,8 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-or dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-px5-evb.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-r88.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-evb.dtb @@ -22,7 +22,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-ficus.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-firefly.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-gru-bob.dtb -@@ -40,6 +46,9 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-na +@@ -41,6 +47,9 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-na dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4b.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb diff --git a/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch b/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch index af346f09d6bed5..5be8c13e21ca90 100644 --- a/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch +++ b/target/linux/rockchip/patches-5.19/0903-crypto-rockchip-permit-to-pass-self-tests.patch @@ -2133,7 +2133,7 @@ Signed-off-by: Corentin Labbe <clabbe@baylibre.com> .ivsize = DES_BLOCK_SIZE, --- a/drivers/crypto/Kconfig +++ b/drivers/crypto/Kconfig -@@ -784,7 +784,12 @@ config CRYPTO_DEV_IMGTEC_HASH +@@ -669,7 +669,12 @@ config CRYPTO_DEV_IMGTEC_HASH config CRYPTO_DEV_ROCKCHIP tristate "Rockchip's Cryptographic Engine driver" depends on OF && ARCH_ROCKCHIP @@ -2146,7 +2146,7 @@ Signed-off-by: Corentin Labbe <clabbe@baylibre.com> select CRYPTO_LIB_DES select CRYPTO_MD5 select CRYPTO_SHA1 -@@ -796,6 +801,16 @@ config CRYPTO_DEV_ROCKCHIP +@@ -681,6 +686,16 @@ config CRYPTO_DEV_ROCKCHIP This driver interfaces with the hardware crypto accelerator. Supporting cbc/ecb chainmode, and aes/des/des3_ede cipher mode. @@ -2165,7 +2165,7 @@ Signed-off-by: Corentin Labbe <clabbe@baylibre.com> depends on ZYNQMP_FIRMWARE || COMPILE_TEST --- a/MAINTAINERS +++ b/MAINTAINERS -@@ -16972,6 +16972,13 @@ F: Documentation/ABI/*/sysfs-driver-hid- +@@ -17300,6 +17300,13 @@ F: Documentation/ABI/*/sysfs-driver-hid- F: drivers/hid/hid-roccat* F: include/linux/hid-roccat* @@ -2370,7 +2370,7 @@ Signed-off-by: Corentin Labbe <clabbe@baylibre.com> #define SRST_CRYPTO1_S 184 --- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi -@@ -1040,6 +1040,17 @@ +@@ -1058,6 +1058,17 @@ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; }; @@ -2390,7 +2390,7 @@ Signed-off-by: Corentin Labbe <clabbe@baylibre.com> rockchip,grf = <&grf>; --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -@@ -573,6 +573,26 @@ +@@ -582,6 +582,26 @@ status = "disabled"; }; From dad62d5fb53d163926b971e824b39e57e7c8a673 Mon Sep 17 00:00:00 2001 From: aakkll <94471752+aakkll@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:23:05 +0800 Subject: [PATCH 8/9] kernel: bump 5.15 to 5.15.59 (#9891) Signed-off-by: aakkll <94471752+aakkll@users.noreply.github.com> --- include/kernel-5.15 | 4 ++-- .../ath79/patches-5.15/910-unaligned_access_hacks.patch | 8 ++++---- target/linux/generic/hack-5.15/902-debloat_proc.patch | 4 ++-- ...ix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 2 +- ...llow-rejecting-with-source-address-failed-policy.patch | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/kernel-5.15 b/include/kernel-5.15 index 5bbf12d6f44687..716bcddf805028 100644 --- a/include/kernel-5.15 +++ b/include/kernel-5.15 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.15 = .58 -LINUX_KERNEL_HASH-5.15.58 = d75bd9579c4b318e6162e21c591878fd37efda0f79c5cdd0dc4eb9ea9dfc4fa8 +LINUX_VERSION-5.15 = .59 +LINUX_KERNEL_HASH-5.15.59 = e6ddc642057340db06b3b921c2b31bfed2c611359e8f144c3e5cf9c3ac33bccb diff --git a/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch index ef9dab550837cf..1eaeefef00ce0a 100644 --- a/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch +++ b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch @@ -305,7 +305,7 @@ list_for_each_entry(p, head, list) { --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c -@@ -613,48 +613,53 @@ static void tcp_options_write(__be32 *pt +@@ -610,48 +610,53 @@ static void tcp_options_write(__be32 *pt u16 options = opts->options; /* mungable copy */ if (unlikely(OPTION_MD5 & options)) { @@ -382,7 +382,7 @@ } if (unlikely(opts->num_sack_blocks)) { -@@ -662,16 +667,17 @@ static void tcp_options_write(__be32 *pt +@@ -659,16 +664,17 @@ static void tcp_options_write(__be32 *pt tp->duplicate_sack : tp->selective_acks; int this_sack; @@ -406,7 +406,7 @@ } tp->rx_opt.dsack = 0; -@@ -684,13 +690,14 @@ static void tcp_options_write(__be32 *pt +@@ -681,13 +687,14 @@ static void tcp_options_write(__be32 *pt if (foc->exp) { len = TCPOLEN_EXP_FASTOPEN_BASE + foc->len; @@ -706,7 +706,7 @@ EXPORT_SYMBOL(xfrm_parse_spi); --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c -@@ -4138,14 +4138,16 @@ static bool tcp_parse_aligned_timestamp( +@@ -4140,14 +4140,16 @@ static bool tcp_parse_aligned_timestamp( { const __be32 *ptr = (const __be32 *)(th + 1); diff --git a/target/linux/generic/hack-5.15/902-debloat_proc.patch b/target/linux/generic/hack-5.15/902-debloat_proc.patch index fef28464bc0e1a..33d637f13eae91 100644 --- a/target/linux/generic/hack-5.15/902-debloat_proc.patch +++ b/target/linux/generic/hack-5.15/902-debloat_proc.patch @@ -341,7 +341,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -3019,11 +3019,13 @@ static const struct seq_operations fib_r +@@ -3022,11 +3022,13 @@ static const struct seq_operations fib_r int __net_init fib_proc_init(struct net *net) { @@ -357,7 +357,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> fib_triestat_seq_show, NULL)) goto out2; -@@ -3034,17 +3036,21 @@ int __net_init fib_proc_init(struct net +@@ -3037,17 +3039,21 @@ int __net_init fib_proc_init(struct net return 0; out3: diff --git a/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch index 30c70a6be995df..4e347a46710425 100644 --- a/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ b/target/linux/generic/pending-5.15/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de> --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -7552,7 +7552,7 @@ static void __init alloc_node_mem_map(st +@@ -7556,7 +7556,7 @@ static void __init alloc_node_mem_map(st if (pgdat == NODE_DATA(0)) { mem_map = NODE_DATA(0)->node_mem_map; if (page_to_pfn(mem_map) != pgdat->node_start_pfn) diff --git a/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch index 68960765bb051c..ac4396209efb4b 100644 --- a/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch +++ b/target/linux/generic/pending-5.15/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch @@ -66,7 +66,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org> static void rt_fibinfo_free(struct rtable __rcu **rtp) --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -2767,6 +2767,7 @@ static const char *const rtn_type_names[ +@@ -2770,6 +2770,7 @@ static const char *const rtn_type_names[ [RTN_THROW] = "THROW", [RTN_NAT] = "NAT", [RTN_XRESOLVE] = "XRESOLVE", From 3c316115f97fbfd68e64aad50a87de6e80b20cd4 Mon Sep 17 00:00:00 2001 From: aakkll <94471752+aakkll@users.noreply.github.com> Date: Sat, 6 Aug 2022 00:23:26 +0800 Subject: [PATCH 9/9] kernel: bump 5.18 to 5.18.16 (#9892) Signed-off-by: aakkll <94471752+aakkll@users.noreply.github.com> --- include/kernel-5.18 | 4 ++-- target/linux/generic/hack-5.18/902-debloat_proc.patch | 4 ++-- ...20-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch | 2 +- ...v6-allow-rejecting-with-source-address-failed-policy.patch | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/kernel-5.18 b/include/kernel-5.18 index 554292138fdce4..532f60fb7bd95b 100644 --- a/include/kernel-5.18 +++ b/include/kernel-5.18 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.18 = .15 -LINUX_KERNEL_HASH-5.18.15 = 69804febdc388a69dfb64493b7b58d402853de3a14144ea8db7fd67c30dcbe3c +LINUX_VERSION-5.18 = .16 +LINUX_KERNEL_HASH-5.18.16 = f1f586251e63de14c86e5f95b96beb15a0434f1e6e21df788d123564af0d11ce diff --git a/target/linux/generic/hack-5.18/902-debloat_proc.patch b/target/linux/generic/hack-5.18/902-debloat_proc.patch index 5f96b0668e3f17..f9ddf5a093bef1 100644 --- a/target/linux/generic/hack-5.18/902-debloat_proc.patch +++ b/target/linux/generic/hack-5.18/902-debloat_proc.patch @@ -341,7 +341,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -3026,11 +3026,13 @@ static const struct seq_operations fib_r +@@ -3029,11 +3029,13 @@ static const struct seq_operations fib_r int __net_init fib_proc_init(struct net *net) { @@ -357,7 +357,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> fib_triestat_seq_show, NULL)) goto out2; -@@ -3041,17 +3043,21 @@ int __net_init fib_proc_init(struct net +@@ -3044,17 +3046,21 @@ int __net_init fib_proc_init(struct net return 0; out3: diff --git a/target/linux/generic/pending-5.18/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch b/target/linux/generic/pending-5.18/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch index f9a7d0cbed6d2f..0d36a85926c770 100644 --- a/target/linux/generic/pending-5.18/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch +++ b/target/linux/generic/pending-5.18/120-Fix-alloc_node_mem_map-with-ARCH_PFN_OFFSET-calcu.patch @@ -71,7 +71,7 @@ Signed-off-by: Tobias Wolf <dev-NTEO@vplace.de> --- a/mm/page_alloc.c +++ b/mm/page_alloc.c -@@ -7668,7 +7668,7 @@ static void __init alloc_node_mem_map(st +@@ -7672,7 +7672,7 @@ static void __init alloc_node_mem_map(st if (pgdat == NODE_DATA(0)) { mem_map = NODE_DATA(0)->node_mem_map; if (page_to_pfn(mem_map) != pgdat->node_start_pfn) diff --git a/target/linux/generic/pending-5.18/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch b/target/linux/generic/pending-5.18/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch index cc261ab98073da..534cd5a9d12571 100644 --- a/target/linux/generic/pending-5.18/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch +++ b/target/linux/generic/pending-5.18/670-ipv6-allow-rejecting-with-source-address-failed-policy.patch @@ -66,7 +66,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org> static void rt_fibinfo_free(struct rtable __rcu **rtp) --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c -@@ -2773,6 +2773,7 @@ static const char *const rtn_type_names[ +@@ -2776,6 +2776,7 @@ static const char *const rtn_type_names[ [RTN_THROW] = "THROW", [RTN_NAT] = "NAT", [RTN_XRESOLVE] = "XRESOLVE",