From d7d01fb74db886fff806f9a17cb472521b6b51b6 Mon Sep 17 00:00:00 2001 From: David Bauer Date: Sun, 3 Dec 2023 06:49:40 +0100 Subject: [PATCH 1/8] uboot-envtools: fix GL-MT2500 offset The previous offsets did also work, as they've wrapped back to 0x0. However, in reality the environment starts at offset 0x0 of the u-boot-env MMC partition. Signed-off-by: David Bauer --- package/boot/uboot-envtools/files/mediatek_filogic | 9 +++------ target/linux/mediatek/image/filogic.mk | 7 +------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/package/boot/uboot-envtools/files/mediatek_filogic b/package/boot/uboot-envtools/files/mediatek_filogic index 9fd1f5cdc6913c..d797bfc1f12584 100644 --- a/package/boot/uboot-envtools/files/mediatek_filogic +++ b/package/boot/uboot-envtools/files/mediatek_filogic @@ -34,17 +34,14 @@ bananapi,bpi-r3) ;; esac ;; -glinet,gl-mt2500) +glinet,gl-mt2500|\ +glinet,gl-mt6000) local envdev=$(find_mmc_part "u-boot-env") - ubootenv_add_uci_config "$envdev" "0x400000" "0x80000" + ubootenv_add_uci_config "$envdev" "0x0" "0x80000" ;; glinet,gl-mt3000) ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x80000" "0x20000" ;; -glinet,gl-mt6000) - local envdev=$(find_mmc_part "u-boot-env") - ubootenv_add_uci_config "$envdev" "0x0" "0x80000" - ;; xiaomi,mi-router-wr30u|\ xiaomi,mi-router-ax3000t|\ xiaomi,redmi-router-ax6000) diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk index ad58de7165452b..9f07d894a044f7 100644 --- a/target/linux/mediatek/image/filogic.mk +++ b/target/linux/mediatek/image/filogic.mk @@ -151,14 +151,9 @@ define Device/glinet_gl-mt2500 DEVICE_MODEL := GL-MT2500 DEVICE_DTS := mt7981b-glinet-gl-mt2500 DEVICE_DTS_DIR := ../dts - DEVICE_DTS_LOADADDR := 0x47000000 - DEVICE_PACKAGES := kmod-usb3 + DEVICE_PACKAGES := e2fsprogs f2fsck mkf2fs kmod-usb3 SUPPORTED_DEVICES += glinet,mt2500-emmc IMAGES := sysupgrade.bin - KERNEL := kernel-bin | lzma | \ - fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k - KERNEL_INITRAMFS := kernel-bin | lzma | \ - fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 64k IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata endef TARGET_DEVICES += glinet_gl-mt2500 From 8c95f404aa6f0e896d47d0d22e650d3becbf8452 Mon Sep 17 00:00:00 2001 From: Marty Jones Date: Tue, 28 Nov 2023 13:27:18 -0500 Subject: [PATCH 2/8] kernel: backport fixes for realtek r8152 Fixes issues with RTL8156 2.5G USB adapters - # ethtool eth1 Settings for eth1: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: 2500Mb/s Duplex: Half Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: off MDI-X: Unknown Current message level: 0x00000007 (7) drv probe link Link detected: yes - # - r8152: break the loop when the budget is exhausted - r8152: Block future register access if register access fails - r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE - r8152: add vendor/device ID pair for D-Link DUB-E250 - r8152: try to use a normal budget - r8152: set bp in bulk - r8152: adjust generic_ocp_write function - r8152: fix the autosuspend doesn't work - r8152: Add __GFP_NOWARN to big allocations - r8152: reduce the control transfer of rtl8152_get_version() - r8152: remove rtl_vendor_mode function - r8152: avoid to change cfg for all devices - r8152: add USB device driver for config selection - r8152: use napi_gro_frags - cdc_ether: no need to blacklist any r8152 devices - cdc_ether: add u-blox 0x1313 composition Build system: x86_64 Build-tested: bcm2711, rockchip, x86/64 Run-tested: bcm2711/RPi4B, rockchip/nanopi r2s, x86/64 Signed-off-by: Marty Jones --- ...B-device-driver-for-config-selection.patch | 229 +++++++++ ...-need-to-blacklist-any-r8152-devices.patch | 158 +++++++ ...-avoid-to-change-cfg-for-all-devices.patch | 64 +++ ...8152-remove-rtl_vendor_mode-function.patch | 71 +++ ...-control-transfer-of-rtl8152_get_ver.patch | 46 ++ ...-Add-__GFP_NOWARN-to-big-allocations.patch | 55 +++ ...152-fix-the-autosuspend-doesn-t-work.patch | 24 + ...52-adjust-generic_ocp_write-function.patch | 70 +++ .../795-v6.6-09-r8152-set-bp-in-bulk.patch | 129 +++++ ...r-device-ID-pair-for-D-Link-DUB-E250.patch | 39 ++ ...L8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch | 447 ++++++++++++++++++ ...re-register-access-if-register-acces.patch | 398 ++++++++++++++++ ...he-loop-when-the-budget-is-exhausted.patch | 83 ++++ ..._ether-add-u-blox-0x1313-composition.patch | 47 ++ ...B-device-driver-for-config-selection.patch | 229 +++++++++ ...-need-to-blacklist-any-r8152-devices.patch | 158 +++++++ ...-avoid-to-change-cfg-for-all-devices.patch | 64 +++ ...8152-remove-rtl_vendor_mode-function.patch | 71 +++ ...-control-transfer-of-rtl8152_get_ver.patch | 46 ++ ...-Add-__GFP_NOWARN-to-big-allocations.patch | 55 +++ ...152-fix-the-autosuspend-doesn-t-work.patch | 24 + ...52-adjust-generic_ocp_write-function.patch | 70 +++ .../795-v6.6-09-r8152-set-bp-in-bulk.patch | 129 +++++ ...eth-r8152-try-to-use-a-normal-budget.patch | 39 ++ ...r-device-ID-pair-for-D-Link-DUB-E250.patch | 39 ++ ...L8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch | 447 ++++++++++++++++++ ...re-register-access-if-register-acces.patch | 398 ++++++++++++++++ ...he-loop-when-the-budget-is-exhausted.patch | 83 ++++ ..._ether-add-u-blox-0x1313-composition.patch | 47 ++ ...795-v6.7-16-r8152-use-napi_gro_frags.patch | 122 +++++ ...-r8152-add-LED-configuration-from-OF.patch | 8 +- ...-r8152-add-LED-configuration-from-OF.patch | 8 +- 32 files changed, 3889 insertions(+), 8 deletions(-) create mode 100644 target/linux/generic/backport-5.15/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-09-r8152-set-bp-in-bulk.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch create mode 100644 target/linux/generic/backport-5.15/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-09-r8152-set-bp-in-bulk.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-10-eth-r8152-try-to-use-a-normal-budget.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch create mode 100644 target/linux/generic/backport-6.1/795-v6.7-16-r8152-use-napi_gro_frags.patch diff --git a/target/linux/generic/backport-5.15/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch b/target/linux/generic/backport-5.15/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch new file mode 100644 index 00000000000000..38ddcb5714cbe5 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch @@ -0,0 +1,229 @@ +From ec51fbd1b8a2bca2948dede99c14ec63dc57ff6b Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Fri, 6 Jan 2023 17:07:38 +0100 +Subject: [PATCH] r8152: add USB device driver for config selection +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Subclassing the generic USB device driver to override the +default configuration selection regardless of matching interface +drivers. + +The r815x family devices expose a vendor specific function which +the r8152 interface driver wants to handle. This is the preferred +device mode. Additionally one or more USB class functions are +usually supported for hosts lacking a vendor specific driver. The +choice is USB configuration based, with one alternate function per +configuration. + +Example device with both NCM and ECM alternate cfgs: + +T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=5000 MxCh= 0 +D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 3 +P: Vendor=0bda ProdID=8156 Rev=31.00 +S: Manufacturer=Realtek +S: Product=USB 10/100/1G/2.5G LAN +S: SerialNumber=001000001 +C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=256mA +I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=00 Driver=r8152 +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=83(I) Atr=03(Int.) MxPS= 2 Ivl=128ms +C: #Ifs= 2 Cfg#= 2 Atr=a0 MxPwr=256mA +I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver= +E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms +I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver= +I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver= +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +C: #Ifs= 2 Cfg#= 3 Atr=a0 MxPwr=256mA +I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver= +E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms +I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver= +I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver= +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms + +A problem with this is that Linux will prefer class functions over +vendor specific functions. Using the above example, Linux defaults +to cfg #2, running the device in a sub-optimal NCM mode. + +Previously we've attempted to work around the problem by +blacklisting the devices in the ECM class driver "cdc_ether", and +matching on the ECM class function in the vendor specific interface +driver. The latter has been used to switch back to the vendor +specific configuration when the driver is probed for a class +function. + +This workaround has several issues; +- class driver blacklists is additional maintanence cruft in an + unrelated driver +- class driver blacklists prevents users from optionally running + the devices in class mode +- each device needs double match entries in the vendor driver +- the initial probing as a class function slows down device + discovery + +Now these issues have become even worse with the introduction of +firmware supporting both NCM and ECM, where NCM ends up as the +default mode in Linux. To use the same workaround, we now have +to blacklist the devices in to two different class drivers and +add yet another match entry to the vendor specific driver. + +This patch implements an alternative workaround strategy - +independent of the interface drivers. It avoids adding a +blacklist to the cdc_ncm driver and will let us remove the +existing blacklist from the cdc_ether driver. + +As an additional bonus, removing the blacklists allow users to +select one of the other device modes if wanted. + +Signed-off-by: Bjørn Mork +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 113 ++++++++++++++++++++++++++++------------ + 1 file changed, 81 insertions(+), 32 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9625,6 +9625,9 @@ static int rtl8152_probe(struct usb_inte + if (version == RTL_VER_UNKNOWN) + return -ENODEV; + ++ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) ++ return -ENODEV; ++ + if (!rtl_vendor_mode(intf)) + return -ENODEV; + +@@ -9834,43 +9837,35 @@ static void rtl8152_disconnect(struct us + } + } + +-#define REALTEK_USB_DEVICE(vend, prod) { \ +- USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC), \ +-}, \ +-{ \ +- USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_COMM, \ +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), \ +-} + + /* table of devices that work with this driver */ + static const struct usb_device_id rtl8152_table[] = { + /* Realtek */ +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156), ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8050) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8053) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8152) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) }, + + /* Microsoft */ +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e), +- REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387), +- REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041), +- REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff), +- REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601), ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) }, ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6) }, ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) }, ++ { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3069) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3082) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7205) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) }, ++ { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, ++ { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, ++ { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, + {} + }; + +@@ -9890,7 +9885,61 @@ static struct usb_driver rtl8152_driver + .disable_hub_initiated_lpm = 1, + }; + +-module_usb_driver(rtl8152_driver); ++static int rtl8152_cfgselector_probe(struct usb_device *udev) ++{ ++ struct usb_host_config *c; ++ int i, num_configs; ++ ++ /* The vendor mode is not always config #1, so to find it out. */ ++ c = udev->config; ++ num_configs = udev->descriptor.bNumConfigurations; ++ for (i = 0; i < num_configs; (i++, c++)) { ++ struct usb_interface_descriptor *desc = NULL; ++ ++ if (!c->desc.bNumInterfaces) ++ continue; ++ desc = &c->intf_cache[0]->altsetting->desc; ++ if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) ++ break; ++ } ++ ++ if (i == num_configs) ++ return -ENODEV; ++ ++ if (usb_set_configuration(udev, c->desc.bConfigurationValue)) { ++ dev_err(&udev->dev, "Failed to set configuration %d\n", ++ c->desc.bConfigurationValue); ++ return -ENODEV; ++ } ++ ++ return 0; ++} ++ ++static struct usb_device_driver rtl8152_cfgselector_driver = { ++ .name = MODULENAME "-cfgselector", ++ .probe = rtl8152_cfgselector_probe, ++ .id_table = rtl8152_table, ++ .generic_subclass = 1, ++}; ++ ++static int __init rtl8152_driver_init(void) ++{ ++ int ret; ++ ++ ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE); ++ if (ret) ++ return ret; ++ return usb_register(&rtl8152_driver); ++} ++ ++static void __exit rtl8152_driver_exit(void) ++{ ++ usb_deregister(&rtl8152_driver); ++ usb_deregister_device_driver(&rtl8152_cfgselector_driver); ++} ++ ++module_init(rtl8152_driver_init); ++module_exit(rtl8152_driver_exit); + + MODULE_AUTHOR(DRIVER_AUTHOR); + MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/target/linux/generic/backport-5.15/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch b/target/linux/generic/backport-5.15/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch new file mode 100644 index 00000000000000..2b3272cebd0149 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch @@ -0,0 +1,158 @@ +From 69649ef8405320f81497f4757faac8234f61b167 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Fri, 6 Jan 2023 17:07:39 +0100 +Subject: [PATCH] cdc_ether: no need to blacklist any r8152 devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The r8152 driver does not need this anymore. + +Dropping blacklist entries adds optional support for these +devices in ECM mode. + +The 8153 devices are handled by the r8153_ecm driver when +in ECM mode, and must still be blacklisted here. + +Signed-off-by: Bjørn Mork +Signed-off-by: David S. Miller +--- + drivers/net/usb/cdc_ether.c | 114 ------------------------------------ + 1 file changed, 114 deletions(-) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -767,13 +767,6 @@ static const struct usb_device_id produc + .driver_info = 0, + }, + +-/* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- + /* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */ + { + USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM, +@@ -781,119 +774,12 @@ static const struct usb_device_id produc + .driver_info = 0, + }, + +-/* Samsung USB Ethernet Adapters */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-#if IS_ENABLED(CONFIG_USB_RTL8152) +-/* Linksys USB3GIGV1 Ethernet Adapter */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +-#endif +- +-/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3054, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad USB-C Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad Thunderbolt 3 Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3069, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo USB C to Ethernet Adapter (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x720c, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo USB-C Travel Hub (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7214, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- + /* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */ + { + USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info = 0, + }, +- +-/* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface 2 dock (based on Realtek RTL8152) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07ab, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, + + /* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */ + { diff --git a/target/linux/generic/backport-5.15/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch b/target/linux/generic/backport-5.15/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch new file mode 100644 index 00000000000000..8bbf0be802be18 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch @@ -0,0 +1,64 @@ +From 0d4cda805a183bbe523f2407edb5c14ade50b841 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 17 Jan 2023 11:03:44 +0800 +Subject: [PATCH] r8152: avoid to change cfg for all devices + +The rtl8152_cfgselector_probe() should set the USB configuration to the +vendor mode only for the devices which the driver (r8152) supports. +Otherwise, no driver would be used for such devices. + +Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection") +Signed-off-by: Hayes Wang +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9531,9 +9531,8 @@ static int rtl_fw_init(struct r8152 *tp) + return 0; + } + +-u8 rtl8152_get_version(struct usb_interface *intf) ++static u8 __rtl_get_hw_ver(struct usb_device *udev) + { +- struct usb_device *udev = interface_to_usbdev(intf); + u32 ocp_data = 0; + __le32 *tmp; + u8 version; +@@ -9603,10 +9602,19 @@ u8 rtl8152_get_version(struct usb_interf + break; + default: + version = RTL_VER_UNKNOWN; +- dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); ++ dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data); + break; + } + ++ return version; ++} ++ ++u8 rtl8152_get_version(struct usb_interface *intf) ++{ ++ u8 version; ++ ++ version = __rtl_get_hw_ver(interface_to_usbdev(intf)); ++ + dev_dbg(&intf->dev, "Detected version 0x%04x\n", version); + + return version; +@@ -9890,6 +9898,12 @@ static int rtl8152_cfgselector_probe(str + struct usb_host_config *c; + int i, num_configs; + ++ /* Switch the device to vendor mode, if and only if the vendor mode ++ * driver supports it. ++ */ ++ if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN) ++ return 0; ++ + /* The vendor mode is not always config #1, so to find it out. */ + c = udev->config; + num_configs = udev->descriptor.bNumConfigurations; diff --git a/target/linux/generic/backport-5.15/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch b/target/linux/generic/backport-5.15/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch new file mode 100644 index 00000000000000..c9bd0df202fbf8 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch @@ -0,0 +1,71 @@ +From 95a4c1d617b92cdc4522297741b56e8f6cd01a1e Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Thu, 19 Jan 2023 15:40:42 +0800 +Subject: [PATCH] r8152: remove rtl_vendor_mode function + +After commit ec51fbd1b8a2 ("r8152: add USB device driver for +config selection"), the code about changing USB configuration +in rtl_vendor_mode() wouldn't be run anymore. Therefore, the +function could be removed. + +Signed-off-by: Hayes Wang +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 39 +-------------------------------------- + 1 file changed, 1 insertion(+), 38 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -8267,43 +8267,6 @@ static bool rtl_check_vendor_ok(struct u + return true; + } + +-static bool rtl_vendor_mode(struct usb_interface *intf) +-{ +- struct usb_host_interface *alt = intf->cur_altsetting; +- struct usb_device *udev; +- struct usb_host_config *c; +- int i, num_configs; +- +- if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) +- return rtl_check_vendor_ok(intf); +- +- /* The vendor mode is not always config #1, so to find it out. */ +- udev = interface_to_usbdev(intf); +- c = udev->config; +- num_configs = udev->descriptor.bNumConfigurations; +- if (num_configs < 2) +- return false; +- +- for (i = 0; i < num_configs; (i++, c++)) { +- struct usb_interface_descriptor *desc = NULL; +- +- if (c->desc.bNumInterfaces > 0) +- desc = &c->intf_cache[0]->altsetting->desc; +- else +- continue; +- +- if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) { +- usb_driver_set_configuration(udev, c->desc.bConfigurationValue); +- break; +- } +- } +- +- if (i == num_configs) +- dev_err(&intf->dev, "Unexpected Device\n"); +- +- return false; +-} +- + static int rtl8152_pre_reset(struct usb_interface *intf) + { + struct r8152 *tp = usb_get_intfdata(intf); +@@ -9636,7 +9599,7 @@ static int rtl8152_probe(struct usb_inte + if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) + return -ENODEV; + +- if (!rtl_vendor_mode(intf)) ++ if (!rtl_check_vendor_ok(intf)) + return -ENODEV; + + usb_reset_device(udev); diff --git a/target/linux/generic/backport-5.15/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch b/target/linux/generic/backport-5.15/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch new file mode 100644 index 00000000000000..7d1053aea5a960 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch @@ -0,0 +1,46 @@ +From 02767440e1dda9861a11ca1dbe0f19a760b1d5c2 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Thu, 19 Jan 2023 15:40:43 +0800 +Subject: [PATCH] r8152: reduce the control transfer of rtl8152_get_version() + +Reduce the control transfer by moving calling rtl8152_get_version() in +rtl8152_probe(). This could prevent from calling rtl8152_get_version() +for unnecessary situations. For example, after setting config #2 for the +device, there are two interfaces and rtl8152_probe() may be called +twice. However, we don't need to call rtl8152_get_version() for this +situation. + +Signed-off-by: Hayes Wang +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9588,20 +9588,21 @@ static int rtl8152_probe(struct usb_inte + const struct usb_device_id *id) + { + struct usb_device *udev = interface_to_usbdev(intf); +- u8 version = rtl8152_get_version(intf); + struct r8152 *tp; + struct net_device *netdev; ++ u8 version; + int ret; + +- if (version == RTL_VER_UNKNOWN) +- return -ENODEV; +- + if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) + return -ENODEV; + + if (!rtl_check_vendor_ok(intf)) + return -ENODEV; + ++ version = rtl8152_get_version(intf); ++ if (version == RTL_VER_UNKNOWN) ++ return -ENODEV; ++ + usb_reset_device(udev); + netdev = alloc_etherdev(sizeof(struct r8152)); + if (!netdev) { diff --git a/target/linux/generic/backport-5.15/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch b/target/linux/generic/backport-5.15/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch new file mode 100644 index 00000000000000..5d1dfe3aef17fd --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch @@ -0,0 +1,55 @@ +From 5cc33f139e11b893ff6dc60d8a0ae865a65521ac Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Thu, 6 Apr 2023 17:14:26 -0700 +Subject: [PATCH] r8152: Add __GFP_NOWARN to big allocations + +When memory is a little tight on my system, it's pretty easy to see +warnings that look like this. + + ksoftirqd/0: page allocation failure: order:3, mode:0x40a20(GFP_ATOMIC|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0 + ... + Call trace: + dump_backtrace+0x0/0x1e8 + show_stack+0x20/0x2c + dump_stack_lvl+0x60/0x78 + dump_stack+0x18/0x38 + warn_alloc+0x104/0x174 + __alloc_pages+0x588/0x67c + alloc_rx_agg+0xa0/0x190 [r8152 ...] + r8152_poll+0x270/0x760 [r8152 ...] + __napi_poll+0x44/0x1ec + net_rx_action+0x100/0x300 + __do_softirq+0xec/0x38c + run_ksoftirqd+0x38/0xec + smpboot_thread_fn+0xb8/0x248 + kthread+0x134/0x154 + ret_from_fork+0x10/0x20 + +On a fragmented system it's normal that order 3 allocations will +sometimes fail, especially atomic ones. The driver handles these +failures fine and the WARN just creates spam in the logs for this +case. The __GFP_NOWARN flag is exactly for this situation, so add it +to the allocation. + +NOTE: my testing is on a 5.15 system, but there should be no reason +that this would be fundamentally different on a mainline kernel. + +Signed-off-by: Douglas Anderson +Acked-by: Hayes Wang +Link: https://lore.kernel.org/r/20230406171411.1.I84dbef45786af440fd269b71e9436a96a8e7a152@changeid +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -1944,7 +1944,7 @@ static struct rx_agg *alloc_rx_agg(struc + if (!rx_agg) + return NULL; + +- rx_agg->page = alloc_pages(mflags | __GFP_COMP, order); ++ rx_agg->page = alloc_pages(mflags | __GFP_COMP | __GFP_NOWARN, order); + if (!rx_agg->page) + goto free_rx; + diff --git a/target/linux/generic/backport-5.15/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch b/target/linux/generic/backport-5.15/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch new file mode 100644 index 00000000000000..df881e26083933 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch @@ -0,0 +1,24 @@ +From 0fbd79c01a9a657348f7032df70c57a406468c86 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 2 May 2023 11:36:27 +0800 +Subject: [PATCH] r8152: fix the autosuspend doesn't work + +Set supports_autosuspend = 1 for the rtl8152_cfgselector_driver. + +Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection") +Signed-off-by: Hayes Wang +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9898,6 +9898,7 @@ static struct usb_device_driver rtl8152_ + .probe = rtl8152_cfgselector_probe, + .id_table = rtl8152_table, + .generic_subclass = 1, ++ .supports_autosuspend = 1, + }; + + static int __init rtl8152_driver_init(void) diff --git a/target/linux/generic/backport-5.15/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch b/target/linux/generic/backport-5.15/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch new file mode 100644 index 00000000000000..0da1a5b7cf7797 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch @@ -0,0 +1,70 @@ +From 57df0fb9d511f91202114813e90128d65c0589f0 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Wed, 26 Jul 2023 11:08:07 +0800 +Subject: [PATCH] r8152: adjust generic_ocp_write function + +Reduce the control transfer if all bytes of first or the last DWORD are +written. + +The original method is to split the control transfer into three parts +(the first DWORD, middle continuous data, and the last DWORD). However, +they could be combined if whole bytes of the first DWORD or last DWORD +are written. That is, the first DWORD or the last DWORD could be combined +with the middle continuous data, if the byte_en is 0xff. + +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230726030808.9093-418-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -1310,16 +1310,24 @@ static int generic_ocp_write(struct r815 + byteen_end = byteen & BYTE_EN_END_MASK; + + byen = byteen_start | (byteen_start << 4); +- ret = set_registers(tp, index, type | byen, 4, data); +- if (ret < 0) +- goto error1; +- +- index += 4; +- data += 4; +- size -= 4; + +- if (size) { ++ /* Split the first DWORD if the byte_en is not 0xff */ ++ if (byen != BYTE_EN_DWORD) { ++ ret = set_registers(tp, index, type | byen, 4, data); ++ if (ret < 0) ++ goto error1; ++ ++ index += 4; ++ data += 4; + size -= 4; ++ } ++ ++ if (size) { ++ byen = byteen_end | (byteen_end >> 4); ++ ++ /* Split the last DWORD if the byte_en is not 0xff */ ++ if (byen != BYTE_EN_DWORD) ++ size -= 4; + + while (size) { + if (size > limit) { +@@ -1346,10 +1354,9 @@ static int generic_ocp_write(struct r815 + } + } + +- byen = byteen_end | (byteen_end >> 4); +- ret = set_registers(tp, index, type | byen, 4, data); +- if (ret < 0) +- goto error1; ++ /* Set the last DWORD */ ++ if (byen != BYTE_EN_DWORD) ++ ret = set_registers(tp, index, type | byen, 4, data); + } + + error1: diff --git a/target/linux/generic/backport-5.15/795-v6.6-09-r8152-set-bp-in-bulk.patch b/target/linux/generic/backport-5.15/795-v6.6-09-r8152-set-bp-in-bulk.patch new file mode 100644 index 00000000000000..cfc31daf12628c --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-09-r8152-set-bp-in-bulk.patch @@ -0,0 +1,129 @@ +From e5c266a61186b462c388c53a3564c375e72f2244 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Wed, 26 Jul 2023 11:08:08 +0800 +Subject: [PATCH] r8152: set bp in bulk + +PLA_BP_0 ~ PLA_BP_15 (0xfc28 ~ 0xfc46) are continuous registers, so we +could combine the control transfers into one control transfer. + +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230726030808.9093-419-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 75 ++++++++++++++--------------------------- + 1 file changed, 25 insertions(+), 50 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -3977,29 +3977,10 @@ static void rtl_reset_bmu(struct r8152 * + /* Clear the bp to stop the firmware before loading a new one */ + static void rtl_clear_bp(struct r8152 *tp, u16 type) + { +- switch (tp->version) { +- case RTL_VER_01: +- case RTL_VER_02: +- case RTL_VER_07: +- break; +- case RTL_VER_03: +- case RTL_VER_04: +- case RTL_VER_05: +- case RTL_VER_06: +- ocp_write_byte(tp, type, PLA_BP_EN, 0); +- break; +- case RTL_VER_14: +- ocp_write_word(tp, type, USB_BP2_EN, 0); ++ u16 bp[16] = {0}; ++ u16 bp_num; + +- ocp_write_word(tp, type, USB_BP_8, 0); +- ocp_write_word(tp, type, USB_BP_9, 0); +- ocp_write_word(tp, type, USB_BP_10, 0); +- ocp_write_word(tp, type, USB_BP_11, 0); +- ocp_write_word(tp, type, USB_BP_12, 0); +- ocp_write_word(tp, type, USB_BP_13, 0); +- ocp_write_word(tp, type, USB_BP_14, 0); +- ocp_write_word(tp, type, USB_BP_15, 0); +- break; ++ switch (tp->version) { + case RTL_VER_08: + case RTL_VER_09: + case RTL_VER_10: +@@ -4007,32 +3988,31 @@ static void rtl_clear_bp(struct r8152 *t + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: +- default: + if (type == MCU_TYPE_USB) { + ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0); +- +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_10, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_11, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_12, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_13, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_14, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_15, 0); +- } else { +- ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0); ++ bp_num = 16; ++ break; + } ++ fallthrough; ++ case RTL_VER_03: ++ case RTL_VER_04: ++ case RTL_VER_05: ++ case RTL_VER_06: ++ ocp_write_byte(tp, type, PLA_BP_EN, 0); ++ fallthrough; ++ case RTL_VER_01: ++ case RTL_VER_02: ++ case RTL_VER_07: ++ bp_num = 8; ++ break; ++ case RTL_VER_14: ++ default: ++ ocp_write_word(tp, type, USB_BP2_EN, 0); ++ bp_num = 16; + break; + } + +- ocp_write_word(tp, type, PLA_BP_0, 0); +- ocp_write_word(tp, type, PLA_BP_1, 0); +- ocp_write_word(tp, type, PLA_BP_2, 0); +- ocp_write_word(tp, type, PLA_BP_3, 0); +- ocp_write_word(tp, type, PLA_BP_4, 0); +- ocp_write_word(tp, type, PLA_BP_5, 0); +- ocp_write_word(tp, type, PLA_BP_6, 0); +- ocp_write_word(tp, type, PLA_BP_7, 0); ++ generic_ocp_write(tp, PLA_BP_0, BYTE_EN_DWORD, bp_num << 1, bp, type); + + /* wait 3 ms to make sure the firmware is stopped */ + usleep_range(3000, 6000); +@@ -5009,10 +4989,9 @@ static void rtl8152_fw_phy_nc_apply(stru + + static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac) + { +- u16 bp_en_addr, bp_index, type, bp_num, fw_ver_reg; ++ u16 bp_en_addr, type, fw_ver_reg; + u32 length; + u8 *data; +- int i; + + switch (__le32_to_cpu(mac->blk_hdr.type)) { + case RTL_FW_PLA: +@@ -5054,12 +5033,8 @@ static void rtl8152_fw_mac_apply(struct + ocp_write_word(tp, type, __le16_to_cpu(mac->bp_ba_addr), + __le16_to_cpu(mac->bp_ba_value)); + +- bp_index = __le16_to_cpu(mac->bp_start); +- bp_num = __le16_to_cpu(mac->bp_num); +- for (i = 0; i < bp_num; i++) { +- ocp_write_word(tp, type, bp_index, __le16_to_cpu(mac->bp[i])); +- bp_index += 2; +- } ++ generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD, ++ __le16_to_cpu(mac->bp_num) << 1, mac->bp, type); + + bp_en_addr = __le16_to_cpu(mac->bp_en_addr); + if (bp_en_addr) diff --git a/target/linux/generic/backport-5.15/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch b/target/linux/generic/backport-5.15/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch new file mode 100644 index 00000000000000..4d1b177ff204c4 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch @@ -0,0 +1,39 @@ +From 72f93a3136ee18fd59fa6579f84c07e93424681e Mon Sep 17 00:00:00 2001 +From: Antonio Napolitano +Date: Sat, 26 Aug 2023 01:05:50 +0200 +Subject: [PATCH] r8152: add vendor/device ID pair for D-Link DUB-E250 + +The D-Link DUB-E250 is an RTL8156 based 2.5G Ethernet controller. + +Add the vendor and product ID values to the driver. This makes Ethernet +work with the adapter. + +Signed-off-by: Antonio Napolitano +Link: https://lore.kernel.org/r/CV200KJEEUPC.WPKAHXCQJ05I@mercurius +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 1 + + include/linux/usb/r8152.h | 1 + + 2 files changed, 2 insertions(+) + + +--- a/include/linux/usb/r8152.h ++++ b/include/linux/usb/r8152.h +@@ -29,6 +29,7 @@ + #define VENDOR_ID_LINKSYS 0x13b1 + #define VENDOR_ID_NVIDIA 0x0955 + #define VENDOR_ID_TPLINK 0x2357 ++#define VENDOR_ID_DLINK 0x2001 + + #if IS_REACHABLE(CONFIG_USB_RTL8152) + extern u8 rtl8152_get_version(struct usb_interface *intf); +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9820,6 +9820,7 @@ static const struct usb_device_id rtl815 + { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, + { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, + { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, ++ { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) }, + {} + }; + diff --git a/target/linux/generic/backport-5.15/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch b/target/linux/generic/backport-5.15/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch new file mode 100644 index 00000000000000..4f0e0e1c658130 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch @@ -0,0 +1,447 @@ +From 715f67f33af45ce2cc3a5b1ef133cc8c8e7787b0 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Fri, 20 Oct 2023 14:06:58 -0700 +Subject: [PATCH] r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE + +Whenever the RTL8152_UNPLUG is set that just tells the driver that all +accesses will fail and we should just immediately bail. A future patch +will use this same concept at a time when the driver hasn't actually +been unplugged but is about to be reset. Rename the flag in +preparation for the future patch. + +This is a no-op change and just a search and replace. + +Signed-off-by: Douglas Anderson +Reviewed-by: Grant Grundler +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 96 ++++++++++++++++++++--------------------- + 1 file changed, 48 insertions(+), 48 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -763,7 +763,7 @@ enum rtl_register_content { + + /* rtl8152 flags */ + enum rtl8152_flags { +- RTL8152_UNPLUG = 0, ++ RTL8152_INACCESSIBLE = 0, + RTL8152_SET_RX_MODE, + WORK_ENABLE, + RTL8152_LINK_CHG, +@@ -1241,7 +1241,7 @@ int set_registers(struct r8152 *tp, u16 + static void rtl_set_unplug(struct r8152 *tp) + { + if (tp->udev->state == USB_STATE_NOTATTACHED) { +- set_bit(RTL8152_UNPLUG, &tp->flags); ++ set_bit(RTL8152_INACCESSIBLE, &tp->flags); + smp_mb__after_atomic(); + } + } +@@ -1252,7 +1252,7 @@ static int generic_ocp_read(struct r8152 + u16 limit = 64; + int ret = 0; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + /* both size and indix must be 4 bytes align */ +@@ -1296,7 +1296,7 @@ static int generic_ocp_write(struct r815 + u16 byteen_start, byteen_end, byen; + u16 limit = 512; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + /* both size and indix must be 4 bytes align */ +@@ -1533,7 +1533,7 @@ static int read_mii_word(struct net_devi + struct r8152 *tp = netdev_priv(netdev); + int ret; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + if (phy_id != R8152_PHY_ID) +@@ -1549,7 +1549,7 @@ void write_mii_word(struct net_device *n + { + struct r8152 *tp = netdev_priv(netdev); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (phy_id != R8152_PHY_ID) +@@ -1754,7 +1754,7 @@ static void read_bulk_callback(struct ur + if (!tp) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!test_bit(WORK_ENABLE, &tp->flags)) +@@ -1846,7 +1846,7 @@ static void write_bulk_callback(struct u + if (!test_bit(WORK_ENABLE, &tp->flags)) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!skb_queue_empty(&tp->tx_queue)) +@@ -1867,7 +1867,7 @@ static void intr_callback(struct urb *ur + if (!test_bit(WORK_ENABLE, &tp->flags)) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + switch (status) { +@@ -2611,7 +2611,7 @@ static void bottom_half(struct tasklet_s + { + struct r8152 *tp = from_tasklet(tp, t, tx_tl); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!test_bit(WORK_ENABLE, &tp->flags)) +@@ -2654,7 +2654,7 @@ int r8152_submit_rx(struct r8152 *tp, st + int ret; + + /* The rx would be stopped, so skip submitting */ +- if (test_bit(RTL8152_UNPLUG, &tp->flags) || ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || + !test_bit(WORK_ENABLE, &tp->flags) || !netif_carrier_ok(tp->netdev)) + return 0; + +@@ -3050,7 +3050,7 @@ static int rtl_enable(struct r8152 *tp) + + static int rtl8152_enable(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -3137,7 +3137,7 @@ static int rtl8153_enable(struct r8152 * + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -3169,7 +3169,7 @@ static void rtl_disable(struct r8152 *tp + u32 ocp_data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -3623,7 +3623,7 @@ static u16 r8153_phy_status(struct r8152 + } + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -3655,7 +3655,7 @@ static void r8153b_ups_en(struct r8152 * + int i; + + for (i = 0; i < 500; i++) { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & + AUTOLOAD_DONE) +@@ -3697,7 +3697,7 @@ static void r8153c_ups_en(struct r8152 * + int i; + + for (i = 0; i < 500; i++) { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & + AUTOLOAD_DONE) +@@ -4042,8 +4042,8 @@ static int rtl_phy_patch_request(struct + for (i = 0; wait && i < 5000; i++) { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) +- break; ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) ++ return -ENODEV; + + usleep_range(1000, 2000); + ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT); +@@ -6001,7 +6001,7 @@ static int rtl8156_enable(struct r8152 * + u32 ocp_data; + u16 speed; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + r8156_fc_parameter(tp); +@@ -6059,7 +6059,7 @@ static int rtl8156b_enable(struct r8152 + u32 ocp_data; + u16 speed; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -6245,7 +6245,7 @@ out: + + static void rtl8152_up(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8152_aldps_en(tp, false); +@@ -6255,7 +6255,7 @@ static void rtl8152_up(struct r8152 *tp) + + static void rtl8152_down(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6270,7 +6270,7 @@ static void rtl8153_up(struct r8152 *tp) + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_u1u2en(tp, false); +@@ -6310,7 +6310,7 @@ static void rtl8153_down(struct r8152 *t + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6331,7 +6331,7 @@ static void rtl8153b_up(struct r8152 *tp + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6355,7 +6355,7 @@ static void rtl8153b_down(struct r8152 * + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6392,7 +6392,7 @@ static void rtl8153c_up(struct r8152 *tp + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6473,7 +6473,7 @@ static void rtl8156_up(struct r8152 *tp) + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6546,7 +6546,7 @@ static void rtl8156_down(struct r8152 *t + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6684,7 +6684,7 @@ static void rtl_work_func_t(struct work_ + /* If the device is unplugged or !netif_running(), the workqueue + * doesn't need to wake the device, and could return directly. + */ +- if (test_bit(RTL8152_UNPLUG, &tp->flags) || !netif_running(tp->netdev)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || !netif_running(tp->netdev)) + return; + + if (usb_autopm_get_interface(tp->intf) < 0) +@@ -6723,7 +6723,7 @@ static void rtl_hw_phy_work_func_t(struc + { + struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (usb_autopm_get_interface(tp->intf) < 0) +@@ -6850,7 +6850,7 @@ static int rtl8152_close(struct net_devi + netif_stop_queue(netdev); + + res = usb_autopm_get_interface(tp->intf); +- if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (res < 0 || test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + rtl_stop_rx(tp); + } else { +@@ -6883,7 +6883,7 @@ static void r8152b_init(struct r8152 *tp + u32 ocp_data; + u16 data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + data = r8152_mdio_read(tp, MII_BMCR); +@@ -6927,7 +6927,7 @@ static void r8153_init(struct r8152 *tp) + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_u1u2en(tp, false); +@@ -6938,7 +6938,7 @@ static void r8153_init(struct r8152 *tp) + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -7067,7 +7067,7 @@ static void r8153b_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -7078,7 +7078,7 @@ static void r8153b_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -7149,7 +7149,7 @@ static void r8153c_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -7169,7 +7169,7 @@ static void r8153c_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -7998,7 +7998,7 @@ static void r8156_init(struct r8152 *tp) + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); +@@ -8019,7 +8019,7 @@ static void r8156_init(struct r8152 *tp) + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -8094,7 +8094,7 @@ static void r8156b_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); +@@ -8128,7 +8128,7 @@ static void r8156b_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -9153,7 +9153,7 @@ static int rtl8152_ioctl(struct net_devi + struct mii_ioctl_data *data = if_mii(rq); + int res; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + res = usb_autopm_get_interface(tp->intf); +@@ -9255,7 +9255,7 @@ static const struct net_device_ops rtl81 + + static void rtl8152_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (tp->version != RTL_VER_01) +@@ -9264,7 +9264,7 @@ static void rtl8152_unload(struct r8152 + + static void rtl8153_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_power_cut_en(tp, false); +@@ -9272,7 +9272,7 @@ static void rtl8153_unload(struct r8152 + + static void rtl8153b_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_power_cut_en(tp, false); diff --git a/target/linux/generic/backport-5.15/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch b/target/linux/generic/backport-5.15/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch new file mode 100644 index 00000000000000..0ce8206657a8e2 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch @@ -0,0 +1,398 @@ +From d9962b0d42029bcb40fe3c38bce06d1870fa4df4 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Fri, 20 Oct 2023 14:06:59 -0700 +Subject: [PATCH] r8152: Block future register access if register access fails + +Even though the functions to read/write registers can fail, most of +the places in the r8152 driver that read/write register values don't +check error codes. The lack of error code checking is problematic in +at least two ways. + +The first problem is that the r8152 driver often uses code patterns +similar to this: + x = read_register() + x = x | SOME_BIT; + write_register(x); + +...with the above pattern, if the read_register() fails and returns +garbage then we'll end up trying to write modified garbage back to the +Realtek adapter. If the write_register() succeeds that's bad. Note +that as of commit f53a7ad18959 ("r8152: Set memory to all 0xFFs on +failed reg reads") the "garbage" returned by read_register() will at +least be consistent garbage, but it is still garbage. + +It turns out that this problem is very serious. Writing garbage to +some of the hardware registers on the Ethernet adapter can put the +adapter in such a bad state that it needs to be power cycled (fully +unplugged and plugged in again) before it can enumerate again. + +The second problem is that the r8152 driver generally has functions +that are long sequences of register writes. Assuming everything will +be OK if a random register write fails in the middle isn't a great +assumption. + +One might wonder if the above two problems are real. You could ask if +we would really have a successful write after a failed read. It turns +out that the answer appears to be "yes, this can happen". In fact, +we've seen at least two distinct failure modes where this happens. + +On a sc7180-trogdor Chromebook if you drop into kdb for a while and +then resume, you can see: +1. We get a "Tx timeout" +2. The "Tx timeout" queues up a USB reset. +3. In rtl8152_pre_reset() we try to reinit the hardware. +4. The first several (2-9) register accesses fail with a timeout, then + things recover. + +The above test case was actually fixed by the patch ("r8152: Increase +USB control msg timeout to 5000ms as per spec") but at least shows +that we really can see successful calls after failed ones. + +On a different (AMD) based Chromebook with a particular adapter, we +found that during reboot tests we'd also sometimes get a transitory +failure. In this case we saw -EPIPE being returned sometimes. Retrying +worked, but retrying is not always safe for all register accesses +since reading/writing some registers might have side effects (like +registers that clear on read). + +Let's fully lock out all register access if a register access fails. +When we do this, we'll try to queue up a USB reset and try to unlock +register access after the reset. This is slightly tricker than it +sounds since the r8152 driver has an optimized reset sequence that +only works reliably after probe happens. In order to handle this, we +avoid the optimized reset if probe didn't finish. Instead, we simply +retry the probe routine in this case. + +When locking out access, we'll use the existing infrastructure that +the driver was using when it detected we were unplugged. This keeps us +from getting stuck in delay loops in some parts of the driver. + +Signed-off-by: Douglas Anderson +Reviewed-by: Grant Grundler +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 207 ++++++++++++++++++++++++++++++++++------ + 1 file changed, 176 insertions(+), 31 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -772,6 +772,9 @@ enum rtl8152_flags { + SCHEDULE_TASKLET, + GREEN_ETHERNET, + RX_EPROTO, ++ IN_PRE_RESET, ++ PROBED_WITH_NO_ERRORS, ++ PROBE_SHOULD_RETRY, + }; + + #define DEVICE_ID_THINKPAD_ONELINK_PLUS_DOCK 0x3054 +@@ -949,6 +952,8 @@ struct r8152 { + u8 version; + u8 duplex; + u8 autoneg; ++ ++ unsigned int reg_access_reset_count; + }; + + /** +@@ -1196,6 +1201,96 @@ static unsigned int agg_buf_sz = 16384; + + #define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc)) + ++/* If register access fails then we block access and issue a reset. If this ++ * happens too many times in a row without a successful access then we stop ++ * trying to reset and just leave access blocked. ++ */ ++#define REGISTER_ACCESS_MAX_RESETS 3 ++ ++static void rtl_set_inaccessible(struct r8152 *tp) ++{ ++ set_bit(RTL8152_INACCESSIBLE, &tp->flags); ++ smp_mb__after_atomic(); ++} ++ ++static void rtl_set_accessible(struct r8152 *tp) ++{ ++ clear_bit(RTL8152_INACCESSIBLE, &tp->flags); ++ smp_mb__after_atomic(); ++} ++ ++static ++int r8152_control_msg(struct r8152 *tp, unsigned int pipe, __u8 request, ++ __u8 requesttype, __u16 value, __u16 index, void *data, ++ __u16 size, const char *msg_tag) ++{ ++ struct usb_device *udev = tp->udev; ++ int ret; ++ ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) ++ return -ENODEV; ++ ++ ret = usb_control_msg(udev, pipe, request, requesttype, ++ value, index, data, size, ++ USB_CTRL_GET_TIMEOUT); ++ ++ /* No need to issue a reset to report an error if the USB device got ++ * unplugged; just return immediately. ++ */ ++ if (ret == -ENODEV) ++ return ret; ++ ++ /* If the write was successful then we're done */ ++ if (ret >= 0) { ++ tp->reg_access_reset_count = 0; ++ return ret; ++ } ++ ++ dev_err(&udev->dev, ++ "Failed to %s %d bytes at %#06x/%#06x (%d)\n", ++ msg_tag, size, value, index, ret); ++ ++ /* Block all future register access until we reset. Much of the code ++ * in the driver doesn't check for errors. Notably, many parts of the ++ * driver do a read/modify/write of a register value without ++ * confirming that the read succeeded. Writing back modified garbage ++ * like this can fully wedge the adapter, requiring a power cycle. ++ */ ++ rtl_set_inaccessible(tp); ++ ++ /* If probe hasn't yet finished, then we'll request a retry of the ++ * whole probe routine if we get any control transfer errors. We ++ * never have to clear this bit since we free/reallocate the whole "tp" ++ * structure if we retry probe. ++ */ ++ if (!test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) { ++ set_bit(PROBE_SHOULD_RETRY, &tp->flags); ++ return ret; ++ } ++ ++ /* Failing to access registers in pre-reset is not surprising since we ++ * wouldn't be resetting if things were behaving normally. The register ++ * access we do in pre-reset isn't truly mandatory--we're just reusing ++ * the disable() function and trying to be nice by powering the ++ * adapter down before resetting it. Thus, if we're in pre-reset, ++ * we'll return right away and not try to queue up yet another reset. ++ * We know the post-reset is already coming. ++ */ ++ if (test_bit(IN_PRE_RESET, &tp->flags)) ++ return ret; ++ ++ if (tp->reg_access_reset_count < REGISTER_ACCESS_MAX_RESETS) { ++ usb_queue_reset_device(tp->intf); ++ tp->reg_access_reset_count++; ++ } else if (tp->reg_access_reset_count == REGISTER_ACCESS_MAX_RESETS) { ++ dev_err(&udev->dev, ++ "Tried to reset %d times; giving up.\n", ++ REGISTER_ACCESS_MAX_RESETS); ++ } ++ ++ return ret; ++} ++ + static + int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) + { +@@ -1206,9 +1301,10 @@ int get_registers(struct r8152 *tp, u16 + if (!tmp) + return -ENOMEM; + +- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_in, +- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, +- value, index, tmp, size, USB_CTRL_GET_TIMEOUT); ++ ret = r8152_control_msg(tp, tp->pipe_ctrl_in, ++ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, ++ value, index, tmp, size, "read"); ++ + if (ret < 0) + memset(data, 0xff, size); + else +@@ -1229,9 +1325,9 @@ int set_registers(struct r8152 *tp, u16 + if (!tmp) + return -ENOMEM; + +- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_out, +- RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, +- value, index, tmp, size, USB_CTRL_SET_TIMEOUT); ++ ret = r8152_control_msg(tp, tp->pipe_ctrl_out, ++ RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, ++ value, index, tmp, size, "write"); + + kfree(tmp); + +@@ -1240,10 +1336,8 @@ int set_registers(struct r8152 *tp, u16 + + static void rtl_set_unplug(struct r8152 *tp) + { +- if (tp->udev->state == USB_STATE_NOTATTACHED) { +- set_bit(RTL8152_INACCESSIBLE, &tp->flags); +- smp_mb__after_atomic(); +- } ++ if (tp->udev->state == USB_STATE_NOTATTACHED) ++ rtl_set_inaccessible(tp); + } + + static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, +@@ -8254,7 +8348,7 @@ static int rtl8152_pre_reset(struct usb_ + struct r8152 *tp = usb_get_intfdata(intf); + struct net_device *netdev; + +- if (!tp) ++ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) + return 0; + + netdev = tp->netdev; +@@ -8269,7 +8363,9 @@ static int rtl8152_pre_reset(struct usb_ + napi_disable(&tp->napi); + if (netif_carrier_ok(netdev)) { + mutex_lock(&tp->control); ++ set_bit(IN_PRE_RESET, &tp->flags); + tp->rtl_ops.disable(tp); ++ clear_bit(IN_PRE_RESET, &tp->flags); + mutex_unlock(&tp->control); + } + +@@ -8282,9 +8378,11 @@ static int rtl8152_post_reset(struct usb + struct net_device *netdev; + struct sockaddr sa; + +- if (!tp) ++ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) + return 0; + ++ rtl_set_accessible(tp); ++ + /* reset the MAC address in case of policy change */ + if (determine_ethernet_addr(tp, &sa) >= 0) { + rtnl_lock(); +@@ -9482,17 +9580,29 @@ static u8 __rtl_get_hw_ver(struct usb_de + __le32 *tmp; + u8 version; + int ret; ++ int i; + + tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); + if (!tmp) + return 0; + +- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), +- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, +- PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), +- USB_CTRL_GET_TIMEOUT); +- if (ret > 0) +- ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; ++ /* Retry up to 3 times in case there is a transitory error. We do this ++ * since retrying a read of the version is always safe and this ++ * function doesn't take advantage of r8152_control_msg(). ++ */ ++ for (i = 0; i < 3; i++) { ++ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), ++ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, ++ PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), ++ USB_CTRL_GET_TIMEOUT); ++ if (ret > 0) { ++ ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; ++ break; ++ } ++ } ++ ++ if (i != 0 && ret > 0) ++ dev_warn(&udev->dev, "Needed %d retries to read version\n", i); + + kfree(tmp); + +@@ -9566,25 +9676,14 @@ u8 rtl8152_get_version(struct usb_interf + } + EXPORT_SYMBOL_GPL(rtl8152_get_version); + +-static int rtl8152_probe(struct usb_interface *intf, +- const struct usb_device_id *id) ++static int rtl8152_probe_once(struct usb_interface *intf, ++ const struct usb_device_id *id, u8 version) + { + struct usb_device *udev = interface_to_usbdev(intf); + struct r8152 *tp; + struct net_device *netdev; +- u8 version; + int ret; + +- if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) +- return -ENODEV; +- +- if (!rtl_check_vendor_ok(intf)) +- return -ENODEV; +- +- version = rtl8152_get_version(intf); +- if (version == RTL_VER_UNKNOWN) +- return -ENODEV; +- + usb_reset_device(udev); + netdev = alloc_etherdev(sizeof(struct r8152)); + if (!netdev) { +@@ -9757,10 +9856,20 @@ static int rtl8152_probe(struct usb_inte + else + device_set_wakeup_enable(&udev->dev, false); + ++ /* If we saw a control transfer error while probing then we may ++ * want to try probe() again. Consider this an error. ++ */ ++ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags)) ++ goto out2; ++ ++ set_bit(PROBED_WITH_NO_ERRORS, &tp->flags); + netif_info(tp, probe, netdev, "%s\n", DRIVER_VERSION); + + return 0; + ++out2: ++ unregister_netdev(netdev); ++ + out1: + tasklet_kill(&tp->tx_tl); + cancel_delayed_work_sync(&tp->hw_phy_work); +@@ -9769,10 +9878,46 @@ out1: + rtl8152_release_firmware(tp); + usb_set_intfdata(intf, NULL); + out: ++ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags)) ++ ret = -EAGAIN; ++ + free_netdev(netdev); + return ret; + } + ++#define RTL8152_PROBE_TRIES 3 ++ ++static int rtl8152_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ u8 version; ++ int ret; ++ int i; ++ ++ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) ++ return -ENODEV; ++ ++ if (!rtl_check_vendor_ok(intf)) ++ return -ENODEV; ++ ++ version = rtl8152_get_version(intf); ++ if (version == RTL_VER_UNKNOWN) ++ return -ENODEV; ++ ++ for (i = 0; i < RTL8152_PROBE_TRIES; i++) { ++ ret = rtl8152_probe_once(intf, id, version); ++ if (ret != -EAGAIN) ++ break; ++ } ++ if (ret == -EAGAIN) { ++ dev_err(&intf->dev, ++ "r8152 failed probe after %d tries; giving up\n", i); ++ return -ENODEV; ++ } ++ ++ return ret; ++} ++ + static void rtl8152_disconnect(struct usb_interface *intf) + { + struct r8152 *tp = usb_get_intfdata(intf); diff --git a/target/linux/generic/backport-5.15/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch b/target/linux/generic/backport-5.15/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch new file mode 100644 index 00000000000000..42ca9e2ad1c886 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch @@ -0,0 +1,83 @@ +From 66eee612a1ba39f9a76a9ace4a34d012044767fb Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 26 Sep 2023 19:17:13 +0800 +Subject: [PATCH] r8152: break the loop when the budget is exhausted + +[ Upstream commit 2cf51f931797d9a47e75d999d0993a68cbd2a560 ] + +A bulk transfer of the USB may contain many packets. And, the total +number of the packets in the bulk transfer may be more than budget. + +Originally, only budget packets would be handled by napi_gro_receive(), +and the other packets would be queued in the driver for next schedule. + +This patch would break the loop about getting next bulk transfer, when +the budget is exhausted. That is, only the current bulk transfer would +be handled, and the other bulk transfers would be queued for next +schedule. Besides, the packets which are more than the budget in the +current bulk trasnfer would be still queued in the driver, as the +original method. + +In addition, a bulk transfer wouldn't contain more than 400 packets, so +the check of queue length is unnecessary. Therefore, I replace it with +WARN_ON_ONCE(). + +Fixes: cf74eb5a5bc8 ("eth: r8152: try to use a normal budget") +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230926111714.9448-433-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/usb/r8152.c | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -2539,7 +2539,7 @@ static int rx_bottom(struct r8152 *tp, i + } + } + +- if (list_empty(&tp->rx_done)) ++ if (list_empty(&tp->rx_done) || work_done >= budget) + goto out1; + + clear_bit(RX_EPROTO, &tp->flags); +@@ -2555,6 +2555,15 @@ static int rx_bottom(struct r8152 *tp, i + struct urb *urb; + u8 *rx_data; + ++ /* A bulk transfer of USB may contain may packets, so the ++ * total packets may more than the budget. Deal with all ++ * packets in current bulk transfer, and stop to handle the ++ * next bulk transfer until next schedule, if budget is ++ * exhausted. ++ */ ++ if (work_done >= budget) ++ break; ++ + list_del_init(cursor); + + agg = list_entry(cursor, struct rx_agg, list); +@@ -2574,9 +2583,7 @@ static int rx_bottom(struct r8152 *tp, i + unsigned int pkt_len, rx_frag_head_sz; + struct sk_buff *skb; + +- /* limit the skb numbers for rx_queue */ +- if (unlikely(skb_queue_len(&tp->rx_queue) >= 1000)) +- break; ++ WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000); + + pkt_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK; + if (pkt_len < ETH_ZLEN) +@@ -2654,9 +2661,10 @@ submit: + } + } + ++ /* Splice the remained list back to rx_done for next schedule */ + if (!list_empty(&rx_queue)) { + spin_lock_irqsave(&tp->rx_lock, flags); +- list_splice_tail(&rx_queue, &tp->rx_done); ++ list_splice(&rx_queue, &tp->rx_done); + spin_unlock_irqrestore(&tp->rx_lock, flags); + } + diff --git a/target/linux/generic/backport-5.15/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch b/target/linux/generic/backport-5.15/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch new file mode 100644 index 00000000000000..d578d0107fddc4 --- /dev/null +++ b/target/linux/generic/backport-5.15/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch @@ -0,0 +1,47 @@ +From 1b0fce8c8e69485e49a7d34aac3d4c2a2aa15d62 Mon Sep 17 00:00:00 2001 +From: Davide Tronchin +Date: Thu, 29 Jun 2023 12:37:36 +0200 +Subject: [PATCH] net: usb: cdc_ether: add u-blox 0x1313 composition. + +Add CDC-ECM support for LARA-R6 01B. + +The new LARA-R6 product variant identified by the "01B" string can be +configured (by AT interface) in three different USB modes: +* Default mode (Vendor ID: 0x1546 Product ID: 0x1311) with 4 serial +interfaces +* RmNet mode (Vendor ID: 0x1546 Product ID: 0x1312) with 4 serial +interfaces and 1 RmNet virtual network interface +* CDC-ECM mode (Vendor ID: 0x1546 Product ID: 0x1313) with 4 serial +interface and 1 CDC-ECM virtual network interface +The first 4 interfaces of all the 3 configurations (default, RmNet, ECM) +are the same. + +In CDC-ECM mode LARA-R6 01B exposes the following interfaces: +If 0: Diagnostic +If 1: AT parser +If 2: AT parser +If 3: AT parset/alternative functions +If 4: CDC-ECM interface + +Signed-off-by: Davide Tronchin +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/usb/cdc_ether.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -878,6 +878,12 @@ static const struct usb_device_id produc + USB_CDC_PROTO_NONE), + .driver_info = (unsigned long)&wwan_info, + }, { ++ /* U-blox LARA-R6 01B */ ++ USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1313, USB_CLASS_COMM, ++ USB_CDC_SUBCLASS_ETHERNET, ++ USB_CDC_PROTO_NONE), ++ .driver_info = (unsigned long)&wwan_info, ++}, { + /* ZTE modules */ + USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, diff --git a/target/linux/generic/backport-6.1/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch b/target/linux/generic/backport-6.1/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch new file mode 100644 index 00000000000000..605faeec035dfb --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-01-r8152-add-USB-device-driver-for-config-selection.patch @@ -0,0 +1,229 @@ +From ec51fbd1b8a2bca2948dede99c14ec63dc57ff6b Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Fri, 6 Jan 2023 17:07:38 +0100 +Subject: [PATCH] r8152: add USB device driver for config selection +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Subclassing the generic USB device driver to override the +default configuration selection regardless of matching interface +drivers. + +The r815x family devices expose a vendor specific function which +the r8152 interface driver wants to handle. This is the preferred +device mode. Additionally one or more USB class functions are +usually supported for hosts lacking a vendor specific driver. The +choice is USB configuration based, with one alternate function per +configuration. + +Example device with both NCM and ECM alternate cfgs: + +T: Bus=02 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 4 Spd=5000 MxCh= 0 +D: Ver= 3.20 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 9 #Cfgs= 3 +P: Vendor=0bda ProdID=8156 Rev=31.00 +S: Manufacturer=Realtek +S: Product=USB 10/100/1G/2.5G LAN +S: SerialNumber=001000001 +C:* #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=256mA +I:* If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=00 Driver=r8152 +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=83(I) Atr=03(Int.) MxPS= 2 Ivl=128ms +C: #Ifs= 2 Cfg#= 2 Atr=a0 MxPwr=256mA +I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=0d Prot=00 Driver= +E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms +I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=01 Driver= +I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=01 Driver= +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms +C: #Ifs= 2 Cfg#= 3 Atr=a0 MxPwr=256mA +I: If#= 0 Alt= 0 #EPs= 1 Cls=02(comm.) Sub=06 Prot=00 Driver= +E: Ad=83(I) Atr=03(Int.) MxPS= 16 Ivl=128ms +I: If#= 1 Alt= 0 #EPs= 0 Cls=0a(data ) Sub=00 Prot=00 Driver= +I: If#= 1 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver= +E: Ad=81(I) Atr=02(Bulk) MxPS=1024 Ivl=0ms +E: Ad=02(O) Atr=02(Bulk) MxPS=1024 Ivl=0ms + +A problem with this is that Linux will prefer class functions over +vendor specific functions. Using the above example, Linux defaults +to cfg #2, running the device in a sub-optimal NCM mode. + +Previously we've attempted to work around the problem by +blacklisting the devices in the ECM class driver "cdc_ether", and +matching on the ECM class function in the vendor specific interface +driver. The latter has been used to switch back to the vendor +specific configuration when the driver is probed for a class +function. + +This workaround has several issues; +- class driver blacklists is additional maintanence cruft in an + unrelated driver +- class driver blacklists prevents users from optionally running + the devices in class mode +- each device needs double match entries in the vendor driver +- the initial probing as a class function slows down device + discovery + +Now these issues have become even worse with the introduction of +firmware supporting both NCM and ECM, where NCM ends up as the +default mode in Linux. To use the same workaround, we now have +to blacklist the devices in to two different class drivers and +add yet another match entry to the vendor specific driver. + +This patch implements an alternative workaround strategy - +independent of the interface drivers. It avoids adding a +blacklist to the cdc_ncm driver and will let us remove the +existing blacklist from the cdc_ether driver. + +As an additional bonus, removing the blacklists allow users to +select one of the other device modes if wanted. + +Signed-off-by: Bjørn Mork +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 113 ++++++++++++++++++++++++++++------------ + 1 file changed, 81 insertions(+), 32 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9661,6 +9661,9 @@ static int rtl8152_probe(struct usb_inte + if (version == RTL_VER_UNKNOWN) + return -ENODEV; + ++ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) ++ return -ENODEV; ++ + if (!rtl_vendor_mode(intf)) + return -ENODEV; + +@@ -9861,43 +9864,35 @@ static void rtl8152_disconnect(struct us + } + } + +-#define REALTEK_USB_DEVICE(vend, prod) { \ +- USB_DEVICE_INTERFACE_CLASS(vend, prod, USB_CLASS_VENDOR_SPEC), \ +-}, \ +-{ \ +- USB_DEVICE_AND_INTERFACE_INFO(vend, prod, USB_CLASS_COMM, \ +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), \ +-} + + /* table of devices that work with this driver */ + static const struct usb_device_id rtl8152_table[] = { + /* Realtek */ +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8050), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8053), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8155), +- REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8156), ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8050) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8053) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8152) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8153) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8155) }, ++ { USB_DEVICE(VENDOR_ID_REALTEK, 0x8156) }, + + /* Microsoft */ +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927), +- REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0c5e), +- REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3054), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3069), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3082), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7205), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x720c), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x7214), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x721e), +- REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0xa387), +- REALTEK_USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041), +- REALTEK_USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff), +- REALTEK_USB_DEVICE(VENDOR_ID_TPLINK, 0x0601), ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab) }, ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6) }, ++ { USB_DEVICE(VENDOR_ID_MICROSOFT, 0x0927) }, ++ { USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x304f) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3054) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3062) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3069) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x3082) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7205) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x720c) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x7214) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0x721e) }, ++ { USB_DEVICE(VENDOR_ID_LENOVO, 0xa387) }, ++ { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, ++ { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, ++ { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, + {} + }; + +@@ -9917,7 +9912,61 @@ static struct usb_driver rtl8152_driver + .disable_hub_initiated_lpm = 1, + }; + +-module_usb_driver(rtl8152_driver); ++static int rtl8152_cfgselector_probe(struct usb_device *udev) ++{ ++ struct usb_host_config *c; ++ int i, num_configs; ++ ++ /* The vendor mode is not always config #1, so to find it out. */ ++ c = udev->config; ++ num_configs = udev->descriptor.bNumConfigurations; ++ for (i = 0; i < num_configs; (i++, c++)) { ++ struct usb_interface_descriptor *desc = NULL; ++ ++ if (!c->desc.bNumInterfaces) ++ continue; ++ desc = &c->intf_cache[0]->altsetting->desc; ++ if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) ++ break; ++ } ++ ++ if (i == num_configs) ++ return -ENODEV; ++ ++ if (usb_set_configuration(udev, c->desc.bConfigurationValue)) { ++ dev_err(&udev->dev, "Failed to set configuration %d\n", ++ c->desc.bConfigurationValue); ++ return -ENODEV; ++ } ++ ++ return 0; ++} ++ ++static struct usb_device_driver rtl8152_cfgselector_driver = { ++ .name = MODULENAME "-cfgselector", ++ .probe = rtl8152_cfgselector_probe, ++ .id_table = rtl8152_table, ++ .generic_subclass = 1, ++}; ++ ++static int __init rtl8152_driver_init(void) ++{ ++ int ret; ++ ++ ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE); ++ if (ret) ++ return ret; ++ return usb_register(&rtl8152_driver); ++} ++ ++static void __exit rtl8152_driver_exit(void) ++{ ++ usb_deregister(&rtl8152_driver); ++ usb_deregister_device_driver(&rtl8152_cfgselector_driver); ++} ++ ++module_init(rtl8152_driver_init); ++module_exit(rtl8152_driver_exit); + + MODULE_AUTHOR(DRIVER_AUTHOR); + MODULE_DESCRIPTION(DRIVER_DESC); diff --git a/target/linux/generic/backport-6.1/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch b/target/linux/generic/backport-6.1/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch new file mode 100644 index 00000000000000..17131c16d39f72 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-02-cdc_ether-no-need-to-blacklist-any-r8152-devices.patch @@ -0,0 +1,158 @@ +From 69649ef8405320f81497f4757faac8234f61b167 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Fri, 6 Jan 2023 17:07:39 +0100 +Subject: [PATCH] cdc_ether: no need to blacklist any r8152 devices +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The r8152 driver does not need this anymore. + +Dropping blacklist entries adds optional support for these +devices in ECM mode. + +The 8153 devices are handled by the r8153_ecm driver when +in ECM mode, and must still be blacklisted here. + +Signed-off-by: Bjørn Mork +Signed-off-by: David S. Miller +--- + drivers/net/usb/cdc_ether.c | 114 ------------------------------------ + 1 file changed, 114 deletions(-) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -768,13 +768,6 @@ static const struct usb_device_id produc + .driver_info = 0, + }, + +-/* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- + /* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */ + { + USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM, +@@ -782,119 +775,12 @@ static const struct usb_device_id produc + .driver_info = 0, + }, + +-/* Samsung USB Ethernet Adapters */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, 0xa101, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-#if IS_ENABLED(CONFIG_USB_RTL8152) +-/* Linksys USB3GIGV1 Ethernet Adapter */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LINKSYS_VENDOR_ID, 0x0041, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +-#endif +- +-/* Lenovo ThinkPad OneLink+ Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3054, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad USB-C Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3062, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad Thunderbolt 3 Dock (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3069, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* ThinkPad Thunderbolt 3 Dock Gen 2 (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x3082, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo Thinkpad USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7205, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo USB C to Ethernet Adapter (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x720c, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Lenovo USB-C Travel Hub (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x7214, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- + /* Lenovo Powered USB-C Travel Hub (4X90S92381, based on Realtek RTL8153) */ + { + USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0x721e, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), + .driver_info = 0, + }, +- +-/* ThinkPad USB-C Dock Gen 2 (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(LENOVO_VENDOR_ID, 0xa387, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* NVIDIA Tegra USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(NVIDIA_VENDOR_ID, 0x09ff, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface 2 dock (based on Realtek RTL8152) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07ab, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* Microsoft Surface Ethernet Adapter (based on Realtek RTL8153B) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x0927, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, +- +-/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */ +-{ +- USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM, +- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE), +- .driver_info = 0, +-}, + + /* Aquantia AQtion USB to 5GbE Controller (based on AQC111U) */ + { diff --git a/target/linux/generic/backport-6.1/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch b/target/linux/generic/backport-6.1/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch new file mode 100644 index 00000000000000..a5b01f7b0829a3 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-03-r8152-avoid-to-change-cfg-for-all-devices.patch @@ -0,0 +1,64 @@ +From 0d4cda805a183bbe523f2407edb5c14ade50b841 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 17 Jan 2023 11:03:44 +0800 +Subject: [PATCH] r8152: avoid to change cfg for all devices + +The rtl8152_cfgselector_probe() should set the USB configuration to the +vendor mode only for the devices which the driver (r8152) supports. +Otherwise, no driver would be used for such devices. + +Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection") +Signed-off-by: Hayes Wang +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9542,9 +9542,8 @@ static int rtl_fw_init(struct r8152 *tp) + return 0; + } + +-u8 rtl8152_get_version(struct usb_interface *intf) ++static u8 __rtl_get_hw_ver(struct usb_device *udev) + { +- struct usb_device *udev = interface_to_usbdev(intf); + u32 ocp_data = 0; + __le32 *tmp; + u8 version; +@@ -9614,10 +9613,19 @@ u8 rtl8152_get_version(struct usb_interf + break; + default: + version = RTL_VER_UNKNOWN; +- dev_info(&intf->dev, "Unknown version 0x%04x\n", ocp_data); ++ dev_info(&udev->dev, "Unknown version 0x%04x\n", ocp_data); + break; + } + ++ return version; ++} ++ ++u8 rtl8152_get_version(struct usb_interface *intf) ++{ ++ u8 version; ++ ++ version = __rtl_get_hw_ver(interface_to_usbdev(intf)); ++ + dev_dbg(&intf->dev, "Detected version 0x%04x\n", version); + + return version; +@@ -9917,6 +9925,12 @@ static int rtl8152_cfgselector_probe(str + struct usb_host_config *c; + int i, num_configs; + ++ /* Switch the device to vendor mode, if and only if the vendor mode ++ * driver supports it. ++ */ ++ if (__rtl_get_hw_ver(udev) == RTL_VER_UNKNOWN) ++ return 0; ++ + /* The vendor mode is not always config #1, so to find it out. */ + c = udev->config; + num_configs = udev->descriptor.bNumConfigurations; diff --git a/target/linux/generic/backport-6.1/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch b/target/linux/generic/backport-6.1/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch new file mode 100644 index 00000000000000..f97750861c3e4d --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-04-r8152-remove-rtl_vendor_mode-function.patch @@ -0,0 +1,71 @@ +From 95a4c1d617b92cdc4522297741b56e8f6cd01a1e Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Thu, 19 Jan 2023 15:40:42 +0800 +Subject: [PATCH] r8152: remove rtl_vendor_mode function + +After commit ec51fbd1b8a2 ("r8152: add USB device driver for +config selection"), the code about changing USB configuration +in rtl_vendor_mode() wouldn't be run anymore. Therefore, the +function could be removed. + +Signed-off-by: Hayes Wang +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 39 +-------------------------------------- + 1 file changed, 1 insertion(+), 38 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -8274,43 +8274,6 @@ static bool rtl_check_vendor_ok(struct u + return true; + } + +-static bool rtl_vendor_mode(struct usb_interface *intf) +-{ +- struct usb_host_interface *alt = intf->cur_altsetting; +- struct usb_device *udev; +- struct usb_host_config *c; +- int i, num_configs; +- +- if (alt->desc.bInterfaceClass == USB_CLASS_VENDOR_SPEC) +- return rtl_check_vendor_ok(intf); +- +- /* The vendor mode is not always config #1, so to find it out. */ +- udev = interface_to_usbdev(intf); +- c = udev->config; +- num_configs = udev->descriptor.bNumConfigurations; +- if (num_configs < 2) +- return false; +- +- for (i = 0; i < num_configs; (i++, c++)) { +- struct usb_interface_descriptor *desc = NULL; +- +- if (c->desc.bNumInterfaces > 0) +- desc = &c->intf_cache[0]->altsetting->desc; +- else +- continue; +- +- if (desc->bInterfaceClass == USB_CLASS_VENDOR_SPEC) { +- usb_driver_set_configuration(udev, c->desc.bConfigurationValue); +- break; +- } +- } +- +- if (i == num_configs) +- dev_err(&intf->dev, "Unexpected Device\n"); +- +- return false; +-} +- + static int rtl8152_pre_reset(struct usb_interface *intf) + { + struct r8152 *tp = usb_get_intfdata(intf); +@@ -9672,7 +9635,7 @@ static int rtl8152_probe(struct usb_inte + if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) + return -ENODEV; + +- if (!rtl_vendor_mode(intf)) ++ if (!rtl_check_vendor_ok(intf)) + return -ENODEV; + + usb_reset_device(udev); diff --git a/target/linux/generic/backport-6.1/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch b/target/linux/generic/backport-6.1/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch new file mode 100644 index 00000000000000..421f2c7f8f51dc --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-05-r8152-reduce-the-control-transfer-of-rtl8152_get_ver.patch @@ -0,0 +1,46 @@ +From 02767440e1dda9861a11ca1dbe0f19a760b1d5c2 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Thu, 19 Jan 2023 15:40:43 +0800 +Subject: [PATCH] r8152: reduce the control transfer of rtl8152_get_version() + +Reduce the control transfer by moving calling rtl8152_get_version() in +rtl8152_probe(). This could prevent from calling rtl8152_get_version() +for unnecessary situations. For example, after setting config #2 for the +device, there are two interfaces and rtl8152_probe() may be called +twice. However, we don't need to call rtl8152_get_version() for this +situation. + +Signed-off-by: Hayes Wang +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9624,20 +9624,21 @@ static int rtl8152_probe(struct usb_inte + const struct usb_device_id *id) + { + struct usb_device *udev = interface_to_usbdev(intf); +- u8 version = rtl8152_get_version(intf); + struct r8152 *tp; + struct net_device *netdev; ++ u8 version; + int ret; + +- if (version == RTL_VER_UNKNOWN) +- return -ENODEV; +- + if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) + return -ENODEV; + + if (!rtl_check_vendor_ok(intf)) + return -ENODEV; + ++ version = rtl8152_get_version(intf); ++ if (version == RTL_VER_UNKNOWN) ++ return -ENODEV; ++ + usb_reset_device(udev); + netdev = alloc_etherdev(sizeof(struct r8152)); + if (!netdev) { diff --git a/target/linux/generic/backport-6.1/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch b/target/linux/generic/backport-6.1/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch new file mode 100644 index 00000000000000..cdabca36d2a8a9 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.3-06-r8152-Add-__GFP_NOWARN-to-big-allocations.patch @@ -0,0 +1,55 @@ +From 5cc33f139e11b893ff6dc60d8a0ae865a65521ac Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Thu, 6 Apr 2023 17:14:26 -0700 +Subject: [PATCH] r8152: Add __GFP_NOWARN to big allocations + +When memory is a little tight on my system, it's pretty easy to see +warnings that look like this. + + ksoftirqd/0: page allocation failure: order:3, mode:0x40a20(GFP_ATOMIC|__GFP_COMP), nodemask=(null),cpuset=/,mems_allowed=0 + ... + Call trace: + dump_backtrace+0x0/0x1e8 + show_stack+0x20/0x2c + dump_stack_lvl+0x60/0x78 + dump_stack+0x18/0x38 + warn_alloc+0x104/0x174 + __alloc_pages+0x588/0x67c + alloc_rx_agg+0xa0/0x190 [r8152 ...] + r8152_poll+0x270/0x760 [r8152 ...] + __napi_poll+0x44/0x1ec + net_rx_action+0x100/0x300 + __do_softirq+0xec/0x38c + run_ksoftirqd+0x38/0xec + smpboot_thread_fn+0xb8/0x248 + kthread+0x134/0x154 + ret_from_fork+0x10/0x20 + +On a fragmented system it's normal that order 3 allocations will +sometimes fail, especially atomic ones. The driver handles these +failures fine and the WARN just creates spam in the logs for this +case. The __GFP_NOWARN flag is exactly for this situation, so add it +to the allocation. + +NOTE: my testing is on a 5.15 system, but there should be no reason +that this would be fundamentally different on a mainline kernel. + +Signed-off-by: Douglas Anderson +Acked-by: Hayes Wang +Link: https://lore.kernel.org/r/20230406171411.1.I84dbef45786af440fd269b71e9436a96a8e7a152@changeid +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -1947,7 +1947,7 @@ static struct rx_agg *alloc_rx_agg(struc + if (!rx_agg) + return NULL; + +- rx_agg->page = alloc_pages(mflags | __GFP_COMP, order); ++ rx_agg->page = alloc_pages(mflags | __GFP_COMP | __GFP_NOWARN, order); + if (!rx_agg->page) + goto free_rx; + diff --git a/target/linux/generic/backport-6.1/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch b/target/linux/generic/backport-6.1/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch new file mode 100644 index 00000000000000..b4d5b8bdb91519 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.4-07-r8152-fix-the-autosuspend-doesn-t-work.patch @@ -0,0 +1,24 @@ +From 0fbd79c01a9a657348f7032df70c57a406468c86 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 2 May 2023 11:36:27 +0800 +Subject: [PATCH] r8152: fix the autosuspend doesn't work + +Set supports_autosuspend = 1 for the rtl8152_cfgselector_driver. + +Fixes: ec51fbd1b8a2 ("r8152: add USB device driver for config selection") +Signed-off-by: Hayes Wang +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9925,6 +9925,7 @@ static struct usb_device_driver rtl8152_ + .probe = rtl8152_cfgselector_probe, + .id_table = rtl8152_table, + .generic_subclass = 1, ++ .supports_autosuspend = 1, + }; + + static int __init rtl8152_driver_init(void) diff --git a/target/linux/generic/backport-6.1/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch b/target/linux/generic/backport-6.1/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch new file mode 100644 index 00000000000000..3ba79d6cc6a383 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-08-r8152-adjust-generic_ocp_write-function.patch @@ -0,0 +1,70 @@ +From 57df0fb9d511f91202114813e90128d65c0589f0 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Wed, 26 Jul 2023 11:08:07 +0800 +Subject: [PATCH] r8152: adjust generic_ocp_write function + +Reduce the control transfer if all bytes of first or the last DWORD are +written. + +The original method is to split the control transfer into three parts +(the first DWORD, middle continuous data, and the last DWORD). However, +they could be combined if whole bytes of the first DWORD or last DWORD +are written. That is, the first DWORD or the last DWORD could be combined +with the middle continuous data, if the byte_en is 0xff. + +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230726030808.9093-418-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 29 ++++++++++++++++++----------- + 1 file changed, 18 insertions(+), 11 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -1313,16 +1313,24 @@ static int generic_ocp_write(struct r815 + byteen_end = byteen & BYTE_EN_END_MASK; + + byen = byteen_start | (byteen_start << 4); +- ret = set_registers(tp, index, type | byen, 4, data); +- if (ret < 0) +- goto error1; +- +- index += 4; +- data += 4; +- size -= 4; + +- if (size) { ++ /* Split the first DWORD if the byte_en is not 0xff */ ++ if (byen != BYTE_EN_DWORD) { ++ ret = set_registers(tp, index, type | byen, 4, data); ++ if (ret < 0) ++ goto error1; ++ ++ index += 4; ++ data += 4; + size -= 4; ++ } ++ ++ if (size) { ++ byen = byteen_end | (byteen_end >> 4); ++ ++ /* Split the last DWORD if the byte_en is not 0xff */ ++ if (byen != BYTE_EN_DWORD) ++ size -= 4; + + while (size) { + if (size > limit) { +@@ -1349,10 +1357,9 @@ static int generic_ocp_write(struct r815 + } + } + +- byen = byteen_end | (byteen_end >> 4); +- ret = set_registers(tp, index, type | byen, 4, data); +- if (ret < 0) +- goto error1; ++ /* Set the last DWORD */ ++ if (byen != BYTE_EN_DWORD) ++ ret = set_registers(tp, index, type | byen, 4, data); + } + + error1: diff --git a/target/linux/generic/backport-6.1/795-v6.6-09-r8152-set-bp-in-bulk.patch b/target/linux/generic/backport-6.1/795-v6.6-09-r8152-set-bp-in-bulk.patch new file mode 100644 index 00000000000000..485a005b174bdd --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-09-r8152-set-bp-in-bulk.patch @@ -0,0 +1,129 @@ +From e5c266a61186b462c388c53a3564c375e72f2244 Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Wed, 26 Jul 2023 11:08:08 +0800 +Subject: [PATCH] r8152: set bp in bulk + +PLA_BP_0 ~ PLA_BP_15 (0xfc28 ~ 0xfc46) are continuous registers, so we +could combine the control transfers into one control transfer. + +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230726030808.9093-419-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 75 ++++++++++++++--------------------------- + 1 file changed, 25 insertions(+), 50 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -3984,29 +3984,10 @@ static void rtl_reset_bmu(struct r8152 * + /* Clear the bp to stop the firmware before loading a new one */ + static void rtl_clear_bp(struct r8152 *tp, u16 type) + { +- switch (tp->version) { +- case RTL_VER_01: +- case RTL_VER_02: +- case RTL_VER_07: +- break; +- case RTL_VER_03: +- case RTL_VER_04: +- case RTL_VER_05: +- case RTL_VER_06: +- ocp_write_byte(tp, type, PLA_BP_EN, 0); +- break; +- case RTL_VER_14: +- ocp_write_word(tp, type, USB_BP2_EN, 0); ++ u16 bp[16] = {0}; ++ u16 bp_num; + +- ocp_write_word(tp, type, USB_BP_8, 0); +- ocp_write_word(tp, type, USB_BP_9, 0); +- ocp_write_word(tp, type, USB_BP_10, 0); +- ocp_write_word(tp, type, USB_BP_11, 0); +- ocp_write_word(tp, type, USB_BP_12, 0); +- ocp_write_word(tp, type, USB_BP_13, 0); +- ocp_write_word(tp, type, USB_BP_14, 0); +- ocp_write_word(tp, type, USB_BP_15, 0); +- break; ++ switch (tp->version) { + case RTL_VER_08: + case RTL_VER_09: + case RTL_VER_10: +@@ -4014,32 +3995,31 @@ static void rtl_clear_bp(struct r8152 *t + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: +- default: + if (type == MCU_TYPE_USB) { + ocp_write_word(tp, MCU_TYPE_USB, USB_BP2_EN, 0); +- +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_8, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_9, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_10, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_11, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_12, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_13, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_14, 0); +- ocp_write_word(tp, MCU_TYPE_USB, USB_BP_15, 0); +- } else { +- ocp_write_byte(tp, MCU_TYPE_PLA, PLA_BP_EN, 0); ++ bp_num = 16; ++ break; + } ++ fallthrough; ++ case RTL_VER_03: ++ case RTL_VER_04: ++ case RTL_VER_05: ++ case RTL_VER_06: ++ ocp_write_byte(tp, type, PLA_BP_EN, 0); ++ fallthrough; ++ case RTL_VER_01: ++ case RTL_VER_02: ++ case RTL_VER_07: ++ bp_num = 8; ++ break; ++ case RTL_VER_14: ++ default: ++ ocp_write_word(tp, type, USB_BP2_EN, 0); ++ bp_num = 16; + break; + } + +- ocp_write_word(tp, type, PLA_BP_0, 0); +- ocp_write_word(tp, type, PLA_BP_1, 0); +- ocp_write_word(tp, type, PLA_BP_2, 0); +- ocp_write_word(tp, type, PLA_BP_3, 0); +- ocp_write_word(tp, type, PLA_BP_4, 0); +- ocp_write_word(tp, type, PLA_BP_5, 0); +- ocp_write_word(tp, type, PLA_BP_6, 0); +- ocp_write_word(tp, type, PLA_BP_7, 0); ++ generic_ocp_write(tp, PLA_BP_0, BYTE_EN_DWORD, bp_num << 1, bp, type); + + /* wait 3 ms to make sure the firmware is stopped */ + usleep_range(3000, 6000); +@@ -5016,10 +4996,9 @@ static void rtl8152_fw_phy_nc_apply(stru + + static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac) + { +- u16 bp_en_addr, bp_index, type, bp_num, fw_ver_reg; ++ u16 bp_en_addr, type, fw_ver_reg; + u32 length; + u8 *data; +- int i; + + switch (__le32_to_cpu(mac->blk_hdr.type)) { + case RTL_FW_PLA: +@@ -5061,12 +5040,8 @@ static void rtl8152_fw_mac_apply(struct + ocp_write_word(tp, type, __le16_to_cpu(mac->bp_ba_addr), + __le16_to_cpu(mac->bp_ba_value)); + +- bp_index = __le16_to_cpu(mac->bp_start); +- bp_num = __le16_to_cpu(mac->bp_num); +- for (i = 0; i < bp_num; i++) { +- ocp_write_word(tp, type, bp_index, __le16_to_cpu(mac->bp[i])); +- bp_index += 2; +- } ++ generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD, ++ __le16_to_cpu(mac->bp_num) << 1, mac->bp, type); + + bp_en_addr = __le16_to_cpu(mac->bp_en_addr); + if (bp_en_addr) diff --git a/target/linux/generic/backport-6.1/795-v6.6-10-eth-r8152-try-to-use-a-normal-budget.patch b/target/linux/generic/backport-6.1/795-v6.6-10-eth-r8152-try-to-use-a-normal-budget.patch new file mode 100644 index 00000000000000..864671bb32f16e --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-10-eth-r8152-try-to-use-a-normal-budget.patch @@ -0,0 +1,39 @@ +From cf74eb5a5bc867258e7d0b0d1c3c4a60e1e3de2f Mon Sep 17 00:00:00 2001 +From: Jakub Kicinski +Date: Mon, 14 Aug 2023 08:35:21 -0700 +Subject: [PATCH] eth: r8152: try to use a normal budget + +Mario reports that loading r8152 on his system leads to a: + + netif_napi_add_weight() called with weight 256 + +warning getting printed. We don't have any solid data +on why such high budget was chosen, and it may cause +stalls in processing other softirqs and rt threads. +So try to switch back to the default (64) weight. + +If this slows down someone's system we should investigate +which part of stopping starting the NAPI poll in this +driver are expensive. + +Reported-by: Mario Limonciello +Link: https://lore.kernel.org/all/0bfd445a-81f7-f702-08b0-bd5a72095e49@amd.com/ +Acked-by: Hayes Wang +Link: https://lore.kernel.org/r/20230814153521.2697982-1-kuba@kernel.org +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9770,8 +9770,7 @@ static int rtl8152_probe(struct usb_inte + + usb_set_intfdata(intf, tp); + +- netif_napi_add_weight(netdev, &tp->napi, r8152_poll, +- tp->support_2500full ? 256 : 64); ++ netif_napi_add(netdev, &tp->napi, r8152_poll); + + ret = register_netdev(netdev); + if (ret != 0) { diff --git a/target/linux/generic/backport-6.1/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch b/target/linux/generic/backport-6.1/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch new file mode 100644 index 00000000000000..ab6563d5c43628 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-11-r8152-add-vendor-device-ID-pair-for-D-Link-DUB-E250.patch @@ -0,0 +1,39 @@ +From 72f93a3136ee18fd59fa6579f84c07e93424681e Mon Sep 17 00:00:00 2001 +From: Antonio Napolitano +Date: Sat, 26 Aug 2023 01:05:50 +0200 +Subject: [PATCH] r8152: add vendor/device ID pair for D-Link DUB-E250 + +The D-Link DUB-E250 is an RTL8156 based 2.5G Ethernet controller. + +Add the vendor and product ID values to the driver. This makes Ethernet +work with the adapter. + +Signed-off-by: Antonio Napolitano +Link: https://lore.kernel.org/r/CV200KJEEUPC.WPKAHXCQJ05I@mercurius +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 1 + + include/linux/usb/r8152.h | 1 + + 2 files changed, 2 insertions(+) + + +--- a/include/linux/usb/r8152.h ++++ b/include/linux/usb/r8152.h +@@ -29,6 +29,7 @@ + #define VENDOR_ID_LINKSYS 0x13b1 + #define VENDOR_ID_NVIDIA 0x0955 + #define VENDOR_ID_TPLINK 0x2357 ++#define VENDOR_ID_DLINK 0x2001 + + #if IS_REACHABLE(CONFIG_USB_RTL8152) + extern u8 rtl8152_get_version(struct usb_interface *intf); +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -9846,6 +9846,7 @@ static const struct usb_device_id rtl815 + { USB_DEVICE(VENDOR_ID_LINKSYS, 0x0041) }, + { USB_DEVICE(VENDOR_ID_NVIDIA, 0x09ff) }, + { USB_DEVICE(VENDOR_ID_TPLINK, 0x0601) }, ++ { USB_DEVICE(VENDOR_ID_DLINK, 0xb301) }, + {} + }; + diff --git a/target/linux/generic/backport-6.1/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch b/target/linux/generic/backport-6.1/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch new file mode 100644 index 00000000000000..480a60212ae611 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-12-r8152-Rename-RTL8152_UNPLUG-to-RTL8152_INACCESSIBLE.patch @@ -0,0 +1,447 @@ +From 715f67f33af45ce2cc3a5b1ef133cc8c8e7787b0 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Fri, 20 Oct 2023 14:06:58 -0700 +Subject: [PATCH] r8152: Rename RTL8152_UNPLUG to RTL8152_INACCESSIBLE + +Whenever the RTL8152_UNPLUG is set that just tells the driver that all +accesses will fail and we should just immediately bail. A future patch +will use this same concept at a time when the driver hasn't actually +been unplugged but is about to be reset. Rename the flag in +preparation for the future patch. + +This is a no-op change and just a search and replace. + +Signed-off-by: Douglas Anderson +Reviewed-by: Grant Grundler +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 96 ++++++++++++++++++++--------------------- + 1 file changed, 48 insertions(+), 48 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -763,7 +763,7 @@ enum rtl_register_content { + + /* rtl8152 flags */ + enum rtl8152_flags { +- RTL8152_UNPLUG = 0, ++ RTL8152_INACCESSIBLE = 0, + RTL8152_SET_RX_MODE, + WORK_ENABLE, + RTL8152_LINK_CHG, +@@ -1244,7 +1244,7 @@ int set_registers(struct r8152 *tp, u16 + static void rtl_set_unplug(struct r8152 *tp) + { + if (tp->udev->state == USB_STATE_NOTATTACHED) { +- set_bit(RTL8152_UNPLUG, &tp->flags); ++ set_bit(RTL8152_INACCESSIBLE, &tp->flags); + smp_mb__after_atomic(); + } + } +@@ -1255,7 +1255,7 @@ static int generic_ocp_read(struct r8152 + u16 limit = 64; + int ret = 0; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + /* both size and indix must be 4 bytes align */ +@@ -1299,7 +1299,7 @@ static int generic_ocp_write(struct r815 + u16 byteen_start, byteen_end, byen; + u16 limit = 512; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + /* both size and indix must be 4 bytes align */ +@@ -1536,7 +1536,7 @@ static int read_mii_word(struct net_devi + struct r8152 *tp = netdev_priv(netdev); + int ret; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + if (phy_id != R8152_PHY_ID) +@@ -1552,7 +1552,7 @@ void write_mii_word(struct net_device *n + { + struct r8152 *tp = netdev_priv(netdev); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (phy_id != R8152_PHY_ID) +@@ -1757,7 +1757,7 @@ static void read_bulk_callback(struct ur + if (!tp) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!test_bit(WORK_ENABLE, &tp->flags)) +@@ -1849,7 +1849,7 @@ static void write_bulk_callback(struct u + if (!test_bit(WORK_ENABLE, &tp->flags)) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!skb_queue_empty(&tp->tx_queue)) +@@ -1870,7 +1870,7 @@ static void intr_callback(struct urb *ur + if (!test_bit(WORK_ENABLE, &tp->flags)) + return; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + switch (status) { +@@ -2614,7 +2614,7 @@ static void bottom_half(struct tasklet_s + { + struct r8152 *tp = from_tasklet(tp, t, tx_tl); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (!test_bit(WORK_ENABLE, &tp->flags)) +@@ -2657,7 +2657,7 @@ int r8152_submit_rx(struct r8152 *tp, st + int ret; + + /* The rx would be stopped, so skip submitting */ +- if (test_bit(RTL8152_UNPLUG, &tp->flags) || ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || + !test_bit(WORK_ENABLE, &tp->flags) || !netif_carrier_ok(tp->netdev)) + return 0; + +@@ -3057,7 +3057,7 @@ static int rtl_enable(struct r8152 *tp) + + static int rtl8152_enable(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -3144,7 +3144,7 @@ static int rtl8153_enable(struct r8152 * + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -3176,7 +3176,7 @@ static void rtl_disable(struct r8152 *tp + u32 ocp_data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -3630,7 +3630,7 @@ static u16 r8153_phy_status(struct r8152 + } + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -3662,7 +3662,7 @@ static void r8153b_ups_en(struct r8152 * + int i; + + for (i = 0; i < 500; i++) { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & + AUTOLOAD_DONE) +@@ -3704,7 +3704,7 @@ static void r8153c_ups_en(struct r8152 * + int i; + + for (i = 0; i < 500; i++) { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + if (ocp_read_word(tp, MCU_TYPE_PLA, PLA_BOOT_CTRL) & + AUTOLOAD_DONE) +@@ -4049,8 +4049,8 @@ static int rtl_phy_patch_request(struct + for (i = 0; wait && i < 5000; i++) { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) +- break; ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) ++ return -ENODEV; + + usleep_range(1000, 2000); + ocp_data = ocp_reg_read(tp, OCP_PHY_PATCH_STAT); +@@ -6008,7 +6008,7 @@ static int rtl8156_enable(struct r8152 * + u32 ocp_data; + u16 speed; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + r8156_fc_parameter(tp); +@@ -6066,7 +6066,7 @@ static int rtl8156b_enable(struct r8152 + u32 ocp_data; + u16 speed; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + set_tx_qlen(tp); +@@ -6252,7 +6252,7 @@ out: + + static void rtl8152_up(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8152_aldps_en(tp, false); +@@ -6262,7 +6262,7 @@ static void rtl8152_up(struct r8152 *tp) + + static void rtl8152_down(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6277,7 +6277,7 @@ static void rtl8153_up(struct r8152 *tp) + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_u1u2en(tp, false); +@@ -6317,7 +6317,7 @@ static void rtl8153_down(struct r8152 *t + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6338,7 +6338,7 @@ static void rtl8153b_up(struct r8152 *tp + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6362,7 +6362,7 @@ static void rtl8153b_down(struct r8152 * + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6399,7 +6399,7 @@ static void rtl8153c_up(struct r8152 *tp + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6480,7 +6480,7 @@ static void rtl8156_up(struct r8152 *tp) + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -6553,7 +6553,7 @@ static void rtl8156_down(struct r8152 *t + { + u32 ocp_data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + return; + } +@@ -6691,7 +6691,7 @@ static void rtl_work_func_t(struct work_ + /* If the device is unplugged or !netif_running(), the workqueue + * doesn't need to wake the device, and could return directly. + */ +- if (test_bit(RTL8152_UNPLUG, &tp->flags) || !netif_running(tp->netdev)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags) || !netif_running(tp->netdev)) + return; + + if (usb_autopm_get_interface(tp->intf) < 0) +@@ -6730,7 +6730,7 @@ static void rtl_hw_phy_work_func_t(struc + { + struct r8152 *tp = container_of(work, struct r8152, hw_phy_work.work); + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (usb_autopm_get_interface(tp->intf) < 0) +@@ -6857,7 +6857,7 @@ static int rtl8152_close(struct net_devi + netif_stop_queue(netdev); + + res = usb_autopm_get_interface(tp->intf); +- if (res < 0 || test_bit(RTL8152_UNPLUG, &tp->flags)) { ++ if (res < 0 || test_bit(RTL8152_INACCESSIBLE, &tp->flags)) { + rtl_drop_queued_tx(tp); + rtl_stop_rx(tp); + } else { +@@ -6890,7 +6890,7 @@ static void r8152b_init(struct r8152 *tp + u32 ocp_data; + u16 data; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + data = r8152_mdio_read(tp, MII_BMCR); +@@ -6934,7 +6934,7 @@ static void r8153_init(struct r8152 *tp) + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_u1u2en(tp, false); +@@ -6945,7 +6945,7 @@ static void r8153_init(struct r8152 *tp) + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -7074,7 +7074,7 @@ static void r8153b_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -7085,7 +7085,7 @@ static void r8153b_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + break; + } + +@@ -7156,7 +7156,7 @@ static void r8153c_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_u1u2en(tp, false); +@@ -7176,7 +7176,7 @@ static void r8153c_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -8005,7 +8005,7 @@ static void r8156_init(struct r8152 *tp) + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); +@@ -8026,7 +8026,7 @@ static void r8156_init(struct r8152 *tp) + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -8101,7 +8101,7 @@ static void r8156b_init(struct r8152 *tp + u16 data; + int i; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + ocp_data = ocp_read_byte(tp, MCU_TYPE_USB, USB_ECM_OP); +@@ -8135,7 +8135,7 @@ static void r8156b_init(struct r8152 *tp + break; + + msleep(20); +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + } + +@@ -9164,7 +9164,7 @@ static int rtl8152_ioctl(struct net_devi + struct mii_ioctl_data *data = if_mii(rq); + int res; + +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return -ENODEV; + + res = usb_autopm_get_interface(tp->intf); +@@ -9266,7 +9266,7 @@ static const struct net_device_ops rtl81 + + static void rtl8152_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + if (tp->version != RTL_VER_01) +@@ -9275,7 +9275,7 @@ static void rtl8152_unload(struct r8152 + + static void rtl8153_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153_power_cut_en(tp, false); +@@ -9283,7 +9283,7 @@ static void rtl8153_unload(struct r8152 + + static void rtl8153b_unload(struct r8152 *tp) + { +- if (test_bit(RTL8152_UNPLUG, &tp->flags)) ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) + return; + + r8153b_power_cut_en(tp, false); diff --git a/target/linux/generic/backport-6.1/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch b/target/linux/generic/backport-6.1/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch new file mode 100644 index 00000000000000..2cbe3650352d6b --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-13-r8152-Block-future-register-access-if-register-acces.patch @@ -0,0 +1,398 @@ +From d9962b0d42029bcb40fe3c38bce06d1870fa4df4 Mon Sep 17 00:00:00 2001 +From: Douglas Anderson +Date: Fri, 20 Oct 2023 14:06:59 -0700 +Subject: [PATCH] r8152: Block future register access if register access fails + +Even though the functions to read/write registers can fail, most of +the places in the r8152 driver that read/write register values don't +check error codes. The lack of error code checking is problematic in +at least two ways. + +The first problem is that the r8152 driver often uses code patterns +similar to this: + x = read_register() + x = x | SOME_BIT; + write_register(x); + +...with the above pattern, if the read_register() fails and returns +garbage then we'll end up trying to write modified garbage back to the +Realtek adapter. If the write_register() succeeds that's bad. Note +that as of commit f53a7ad18959 ("r8152: Set memory to all 0xFFs on +failed reg reads") the "garbage" returned by read_register() will at +least be consistent garbage, but it is still garbage. + +It turns out that this problem is very serious. Writing garbage to +some of the hardware registers on the Ethernet adapter can put the +adapter in such a bad state that it needs to be power cycled (fully +unplugged and plugged in again) before it can enumerate again. + +The second problem is that the r8152 driver generally has functions +that are long sequences of register writes. Assuming everything will +be OK if a random register write fails in the middle isn't a great +assumption. + +One might wonder if the above two problems are real. You could ask if +we would really have a successful write after a failed read. It turns +out that the answer appears to be "yes, this can happen". In fact, +we've seen at least two distinct failure modes where this happens. + +On a sc7180-trogdor Chromebook if you drop into kdb for a while and +then resume, you can see: +1. We get a "Tx timeout" +2. The "Tx timeout" queues up a USB reset. +3. In rtl8152_pre_reset() we try to reinit the hardware. +4. The first several (2-9) register accesses fail with a timeout, then + things recover. + +The above test case was actually fixed by the patch ("r8152: Increase +USB control msg timeout to 5000ms as per spec") but at least shows +that we really can see successful calls after failed ones. + +On a different (AMD) based Chromebook with a particular adapter, we +found that during reboot tests we'd also sometimes get a transitory +failure. In this case we saw -EPIPE being returned sometimes. Retrying +worked, but retrying is not always safe for all register accesses +since reading/writing some registers might have side effects (like +registers that clear on read). + +Let's fully lock out all register access if a register access fails. +When we do this, we'll try to queue up a USB reset and try to unlock +register access after the reset. This is slightly tricker than it +sounds since the r8152 driver has an optimized reset sequence that +only works reliably after probe happens. In order to handle this, we +avoid the optimized reset if probe didn't finish. Instead, we simply +retry the probe routine in this case. + +When locking out access, we'll use the existing infrastructure that +the driver was using when it detected we were unplugged. This keeps us +from getting stuck in delay loops in some parts of the driver. + +Signed-off-by: Douglas Anderson +Reviewed-by: Grant Grundler +Signed-off-by: David S. Miller +--- + drivers/net/usb/r8152.c | 207 ++++++++++++++++++++++++++++++++++------ + 1 file changed, 176 insertions(+), 31 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -772,6 +772,9 @@ enum rtl8152_flags { + SCHEDULE_TASKLET, + GREEN_ETHERNET, + RX_EPROTO, ++ IN_PRE_RESET, ++ PROBED_WITH_NO_ERRORS, ++ PROBE_SHOULD_RETRY, + }; + + #define DEVICE_ID_LENOVO_USB_C_TRAVEL_HUB 0x721e +@@ -952,6 +955,8 @@ struct r8152 { + u8 version; + u8 duplex; + u8 autoneg; ++ ++ unsigned int reg_access_reset_count; + }; + + /** +@@ -1199,6 +1204,96 @@ static unsigned int agg_buf_sz = 16384; + + #define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc)) + ++/* If register access fails then we block access and issue a reset. If this ++ * happens too many times in a row without a successful access then we stop ++ * trying to reset and just leave access blocked. ++ */ ++#define REGISTER_ACCESS_MAX_RESETS 3 ++ ++static void rtl_set_inaccessible(struct r8152 *tp) ++{ ++ set_bit(RTL8152_INACCESSIBLE, &tp->flags); ++ smp_mb__after_atomic(); ++} ++ ++static void rtl_set_accessible(struct r8152 *tp) ++{ ++ clear_bit(RTL8152_INACCESSIBLE, &tp->flags); ++ smp_mb__after_atomic(); ++} ++ ++static ++int r8152_control_msg(struct r8152 *tp, unsigned int pipe, __u8 request, ++ __u8 requesttype, __u16 value, __u16 index, void *data, ++ __u16 size, const char *msg_tag) ++{ ++ struct usb_device *udev = tp->udev; ++ int ret; ++ ++ if (test_bit(RTL8152_INACCESSIBLE, &tp->flags)) ++ return -ENODEV; ++ ++ ret = usb_control_msg(udev, pipe, request, requesttype, ++ value, index, data, size, ++ USB_CTRL_GET_TIMEOUT); ++ ++ /* No need to issue a reset to report an error if the USB device got ++ * unplugged; just return immediately. ++ */ ++ if (ret == -ENODEV) ++ return ret; ++ ++ /* If the write was successful then we're done */ ++ if (ret >= 0) { ++ tp->reg_access_reset_count = 0; ++ return ret; ++ } ++ ++ dev_err(&udev->dev, ++ "Failed to %s %d bytes at %#06x/%#06x (%d)\n", ++ msg_tag, size, value, index, ret); ++ ++ /* Block all future register access until we reset. Much of the code ++ * in the driver doesn't check for errors. Notably, many parts of the ++ * driver do a read/modify/write of a register value without ++ * confirming that the read succeeded. Writing back modified garbage ++ * like this can fully wedge the adapter, requiring a power cycle. ++ */ ++ rtl_set_inaccessible(tp); ++ ++ /* If probe hasn't yet finished, then we'll request a retry of the ++ * whole probe routine if we get any control transfer errors. We ++ * never have to clear this bit since we free/reallocate the whole "tp" ++ * structure if we retry probe. ++ */ ++ if (!test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) { ++ set_bit(PROBE_SHOULD_RETRY, &tp->flags); ++ return ret; ++ } ++ ++ /* Failing to access registers in pre-reset is not surprising since we ++ * wouldn't be resetting if things were behaving normally. The register ++ * access we do in pre-reset isn't truly mandatory--we're just reusing ++ * the disable() function and trying to be nice by powering the ++ * adapter down before resetting it. Thus, if we're in pre-reset, ++ * we'll return right away and not try to queue up yet another reset. ++ * We know the post-reset is already coming. ++ */ ++ if (test_bit(IN_PRE_RESET, &tp->flags)) ++ return ret; ++ ++ if (tp->reg_access_reset_count < REGISTER_ACCESS_MAX_RESETS) { ++ usb_queue_reset_device(tp->intf); ++ tp->reg_access_reset_count++; ++ } else if (tp->reg_access_reset_count == REGISTER_ACCESS_MAX_RESETS) { ++ dev_err(&udev->dev, ++ "Tried to reset %d times; giving up.\n", ++ REGISTER_ACCESS_MAX_RESETS); ++ } ++ ++ return ret; ++} ++ + static + int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) + { +@@ -1209,9 +1304,10 @@ int get_registers(struct r8152 *tp, u16 + if (!tmp) + return -ENOMEM; + +- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_in, +- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, +- value, index, tmp, size, USB_CTRL_GET_TIMEOUT); ++ ret = r8152_control_msg(tp, tp->pipe_ctrl_in, ++ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, ++ value, index, tmp, size, "read"); ++ + if (ret < 0) + memset(data, 0xff, size); + else +@@ -1232,9 +1328,9 @@ int set_registers(struct r8152 *tp, u16 + if (!tmp) + return -ENOMEM; + +- ret = usb_control_msg(tp->udev, tp->pipe_ctrl_out, +- RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, +- value, index, tmp, size, USB_CTRL_SET_TIMEOUT); ++ ret = r8152_control_msg(tp, tp->pipe_ctrl_out, ++ RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, ++ value, index, tmp, size, "write"); + + kfree(tmp); + +@@ -1243,10 +1339,8 @@ int set_registers(struct r8152 *tp, u16 + + static void rtl_set_unplug(struct r8152 *tp) + { +- if (tp->udev->state == USB_STATE_NOTATTACHED) { +- set_bit(RTL8152_INACCESSIBLE, &tp->flags); +- smp_mb__after_atomic(); +- } ++ if (tp->udev->state == USB_STATE_NOTATTACHED) ++ rtl_set_inaccessible(tp); + } + + static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, +@@ -8261,7 +8355,7 @@ static int rtl8152_pre_reset(struct usb_ + struct r8152 *tp = usb_get_intfdata(intf); + struct net_device *netdev; + +- if (!tp) ++ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) + return 0; + + netdev = tp->netdev; +@@ -8276,7 +8370,9 @@ static int rtl8152_pre_reset(struct usb_ + napi_disable(&tp->napi); + if (netif_carrier_ok(netdev)) { + mutex_lock(&tp->control); ++ set_bit(IN_PRE_RESET, &tp->flags); + tp->rtl_ops.disable(tp); ++ clear_bit(IN_PRE_RESET, &tp->flags); + mutex_unlock(&tp->control); + } + +@@ -8289,9 +8385,11 @@ static int rtl8152_post_reset(struct usb + struct net_device *netdev; + struct sockaddr sa; + +- if (!tp) ++ if (!tp || !test_bit(PROBED_WITH_NO_ERRORS, &tp->flags)) + return 0; + ++ rtl_set_accessible(tp); ++ + /* reset the MAC address in case of policy change */ + if (determine_ethernet_addr(tp, &sa) >= 0) { + rtnl_lock(); +@@ -9493,17 +9591,29 @@ static u8 __rtl_get_hw_ver(struct usb_de + __le32 *tmp; + u8 version; + int ret; ++ int i; + + tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); + if (!tmp) + return 0; + +- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), +- RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, +- PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), +- USB_CTRL_GET_TIMEOUT); +- if (ret > 0) +- ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; ++ /* Retry up to 3 times in case there is a transitory error. We do this ++ * since retrying a read of the version is always safe and this ++ * function doesn't take advantage of r8152_control_msg(). ++ */ ++ for (i = 0; i < 3; i++) { ++ ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), ++ RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, ++ PLA_TCR0, MCU_TYPE_PLA, tmp, sizeof(*tmp), ++ USB_CTRL_GET_TIMEOUT); ++ if (ret > 0) { ++ ocp_data = (__le32_to_cpu(*tmp) >> 16) & VERSION_MASK; ++ break; ++ } ++ } ++ ++ if (i != 0 && ret > 0) ++ dev_warn(&udev->dev, "Needed %d retries to read version\n", i); + + kfree(tmp); + +@@ -9602,25 +9712,14 @@ static bool rtl8152_supports_lenovo_macp + return 0; + } + +-static int rtl8152_probe(struct usb_interface *intf, +- const struct usb_device_id *id) ++static int rtl8152_probe_once(struct usb_interface *intf, ++ const struct usb_device_id *id, u8 version) + { + struct usb_device *udev = interface_to_usbdev(intf); + struct r8152 *tp; + struct net_device *netdev; +- u8 version; + int ret; + +- if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) +- return -ENODEV; +- +- if (!rtl_check_vendor_ok(intf)) +- return -ENODEV; +- +- version = rtl8152_get_version(intf); +- if (version == RTL_VER_UNKNOWN) +- return -ENODEV; +- + usb_reset_device(udev); + netdev = alloc_etherdev(sizeof(struct r8152)); + if (!netdev) { +@@ -9783,10 +9882,20 @@ static int rtl8152_probe(struct usb_inte + else + device_set_wakeup_enable(&udev->dev, false); + ++ /* If we saw a control transfer error while probing then we may ++ * want to try probe() again. Consider this an error. ++ */ ++ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags)) ++ goto out2; ++ ++ set_bit(PROBED_WITH_NO_ERRORS, &tp->flags); + netif_info(tp, probe, netdev, "%s\n", DRIVER_VERSION); + + return 0; + ++out2: ++ unregister_netdev(netdev); ++ + out1: + tasklet_kill(&tp->tx_tl); + cancel_delayed_work_sync(&tp->hw_phy_work); +@@ -9795,10 +9904,46 @@ out1: + rtl8152_release_firmware(tp); + usb_set_intfdata(intf, NULL); + out: ++ if (test_bit(PROBE_SHOULD_RETRY, &tp->flags)) ++ ret = -EAGAIN; ++ + free_netdev(netdev); + return ret; + } + ++#define RTL8152_PROBE_TRIES 3 ++ ++static int rtl8152_probe(struct usb_interface *intf, ++ const struct usb_device_id *id) ++{ ++ u8 version; ++ int ret; ++ int i; ++ ++ if (intf->cur_altsetting->desc.bInterfaceClass != USB_CLASS_VENDOR_SPEC) ++ return -ENODEV; ++ ++ if (!rtl_check_vendor_ok(intf)) ++ return -ENODEV; ++ ++ version = rtl8152_get_version(intf); ++ if (version == RTL_VER_UNKNOWN) ++ return -ENODEV; ++ ++ for (i = 0; i < RTL8152_PROBE_TRIES; i++) { ++ ret = rtl8152_probe_once(intf, id, version); ++ if (ret != -EAGAIN) ++ break; ++ } ++ if (ret == -EAGAIN) { ++ dev_err(&intf->dev, ++ "r8152 failed probe after %d tries; giving up\n", i); ++ return -ENODEV; ++ } ++ ++ return ret; ++} ++ + static void rtl8152_disconnect(struct usb_interface *intf) + { + struct r8152 *tp = usb_get_intfdata(intf); diff --git a/target/linux/generic/backport-6.1/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch b/target/linux/generic/backport-6.1/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch new file mode 100644 index 00000000000000..7bbd1be82085aa --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-14-r8152-break-the-loop-when-the-budget-is-exhausted.patch @@ -0,0 +1,83 @@ +From 66eee612a1ba39f9a76a9ace4a34d012044767fb Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 26 Sep 2023 19:17:13 +0800 +Subject: [PATCH] r8152: break the loop when the budget is exhausted + +[ Upstream commit 2cf51f931797d9a47e75d999d0993a68cbd2a560 ] + +A bulk transfer of the USB may contain many packets. And, the total +number of the packets in the bulk transfer may be more than budget. + +Originally, only budget packets would be handled by napi_gro_receive(), +and the other packets would be queued in the driver for next schedule. + +This patch would break the loop about getting next bulk transfer, when +the budget is exhausted. That is, only the current bulk transfer would +be handled, and the other bulk transfers would be queued for next +schedule. Besides, the packets which are more than the budget in the +current bulk trasnfer would be still queued in the driver, as the +original method. + +In addition, a bulk transfer wouldn't contain more than 400 packets, so +the check of queue length is unnecessary. Therefore, I replace it with +WARN_ON_ONCE(). + +Fixes: cf74eb5a5bc8 ("eth: r8152: try to use a normal budget") +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230926111714.9448-433-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/usb/r8152.c | 18 +++++++++++++----- + 1 file changed, 13 insertions(+), 5 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -2542,7 +2542,7 @@ static int rx_bottom(struct r8152 *tp, i + } + } + +- if (list_empty(&tp->rx_done)) ++ if (list_empty(&tp->rx_done) || work_done >= budget) + goto out1; + + clear_bit(RX_EPROTO, &tp->flags); +@@ -2558,6 +2558,15 @@ static int rx_bottom(struct r8152 *tp, i + struct urb *urb; + u8 *rx_data; + ++ /* A bulk transfer of USB may contain may packets, so the ++ * total packets may more than the budget. Deal with all ++ * packets in current bulk transfer, and stop to handle the ++ * next bulk transfer until next schedule, if budget is ++ * exhausted. ++ */ ++ if (work_done >= budget) ++ break; ++ + list_del_init(cursor); + + agg = list_entry(cursor, struct rx_agg, list); +@@ -2577,9 +2586,7 @@ static int rx_bottom(struct r8152 *tp, i + unsigned int pkt_len, rx_frag_head_sz; + struct sk_buff *skb; + +- /* limit the skb numbers for rx_queue */ +- if (unlikely(skb_queue_len(&tp->rx_queue) >= 1000)) +- break; ++ WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000); + + pkt_len = le32_to_cpu(rx_desc->opts1) & RX_LEN_MASK; + if (pkt_len < ETH_ZLEN) +@@ -2657,9 +2664,10 @@ submit: + } + } + ++ /* Splice the remained list back to rx_done for next schedule */ + if (!list_empty(&rx_queue)) { + spin_lock_irqsave(&tp->rx_lock, flags); +- list_splice_tail(&rx_queue, &tp->rx_done); ++ list_splice(&rx_queue, &tp->rx_done); + spin_unlock_irqrestore(&tp->rx_lock, flags); + } + diff --git a/target/linux/generic/backport-6.1/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch b/target/linux/generic/backport-6.1/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch new file mode 100644 index 00000000000000..c858152067c96a --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.6-15-net-usb-cdc_ether-add-u-blox-0x1313-composition.patch @@ -0,0 +1,47 @@ +From 1b0fce8c8e69485e49a7d34aac3d4c2a2aa15d62 Mon Sep 17 00:00:00 2001 +From: Davide Tronchin +Date: Thu, 29 Jun 2023 12:37:36 +0200 +Subject: [PATCH] net: usb: cdc_ether: add u-blox 0x1313 composition. + +Add CDC-ECM support for LARA-R6 01B. + +The new LARA-R6 product variant identified by the "01B" string can be +configured (by AT interface) in three different USB modes: +* Default mode (Vendor ID: 0x1546 Product ID: 0x1311) with 4 serial +interfaces +* RmNet mode (Vendor ID: 0x1546 Product ID: 0x1312) with 4 serial +interfaces and 1 RmNet virtual network interface +* CDC-ECM mode (Vendor ID: 0x1546 Product ID: 0x1313) with 4 serial +interface and 1 CDC-ECM virtual network interface +The first 4 interfaces of all the 3 configurations (default, RmNet, ECM) +are the same. + +In CDC-ECM mode LARA-R6 01B exposes the following interfaces: +If 0: Diagnostic +If 1: AT parser +If 2: AT parser +If 3: AT parset/alternative functions +If 4: CDC-ECM interface + +Signed-off-by: Davide Tronchin +Reviewed-by: Simon Horman +Signed-off-by: David S. Miller +--- + drivers/net/usb/cdc_ether.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -879,6 +879,12 @@ static const struct usb_device_id produc + USB_CDC_PROTO_NONE), + .driver_info = (unsigned long)&wwan_info, + }, { ++ /* U-blox LARA-R6 01B */ ++ USB_DEVICE_AND_INTERFACE_INFO(UBLOX_VENDOR_ID, 0x1313, USB_CLASS_COMM, ++ USB_CDC_SUBCLASS_ETHERNET, ++ USB_CDC_PROTO_NONE), ++ .driver_info = (unsigned long)&wwan_info, ++}, { + /* ZTE modules */ + USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, USB_CLASS_COMM, + USB_CDC_SUBCLASS_ETHERNET, diff --git a/target/linux/generic/backport-6.1/795-v6.7-16-r8152-use-napi_gro_frags.patch b/target/linux/generic/backport-6.1/795-v6.7-16-r8152-use-napi_gro_frags.patch new file mode 100644 index 00000000000000..3c9680a2790ae4 --- /dev/null +++ b/target/linux/generic/backport-6.1/795-v6.7-16-r8152-use-napi_gro_frags.patch @@ -0,0 +1,122 @@ +From 788d30daa8f97f06166b6a63f0e51f2a4c2f036a Mon Sep 17 00:00:00 2001 +From: Hayes Wang +Date: Tue, 26 Sep 2023 19:17:14 +0800 +Subject: [PATCH] r8152: use napi_gro_frags + +Use napi_gro_frags() for the skb of fragments when the work_done is less +than budget. + +Signed-off-by: Hayes Wang +Link: https://lore.kernel.org/r/20230926111714.9448-434-nic_swsd@realtek.com +Signed-off-by: Jakub Kicinski +--- + drivers/net/usb/r8152.c | 67 ++++++++++++++++++++++++++++++----------- + 1 file changed, 50 insertions(+), 17 deletions(-) + +--- a/drivers/net/usb/r8152.c ++++ b/drivers/net/usb/r8152.c +@@ -2583,8 +2583,9 @@ static int rx_bottom(struct r8152 *tp, i + while (urb->actual_length > len_used) { + struct net_device *netdev = tp->netdev; + struct net_device_stats *stats = &netdev->stats; +- unsigned int pkt_len, rx_frag_head_sz; ++ unsigned int pkt_len, rx_frag_head_sz, len; + struct sk_buff *skb; ++ bool use_frags; + + WARN_ON_ONCE(skb_queue_len(&tp->rx_queue) >= 1000); + +@@ -2597,45 +2598,77 @@ static int rx_bottom(struct r8152 *tp, i + break; + + pkt_len -= ETH_FCS_LEN; ++ len = pkt_len; + rx_data += sizeof(struct rx_desc); + +- if (!agg_free || tp->rx_copybreak > pkt_len) +- rx_frag_head_sz = pkt_len; ++ if (!agg_free || tp->rx_copybreak > len) ++ use_frags = false; + else +- rx_frag_head_sz = tp->rx_copybreak; ++ use_frags = true; ++ ++ if (use_frags) { ++ /* If the budget is exhausted, the packet ++ * would be queued in the driver. That is, ++ * napi_gro_frags() wouldn't be called, so ++ * we couldn't use napi_get_frags(). ++ */ ++ if (work_done >= budget) { ++ rx_frag_head_sz = tp->rx_copybreak; ++ skb = napi_alloc_skb(napi, ++ rx_frag_head_sz); ++ } else { ++ rx_frag_head_sz = 0; ++ skb = napi_get_frags(napi); ++ } ++ } else { ++ rx_frag_head_sz = 0; ++ skb = napi_alloc_skb(napi, len); ++ } + +- skb = napi_alloc_skb(napi, rx_frag_head_sz); + if (!skb) { + stats->rx_dropped++; + goto find_next_rx; + } + + skb->ip_summed = r8152_rx_csum(tp, rx_desc); +- memcpy(skb->data, rx_data, rx_frag_head_sz); +- skb_put(skb, rx_frag_head_sz); +- pkt_len -= rx_frag_head_sz; +- rx_data += rx_frag_head_sz; +- if (pkt_len) { ++ rtl_rx_vlan_tag(rx_desc, skb); ++ ++ if (use_frags) { ++ if (rx_frag_head_sz) { ++ memcpy(skb->data, rx_data, ++ rx_frag_head_sz); ++ skb_put(skb, rx_frag_head_sz); ++ len -= rx_frag_head_sz; ++ rx_data += rx_frag_head_sz; ++ skb->protocol = eth_type_trans(skb, ++ netdev); ++ } ++ + skb_add_rx_frag(skb, 0, agg->page, + agg_offset(agg, rx_data), +- pkt_len, +- SKB_DATA_ALIGN(pkt_len)); ++ len, SKB_DATA_ALIGN(len)); + get_page(agg->page); ++ } else { ++ memcpy(skb->data, rx_data, len); ++ skb_put(skb, len); ++ skb->protocol = eth_type_trans(skb, netdev); + } + +- skb->protocol = eth_type_trans(skb, netdev); +- rtl_rx_vlan_tag(rx_desc, skb); + if (work_done < budget) { ++ if (use_frags) ++ napi_gro_frags(napi); ++ else ++ napi_gro_receive(napi, skb); ++ + work_done++; + stats->rx_packets++; +- stats->rx_bytes += skb->len; +- napi_gro_receive(napi, skb); ++ stats->rx_bytes += pkt_len; + } else { + __skb_queue_tail(&tp->rx_queue, skb); + } + + find_next_rx: +- rx_data = rx_agg_align(rx_data + pkt_len + ETH_FCS_LEN); ++ rx_data = rx_agg_align(rx_data + len + ETH_FCS_LEN); + rx_desc = (struct rx_desc *)rx_data; + len_used = agg_offset(agg, rx_data); + len_used += sizeof(struct rx_desc); diff --git a/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch index 96525089ef5a9e..26c5af8510e53c 100644 --- a/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch +++ b/target/linux/generic/hack-5.15/760-net-usb-r8152-add-LED-configuration-from-OF.patch @@ -22,7 +22,7 @@ Signed-off-by: David Bauer #include #include #include -@@ -6896,6 +6897,22 @@ static void rtl_tally_reset(struct r8152 +@@ -6980,6 +6981,22 @@ static void rtl_tally_reset(struct r8152 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); } @@ -45,7 +45,7 @@ Signed-off-by: David Bauer static void r8152b_init(struct r8152 *tp) { u32 ocp_data; -@@ -6937,6 +6954,8 @@ static void r8152b_init(struct r8152 *tp +@@ -7021,6 +7038,8 @@ static void r8152b_init(struct r8152 *tp ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); @@ -54,7 +54,7 @@ Signed-off-by: David Bauer } static void r8153_init(struct r8152 *tp) -@@ -7077,6 +7096,8 @@ static void r8153_init(struct r8152 *tp) +@@ -7161,6 +7180,8 @@ static void r8153_init(struct r8152 *tp) tp->coalesce = COALESCE_SLOW; break; } @@ -63,7 +63,7 @@ Signed-off-by: David Bauer } static void r8153b_init(struct r8152 *tp) -@@ -7159,6 +7180,8 @@ static void r8153b_init(struct r8152 *tp +@@ -7243,6 +7264,8 @@ static void r8153b_init(struct r8152 *tp rtl_tally_reset(tp); tp->coalesce = 15000; /* 15 us */ diff --git a/target/linux/generic/hack-6.1/760-net-usb-r8152-add-LED-configuration-from-OF.patch b/target/linux/generic/hack-6.1/760-net-usb-r8152-add-LED-configuration-from-OF.patch index 7b7fcca11f422b..c842639792f120 100644 --- a/target/linux/generic/hack-6.1/760-net-usb-r8152-add-LED-configuration-from-OF.patch +++ b/target/linux/generic/hack-6.1/760-net-usb-r8152-add-LED-configuration-from-OF.patch @@ -22,7 +22,7 @@ Signed-off-by: David Bauer #include #include #include -@@ -6903,6 +6904,22 @@ static void rtl_tally_reset(struct r8152 +@@ -7020,6 +7021,22 @@ static void rtl_tally_reset(struct r8152 ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); } @@ -45,7 +45,7 @@ Signed-off-by: David Bauer static void r8152b_init(struct r8152 *tp) { u32 ocp_data; -@@ -6944,6 +6961,8 @@ static void r8152b_init(struct r8152 *tp +@@ -7061,6 +7078,8 @@ static void r8152b_init(struct r8152 *tp ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); @@ -54,7 +54,7 @@ Signed-off-by: David Bauer } static void r8153_init(struct r8152 *tp) -@@ -7084,6 +7103,8 @@ static void r8153_init(struct r8152 *tp) +@@ -7201,6 +7220,8 @@ static void r8153_init(struct r8152 *tp) tp->coalesce = COALESCE_SLOW; break; } @@ -63,7 +63,7 @@ Signed-off-by: David Bauer } static void r8153b_init(struct r8152 *tp) -@@ -7166,6 +7187,8 @@ static void r8153b_init(struct r8152 *tp +@@ -7283,6 +7304,8 @@ static void r8153b_init(struct r8152 *tp rtl_tally_reset(tp); tp->coalesce = 15000; /* 15 us */ From 09d5ae78b47a9d893a570c1d5ef69cba5680565c Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 16 Nov 2023 23:02:33 +0800 Subject: [PATCH 3/8] mediatek: add support for JDCloud AX6000 --- .../mediatek/dts/mt7986a-jdcloud-re-cs-05.dts | 281 ++++++++++++++++++ .../filogic/base-files/etc/board.d/02_network | 6 + .../etc/hotplug.d/firmware/11-mt76-caldata | 3 +- .../base-files/lib/preinit/81_fix_eeprom | 3 +- .../base-files/lib/upgrade/platform.sh | 6 +- 5 files changed, 295 insertions(+), 4 deletions(-) create mode 100644 target/linux/mediatek/dts/mt7986a-jdcloud-re-cs-05.dts diff --git a/target/linux/mediatek/dts/mt7986a-jdcloud-re-cs-05.dts b/target/linux/mediatek/dts/mt7986a-jdcloud-re-cs-05.dts new file mode 100644 index 00000000000000..00b4c79c6bf8f1 --- /dev/null +++ b/target/linux/mediatek/dts/mt7986a-jdcloud-re-cs-05.dts @@ -0,0 +1,281 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +/dts-v1/; +#include +#include + +#include "mt7986a.dtsi" + +/ { + model = "JDCloud RE-CS-05"; + compatible = "jdcloud,re-cs-05", "mediatek,mt7986a"; + + aliases { + serial0 = &uart0; + led-boot = &led_status_green; + led-failsafe = &led_status_red; + led-running = &led_status_blue; + led-upgrade = &led_status_red; + }; + + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "console=ttyS0,115200n8 root=PARTLABEL=rootfs rootwait"; + }; + + keys { + compatible = "gpio-keys"; + + reset { + label = "reset"; + linux,code = ; + gpios = <&pio 9 GPIO_ACTIVE_LOW>; + }; + + wps { + label = "wps"; + linux,code = ; + gpios = <&pio 10 GPIO_ACTIVE_LOW>; + }; + }; + + leds { + compatible = "gpio-leds"; + + led_status_blue: blue { + label = "blue:status"; + gpios = <&pio 7 GPIO_ACTIVE_HIGH>; + }; + + led_status_red: red { + label = "red:status"; + gpios = <&pio 11 GPIO_ACTIVE_HIGH>; + }; + + led_status_green: green { + label = "green:status"; + gpios = <&pio 12 GPIO_ACTIVE_LOW>; + }; + }; + + reg_1p8v: regulator-1p8v { + compatible = "regulator-fixed"; + regulator-name = "fixed-1.8V"; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + regulator-boot-on; + regulator-always-on; + }; + + reg_3p3v: regulator-3p3v { + compatible = "regulator-fixed"; + regulator-name = "fixed-3.3V"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-boot-on; + regulator-always-on; + }; +}; + +&crypto { + status = "okay"; +}; + +ð { + status = "okay"; + + gmac0: mac@0 { + compatible = "mediatek,eth-mac"; + reg = <0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + + gmac1: mac@1 { + compatible = "mediatek,eth-mac"; + reg = <1>; + phy-handle = <&phy6>; + phy-mode = "2500base-x"; + }; + + mdio: mdio-bus { + #address-cells = <1>; + #size-cells = <0>; + }; +}; + +&mdio { + phy6: ethernet-phy@6 { + compatible = "ethernet-phy-ieee802.3-c45"; + reg = <6>; + reset-assert-us = <100000>; + reset-deassert-us = <100000>; + reset-gpios = <&pio 6 GPIO_ACTIVE_LOW>; + realtek,aldps-enable; + }; + + switch: switch@0 { + compatible = "mediatek,mt7531"; + reg = <31>; + reset-gpios = <&pio 5 GPIO_ACTIVE_HIGH>; + interrupt-controller; + #interrupt-cells = <1>; + interrupt-parent = <&pio>; + interrupts = <66 IRQ_TYPE_LEVEL_HIGH>; + }; +}; + +&switch { + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@1 { + reg = <1>; + label = "lan1"; + }; + + port@2 { + reg = <2>; + label = "lan2"; + }; + + port@3 { + reg = <3>; + label = "lan3"; + }; + + port@4 { + reg = <4>; + label = "lan4"; + }; + + port@6 { + reg = <6>; + ethernet = <&gmac0>; + phy-mode = "2500base-x"; + + fixed-link { + speed = <2500>; + full-duplex; + pause; + }; + }; + }; +}; + +&mmc0 { + pinctrl-names = "default", "state_uhs"; + pinctrl-0 = <&mmc0_pins_default>; + pinctrl-1 = <&mmc0_pins_uhs>; + bus-width = <8>; + cap-mmc-highspeed; + hs400-ds-delay = <0x14014>; + max-frequency = <200000000>; + mmc-hs200-1_8v; + mmc-hs400-1_8v; + non-removable; + vmmc-supply = <®_3p3v>; + vqmmc-supply = <®_1p8v>; + status = "okay"; +}; + +&pio { + mmc0_pins_default: mmc0-pins { + mux { + function = "emmc"; + groups = "emmc_51"; + }; + conf-cmd-dat { + pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2", + "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5", + "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD"; + input-enable; + drive-strength = <4>; + mediatek,pull-up-adv = <1>; /* pull-up 10K */ + }; + conf-clk { + pins = "EMMC_CK"; + drive-strength = <6>; + mediatek,pull-down-adv = <2>; /* pull-down 50K */ + }; + conf-ds { + pins = "EMMC_DSL"; + mediatek,pull-down-adv = <2>; /* pull-down 50K */ + }; + conf-rst { + pins = "EMMC_RSTB"; + drive-strength = <4>; + mediatek,pull-up-adv = <1>; /* pull-up 10K */ + }; + }; + + mmc0_pins_uhs: mmc0-uhs-pins { + mux { + function = "emmc"; + groups = "emmc_51"; + }; + conf-cmd-dat { + pins = "EMMC_DATA_0", "EMMC_DATA_1", "EMMC_DATA_2", + "EMMC_DATA_3", "EMMC_DATA_4", "EMMC_DATA_5", + "EMMC_DATA_6", "EMMC_DATA_7", "EMMC_CMD"; + input-enable; + drive-strength = <4>; + mediatek,pull-up-adv = <1>; /* pull-up 10K */ + }; + conf-clk { + pins = "EMMC_CK"; + drive-strength = <6>; + mediatek,pull-down-adv = <2>; /* pull-down 50K */ + }; + conf-ds { + pins = "EMMC_DSL"; + mediatek,pull-down-adv = <2>; /* pull-down 50K */ + }; + conf-rst { + pins = "EMMC_RSTB"; + drive-strength = <4>; + mediatek,pull-up-adv = <1>; /* pull-up 10K */ + }; + }; + + wf_2g_5g_pins: wf_2g_5g-pins { + mux { + function = "wifi"; + groups = "wf_2g", "wf_5g"; + }; + conf { + pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4", + "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6", + "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10", + "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1", + "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0", + "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8", + "WF1_TOP_CLK", "WF1_TOP_DATA"; + drive-strength = <4>; + }; + }; +}; + +&trng { + status = "okay"; +}; + +&uart0 { + status = "okay"; +}; + +&watchdog { + status = "okay"; +}; + +&wmac { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&wf_2g_5g_pins>; +}; diff --git a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network index c2c50f6b5fd6f0..750de97f366917 100644 --- a/target/linux/mediatek/filogic/base-files/etc/board.d/02_network +++ b/target/linux/mediatek/filogic/base-files/etc/board.d/02_network @@ -9,6 +9,7 @@ mediatek_setup_interfaces() case $board in asus,tuf-ax4200|\ + jdcloud,re-cs-05|\ netcore,n60) ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4" eth1 ;; @@ -83,6 +84,11 @@ mediatek_setup_macs() lan_mac=$(macaddr_add "$wan_mac" 1) label_mac=$wan_mac ;; + jdcloud,re-cs-05) + wan_mac=$(mmc_get_mac_binary factory 0x24) + lan_mac=$(mmc_get_mac_binary factory 0x2a) + label_mac=$lan_mac + ;; qihoo,360t7) lan_mac=$(mtd_get_mac_ascii factory lanMac) wan_mac=$(macaddr_add "$lan_mac" 1) diff --git a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata index 6437dfbe621032..56a704f5a16868 100644 --- a/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata +++ b/target/linux/mediatek/filogic/base-files/etc/hotplug.d/firmware/11-mt76-caldata @@ -17,7 +17,8 @@ case "$FIRMWARE" in ;; "mediatek/mt7986_eeprom_mt7976_dual.bin") case "$board" in - glinet,gl-mt6000) + glinet,gl-mt6000|\ + jdcloud,re-cs-05) caldata_extract_mmc "factory" 0x0 0x1000 ;; esac diff --git a/target/linux/mediatek/filogic/base-files/lib/preinit/81_fix_eeprom b/target/linux/mediatek/filogic/base-files/lib/preinit/81_fix_eeprom index bbda755a979245..ee36ffe7cd6c4c 100644 --- a/target/linux/mediatek/filogic/base-files/lib/preinit/81_fix_eeprom +++ b/target/linux/mediatek/filogic/base-files/lib/preinit/81_fix_eeprom @@ -2,7 +2,8 @@ preinit_fix_eeprom() { case $(board_name) in - glinet,gl-mt6000) + glinet,gl-mt6000|\ + jdcloud,re-cs-05) mmc_part=$(find_mmc_part factory) FIRMWARE="mediatek/mt7986_eeprom_mt7976_dual.bin" [ ! -e /lib/firmware/"$FIRMWARE" ] && \ diff --git a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh index 9649a2c99b1b8a..8619c72b860ffe 100755 --- a/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh +++ b/target/linux/mediatek/filogic/base-files/lib/upgrade/platform.sh @@ -30,7 +30,8 @@ platform_do_upgrade() { esac ;; glinet,gl-mt2500|\ - glinet,gl-mt6000) + glinet,gl-mt6000|\ + jdcloud,re-cs-05) CI_KERNPART="kernel" CI_ROOTPART="rootfs" emmc_do_upgrade "$1" @@ -76,7 +77,8 @@ platform_copy_config() { esac ;; glinet,gl-mt2500|\ - glinet,gl-mt6000) + glinet,gl-mt6000|\ + jdcloud,re-cs-05) emmc_copy_config ;; esac From 276ea289ecb89cd7c721f1eb983cf140b46bf64a Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Thu, 7 Dec 2023 17:34:12 +0800 Subject: [PATCH 4/8] mediatek: add device pacakges for JDCloud AX6000 --- target/linux/mediatek/image/filogic.mk | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/target/linux/mediatek/image/filogic.mk b/target/linux/mediatek/image/filogic.mk index 9f07d894a044f7..10c1b7b4e8e844 100644 --- a/target/linux/mediatek/image/filogic.mk +++ b/target/linux/mediatek/image/filogic.mk @@ -215,6 +215,20 @@ define Device/jcg_q30-pro endef TARGET_DEVICES += jcg_q30-pro +define Device/jdcloud_re-cs-05 + DEVICE_VENDOR := JDCloud + DEVICE_MODEL := AX6000 + DEVICE_DTS := mt7986a-jdcloud-re-cs-05 + DEVICE_DTS_DIR := ../dts + DEVICE_PACKAGES := e2fsprogs f2fsck mkf2fs kmod-mt7986-firmware mt7986-wo-firmware + UBINIZE_OPTS := -E 5 + BLOCKSIZE := 128k + PAGESIZE := 2048 + IMAGES := sysupgrade.bin + IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata +endef +TARGET_DEVICES += jdcloud_re-cs-05 + define Device/mediatek_mt7986a-rfb DEVICE_VENDOR := MediaTek DEVICE_MODEL := MTK7986 rfba AP From 22134ba1846bc20f445eca76d86491cbd675deaa Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 25 Nov 2023 21:25:05 +0800 Subject: [PATCH 5/8] ipq95xx: add initial target support --- target/linux/ipq95xx/Makefile | 18 + target/linux/ipq95xx/base-files/etc/inittab | 3 + target/linux/ipq95xx/config-6.1 | 1202 +++++ target/linux/ipq95xx/generic/config-default | 70 + target/linux/ipq95xx/generic/target.mk | 8 + target/linux/ipq95xx/image/Makefile | 35 + target/linux/ipq95xx/image/generic.mk | 14 + ...-qcom-smd-rpm-Add-IPQ9574-compatible.patch | 32 + ...q-pll-refactor-the-driver-to-accommo.patch | 127 + ...pha-pll-Add-support-for-Stromer-PLLs.patch | 229 + ...-Add-IDs-for-IPQ9574-and-its-variant.patch | 38 + ...dd-ipq9574-SoC-and-AL02-board-suppor.patch | 404 ++ ...nfig-Enable-IPQ9574-SoC-base-configs.patch | 38 + ...bal-Clock-Controller-driver-for-IPQ9.patch | 4308 +++++++++++++++++ ...k-Add-ipq9574-clock-and-reset-defini.patch | 482 ++ ...ctrl-qcom-Add-IPQ9574-pinctrl-driver.patch | 889 ++++ ...pq9574-Add-support-for-APSS-clock-co.patch | 48 + ...apss-ipq-pll-Add-support-for-IPQ9574.patch | 66 + ...tor-qcom_smd-Add-MP5496-S1-regulator.patch | 43 + ...ipq9574-rename-al02-c7-dts-to-rdp433.patch | 49 + ...pq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch | 44 + ...pq9574-Update-the-size-of-GICC-GICV-.patch | 42 + ...pq9574-add-support-for-RDP418-varian.patch | 166 + ...64-dts-qcom-ipq9574-Add-SMEM-support.patch | 48 + ...pq9574-add-support-for-RDP449-varian.patch | 121 + ...dts-qcom-ipq9574-Add-cpufreq-support.patch | 127 + ...com-ipq9574-Add-SMPA1-regulator-node.patch | 50 + ...s-qcom-ipq9574-Add-RPM-related-nodes.patch | 55 + ...ts-qcom-ipq9574-add-few-device-nodes.patch | 252 + ...-add-few-more-reserved-memory-region.patch | 99 + ...m64-dts-qcom-ipq9574-add-QFPROM-node.patch | 38 + ...pq9574-add-support-for-RDP453-varian.patch | 120 + ...pq9574-add-support-for-RDP454-varian.patch | 120 + ...pq9574-add-few-more-reserved-memory-.patch | 60 + ...pq9574-Use-assigned-clock-rates-for-.patch | 59 + ...om-ipq9574-Fix-hwlock-index-for-SMEM.patch | 36 + ...pq9574-include-the-GPLL0-as-clock-pr.patch | 40 + ...q6018-add-the-GPLL0-clock-also-as-cl.patch | 50 + ...-drop-the-CLK_SET_RATE_PARENT-flag-f.patch | 62 + ...m-use-64-bit-calling-convention-only.patch | 53 + ...com-ipq9574-Add-common-RDP-dtsi-file.patch | 519 ++ ...pq9574-populate-the-opp-table-based-.patch | 110 + ...alpha-pll-introduce-stromer-plus-ops.patch | 106 + ...-nvmem-Introduce-cpufreq-for-ipq95xx.patch | 74 + ...-dts-qcom-ipq9574-Enable-WPS-buttons.patch | 66 + ...apss-ipq-pll-add-support-for-IPQ5332.patch | 131 + ...q-pll-Use-stromer-plus-ops-for-strom.patch | 39 + ...dd-STROMER-PLUS-PLL-type-for-IPQ5332.patch | 55 + 48 files changed, 10845 insertions(+) create mode 100644 target/linux/ipq95xx/Makefile create mode 100644 target/linux/ipq95xx/base-files/etc/inittab create mode 100644 target/linux/ipq95xx/config-6.1 create mode 100644 target/linux/ipq95xx/generic/config-default create mode 100644 target/linux/ipq95xx/generic/target.mk create mode 100644 target/linux/ipq95xx/image/Makefile create mode 100644 target/linux/ipq95xx/image/generic.mk create mode 100644 target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch create mode 100644 target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch diff --git a/target/linux/ipq95xx/Makefile b/target/linux/ipq95xx/Makefile new file mode 100644 index 00000000000000..875f7f954f29bf --- /dev/null +++ b/target/linux/ipq95xx/Makefile @@ -0,0 +1,18 @@ +include $(TOPDIR)/rules.mk + +ARCH:=aarch64 +BOARD:=ipq95xx +BOARDNAME:=Qualcomm Atheros IPQ95XX +FEATURES:=squashfs fpu ramdisk nand pcie +CPU_TYPE:=cortex-a73 +SUBTARGETS:=generic + +KERNELNAME:=Image dtbs +KERNEL_PATCHVER:=6.1 + +include $(INCLUDE_DIR)/target.mk + +DEFAULT_PACKAGES += \ + e2fsprogs uboot-envtools kmod-leds-gpio kmod-gpio-button-hotplug + +$(eval $(call BuildTarget)) diff --git a/target/linux/ipq95xx/base-files/etc/inittab b/target/linux/ipq95xx/base-files/etc/inittab new file mode 100644 index 00000000000000..167adf0348e5b4 --- /dev/null +++ b/target/linux/ipq95xx/base-files/etc/inittab @@ -0,0 +1,3 @@ +::sysinit:/etc/init.d/rcS S boot +::shutdown:/etc/init.d/rcS K shutdown +ttyMSM0::askfirst:/usr/libexec/login.sh diff --git a/target/linux/ipq95xx/config-6.1 b/target/linux/ipq95xx/config-6.1 new file mode 100644 index 00000000000000..ad18acbc33ed30 --- /dev/null +++ b/target/linux/ipq95xx/config-6.1 @@ -0,0 +1,1202 @@ +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y +CONFIG_GENERIC_IRQ_IPI=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +# CONFIG_IRQ_MSI_IOMMU is not set +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_SPARSE_IRQ=y +# CONFIG_GENERIC_IRQ_DEBUGFS is not set +CONFIG_GENERIC_TIME_VSYSCALL=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_HAS_TICK_BROADCAST=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_CONTEXT_TRACKING=y +CONFIG_CONTEXT_TRACKING_IDLE=y +CONFIG_TICK_ONESHOT=y +CONFIG_NO_HZ_COMMON=y +# CONFIG_HZ_PERIODIC is not set +CONFIG_NO_HZ_IDLE=y +# CONFIG_NO_HZ_FULL is not set +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +# CONFIG_ARCH_BITMAIN is not set +CONFIG_ARCH_DMA_ADDR_T_64BIT=y +CONFIG_ARCH_FORCE_MAX_ORDER=11 +CONFIG_ARCH_HIBERNATION_POSSIBLE=y +# CONFIG_ARCH_IPQ40XX is not set +# CONFIG_ARCH_IPQ5332 is not set +# CONFIG_ARCH_IPQ6018 is not set +CONFIG_ARCH_KEEP_MEMBLOCK=y +# CONFIG_ARCH_MDM9615 is not set +CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y +# CONFIG_ARCH_MILBEAUT is not set +CONFIG_ARCH_MMAP_RND_BITS=18 +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=11 +# CONFIG_ARCH_MSM8909 is not set +# CONFIG_ARCH_MSM8916 is not set +# CONFIG_ARCH_MSM8960 is not set +# CONFIG_ARCH_MSM8974 is not set +# CONFIG_ARCH_MSM8X60 is not set +CONFIG_ARCH_MULTIPLATFORM=y +CONFIG_ARCH_MULTI_V6_V7=y +CONFIG_ARCH_MULTI_V7=y +CONFIG_ARCH_NR_GPIO=0 +CONFIG_ARCH_OPTIONAL_KERNEL_RWX=y +CONFIG_ARCH_OPTIONAL_KERNEL_RWX_DEFAULT=y +# CONFIG_ARCH_NXP is not set +CONFIG_ARCH_QCOM=y +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +CONFIG_ARCH_STACKWALK=y +CONFIG_ARCH_SUSPEND_POSSIBLE=y +CONFIG_ARCH_WANTS_NO_INSTR=y +CONFIG_ARCH_WANTS_THP_SWAP=y +CONFIG_ARM64=y +CONFIG_ARM64_4K_PAGES=y +CONFIG_ARM64_EPAN=y +# CONFIG_ARM_QCOM_CPUFREQ_HW is not set +# CONFIG_ARM_ARCH_TIMER_EVTSTREAM is not set +# CONFIG_ARM64_CNP is not set +# CONFIG_ARM64_ERRATUM_1742098 is not set +# CONFIG_ARM64_ERRATUM_2051678 is not set +# CONFIG_ARM64_ERRATUM_2054223 is not set +# CONFIG_ARM64_ERRATUM_2067961 is not set +# CONFIG_ARM64_ERRATUM_2077057 is not set +# CONFIG_ARM64_ERRATUM_2441007 is not set +# CONFIG_ARM64_ERRATUM_2441009 is not set +# CONFIG_ARM64_ERRATUM_2658417 is not set +# CONFIG_ARM64_PMEM is not set +# CONFIG_ARM64_PSEUDO_NMI is not set +CONFIG_COMPAT_32BIT_TIME=y +CONFIG_ARM64_TAGGED_ADDR_ABI=y +CONFIG_ARM_THUMB=y +CONFIG_ARM_PATCH_IDIV=y +CONFIG_ARM_PATCH_PHYS_VIRT=y +CONFIG_ARM_QCOM_CPUFREQ_NVMEM=y +# CONFIG_ARM_QCOM_SPM_CPUIDLE is not set +# CONFIG_RELOCATABLE is not set +# CONFIG_RANDOMIZE_BASE is not set +# CONFIG_RANDOMIZE_MODULE_REGION_FULL is not set +# CONFIG_RANDOMIZE_KSTACK_OFFSET is not set +CONFIG_ARCH_NR_GPIO=0 +CONFIG_CMDLINE="" +# CONFIG_EFI is not set +CONFIG_SUSPEND=y +CONFIG_SUSPEND_FREEZER=y +# CONFIG_SUSPEND_SKIP_SYNC is not set +# CONFIG_HIBERNATION is not set +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +# CONFIG_PM_AUTOSLEEP is not set +# CONFIG_PM_USERSPACE_AUTOSLEEP is not set +# CONFIG_PM_WAKELOCKS is not set +CONFIG_PM=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_CLK=y +CONFIG_PM_GENERIC_DOMAINS=y +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +# CONFIG_ARM_HIGHBANK_CPUIDLE is not set +CONFIG_ARM_PSCI=y +CONFIG_ARM_PSCI_FW=y +# CONFIG_ARM_SMMU is not set +# CONFIG_ARM_SMMU_V3 is not set +# CONFIG_QCOM_IOMMU is not set +# CONFIG_VIRTIO_IOMMU is not set +CONFIG_ATA=y +CONFIG_AUDIT_ARCH_COMPAT_GENERIC=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_NVME=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_COUNT=16 +CONFIG_BLK_DEV_RAM_SIZE=4096 +CONFIG_BLK_INLINE_ENCRYPTION=y +CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y +# CONFIG_VIRTIO_BLK is not set +CONFIG_BMP280=y +CONFIG_BMP280_I2C=y +# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0 +CONFIG_BOUNCE=y +# CONFIG_BPF_KPROBE_OVERRIDE is not set +# CONFIG_BPFILTER is not set +CONFIG_BRIDGE_VLAN_FILTERING=y +# CONFIG_BT_HCIBTUSB_MTK is not set +# CONFIG_BT_MTKSDIO is not set +CONFIG_BUILD_BIN2C=y +# CONFIG_BUS_TOPOLOGY_ADHOC is not set +# CONFIG_CACHE_L2X0 is not set +# CONFIG_CAVIUM_TX2_ERRATUM_219 is not set +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_CC_STACKPROTECTOR=y +# CONFIG_CC_STACKPROTECTOR_NONE is not set +CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_CFG80211_HEADERS=y +# CONFIG_CHARGER_LT3651 is not set +# CONFIG_CHARGER_QCOM_SMBB is not set +# CONFIG_CHARGER_UCS1002 is not set +CONFIG_CLEANCACHE=y +CONFIG_CLKDEV_LOOKUP=y +CONFIG_CLKSRC_OF=y +CONFIG_CLKSRC_PROBE=y +CONFIG_CLKSRC_QCOM=y +CONFIG_CLONE_BACKWARDS=y +# CONFIG_CMA is not set +# CONFIG_CMA_ALIGNMENT is not set +# CONFIG_CMA_AREAS is not set +# CONFIG_CMA_DEBUG is not set +# CONFIG_CMA_DEBUGFS is not set +# CONFIG_CMA_SIZE_MBYTES is not set +# CONFIG_CMA_SIZE_SEL_MAX is not set +# CONFIG_CMA_SIZE_SEL_MBYTES is not set +# CONFIG_CMA_SIZE_SEL_MIN is not set +# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set +CONFIG_CNSS2=y +CONFIG_CNSS2_QCA9574_SUPPORT=y +# CONFIG_CNSS2_CALIBRATION_SUPPORT is not set +# CONFIG_CNSS2_DEBUG is not set +CONFIG_CNSS2_GENL=y +# CONFIG_CNSS2_PCI_DRIVER is not set +# CONFIG_CNSS2_PM is not set +# CONFIG_CNSS2_RAMDUMP is not set +# CONFIG_CNSS2_SMMU is not set +CONFIG_CNSS_QCN9000=y +# CONFIG_SURFACE_PLATFORMS is not set +CONFIG_COMMON_CLK=y +CONFIG_COMMON_CLK_QCOM=y +# CONFIG_COMMON_CLK_XGENE is not set +# CONFIG_COMMON_CLK_SI5341 is not set +CONFIG_CONFIGFS_FS=y +CONFIG_COREDUMP=y +CONFIG_CORESIGHT=y +# CONFIG_CORESIGHT_BYTE_CNTR is not set +# CONFIG_CORESIGHT_CATU is not set +# CONFIG_CORESIGHT_CPU_DEBUG is not set +CONFIG_CORESIGHT_CSR=y +CONFIG_CORESIGHT_CTI=y +# CONFIG_CORESIGHT_CTI_INTEGRATION_REGS is not set +# CONFIG_CORESIGHT_TRBE is not set +# CONFIG_CORESIGHT_CTI_SAVE_DISABLE is not set +# CONFIG_CORESIGHT_DUMMY is not set +CONFIG_CORESIGHT_HWEVENT=y +CONFIG_CORESIGHT_LINKS_AND_SINKS=y +CONFIG_CORESIGHT_LINK_AND_SINK_TMC=y +# CONFIG_CORESIGHT_REMOTE_ETM is not set +# CONFIG_CORESIGHT_SINK_ETBV10 is not set +# CONFIG_CORESIGHT_SINK_TPIU is not set +# CONFIG_CORESIGHT_SOURCE_ETM3X is not set +CONFIG_CORESIGHT_SOURCE_ETM4X=y +CONFIG_CORESIGHT_STM=y +CONFIG_CORESIGHT_TPDA=y +CONFIG_CORESIGHT_TPDM=y +# CONFIG_CORESIGHT_TPDM_DEFAULT_ENABLE is not set +# CONFIG_COUNTER is not set +CONFIG_CPUFREQ_DT=y +CONFIG_CPUFREQ_DT_PLATDEV=y +CONFIG_CPU_32v6K=y +CONFIG_CPU_32v7=y +CONFIG_CPU_ABRT_EV7=y +# CONFIG_CPU_BIG_ENDIAN is not set +CONFIG_CPU_LITTLE_ENDIAN=y +# CONFIG_SCHED_CLUSTER is not set +# CONFIG_CPU_BPREDICT_DISABLE is not set +CONFIG_CPU_CACHE_V7=y +CONFIG_CPU_CACHE_VIPT=y +CONFIG_CPU_COPY_V6=y +CONFIG_CPU_CP15=y +CONFIG_CPU_CP15_MMU=y +CONFIG_CPU_FREQ=y +CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_COMMON=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_PERFORMANCE=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_STAT=y +CONFIG_CPU_HAS_ASID=y +# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set +# CONFIG_CPU_ICACHE_DISABLE is not set +# CONFIG_CPU_ICACHE_MISMATCH_WORKAROUND is not set +CONFIG_CPU_IDLE=y +CONFIG_CPU_IDLE_GOV_LADDER=y +CONFIG_CPU_IDLE_GOV_MENU=y +# CONFIG_CPU_IDLE_GOV_TEO is not set +CONFIG_CPU_IDLE_MULTIPLE_DRIVERS=y +CONFIG_CPU_PABRT_V7=y +CONFIG_CPU_PM=y +CONFIG_CPU_RMAP=y +# CONFIG_CPU_SW_DOMAIN_PAN is not set +# CONFIG_CPU_THERMAL is not set +CONFIG_CPU_TLB_V7=y +CONFIG_CPU_V7=y +CONFIG_CRC16=y +# CONFIG_CRC32_SARWATE is not set +CONFIG_CRC32_SLICEBY8=y +CONFIG_CROSS_MEMORY_ATTACH=y +# CONFIG_CRYPTO_ADIANTUM is not set +CONFIG_CRYPTO_AEAD=y +CONFIG_CRYPTO_AEAD2=y +CONFIG_CRYPTO_AES=y +# CONFIG_CRYPTO_DISABLE_AES192_TEST is not set +CONFIG_CRYPTO_AES_586=y +# CONFIG_CRYPTO_ALL_CASES is not set +CONFIG_CRYPTO_ARC4=y +CONFIG_CRYPTO_BLKCIPHER=y +CONFIG_CRYPTO_BLKCIPHER2=y +CONFIG_CRYPTO_CBC=y +CONFIG_CRYPTO_CCM=y +CONFIG_CRYPTO_CMAC=y +CONFIG_CRYPTO_CRC32C=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_DEFLATE=y +CONFIG_CRYPTO_DES=y +# CONFIG_CRYPTO_DEV_ATMEL_SHA204A is not set +# CONFIG_CRYPTO_DEV_HISI_ZIP is not set +# CONFIG_CRYPTO_DEV_OTA_CRYPTO is not set +CONFIG_CRYPTO_DEV_QCOM_ICE=y +# CONFIG_CRYPTO_DEV_QCOM_MSM_QCE is not set +# CONFIG_CRYPTO_DEV_QCOM_RNG is not set +CONFIG_CRYPTO_DISABLE_AHASH_LARGE_KEY_TEST=y +CONFIG_CRYPTO_DISABLE_AHASH_TYPE1_TESTS=y +CONFIG_CRYPTO_DISABLE_AHASH_TYPE2_TESTS=y +CONFIG_CRYPTO_DISABLE_AHASH_TYPE3_TESTS=y +CONFIG_CRYPTO_DISABLE_AUTH_SPLIT_TESTS=y +CONFIG_CRYPTO_DISABLE_HW_UNSUPPORTED_TESTS=y +CONFIG_CRYPTO_DISABLE_OUTOFPLACE_TESTS=y +CONFIG_CRYPTO_DRBG_HMAC=y +CONFIG_CRYPTO_DRBG_MENU=y +CONFIG_CRYPTO_ECB=y +CONFIG_CRYPTO_ECHAINIV=y +# CONFIG_CRYPTO_ECRDSA is not set +# CONFIG_CRYPTO_ESSIV is not set +CONFIG_CRYPTO_GCM=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_GHASH=y +CONFIG_CRYPTO_HASH=y +CONFIG_CRYPTO_HASH2=y +CONFIG_CRYPTO_HMAC=y +CONFIG_CRYPTO_HW=y +CONFIG_CRYPTO_JITTERENTROPY=y +CONFIG_CRYPTO_KPP2=y +CONFIG_CRYPTO_LIB_AES=y +CONFIG_CRYPTO_LIB_SHA256=y +CONFIG_CRYPTO_LIB_UTILS=y +CONFIG_CRYPTO_LZO=y +CONFIG_CRYPTO_MANAGER=y +CONFIG_CRYPTO_MANAGER2=y +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +# CONFIG_CRYPTO_MANAGER_EXTRA_TESTS is not set +CONFIG_CRYPTO_MD5_PPC=y +CONFIG_CRYPTO_MICHAEL_MIC=y +CONFIG_CRYPTO_NO_AES_XTS_ZERO_KEY_SUPPORT=y +CONFIG_CRYPTO_NO_AES_CTR_UNEVEN_DATA_LEN_SUPPORT=y +# CONFIG_CRYPTO_NO_ZERO_LEN_HASH is not set +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_NULL2=y +CONFIG_CRYPTO_OFB=y +# CONFIG_CRYPTO_PCRYPT is not set +# CONFIG_CRYPTO_POLYVAL_ARM64_CE is not set +CONFIG_CRYPTO_RMD160=y +CONFIG_CRYPTO_RNG=y +CONFIG_CRYPTO_RNG2=y +CONFIG_CRYPTO_RNG_DEFAULT=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_PPC=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_SHA512=y +# CONFIG_CRYPTO_SM3_NEON is not set +# CONFIG_CRYPTO_SM4_ARM64_CE_BLK is not set +# CONFIG_CRYPTO_SM4_ARM64_NEON_BLK is not set +# CONFIG_CRYPTO_STREEBOG is not set +CONFIG_CRYPTO_WORKQUEUE=y +CONFIG_CRYPTO_XTS=y +# CONFIG_CRYPTO_XXHASH is not set +CONFIG_CRYPTO_XZ=y +CONFIG_DCACHE_WORD_ACCESS=y +CONFIG_DEBUG_BUGVERBOSE=y +# CONFIG_DEBUG_EFI is not set +CONFIG_DEBUG_GPIO=y +# CONFIG_DEBUG_INFO_REDUCED is not set +CONFIG_DEBUG_KMEMLEAK_AUTO_SCAN=y +CONFIG_DEBUG_LL_INCLUDE="mach/debug-macro.S" +# CONFIG_DEBUG_MISC is not set +# CONFIG_DEBUG_PLIST is not set +# CONFIG_DEBUG_UART_8250 is not set +# CONFIG_DEBUG_USER is not set +CONFIG_DECOMPRESS_GZIP=y +CONFIG_DEFAULT_SECURITY_DAC=y +CONFIG_DEVMEM=y +# CONFIG_DIAGFWD_BRIDGE_CODE is not set +# CONFIG_DIAG_MHI is not set +CONFIG_DIAG_OVER_QRTR=y +# CONFIG_DIAG_OVER_USB is not set +CONFIG_DMADEVICES=y +# CONFIG_DMA_CMA is not set +CONFIG_DMA_ENGINE=y +CONFIG_DMA_OF=y +# CONFIG_DMA_SOUND is not set +CONFIG_DMA_VIRTUAL_CHANNELS=y +# CONFIG_DMI is not set +# CONFIG_DMIID is not set +# CONFIG_DMI_SYSFS is not set +# CONFIG_DM_INIT is not set +# CONFIG_DP83640_PHY is not set +# CONFIG_DPS310 is not set +CONFIG_DTC=y +CONFIG_DT_IDLE_STATES=y +# CONFIG_DWMAC_GENERIC is not set +CONFIG_DYNAMIC_DEBUG=y +CONFIG_EDAC_ATOMIC_SCRUB=y +CONFIG_EDAC_SUPPORT=y +CONFIG_EXT4_FS=y +CONFIG_FIXED_PHY=y +CONFIG_FIX_EARLYCON_MEM=y +CONFIG_FWNODE_MDIO=y +CONFIG_FW_LOADER_PAGED_BUF=y +# CONFIG_FW_CACHE is not set +CONFIG_GENERIC_ALLOCATOR=y +CONFIG_GENERIC_BUG=y +CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y +# CONFIG_GENERIC_CPUFREQ_KRAIT is not set +CONFIG_GENERIC_IDLE_POLL_SETUP=y +CONFIG_GENERIC_IO=y +CONFIG_GENERIC_IRQ_SHOW=y +CONFIG_GENERIC_IRQ_SHOW_LEVEL=y +CONFIG_GENERIC_ISA_DMA=y +CONFIG_GENERIC_MSI_IRQ=y +CONFIG_GENERIC_MSI_IRQ_DOMAIN=y +CONFIG_GENERIC_PCI_IOMAP=y +CONFIG_GENERIC_PHY=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_GEN_RTC is not set +# CONFIG_GLACIER is not set +# CONFIG_GLINK_DEBUG_FS is not set +CONFIG_GPIOLIB=y +CONFIG_GPIOLIB_IRQCHIP=y +# CONFIG_GPIO_AMD_FCH is not set +# CONFIG_GPIO_CADENCE is not set +CONFIG_GPIO_DEVRES=y +# CONFIG_GPIO_GW_PLD is not set +# CONFIG_GPIO_LATCH is not set +# CONFIG_GPIO_NXP_74HC153 is not set +# CONFIG_GPIO_SAMA5D2_PIOBU is not set +CONFIG_GPIO_SYSFS=y +# CONFIG_GPIO_USB_DETECT is not set +# CONFIG_GSI is not set +# CONFIG_HABANA_AI is not set +CONFIG_HANDLE_DOMAIN_IRQ=y +CONFIG_HARDEN_BRANCH_PREDICTOR=y +CONFIG_HARDIRQS_SW_RESEND=y +CONFIG_HAS_DMA=y +CONFIG_HAS_IOMEM=y +CONFIG_HAS_IOPORT_MAP=y +CONFIG_HAVE_ARM_ARCH_TIMER=y +CONFIG_HAVE_SMP=y +CONFIG_HIGHMEM=y +CONFIG_HIGHPTE=y +# CONFIG_HIST_TRIGGERS is not set +CONFIG_HOTPLUG_CPU=y +CONFIG_HWSPINLOCK=y +CONFIG_HWSPINLOCK_QCOM=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_HW_RANDOM_CN10K=y +CONFIG_HZ_FIXED=0 +CONFIG_I2C=y +CONFIG_I2C_BOARDINFO=y +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_COMPAT=y +CONFIG_I2C_HELPER_AUTO=y +# CONFIG_I2C_NVIDIA_GPU is not set +# CONFIG_I2C_QCOM_CCI is not set +CONFIG_I2C_QUP=y +# CONFIG_I3C is not set +# CONFIG_IGC is not set +CONFIG_IIO=y +# CONFIG_IIO_BUFFER is not set +# CONFIG_IIO_TRIGGER is not set +# CONFIG_ADMV8818 is not set +# CONFIG_ADMV1014 is not set +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y +# CONFIG_IKHEADERS is not set +CONFIG_INITRAMFS_SOURCE="" +# CONFIG_RD_GZIP is not set +# CONFIG_RD_BZIP2 is not set +# CONFIG_RD_LZMA is not set +# CONFIG_RD_XZ is not set +# CONFIG_RD_LZO is not set +# CONFIG_RD_LZ4 is not set +# CONFIG_RD_ZSTD is not set +# CONFIG_BOOT_CONFIG is not set +# CONFIG_INITRAMFS_PRESERVE_MTIME is not set +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_INIT_ON_ALLOC_DEFAULT_ON is not set +# CONFIG_INIT_ON_FREE_DEFAULT_ON is not set +# CONFIG_INPUT_GPIO_VIBRA is not set +# CONFIG_INPUT_MSM_VIBRATOR is not set +# CONFIG_INPUT_PM8941_PWRKEY is not set +# CONFIG_INPUT_PM8XXX_VIBRATOR is not set +# CONFIG_INTERCONNECT is not set +CONFIG_IOMMU_HELPER=y +# CONFIG_IOMMU_DEBUGFS is not set +# CONFIG_IOMMU_DEFAULT_DMA_STRICT is not set +# CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set +# CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set +# CONFIG_IOMMU_IO_PGTABLE_LPAE is not set +# CONFIG_IOMMU_IO_PGTABLE_ARMV7S is not set +# CONFIG_IOMMU_IO_PGTABLE_DART is not set +# CONFIG_OF_IOMMU is not set +# CONFIG_IOMMU_DMA is not set +# CONFIG_IOMMU_SUPPORT is not set +# CONFIG_APQ_GCC_8084 is not set +# CONFIG_APQ_MMCC_8084 is not set +# CONFIG_IPQ_APSS_PLL is not set +CONFIG_IPQ_APSS_6018=y +CONFIG_IPQ_DEBUG=y +# CONFIG_IPQ_GCC_4019 is not set +# CONFIG_IPQ_GCC_5018 is not set +# CONFIG_IPQ_GCC_5332 is not set +# CONFIG_IPQ_GCC_6018 is not set +# CONFIG_IPQ_GCC_806X is not set +# CONFIG_IPQ_GCC_8074 is not set +# CONFIG_IPQ_GCC_DEVSOC is not set +CONFIG_IPQ_GCC_9574=y +CONFIG_IPQ_NSSCC_9574=y +# CONFIG_IPQ_LCC_806X is not set +CONFIG_IPQ_REG_UPDATE=y +# CONFIG_IPQ_REMOTEPROC_ADSP is not set +CONFIG_IPQ_SUBSYSTEM_DUMP=y +CONFIG_IPQ_SUBSYSTEM_RAMDUMP=y +# CONFIG_IPQ_SUBSYSTEM_RESTART is not set +# CONFIG_IPQ_SUBSYSTEM_RESTART_TEST is not set +CONFIG_IPQ_TCSR=y +CONFIG_IRQCHIP=y +CONFIG_IRQ_DOMAIN=y +CONFIG_IRQ_DOMAIN_HIERARCHY=y +CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y +CONFIG_IRQ_FORCED_THREADING=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_IRQ_WORK=y +CONFIG_JBD2=y +# CONFIG_KCOV is not set +CONFIG_KEYS=y +# CONFIG_KEYS_REQUEST_CACHE is not set +CONFIG_KPSS_XCC=y +# CONFIG_KPROBE_EVENTS_ON_NOTRACE is not set +# CONFIG_KRAITCC is not set +# CONFIG_KRAIT_CLOCKS is not set +# CONFIG_KRAIT_L2_ACCESSORS is not set +# CONFIG_LCD_CLASS_DEVICE is not set +CONFIG_LEDS_IPQ=y +# CONFIG_LEDS_LM3532 is not set +# CONFIG_LEDS_PCA9956B is not set +CONFIG_LEDS_TLC591XX=y +# CONFIG_LEDS_TRIGGER_AUDIO is not set +# CONFIG_LEDS_TRIGGER_PATTERN is not set +# CONFIG_LEDS_PWM_MULTICOLOR is not set +CONFIG_LIBFDT=y +CONFIG_LOCKUP_DETECTOR=y +# CONFIG_LOCK_EVENT_COUNTS is not set +CONFIG_LOCK_SPIN_ON_OWNER=y +CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity" +# CONFIG_LTC1660 is not set +CONFIG_LZO_COMPRESS=y +CONFIG_LZO_DECOMPRESS=y +CONFIG_MAILBOX=y +# CONFIG_MAILBOX_TEST is not set +# CONFIG_MAP_E_SUPPORT is not set +# CONFIG_MAX31856 is not set +# CONFIG_MAX44009 is not set +# CONFIG_MAX5432 is not set +# CONFIG_MB1232 is not set +# CONFIG_MCP3911 is not set +# CONFIG_MCP41010 is not set +CONFIG_MDIO=y +CONFIG_MDIO_BITBANG=y +CONFIG_MDIO_BOARDINFO=y +# CONFIG_MDIO_BUS_MUX_MULTIPLEXER is not set +CONFIG_MDIO_GPIO=y +CONFIG_MDIO_QCA=y +# CONFIG_MDM_GCC_9615 is not set +# CONFIG_MDM_LCC_9615 is not set +# CONFIG_MEMORY_HOTPLUG is not set +# CONFIG_MFD_LOCHNAGAR is not set +# CONFIG_MFD_MAX77650 is not set +CONFIG_MFD_QCOM_RPM=y +# CONFIG_MFD_SPMI_PMIC is not set +CONFIG_MFD_SYSCON=y +# CONFIG_MFD_TQMX86 is not set +CONFIG_MHI_BUS=y +CONFIG_MHI_BUS_DEBUG=y +# CONFIG_MHI_BUS_RESERVED_DMA_POOL is not set +CONFIG_MHI_NETDEV=y +CONFIG_MHI_QTI=y +# CONFIG_MHI_SATELLITE is not set +CONFIG_MHI_UCI=y +CONFIG_MHI_WWAN_CTRL=y +CONFIG_MHI_BUS_PCI_GENERIC=y +CONFIG_MIGHT_HAVE_CACHE_L2X0=y +CONFIG_MIGRATION=y +CONFIG_MMC=y +CONFIG_MMC_ARMMMCI=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_CRYPTO=y +CONFIG_MMC_QCOM_DML=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_IO_ACCESSORS=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +# CONFIG_MMC_SDHCI_OF_ARASAN is not set +# CONFIG_MMC_SDHCI_OF_ASPEED is not set +# CONFIG_MMC_SDHCI_PCI is not set +CONFIG_MMC_SDHCI_PLTFM=y +# CONFIG_MMC_STM32_SDMMC is not set +# CONFIG_MMC_TIFM_SD is not set +CONFIG_MODULES_TREE_LOOKUP=y +CONFIG_MODULES_USE_ELF_REL=y +# CONFIG_MSM_GCC_8660 is not set +# CONFIG_MSM_GCC_8909 is not set +# CONFIG_MSM_GCC_8916 is not set +# CONFIG_MSM_GCC_8939 is not set +# CONFIG_MSM_GCC_8960 is not set +# CONFIG_MSM_GCC_8974 is not set +# CONFIG_MSM_GCC_8976 is not set +# CONFIG_MSM_GCC_8994 is not set +# CONFIG_MSM_GCC_8996 is not set +# CONFIG_MSM_GCC_8998 is not set +# CONFIG_MSM_GPUCC_8998 is not set +# CONFIG_MSM_IOMMU is not set +# CONFIG_MSM_LCC_8960 is not set +# CONFIG_MSM_MHI is not set +# CONFIG_MSM_MHI_DEBUG is not set +# CONFIG_MSM_MHI_DEV is not set +# CONFIG_MSM_MHI_UCI is not set +# CONFIG_MSM_MMCC_8960 is not set +# CONFIG_MSM_MMCC_8974 is not set +# CONFIG_MSM_MMCC_8996 is not set +# CONFIG_MSM_QMI_INTERFACE is not set +# CONFIG_MSM_RPM_GLINK is not set +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_RPMSG=y +# CONFIG_MSM_RPM_SMD is not set +# CONFIG_MSM_SECURE_BUFFER is not set +# CONFIG_MSM_SMEM is not set +# CONFIG_MSM_TEST_QMI_CLIENT is not set +# CONFIG_MSM_MMCC_8998 is not set +# CONFIG_QCM_GCC_2290 is not set +# CONFIG_QCM_DISPCC_2290 is not set +# CONFIG_MTD_SPLIT_BCM_WFI_FW is not set +CONFIG_MTD_CMDLINE_PARTS=y +# CONFIG_MTD_HYPERBUS is not set +CONFIG_MTD_M25P80=y +# CONFIG_MTD_NAND_ECC_SW_BCH is not set +# CONFIG_MTD_NAND_ECC_SW_HAMMING_SMC is not set +CONFIG_MTD_NAND_QCOM=y +# CONFIG_MTD_NAND_QCOM_SERIAL is not set +# CONFIG_MTD_QCOMSMEM_PARTS is not set +CONFIG_MTD_RAW_NAND=y +# CONFIG_MTD_ROUTERBOOT_PARTS is not set +CONFIG_MTD_SPINAND_GIGADEVICE=y +CONFIG_MTD_SPINAND_MT29F=y +CONFIG_MTD_SPINAND_ONDIEECC=y +CONFIG_MTD_SPI_NOR=y +# CONFIG_MTD_SPLIT_ELF_FW is not set +CONFIG_MTD_SPLIT_FIRMWARE=y +CONFIG_MTD_SPLIT_FIT_FW=y +CONFIG_MTD_UBI=y +CONFIG_MTD_UBI_BEB_LIMIT=20 +CONFIG_MTD_UBI_BLOCK=y +# CONFIG_MTD_UBI_FASTMAP is not set +CONFIG_MTD_UBI_GLUEBI=y +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MULTI_IRQ_HANDLER=y +CONFIG_MUTEX_SPIN_ON_OWNER=y +CONFIG_NEED_DMA_MAP_STATE=y +CONFIG_NEON=y +CONFIG_NET=y +# CONFIG_VIRTIO_NET is not set +# CONFIG_NET_DSA_MV88E6063 is not set +CONFIG_NET_FLOW_LIMIT=y +CONFIG_NET_L3_MASTER_DEV=y +CONFIG_NET_PTP_CLASSIFY=y +# CONFIG_NET_SCH_TAPRIO is not set +CONFIG_NET_SWITCHDEV=y +# CONFIG_NET_VENDOR_GOOGLE is not set +# CONFIG_NET_VENDOR_PENSANDO is not set +# CONFIG_NF_CONNTRACK_DSCPREMARK_EXT is not set +# CONFIG_NF_IPV6_DUMMY_HEADER is not set +# CONFIG_NI_XGE_MANAGEMENT_ENET is not set +# CONFIG_NOA1305 is not set +CONFIG_NO_BOOTMEM=y +CONFIG_NO_HZ=y +CONFIG_NO_HZ_COMMON=y +CONFIG_NO_HZ_IDLE=y +CONFIG_NR_CPUS=4 +# CONFIG_NULL_TTY is not set +# CONFIG_NUMA is not set +CONFIG_NUM_ALT_PARTITION=16 +CONFIG_NVME_HWMON=y +CONFIG_NVMEM=y +# CONFIG_NVMEM_SYSFS is not set +CONFIG_NVMEM_QCOM_QFPROM=y +# CONFIG_NVMEM_RMEM is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set +# CONFIG_OCTEONTX2_AF is not set +# CONFIG_OCTEON_EP is not set +CONFIG_OF=y +CONFIG_OF_ADDRESS=y +CONFIG_OF_ADDRESS_PCI=y +CONFIG_OF_EARLY_FLATTREE=y +CONFIG_OF_FLATTREE=y +CONFIG_OF_GPIO=y +CONFIG_OF_IRQ=y +CONFIG_OF_KOBJ=y +CONFIG_OF_MDIO=y +CONFIG_OF_MTD=y +CONFIG_OF_NET=y +CONFIG_OF_PCI=y +CONFIG_OF_PCI_IRQ=y +CONFIG_OF_RESERVED_MEM=y +# CONFIG_OF_SLIMBUS is not set +CONFIG_OLD_SIGACTION=y +CONFIG_OLD_SIGSUSPEND3=y +CONFIG_PADATA=y +CONFIG_PAGE_OFFSET=0xC0000000 +# CONFIG_PAGE_TABLE_CHECK is not set +CONFIG_PANIC_ON_OOPS=y +CONFIG_PANIC_ON_OOPS_VALUE=1 +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PCI=y +# CONFIG_PCIEAER is not set +# CONFIG_PCIE_AL is not set +# CONFIG_PCIE_CADENCE_EP is not set +CONFIG_PCIE_DW=y +# CONFIG_PCIE_DW_PLAT is not set +# CONFIG_PCIE_PME is not set +CONFIG_PCIE_QCOM=y +CONFIG_PCI_DOMAINS=y +CONFIG_PCI_DOMAINS_GENERIC=y +CONFIG_PCI_MSI=y +CONFIG_PCI_MSI_IRQ_DOMAIN=y +CONFIG_PCS_XPCS=y +CONFIG_PERF_USE_VMALLOC=y +CONFIG_PGTABLE_LEVELS=2 +CONFIG_PHYLIB=y +CONFIG_PHYLINK=y +CONFIG_PHY_IPQ_UNIPHY_PCIE=y +CONFIG_PHYS_OFFSET=0x40000000 +# CONFIG_PHY_QCOM_APQ8064_SATA is not set +# CONFIG_PHY_QCOM_EDP is not set +# CONFIG_PHY_QCOM_IPQ4019_USB is not set +# CONFIG_PHY_QCOM_IPQ806X_SATA is not set +# CONFIG_PHY_QCOM_IPQ806X_USB is not set +# CONFIG_PHY_QCOM_PCIE2 is not set +CONFIG_PHY_QCOM_QMP=y +# CONFIG_PHY_QCOM_QUSB2 is not set +# CONFIG_PHY_QCOM_UFS is not set +# CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2 is not set +# CONFIG_PHY_QCOM_USB_HS_28NM is not set +# CONFIG_PHY_QCOM_USB_SS is not set +CONFIG_PINCTRL=y +# CONFIG_PINCTRL_APQ8064 is not set +# CONFIG_PINCTRL_APQ8084 is not set +# CONFIG_PINCTRL_DEVSOC is not set +# CONFIG_PINCTRL_IPQ4019 is not set +# CONFIG_PINCTRL_IPQ5018 is not set +# CONFIG_PINCTRL_IPQ5332 is not set +# CONFIG_PINCTRL_IPQ6018 is not set +# CONFIG_PINCTRL_IPQ8064 is not set +# CONFIG_PINCTRL_IPQ8074 is not set +CONFIG_PINCTRL_IPQ9574=y +# CONFIG_PINCTRL_MDM9615 is not set +CONFIG_PINCTRL_MSM=y +# CONFIG_PINCTRL_MSM8226 is not set +# CONFIG_PINCTRL_MSM8660 is not set +# CONFIG_PINCTRL_MSM8909 is not set +# CONFIG_PINCTRL_MSM8916 is not set +# CONFIG_PINCTRL_MSM8960 is not set +# CONFIG_PINCTRL_MSM8976 is not set +# CONFIG_PINCTRL_MSM8994 is not set +# CONFIG_PINCTRL_MSM8996 is not set +# CONFIG_PINCTRL_MSM8998 is not set +# CONFIG_PINCTRL_QCOM_SPMI_PMIC is not set +# CONFIG_PINCTRL_QCOM_SSBI_PMIC is not set +# CONFIG_PINCTRL_QCM2290 is not set +# CONFIG_PINCTRL_QCS404 is not set +# CONFIG_PINCTRL_SC7180 is not set +# CONFIG_PINCTRL_SC8280XP is not set +# CONFIG_PINCTRL_SDM660 is not set +# CONFIG_PINCTRL_SDM845 is not set +# CONFIG_PINCTRL_SDX65 is not set +# CONFIG_PINCTRL_SM8150 is not set +# CONFIG_PINCTRL_SM6350 is not set +# CONFIG_PINCTRL_SM6375 is not set +# CONFIG_PINCTRL_SM8250 is not set +# CONFIG_PINCTRL_SM8450 is not set +# CONFIG_PINCTRL_STMFX is not set +# CONFIG_PKCS7_TEST_KEY is not set +# CONFIG_PKCS7_MESSAGE_PARSER is not set +# CONFIG_PKCS8_PRIVATE_KEY_PARSER is not set +# CONFIG_PL330_DMA is not set +CONFIG_PM=y +# CONFIG_PM8916_WATCHDOG is not set +CONFIG_PM_CLK=y +# CONFIG_PM_DEBUG is not set +CONFIG_PM_GENERIC_DOMAINS=y +CONFIG_PM_GENERIC_DOMAINS_OF=y +CONFIG_PM_GENERIC_DOMAINS_SLEEP=y +CONFIG_PM_OPP=y +CONFIG_PM_SLEEP=y +CONFIG_PM_SLEEP_SMP=y +CONFIG_POWER_RESET=y +CONFIG_POWER_RESET_MSM=y +CONFIG_POWER_SUPPLY=y +CONFIG_PPS=y +CONFIG_PREEMPT=y +CONFIG_PREEMPT_COUNT=y +# CONFIG_PREEMPT_DYNAMIC is not set +# CONFIG_PREEMPT_NONE is not set +CONFIG_PREEMPT_RCU=y +# CONFIG_COMPAT_ALIGNMENT_FIXUPS is not set +# CONFIG_PRINTK_CALLER is not set +CONFIG_PRINTK_TIME=y +CONFIG_PROC_PAGE_MONITOR=y +# CONFIG_PROC_STRIPPED is not set +# CONFIG_PSI is not set +CONFIG_PTP_1588_CLOCK=y +CONFIG_PUBLIC_KEY_ALGO_RSA=y +# CONFIG_PVPANIC is not set +CONFIG_PWM=y +CONFIG_PWM_IPQ=y +# CONFIG_PWM_PCA9685 is not set +CONFIG_PWM_SYSFS=y +# CONFIG_PWM_CLK is not set +# CONFIG_PWM_XILINX is not set +# CONFIG_PWRSEQ_EMMC is not set +CONFIG_PWRSEQ_IPQ=y +# CONFIG_PWRSEQ_SIMPLE is not set +CONFIG_QCA_MINIDUMP=y +# CONFIG_QCA_MINIDUMP_DEBUG is not set +# CONFIG_QCOM_A53PLL is not set +CONFIG_QCOM_ADM=y +# CONFIG_QCOM_AOSS_QMP is not set +CONFIG_QCOM_APCS_IPC=y +CONFIG_QCOM_APM=y +# CONFIG_QCOM_MPM is not set +# CONFIG_QCOM_IPCC is not set +# CONFIG_QCOM_APR is not set +CONFIG_QCOM_BAM_DMA=y +CONFIG_QCOM_CACHE_DUMP=y +CONFIG_QCOM_CACHE_DUMP_ON_PANIC=y +# CONFIG_QCOM_CPR is not set +# CONFIG_QCOM_OCMEM is not set +# CONFIG_QCOM_SPM is not set +# CONFIG_QCOM_STATS is not set +# CONFIG_QCOM_WCNSS_CTRL is not set +# CONFIG_QCOM_ICC_BWMON is not set +# CONFIG_QCOM_CLK_APCS_MSM8916 is not set +# CONFIG_QCOM_CLK_APCC_MSM8996 is not set +# CONFIG_QCOM_CLK_APCS_SDX55 is not set +# CONFIG_QCOM_CLK_RPM is not set +# CONFIG_QCOM_CLK_SMD_RPM is not set +# CONFIG_QCOM_COINCELL is not set +# CONFIG_QCOM_COMMAND_DB is not set +CONFIG_QCOM_DLOAD_MODE=y +CONFIG_QCOM_DLOAD_MODE_APPSBL=y +# CONFIG_QCOM_EBI2 is not set +# CONFIG_QCOM_FASTRPC is not set +CONFIG_QCOM_GDSC=y +# CONFIG_QCOM_GENI_SE is not set +CONFIG_QCOM_GLINK_SSR=y +# CONFIG_QCOM_GSBI is not set +# CONFIG_QCOM_HFPLL is not set +# CONFIG_QCOM_LLCC is not set +# CONFIG_QCOM_NON_SECURE_PIL is not set +CONFIG_QCOM_Q6V5_MPD=y +# CONFIG_QCOM_PDC is not set +# CONFIG_QCOM_PM is not set +# CONFIG_QCOM_Q6V5_ADSP is not set +# CONFIG_QCOM_Q6V5_MSS is not set +# CONFIG_QCOM_Q6V5_PAS is not set +# CONFIG_QCOM_Q6V5_WCSS is not set +CONFIG_QCOM_QFPROM=y +CONFIG_QCOM_QMI_HELPERS=y +CONFIG_QCOM_RESTART_REASON=y +# CONFIG_QCOM_RMTFS_MEM is not set +# CONFIG_QCOM_RPMH is not set +# CONFIG_QCOM_RPMPD is not set +CONFIG_QCOM_RPM_CLK=y +# CONFIG_QCOM_RTB is not set +CONFIG_QCOM_SCM=y +CONFIG_QCOM_SCM_32=y +CONFIG_QCOM_SCM_DOWNLOAD_MODE_DEFAULT=y +# CONFIG_QCOM_SMD is not set +CONFIG_QCOM_SMD_RPM=y +CONFIG_QCOM_SMEM=y +CONFIG_QCOM_SMEM_STATE=y +CONFIG_QCOM_SMP2P=y +# CONFIG_QCOM_SMSM is not set +CONFIG_QCOM_SOC_NETSTANDBY=y +CONFIG_QCOM_SOCINFO=y +# CONFIG_QCOM_SPMI_ADC5 is not set +# CONFIG_QCOM_SPMI_TEMP_ALARM is not set +# CONFIG_QCOM_SPMI_VADC is not set +CONFIG_QCOM_SYSMON=y +CONFIG_QCOM_TSENS=y +CONFIG_QCOM_WDT=y +CONFIG_QCOM_DCC_V2=y +# CONFIG_QCS_GCC_404 is not set +# CONFIG_QCS_Q6SSTOP_404 is not set +# CONFIG_QCS_TURING_404 is not set +# CONFIG_HP_WATCHDOG is not set +CONFIG_RAS=y +CONFIG_RATIONAL=y +CONFIG_RCU_CPU_STALL_TIMEOUT=21 +# CONFIG_RCU_EXPERT is not set +CONFIG_RCU_STALL_COMMON=y +# CONFIG_REED_SOLOMON_TEST is not set +CONFIG_REGMAP=y +CONFIG_REGMAP_ALLOW_WRITE_DEBUGFS=y +CONFIG_REGMAP_MMIO=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_CPR3=y +CONFIG_REGULATOR_CPR3_NPU=y +CONFIG_REGULATOR_CPR4_APSS=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_GPIO=y +# CONFIG_REGULATOR_IPQ40XX is not set +# CONFIG_REGULATOR_QCOM_RPM is not set +CONFIG_REGULATOR_QCOM_SMD_RPM=y +# CONFIG_REGULATOR_QCOM_SPMI is not set +CONFIG_REGULATOR_QTI_GPIO=y +CONFIG_REGULATOR_RPM_GLINK=y +# CONFIG_REGULATOR_RPM_SMD is not set +# CONFIG_REGULATOR_VQMMC_IPQ4019 is not set +CONFIG_RELAY=y +CONFIG_REMOTEPROC=y +# CONFIG_REMOTEPROC_CDEV is not set +# CONFIG_RESET_ATTACK_MITIGATION is not set +CONFIG_RESET_CONTROLLER=y +# CONFIG_RESET_QCOM_AOSS is not set +# CONFIG_RESET_QCOM_PDC is not set +# CONFIG_QCOM_WCNSS_PIL is not set +CONFIG_QRTR=y +CONFIG_QRTR_MHI=y +CONFIG_QRTR_SMD=y +CONFIG_RFS_ACCEL=y +# CONFIG_RODATA_FULL_DEFAULT_ENABLED is not set +CONFIG_RPMSG=y +CONFIG_RPMSG_CHAR=y +# CONFIG_RPMSG_CTRL is not set +# CONFIG_RPMSG_NS is not set +CONFIG_RPMSG_QCOM_GLINK_RPM=y +CONFIG_RPMSG_QCOM_GLINK_SMEM=y +CONFIG_RPMSG_QCOM_SMD=y +# CONFIG_RPMSG_TTY is not set +# CONFIG_RPMSG_VIRTIO is not set +CONFIG_RPS=y +CONFIG_RTC_CLASS=y +# CONFIG_RTC_DRV_CMOS is not set +# CONFIG_RTC_DRV_PM8XXX is not set +CONFIG_RWSEM_SPIN_ON_OWNER=y +CONFIG_RWSEM_XCHGADD_ALGORITHM=y +CONFIG_SAMPLES=y +# CONFIG_SAMPLE_AUXDISPLAY is not set +# CONFIG_SAMPLE_CONFIGFS is not set +# CONFIG_SAMPLE_HW_BREAKPOINT is not set +# CONFIG_SAMPLE_KFIFO is not set +# CONFIG_SAMPLE_KOBJECT is not set +# CONFIG_SAMPLE_KPROBES is not set +# CONFIG_SAMPLE_KRETPROBES is not set +# CONFIG_SAMPLE_WATCHDOG is not set +# CONFIG_SAMPLE_CORESIGHT_SYSCFG is not set +CONFIG_SAMPLE_QMI_CLIENT=m +# CONFIG_SAMPLE_RPMSG_CLIENT is not set +# CONFIG_SAMPLE_TRACE_ARRAY is not set +# CONFIG_SAMPLE_TRACE_CUSTOM_EVENTS is not set +CONFIG_SAMPLE_TRACE_EVENTS=y +# CONFIG_SAMPLE_TRACE_PRINTK is not set +# CONFIG_SAMPLE_VFIO_MDEV_MDPY_FB is not set +# CONFIG_SATA_AHCI is not set +CONFIG_SCHED_HRTICK=y +# CONFIG_SCHED_INFO is not set +# CONFIG_SC_DISPCC_7180 is not set +# CONFIG_SC_MSS_7180 is not set +# CONFIG_SC_VIDEOCC_7180 is not set +# CONFIG_SC_CAMCC_7280 is not set +# CONFIG_SC_DISPCC_7280 is not set +# CONFIG_SC_GCC_7180 is not set +# CONFIG_SC_GCC_8280XP is not set +# CONFIG_SC_GPUCC_7180 is not set +# CONFIG_SC_LPASSCC_7280 is not set +# CONFIG_SC_LPASS_CORECC_7180 is not set +# CONFIG_SC_LPASS_CORECC_7280 is not set +CONFIG_UACCE=y +# CONFIG_SCSI is not set +# CONFIG_SCSI_DMA is not set +# CONFIG_SCSI_MYRS is not set +CONFIG_SCSI_SCAN_ASYNC=y +# CONFIG_SDM_CAMCC_845 is not set +# CONFIG_SDM_DISPCC_845 is not set +# CONFIG_SDM_GCC_660 is not set +# CONFIG_SDM_GCC_845 is not set +# CONFIG_SDM_GPUCC_845 is not set +# CONFIG_SDM_LPASSCC_845 is not set +# CONFIG_SDM_VIDEOCC_845 is not set +# CONFIG_SDX_GCC_65 is not set +# CONFIG_SEEMP_CORE is not set +# CONFIG_SENSIRION_SGP30 is not set +# CONFIG_SENSORS_DRIVETEMP is not set +# CONFIG_SENSORS_OCC_P8_I2C is not set +# CONFIG_SENSORS_RM3100_I2C is not set +# CONFIG_SENSORS_RM3100_SPI is not set +# CONFIG_SERIAL_8250 is not set +# CONFIG_SERIAL_8250_CONSOLE is not set +# CONFIG_SERIAL_8250_DMA is not set +# CONFIG_SERIAL_AMBA_PL010 is not set +# CONFIG_SERIAL_AMBA_PL011 is not set +# CONFIG_SERIAL_FSL_LINFLEXUART is not set +CONFIG_SERIAL_MSM=y +CONFIG_SERIAL_MSM_CONSOLE=y +# CONFIG_SERIAL_SIFIVE is not set +# CONFIG_SHADOW_CALL_STACK is not set +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_SKB_RECYCLER=y +CONFIG_SKB_RECYCLER_MULTI_CPU=y +# CONFIG_SKB_RECYCLER_PREALLOC is not set +# CONFIG_SLIMBUS is not set +# CONFIG_SLIMBUS_MSM_CTRL is not set +# CONFIG_SLIMBUS_MSM_NGD is not set +CONFIG_SMP=y +CONFIG_SMP_ON_UP=y +# CONFIG_SM_CAMCC_8450 is not set +# CONFIG_SM_GCC_8150 is not set +# CONFIG_SM_GCC_8250 is not set +# CONFIG_SM_GCC_8450 is not set +# CONFIG_SM_GPUCC_6350 is not set +# CONFIG_SM_GPUCC_8150 is not set +# CONFIG_SM_GPUCC_8250 is not set +# CONFIG_SM_GPUCC_8350 is not set +# CONFIG_SM_VIDEOCC_8150 is not set +# CONFIG_SM_VIDEOCC_8250 is not set +CONFIG_SOUND=y +# CONFIG_SND_SOC_APQ8016_SBC is not set +# CONFIG_SND_SOC_SC7180 is not set +CONFIG_SND=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_IPQ=y +CONFIG_SND_SOC_IPQ9574_LPASS_PCM_RAW=y +CONFIG_SND_SOC_IPQ_LPASS=y +CONFIG_SND_SOC_QCOM=y +CONFIG_SOCK_RX_QUEUE_MAPPING=y +CONFIG_SOFTIRQ_ON_OWN_STACK=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_MASTER=y +CONFIG_SPI_MEM=y +# CONFIG_SPI_MTK_QUADSPI is not set +# CONFIG_SPI_QCOM_QSPI is not set +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=y +# CONFIG_SPI_VSC7385 is not set +# CONFIG_SPMI is not set +# CONFIG_SPMI_MSM_PMIC_ARB is not set +# CONFIG_SPMI_PMIC_CLKDIV is not set +CONFIG_SPS=y +# CONFIG_SPS30 is not set +# CONFIG_SPS_SUPPORT_BAMDMA is not set +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_SRCU=y +# CONFIG_SRD_TRACE is not set +# CONFIG_STAGING is not set +# CONFIG_STM_PROTO_BASIC is not set +# CONFIG_STM_PROTO_SYS_T is not set +# CONFIG_STM_SOURCE_FTRACE is not set +# CONFIG_STM_SOURCE_HEARTBEAT is not set +# CONFIG_STOPWATCH is not set +# CONFIG_STRIP_ASM_SYMS is not set +# CONFIG_SYSTEM_EXTRA_CERTIFICATE is not set +# CONFIG_SECONDARY_TRUSTED_KEYRING is not set +CONFIG_SUSPEND=y +# CONFIG_SWAP is not set +CONFIG_SWCONFIG=y +CONFIG_SWIOTLB=y +CONFIG_SWP_EMULATE=y +# CONFIG_SW_SYNC is not set +# CONFIG_SYNC is not set +CONFIG_INET_TABLE_PERTURB_ORDER=16 +CONFIG_SYS_SUPPORTS_APM_EMULATION=y +# CONFIG_TEST_BLACKHOLE_DEV is not set +# CONFIG_TEST_DYNAMIC_DEBUG is not set +# CONFIG_TEST_MEMCAT_P is not set +# CONFIG_TEST_MEMINIT is not set +# CONFIG_TEST_STACKINIT is not set +# CONFIG_TEST_STRSCPY is not set +# CONFIG_TEST_VMALLOC is not set +# CONFIG_TEST_XARRAY is not set +# CONFIG_TEST_MAPLE_TREE is not set +# CONFIG_NVME_MULTIPATH is not set +# CONFIG_ARM_MHU_V2 is not set +# CONFIG_HISI_PCIE_PMU is not set +# CONFIG_HNS3_PMU is not set +# CONFIG_HISI_PTT is not set +# CONFIG_ETM4X_IMPDEF_FEATURE is not set +CONFIG_THERMAL=y +CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y +CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0 +CONFIG_THERMAL_GOV_STEP_WISE=y +CONFIG_THERMAL_GOV_USER_SPACE=y +CONFIG_THERMAL_HWMON=y +CONFIG_THERMAL_OF=y +CONFIG_THERMAL_WRITABLE_TRIPS=y +# CONFIG_THUMB2_KERNEL is not set +# CONFIG_TICK_CPU_ACCOUNTING is not set +# CONFIG_TI_ADS124S08 is not set +# CONFIG_TI_ADS8344 is not set +# CONFIG_TI_CPSW_PHY_SEL is not set +# CONFIG_TI_DAC7311 is not set +# CONFIG_TI_DAC7612 is not set +CONFIG_TRACING_EVENTS_GPIO=y +# CONFIG_TRUSTED_FOUNDATIONS is not set +CONFIG_UBIFS_FS=y +CONFIG_UBIFS_FS_ADVANCED_COMPR=y +CONFIG_UBIFS_FS_LZO=y +CONFIG_UBIFS_FS_XATTR=y +CONFIG_UBIFS_FS_XZ=y +CONFIG_UBIFS_FS_ZLIB=y +# CONFIG_UBIFS_FS_ZSTD is not set +CONFIG_UEVENT_HELPER_PATH="" +CONFIG_UNCOMPRESS_INCLUDE="debug/uncompress.h" +# CONFIG_UNICODE is not set +CONFIG_UNINLINE_SPIN_UNLOCK=y +# CONFIG_UNMAP_KERNEL_AT_EL0 is not set +CONFIG_UNWINDER_ARM=y +# CONFIG_UNWINDER_FRAME_POINTER is not set +# CONFIG_USB_BAM is not set +CONFIG_USB_CONFIGFS=y +# CONFIG_USB_CONFIGFS_ACM is not set +# CONFIG_USB_CONFIGFS_ECM is not set +# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set +# CONFIG_USB_CONFIGFS_EEM is not set +# CONFIG_USB_CONFIGFS_F_DIAG is not set +# CONFIG_USB_CONFIGFS_F_FS is not set +# CONFIG_USB_CONFIGFS_F_HID is not set +# CONFIG_USB_CONFIGFS_F_LB_SS is not set +# CONFIG_USB_CONFIGFS_F_MIDI is not set +# CONFIG_USB_CONFIGFS_F_PRINTER is not set +# CONFIG_USB_CONFIGFS_F_QDSS is not set +# CONFIG_USB_CONFIGFS_F_UAC1 is not set +# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set +# CONFIG_USB_CONFIGFS_F_UAC2 is not set +# CONFIG_USB_CONFIGFS_MASS_STORAGE is not set +# CONFIG_USB_CONFIGFS_NCM is not set +# CONFIG_USB_CONFIGFS_OBEX is not set +# CONFIG_USB_CONFIGFS_RNDIS is not set +# CONFIG_USB_CONFIGFS_SERIAL is not set +# CONFIG_USB_CONN_GPIO is not set +# CONFIG_USB_DWC3_OF_SIMPLE is not set +# CONFIG_USB_EHCI_FSL is not set +# CONFIG_USB_EHCI_ROOT_HUB_TT is not set +# CONFIG_USB_EHCI_TT_NEWSCHED is not set +# CONFIG_USB_GADGET is not set +# CONFIG_USB_NET_AQC111 is not set +# CONFIG_USB_OHCI_LITTLE_ENDIAN is not set +# CONFIG_USB_QCA_M31_PHY is not set +# CONFIG_USB_QCOM_8X16_PHY is not set +# CONFIG_USB_QCOM_QMP_PHY is not set +# CONFIG_USB_QCOM_QUSB_PHY is not set +CONFIG_USB_SUPPORT=y +CONFIG_USE_OF=y +# CONFIG_U_SERIAL_CONSOLE is not set +# CONFIG_VALIDATE_FS_PARSER is not set +# CONFIG_VCNL4035 is not set +CONFIG_VDSO=y +CONFIG_VECTORS_BASE=0xffff0000 +# CONFIG_VFIO is not set +CONFIG_VFP=y +CONFIG_VFPv3=y +# CONFIG_VMWARE_VMCI is not set +CONFIG_WATCHDOG_CORE=y +CONFIG_WATCHDOG_OPEN_TIMEOUT=0 +# CONFIG_WL_TI is not set +# CONFIG_WQ_POWER_EFFICIENT_DEFAULT is not set +CONFIG_WWAN=y +# CONFIG_WWAN_DEBUGFS is not set +CONFIG_X509_CERTIFICATE_PARSER=y +# CONFIG_XILINX_SDFEC is not set +# CONFIG_XILINX_XADC is not set +CONFIG_XPS=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y +CONFIG_ZBOOT_ROM_BSS=0 +CONFIG_ZBOOT_ROM_TEXT=0 +CONFIG_ZLIB_DEFLATE=y +CONFIG_ZLIB_INFLATE=y +CONFIG_ZONE_DMA32=y +CONFIG_ZSTD_COMMON=y +CONFIG_ZSTD_COMPRESS=y +CONFIG_ZSTD_DECOMPRESS=y +CONFIG_AQUANTIA_PHY=y +CONFIG_AT803X_PHY=y +CONFIG_MDIO_IPQ4019=y +CONFIG_QTI_TZ_LOG=y +CONFIG_QTI_LICENSE_MANAGER=y +# CONFIG_VIRT_WIFI is not set +# CONFIG_FIPS_SIGNATURE_SELFTEST is not set +# CONFIG_QTI_APSS_ACC is not set +# CONFIG_DEBUG_MEM_USAGE is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_ARM64_MODULE_PLTS is not set +# CONFIG_SCHED_STACK_END_CHECK is not set +# CONFIG_SYMBOLIC_ERRNAME is not set +# CONFIG_LEDS_BRIGHTNESS_HW_CHANGED is not set +# CONFIG_LEDS_CLASS_MULTICOLOR is not set +# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set +# CONFIG_MITIGATE_SPECTRE_BRANCH_HISTORY is not set +# CONFIG_PINCTRL_SINGLE is not set +# CONFIG_RANDOM_TRUST_BOOTLOADER is not set +# CONFIG_RANDOM_TRUST_CPU is not set +# CONFIG_ADVISE_SYSCALLS is not set +# CONFIG_AIO is not set +# CONFIG_ARM64_TAGGED_ADDR_ABI is not set +# CONFIG_BLK_DEV_THROTTLING is not set +# CONFIG_BPF_JIT is not set +# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set +# CONFIG_CGROUP_BPF is not set +# CONFIG_CGROUP_RDMA is not set +# CONFIG_CRC8 is not set +# CONFIG_DAX is not set +# CONFIG_EXT4_USE_FOR_EXT2 is not set +# CONFIG_FANOTIFY is not set +# CONFIG_FHANDLE is not set +# CONFIG_IO_URING is not set +# CONFIG_IP_PIMSM_V1 is not set +# CONFIG_IP_PIMSM_V2 is not set +# CONFIG_RAS is not set +# CONFIG_SECCOMP is not set +# CONFIG_SND_PROC_FS is not set +# CONFIG_OPTIMIZE_INLINING is not set diff --git a/target/linux/ipq95xx/generic/config-default b/target/linux/ipq95xx/generic/config-default new file mode 100644 index 00000000000000..a81cec0635a23a --- /dev/null +++ b/target/linux/ipq95xx/generic/config-default @@ -0,0 +1,70 @@ +# CONFIG_32BIT is not set +CONFIG_64BIT=y +# CONFIG_ACPI is not set +# CONFIG_ARCH_BCM_IPROC is not set +# CONFIG_ARCH_EXYNOS7 is not set +CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y +CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y +# CONFIG_ARCH_LAYERSCAPE is not set +CONFIG_ARCH_PHYS_ADDR_T_64BIT=y +# CONFIG_ARCH_SEATTLE is not set +CONFIG_ARCH_SELECT_MEMORY_MODEL=y +CONFIG_ARCH_SPARSEMEM_DEFAULT=y +CONFIG_ARCH_SPARSEMEM_ENABLE=y +# CONFIG_ARCH_SPRD is not set +# CONFIG_ARCH_STRATIX10 is not set +# CONFIG_ARCH_THUNDER is not set +CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION=y +CONFIG_ARCH_WANT_FRAME_POINTERS=y +CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y +# CONFIG_ARCH_XGENE is not set +# CONFIG_ARCH_ZYNQMP is not set +CONFIG_ARM64=y +# CONFIG_ARM64_16K_PAGES is not set +CONFIG_ARM64_4K_PAGES=y +# CONFIG_ARM64_64K_PAGES is not set +# CONFIG_ARM64_CRYPTO is not set +# CONFIG_ARM64_ERRATUM_819472 is not set +# CONFIG_ARM64_ERRATUM_824069 is not set +# CONFIG_ARM64_ERRATUM_826319 is not set +# CONFIG_ARM64_ERRATUM_827319 is not set +# CONFIG_ARM64_ERRATUM_832075 is not set +# CONFIG_ARM64_ERRATUM_843419 is not set +# CONFIG_ARM64_ERRATUM_845719 is not set +CONFIG_ARM64_HW_AFDBM=y +# CONFIG_ARM64_LSE_ATOMICS is not set +CONFIG_ARM64_PAN=y +# CONFIG_ARM64_PTDUMP is not set +# CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set +CONFIG_ARM64_VA_BITS=39 +CONFIG_ARM64_VA_BITS_39=y +# CONFIG_ARM64_VA_BITS_48 is not set +# CONFIG_ARMV8_DEPRECATED is not set +# CONFIG_CAVIUM_ERRATUM_22375 is not set +# CONFIG_CAVIUM_ERRATUM_23154 is not set +# CONFIG_CAVIUM_ERRATUM_27456 is not set +# CONFIG_COMMON_CLK_VERSATILE is not set +CONFIG_COMMON_CLK_XGENE=y +CONFIG_COMPAT=y +CONFIG_COMPAT_BINFMT_ELF=y +# CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set +# CONFIG_DEBUG_ALIGN_RODATA is not set +CONFIG_FRAME_WARN=2048 +# CONFIG_GPIO_XGENE is not set +# CONFIG_HUGETLBFS is not set +# CONFIG_I2C_CADENCE is not set +# CONFIG_KASAN is not set +# CONFIG_KVM is not set +# CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_PCI_HISI is not set +CONFIG_PHYS_ADDR_T_64BIT=y +# CONFIG_PHY_XGENE is not set +# CONFIG_POWER_RESET_XGENE is not set +CONFIG_QCOM_SCM_64=y +# CONFIG_RTC_DRV_EFI is not set +CONFIG_SPARSEMEM=y +CONFIG_SPARSEMEM_EXTREME=y +CONFIG_SPARSEMEM_MANUAL=y +CONFIG_SPARSEMEM_VMEMMAP=y +CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y +CONFIG_VIRTUALIZATION=y diff --git a/target/linux/ipq95xx/generic/target.mk b/target/linux/ipq95xx/generic/target.mk new file mode 100644 index 00000000000000..9de98feff463aa --- /dev/null +++ b/target/linux/ipq95xx/generic/target.mk @@ -0,0 +1,8 @@ + +SUBTARGET:=generic +BOARDNAME:=QTI IPQ95xx(64bit) based boards +CPU_TYPE:=cortex-a73 + +define Target/Description + Build images for IPQ95xx 64 bit system. +endef diff --git a/target/linux/ipq95xx/image/Makefile b/target/linux/ipq95xx/image/Makefile new file mode 100644 index 00000000000000..3989e31139328e --- /dev/null +++ b/target/linux/ipq95xx/image/Makefile @@ -0,0 +1,35 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/image.mk + +define Device/Default + PROFILES := Default + DTS_DIR := $(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/dts/$(if $(CONFIG_TARGET_ipq95xx_generic),qcom) + KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts) + KERNEL_LOADADDR := 0x40000000 + DEVICE_DTS = $$(SOC)-$(lastword $(subst _, ,$(1))) + DEVICE_DTS_CONFIG := config-1 + IMAGES := sysupgrade.bin + IMAGE/sysupgrade.bin = sysupgrade-tar | append-metadata + IMAGE/sysupgrade.bin/squashfs := +endef + +define Device/FitImage + KERNEL_SUFFIX := -fit-uImage.itb + KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb + KERNEL_NAME := Image +endef + +define Device/FitImageLzma + KERNEL_SUFFIX := -fit-uImage.itb + KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(DEVICE_DTS).dtb + KERNEL_NAME := Image +endef + +include generic.mk + +define Image/Build + $(call Image/Build/$(1),$(1)) + dd if=$(KDIR)/root$(2).$(1) of=$(BIN_DIR)/$(IMG_PREFIX)-$(1)-root$(3).img bs=2k conv=sync +endef + +$(eval $(call BuildImage)) diff --git a/target/linux/ipq95xx/image/generic.mk b/target/linux/ipq95xx/image/generic.mk new file mode 100644 index 00000000000000..765ed06026ac72 --- /dev/null +++ b/target/linux/ipq95xx/image/generic.mk @@ -0,0 +1,14 @@ +define Device/qcom_rdp433 + $(call Device/FitImageLzma) + DEVICE_VENDOR := QTI + DEVICE_MODEL := RDP433 + DEVICE_VARIANT := AP-AL02-C4 + BOARD_NAME := ap-al02.1-c4 + BUILD_DTS_ipq9574-rdp433 := 1 + SOC := ipq9574 + KERNEL_INSTALL := 1 + KERNEL_SIZE := 6096k + IMAGE_SIZE := 25344k + IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-rootfs | pad-rootfs | append-metadata +endef +TARGET_DEVICES += qcom_rdp433 diff --git a/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch b/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch new file mode 100644 index 00000000000000..81b7f4ba7b5081 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch @@ -0,0 +1,32 @@ +From d86de60f5e324034e1e917881ff0b46f2f9f00e7 Mon Sep 17 00:00:00 2001 +From: devi priya +Date: Fri, 13 Jan 2023 20:33:05 +0530 +Subject: [PATCH 01/41] soc: qcom: smd-rpm: Add IPQ9574 compatible + +Adding compatible string to support RPM communication over SMD for +IPQ9574 SoC + +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: devi priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230113150310.29709-2-quic_devipriy@quicinc.com +--- + drivers/soc/qcom/smd-rpm.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/soc/qcom/smd-rpm.c b/drivers/soc/qcom/smd-rpm.c +index 413f9f4ae9cd..10765775ee17 100644 +--- a/drivers/soc/qcom/smd-rpm.c ++++ b/drivers/soc/qcom/smd-rpm.c +@@ -233,6 +233,7 @@ static void qcom_smd_rpm_remove(struct rpmsg_device *rpdev) + static const struct of_device_id qcom_smd_rpm_of_match[] = { + { .compatible = "qcom,rpm-apq8084" }, + { .compatible = "qcom,rpm-ipq6018" }, ++ { .compatible = "qcom,rpm-ipq9574" }, + { .compatible = "qcom,rpm-msm8226" }, + { .compatible = "qcom,rpm-msm8909" }, + { .compatible = "qcom,rpm-msm8916" }, +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch b/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch new file mode 100644 index 00000000000000..20ed0935778234 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch @@ -0,0 +1,127 @@ +From 19cd9f8fc024ba70659411f00fd8c4f4a3814647 Mon Sep 17 00:00:00 2001 +From: Kathiravan T +Date: Fri, 17 Feb 2023 14:03:04 +0530 +Subject: [PATCH 02/41] clk: qcom: apss-ipq-pll: refactor the driver to + accommodate different PLL types + +APSS PLL found on the IPQ8074 and IPQ6018 are of type Huayra PLL. But, +IPQ5332 APSS PLL is of type Stromer Plus. To accommodate both these PLLs, +refactor the driver to take the clk_alpha_pll, alpha_pll_config via driver +data. + +Reviewed-by: Konrad Dybcio +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230217083308.12017-2-quic_kathirav@quicinc.com +--- + drivers/clk/qcom/apss-ipq-pll.c | 60 ++++++++++++++++++++++----------- + 1 file changed, 41 insertions(+), 19 deletions(-) + +diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c +index a5aea27eb867..4f2a147e9fb2 100644 +--- a/drivers/clk/qcom/apss-ipq-pll.c ++++ b/drivers/clk/qcom/apss-ipq-pll.c +@@ -8,20 +8,27 @@ + + #include "clk-alpha-pll.h" + +-static const u8 ipq_pll_offsets[] = { +- [PLL_OFF_L_VAL] = 0x08, +- [PLL_OFF_ALPHA_VAL] = 0x10, +- [PLL_OFF_USER_CTL] = 0x18, +- [PLL_OFF_CONFIG_CTL] = 0x20, +- [PLL_OFF_CONFIG_CTL_U] = 0x24, +- [PLL_OFF_STATUS] = 0x28, +- [PLL_OFF_TEST_CTL] = 0x30, +- [PLL_OFF_TEST_CTL_U] = 0x34, ++/* ++ * Even though APSS PLL type is of existing one (like Huayra), its offsets ++ * are different from the one mentioned in the clk-alpha-pll.c, since the ++ * PLL is specific to APSS, so lets the define the same. ++ */ ++static const u8 ipq_pll_offsets[][PLL_OFF_MAX_REGS] = { ++ [CLK_ALPHA_PLL_TYPE_HUAYRA] = { ++ [PLL_OFF_L_VAL] = 0x08, ++ [PLL_OFF_ALPHA_VAL] = 0x10, ++ [PLL_OFF_USER_CTL] = 0x18, ++ [PLL_OFF_CONFIG_CTL] = 0x20, ++ [PLL_OFF_CONFIG_CTL_U] = 0x24, ++ [PLL_OFF_STATUS] = 0x28, ++ [PLL_OFF_TEST_CTL] = 0x30, ++ [PLL_OFF_TEST_CTL_U] = 0x34, ++ }, + }; + +-static struct clk_alpha_pll ipq_pll = { ++static struct clk_alpha_pll ipq_pll_huayra = { + .offset = 0x0, +- .regs = ipq_pll_offsets, ++ .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_HUAYRA], + .flags = SUPPORTS_DYNAMIC_UPDATE, + .clkr = { + .enable_reg = 0x0, +@@ -61,6 +68,21 @@ static const struct alpha_pll_config ipq8074_pll_config = { + .test_ctl_hi_val = 0x4000, + }; + ++struct apss_pll_data { ++ struct clk_alpha_pll *pll; ++ const struct alpha_pll_config *pll_config; ++}; ++ ++static struct apss_pll_data ipq8074_pll_data = { ++ .pll = &ipq_pll_huayra, ++ .pll_config = &ipq8074_pll_config, ++}; ++ ++static struct apss_pll_data ipq6018_pll_data = { ++ .pll = &ipq_pll_huayra, ++ .pll_config = &ipq6018_pll_config, ++}; ++ + static const struct regmap_config ipq_pll_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, +@@ -71,7 +93,7 @@ static const struct regmap_config ipq_pll_regmap_config = { + + static int apss_ipq_pll_probe(struct platform_device *pdev) + { +- const struct alpha_pll_config *ipq_pll_config; ++ const struct apss_pll_data *data; + struct device *dev = &pdev->dev; + struct regmap *regmap; + void __iomem *base; +@@ -85,23 +107,23 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) + if (IS_ERR(regmap)) + return PTR_ERR(regmap); + +- ipq_pll_config = of_device_get_match_data(&pdev->dev); +- if (!ipq_pll_config) ++ data = of_device_get_match_data(&pdev->dev); ++ if (!data) + return -ENODEV; + +- clk_alpha_pll_configure(&ipq_pll, regmap, ipq_pll_config); ++ clk_alpha_pll_configure(data->pll, regmap, data->pll_config); + +- ret = devm_clk_register_regmap(dev, &ipq_pll.clkr); ++ ret = devm_clk_register_regmap(dev, &data->pll->clkr); + if (ret) + return ret; + + return devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, +- &ipq_pll.clkr.hw); ++ &data->pll->clkr.hw); + } + + static const struct of_device_id apss_ipq_pll_match_table[] = { +- { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_config }, +- { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_config }, ++ { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data }, ++ { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data }, + { } + }; + MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table); +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch b/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch new file mode 100644 index 00000000000000..2e84493af1a194 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch @@ -0,0 +1,229 @@ +From 5bd9fcb9c152a9ed0c9bb22e403d4df359faad7b Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Tue, 7 Mar 2023 11:52:24 +0530 +Subject: [PATCH 03/41] clk: qcom: clk-alpha-pll: Add support for Stromer PLLs + +Add programming sequence support for managing the Stromer +PLLs. + +Reviewed-by: Stephen Boyd +Co-developed-by: Sricharan R +Signed-off-by: Sricharan R +Signed-off-by: Varadarajan Narayanan +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230307062232.4889-2-quic_kathirav@quicinc.com +--- + drivers/clk/qcom/clk-alpha-pll.c | 128 ++++++++++++++++++++++++++++++- + drivers/clk/qcom/clk-alpha-pll.h | 13 +++- + 2 files changed, 139 insertions(+), 2 deletions(-) + +diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c +index 1973d79c9465..8e5e7a26bcc4 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.c ++++ b/drivers/clk/qcom/clk-alpha-pll.c +@@ -1,7 +1,7 @@ + // SPDX-License-Identifier: GPL-2.0 + /* + * Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. +- * Copyright (c) 2021, Qualcomm Innovation Center, Inc. All rights reserved. ++ * Copyright (c) 2021, 2023, Qualcomm Innovation Center, Inc. All rights reserved. + */ + + #include +@@ -188,6 +188,18 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { + [PLL_OFF_CONFIG_CTL] = 0x1C, + [PLL_OFF_STATUS] = 0x20, + }, ++ [CLK_ALPHA_PLL_TYPE_STROMER] = { ++ [PLL_OFF_L_VAL] = 0x08, ++ [PLL_OFF_ALPHA_VAL] = 0x10, ++ [PLL_OFF_ALPHA_VAL_U] = 0x14, ++ [PLL_OFF_USER_CTL] = 0x18, ++ [PLL_OFF_USER_CTL_U] = 0x1c, ++ [PLL_OFF_CONFIG_CTL] = 0x20, ++ [PLL_OFF_CONFIG_CTL_U] = 0xff, ++ [PLL_OFF_TEST_CTL] = 0x30, ++ [PLL_OFF_TEST_CTL_U] = 0x34, ++ [PLL_OFF_STATUS] = 0x28, ++ }, + }; + EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); + +@@ -199,6 +211,8 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); + #define ALPHA_BITWIDTH 32U + #define ALPHA_SHIFT(w) min(w, ALPHA_BITWIDTH) + ++#define ALPHA_PLL_STATUS_REG_SHIFT 8 ++ + #define PLL_HUAYRA_M_WIDTH 8 + #define PLL_HUAYRA_M_SHIFT 8 + #define PLL_HUAYRA_M_MASK 0xff +@@ -2308,3 +2322,115 @@ const struct clk_ops clk_alpha_pll_rivian_evo_ops = { + .round_rate = clk_rivian_evo_pll_round_rate, + }; + EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops); ++ ++void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, ++ const struct alpha_pll_config *config) ++{ ++ u32 val, val_u, mask, mask_u; ++ ++ regmap_write(regmap, PLL_L_VAL(pll), config->l); ++ regmap_write(regmap, PLL_ALPHA_VAL(pll), config->alpha); ++ regmap_write(regmap, PLL_CONFIG_CTL(pll), config->config_ctl_val); ++ ++ if (pll_has_64bit_config(pll)) ++ regmap_write(regmap, PLL_CONFIG_CTL_U(pll), ++ config->config_ctl_hi_val); ++ ++ if (pll_alpha_width(pll) > 32) ++ regmap_write(regmap, PLL_ALPHA_VAL_U(pll), config->alpha_hi); ++ ++ val = config->main_output_mask; ++ val |= config->aux_output_mask; ++ val |= config->aux2_output_mask; ++ val |= config->early_output_mask; ++ val |= config->pre_div_val; ++ val |= config->post_div_val; ++ val |= config->vco_val; ++ val |= config->alpha_en_mask; ++ val |= config->alpha_mode_mask; ++ ++ mask = config->main_output_mask; ++ mask |= config->aux_output_mask; ++ mask |= config->aux2_output_mask; ++ mask |= config->early_output_mask; ++ mask |= config->pre_div_mask; ++ mask |= config->post_div_mask; ++ mask |= config->vco_mask; ++ mask |= config->alpha_en_mask; ++ mask |= config->alpha_mode_mask; ++ ++ regmap_update_bits(regmap, PLL_USER_CTL(pll), mask, val); ++ ++ /* Stromer APSS PLL does not enable LOCK_DET by default, so enable it */ ++ val_u = config->status_val << ALPHA_PLL_STATUS_REG_SHIFT; ++ val_u |= config->lock_det; ++ ++ mask_u = config->status_mask; ++ mask_u |= config->lock_det; ++ ++ regmap_update_bits(regmap, PLL_USER_CTL_U(pll), mask_u, val_u); ++ regmap_write(regmap, PLL_TEST_CTL(pll), config->test_ctl_val); ++ regmap_write(regmap, PLL_TEST_CTL_U(pll), config->test_ctl_hi_val); ++ ++ if (pll->flags & SUPPORTS_FSM_MODE) ++ qcom_pll_set_fsm_mode(regmap, PLL_MODE(pll), 6, 0); ++} ++EXPORT_SYMBOL_GPL(clk_stromer_pll_configure); ++ ++static int clk_alpha_pll_stromer_determine_rate(struct clk_hw *hw, ++ struct clk_rate_request *req) ++{ ++ u32 l; ++ u64 a; ++ ++ req->rate = alpha_pll_round_rate(req->rate, req->best_parent_rate, ++ &l, &a, ALPHA_REG_BITWIDTH); ++ ++ return 0; ++} ++ ++static int clk_alpha_pll_stromer_set_rate(struct clk_hw *hw, unsigned long rate, ++ unsigned long prate) ++{ ++ struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); ++ int ret; ++ u32 l; ++ u64 a; ++ ++ rate = alpha_pll_round_rate(rate, prate, &l, &a, ALPHA_REG_BITWIDTH); ++ ++ regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); ++ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); ++ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), ++ a >> ALPHA_BITWIDTH); ++ ++ regmap_update_bits(pll->clkr.regmap, PLL_USER_CTL(pll), ++ PLL_ALPHA_EN, PLL_ALPHA_EN); ++ ++ if (!clk_hw_is_enabled(hw)) ++ return 0; ++ ++ /* ++ * Stromer PLL supports Dynamic programming. ++ * It allows the PLL frequency to be changed on-the-fly without first ++ * execution of a shutdown procedure followed by a bring up procedure. ++ */ ++ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_UPDATE, ++ PLL_UPDATE); ++ ++ ret = wait_for_pll_update(pll); ++ if (ret) ++ return ret; ++ ++ return wait_for_pll_enable_lock(pll); ++} ++ ++const struct clk_ops clk_alpha_pll_stromer_ops = { ++ .enable = clk_alpha_pll_enable, ++ .disable = clk_alpha_pll_disable, ++ .is_enabled = clk_alpha_pll_is_enabled, ++ .recalc_rate = clk_alpha_pll_recalc_rate, ++ .determine_rate = clk_alpha_pll_stromer_determine_rate, ++ .set_rate = clk_alpha_pll_stromer_set_rate, ++}; ++EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops); +diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h +index f9524b3fce6b..51d4043c7e4f 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.h ++++ b/drivers/clk/qcom/clk-alpha-pll.h +@@ -1,5 +1,9 @@ + /* SPDX-License-Identifier: GPL-2.0 */ +-/* Copyright (c) 2015, 2018, The Linux Foundation. All rights reserved. */ ++/* ++ * Copyright (c) 2015, 2018, 2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ + + #ifndef __QCOM_CLK_ALPHA_PLL_H__ + #define __QCOM_CLK_ALPHA_PLL_H__ +@@ -21,6 +25,7 @@ enum { + CLK_ALPHA_PLL_TYPE_RIVIAN_EVO, + CLK_ALPHA_PLL_TYPE_DEFAULT_EVO, + CLK_ALPHA_PLL_TYPE_BRAMMO_EVO, ++ CLK_ALPHA_PLL_TYPE_STROMER, + CLK_ALPHA_PLL_TYPE_MAX, + }; + +@@ -128,6 +133,9 @@ struct alpha_pll_config { + u32 post_div_mask; + u32 vco_val; + u32 vco_mask; ++ u32 status_val; ++ u32 status_mask; ++ u32 lock_det; + }; + + extern const struct clk_ops clk_alpha_pll_ops; +@@ -136,6 +144,7 @@ extern const struct clk_ops clk_alpha_pll_hwfsm_ops; + extern const struct clk_ops clk_alpha_pll_postdiv_ops; + extern const struct clk_ops clk_alpha_pll_huayra_ops; + extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; ++extern const struct clk_ops clk_alpha_pll_stromer_ops; + + extern const struct clk_ops clk_alpha_pll_fabia_ops; + extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; +@@ -182,5 +191,7 @@ void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regma + const struct alpha_pll_config *config); + void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, + const struct alpha_pll_config *config); ++void clk_stromer_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, ++ const struct alpha_pll_config *config); + + #endif +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch b/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch new file mode 100644 index 00000000000000..dbdda814197cae --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch @@ -0,0 +1,38 @@ +From d1429c2349b80274255a676404d15bb2e25fa4b9 Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Tue, 14 Mar 2023 11:43:34 +0530 +Subject: [PATCH 04/41] soc: qcom: socinfo: Add IDs for IPQ9574 and its + variants + +Add SOC ID for Qualcomm IPQ9574, IPQ9570, IPQ9554, IPQ9550, +IPQ9514 and IPQ9510 + +Signed-off-by: Varadarajan Narayanan +Reviewed-by: Krzysztof Kozlowski +Reviewed-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/1678774414-14414-3-git-send-email-quic_varada@quicinc.com +--- + drivers/soc/qcom/socinfo.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c +index 510a48dbc4ac..5b507f247a64 100644 +--- a/drivers/soc/qcom/socinfo.c ++++ b/drivers/soc/qcom/socinfo.c +@@ -280,6 +280,12 @@ static const struct soc_id soc_id[] = { + { 487, "SC7280" }, + { 495, "SC7180P" }, + { 507, "SM6375" }, ++ { 510, "IPQ9514" }, ++ { 511, "IPQ9550" }, ++ { 512, "IPQ9554" }, ++ { 513, "IPQ9570" }, ++ { 514, "IPQ9574" }, ++ { 521, "IPQ9510" }, + }; + + static const char *socinfo_machine(struct device *dev, unsigned int id) +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch b/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch new file mode 100644 index 00000000000000..43941c1386c73e --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch @@ -0,0 +1,404 @@ +From 036302b2ff40f3922ce839b44c4c731cb52d8766 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 16 Mar 2023 12:59:39 +0530 +Subject: [PATCH 05/41] arm64: dts: qcom: Add ipq9574 SoC and AL02 board + support + +Add initial device tree support for Qualcomm IPQ9574 SoC and AL02 board + +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Co-developed-by: Poovendhan Selvaraj +Signed-off-by: Poovendhan Selvaraj +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230316072940.29137-6-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 1 + + arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts | 84 ++++++ + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 270 +++++++++++++++++++ + 3 files changed, 355 insertions(+) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574.dtsi + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index d7669a7cee9f..8e04f0f663da 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-al02-c7.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts b/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts +new file mode 100644 +index 000000000000..2c8430197ec0 +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts +@@ -0,0 +1,84 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 AL02-C7 board device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7"; ++ compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&sdhc_1 { ++ pinctrl-0 = <&sdc_default_state>; ++ pinctrl-names = "default"; ++ mmc-ddr-1_8v; ++ mmc-hs200-1_8v; ++ mmc-hs400-1_8v; ++ mmc-hs400-enhanced-strobe; ++ max-frequency = <384000000>; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ sdc_default_state: sdc-default-state { ++ clk-pins { ++ pins = "gpio5"; ++ function = "sdc_clk"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ ++ cmd-pins { ++ pins = "gpio4"; ++ function = "sdc_cmd"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ data-pins { ++ pins = "gpio0", "gpio1", "gpio2", ++ "gpio3", "gpio6", "gpio7", ++ "gpio8", "gpio9"; ++ function = "sdc_data"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ rclk-pins { ++ pins = "gpio10"; ++ function = "sdc_rclk"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +new file mode 100644 +index 000000000000..3bb7435f5e7f +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -0,0 +1,270 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 SoC device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++#include ++#include ++#include ++ ++/ { ++ interrupt-parent = <&intc>; ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ++ clocks { ++ bias_pll_ubi_nc_clk: bias-pll-ubi-nc-clk { ++ compatible = "fixed-clock"; ++ clock-frequency = <353000000>; ++ #clock-cells = <0>; ++ }; ++ ++ sleep_clk: sleep-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ }; ++ ++ xo_board_clk: xo-board-clk { ++ compatible = "fixed-clock"; ++ #clock-cells = <0>; ++ }; ++ }; ++ ++ cpus { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ CPU0: cpu@0 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a73"; ++ reg = <0x0>; ++ enable-method = "psci"; ++ next-level-cache = <&L2_0>; ++ }; ++ ++ CPU1: cpu@1 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a73"; ++ reg = <0x1>; ++ enable-method = "psci"; ++ next-level-cache = <&L2_0>; ++ }; ++ ++ CPU2: cpu@2 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a73"; ++ reg = <0x2>; ++ enable-method = "psci"; ++ next-level-cache = <&L2_0>; ++ }; ++ ++ CPU3: cpu@3 { ++ device_type = "cpu"; ++ compatible = "arm,cortex-a73"; ++ reg = <0x3>; ++ enable-method = "psci"; ++ next-level-cache = <&L2_0>; ++ }; ++ ++ L2_0: l2-cache { ++ compatible = "cache"; ++ cache-level = <2>; ++ }; ++ }; ++ ++ memory@40000000 { ++ device_type = "memory"; ++ /* We expect the bootloader to fill in the size */ ++ reg = <0x0 0x40000000 0x0 0x0>; ++ }; ++ ++ pmu { ++ compatible = "arm,cortex-a73-pmu"; ++ interrupts = ; ++ }; ++ ++ psci { ++ compatible = "arm,psci-1.0"; ++ method = "smc"; ++ }; ++ ++ reserved-memory { ++ #address-cells = <2>; ++ #size-cells = <2>; ++ ranges; ++ ++ tz_region: tz@4a600000 { ++ reg = <0x0 0x4a600000 0x0 0x400000>; ++ no-map; ++ }; ++ }; ++ ++ soc: soc@0 { ++ compatible = "simple-bus"; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges = <0 0 0 0xffffffff>; ++ ++ tlmm: pinctrl@1000000 { ++ compatible = "qcom,ipq9574-tlmm"; ++ reg = <0x01000000 0x300000>; ++ interrupts = ; ++ gpio-controller; ++ #gpio-cells = <2>; ++ gpio-ranges = <&tlmm 0 0 65>; ++ interrupt-controller; ++ #interrupt-cells = <2>; ++ ++ uart2_pins: uart2-state { ++ pins = "gpio34", "gpio35"; ++ function = "blsp2_uart"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ }; ++ ++ gcc: clock-controller@1800000 { ++ compatible = "qcom,ipq9574-gcc"; ++ reg = <0x01800000 0x80000>; ++ clocks = <&xo_board_clk>, ++ <&sleep_clk>, ++ <&bias_pll_ubi_nc_clk>, ++ <0>, ++ <0>, ++ <0>, ++ <0>, ++ <0>; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ #power-domain-cells = <1>; ++ }; ++ ++ sdhc_1: mmc@7804000 { ++ compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5"; ++ reg = <0x07804000 0x1000>, <0x07805000 0x1000>; ++ reg-names = "hc", "cqhci"; ++ ++ interrupts = , ++ ; ++ interrupt-names = "hc_irq", "pwr_irq"; ++ ++ clocks = <&gcc GCC_SDCC1_AHB_CLK>, ++ <&gcc GCC_SDCC1_APPS_CLK>, ++ <&xo_board_clk>; ++ clock-names = "iface", "core", "xo"; ++ non-removable; ++ status = "disabled"; ++ }; ++ ++ blsp1_uart2: serial@78b1000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078b1000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART3_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ intc: interrupt-controller@b000000 { ++ compatible = "qcom,msm-qgic2"; ++ reg = <0x0b000000 0x1000>, /* GICD */ ++ <0x0b002000 0x1000>, /* GICC */ ++ <0x0b001000 0x1000>, /* GICH */ ++ <0x0b004000 0x1000>; /* GICV */ ++ #address-cells = <1>; ++ #size-cells = <1>; ++ interrupt-controller; ++ #interrupt-cells = <3>; ++ interrupts = ; ++ ranges = <0 0x0b00c000 0x3000>; ++ ++ v2m0: v2m@0 { ++ compatible = "arm,gic-v2m-frame"; ++ reg = <0x00000000 0xffd>; ++ msi-controller; ++ }; ++ ++ v2m1: v2m@1000 { ++ compatible = "arm,gic-v2m-frame"; ++ reg = <0x00001000 0xffd>; ++ msi-controller; ++ }; ++ ++ v2m2: v2m@2000 { ++ compatible = "arm,gic-v2m-frame"; ++ reg = <0x00002000 0xffd>; ++ msi-controller; ++ }; ++ }; ++ ++ timer@b120000 { ++ compatible = "arm,armv7-timer-mem"; ++ reg = <0x0b120000 0x1000>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ ranges; ++ ++ frame@b120000 { ++ reg = <0x0b121000 0x1000>, ++ <0x0b122000 0x1000>; ++ frame-number = <0>; ++ interrupts = , ++ ; ++ }; ++ ++ frame@b123000 { ++ reg = <0x0b123000 0x1000>; ++ frame-number = <1>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ frame@b124000 { ++ reg = <0x0b124000 0x1000>; ++ frame-number = <2>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ frame@b125000 { ++ reg = <0x0b125000 0x1000>; ++ frame-number = <3>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ frame@b126000 { ++ reg = <0x0b126000 0x1000>; ++ frame-number = <4>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ frame@b127000 { ++ reg = <0x0b127000 0x1000>; ++ frame-number = <5>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ ++ frame@b128000 { ++ reg = <0x0b128000 0x1000>; ++ frame-number = <6>; ++ interrupts = ; ++ status = "disabled"; ++ }; ++ }; ++ }; ++ ++ timer { ++ compatible = "arm,armv8-timer"; ++ interrupts = , ++ , ++ , ++ ; ++ }; ++}; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch b/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch new file mode 100644 index 00000000000000..39a373a915a2c3 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch @@ -0,0 +1,38 @@ +From 10899f01cc0a72a2a06b2baa2261c5b898e4a26d Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 16 Mar 2023 12:59:40 +0530 +Subject: [PATCH 06/41] arm64: defconfig: Enable IPQ9574 SoC base configs + +Enables clk & pinctrl related configs for Qualcomm IPQ9574 SoC + +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230316072940.29137-7-quic_devipriy@quicinc.com +--- + arch/arm64/configs/defconfig | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig +index 623e9f308f38..90dd3cf7bcad 100644 +--- a/arch/arm64/configs/defconfig ++++ b/arch/arm64/configs/defconfig +@@ -537,6 +537,7 @@ CONFIG_PINCTRL_IMX93=y + CONFIG_PINCTRL_MSM=y + CONFIG_PINCTRL_IPQ8074=y + CONFIG_PINCTRL_IPQ6018=y ++CONFIG_PINCTRL_IPQ9574=y + CONFIG_PINCTRL_MSM8916=y + CONFIG_PINCTRL_MSM8994=y + CONFIG_PINCTRL_MSM8996=y +@@ -1068,6 +1069,7 @@ CONFIG_QCOM_CLK_SMD_RPM=y + CONFIG_QCOM_CLK_RPMH=y + CONFIG_IPQ_GCC_6018=y + CONFIG_IPQ_GCC_8074=y ++CONFIG_IPQ_GCC_9574=y + CONFIG_MSM_GCC_8916=y + CONFIG_MSM_GCC_8994=y + CONFIG_MSM_MMCC_8996=y +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch b/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch new file mode 100644 index 00000000000000..a5d30558c2a50d --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch @@ -0,0 +1,4308 @@ +From 443758ff3c5ab0445bc802cb4d4a318691de2917 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 16 Mar 2023 12:59:36 +0530 +Subject: [PATCH 07/41] clk: qcom: Add Global Clock Controller driver for + IPQ9574 + +Add Global Clock Controller (GCC) driver for ipq9574 based devices + +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230316072940.29137-3-quic_devipriy@quicinc.com +--- + drivers/clk/qcom/Kconfig | 8 + + drivers/clk/qcom/Makefile | 1 + + drivers/clk/qcom/gcc-ipq9574.c | 4248 ++++++++++++++++++++++++++++++++ + 3 files changed, 4257 insertions(+) + create mode 100644 drivers/clk/qcom/gcc-ipq9574.c + +diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig +index cbf55949c649..94340ee631c3 100644 +--- a/drivers/clk/qcom/Kconfig ++++ b/drivers/clk/qcom/Kconfig +@@ -174,6 +174,14 @@ config IPQ_GCC_8074 + i2c, USB, SD/eMMC, etc. Select this for the root clock + of ipq8074. + ++config IPQ_GCC_9574 ++ tristate "IPQ9574 Global Clock Controller" ++ help ++ Support for global clock controller on ipq9574 devices. ++ Say Y if you want to use peripheral devices such as UART, SPI, ++ i2c, USB, SD/eMMC, etc. Select this for the root clock ++ of ipq9574. ++ + config MSM_GCC_8660 + tristate "MSM8660 Global Clock Controller" + help +diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile +index e6cecf9e0436..1a4c4d55cb17 100644 +--- a/drivers/clk/qcom/Makefile ++++ b/drivers/clk/qcom/Makefile +@@ -27,6 +27,7 @@ obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o + obj-$(CONFIG_IPQ_GCC_6018) += gcc-ipq6018.o + obj-$(CONFIG_IPQ_GCC_806X) += gcc-ipq806x.o + obj-$(CONFIG_IPQ_GCC_8074) += gcc-ipq8074.o ++obj-$(CONFIG_IPQ_GCC_9574) += gcc-ipq9574.o + obj-$(CONFIG_IPQ_LCC_806X) += lcc-ipq806x.o + obj-$(CONFIG_MDM_GCC_9607) += gcc-mdm9607.o + obj-$(CONFIG_MDM_GCC_9615) += gcc-mdm9615.o +diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c +new file mode 100644 +index 000000000000..b2a2d618a5ec +--- /dev/null ++++ b/drivers/clk/qcom/gcc-ipq9574.c +@@ -0,0 +1,4248 @@ ++// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++/* ++ * Copyright (c) 2023 The Linux Foundation. All rights reserved. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "clk-rcg.h" ++#include "clk-branch.h" ++#include "clk-alpha-pll.h" ++#include "clk-regmap-divider.h" ++#include "clk-regmap-mux.h" ++#include "clk-regmap-phy-mux.h" ++#include "reset.h" ++ ++/* Need to match the order of clocks in DT binding */ ++enum { ++ DT_XO, ++ DT_SLEEP_CLK, ++ DT_BIAS_PLL_UBI_NC_CLK, ++ DT_PCIE30_PHY0_PIPE_CLK, ++ DT_PCIE30_PHY1_PIPE_CLK, ++ DT_PCIE30_PHY2_PIPE_CLK, ++ DT_PCIE30_PHY3_PIPE_CLK, ++ DT_USB3PHY_0_CC_PIPE_CLK, ++}; ++ ++enum { ++ P_XO, ++ P_PCIE30_PHY0_PIPE, ++ P_PCIE30_PHY1_PIPE, ++ P_PCIE30_PHY2_PIPE, ++ P_PCIE30_PHY3_PIPE, ++ P_USB3PHY_0_PIPE, ++ P_GPLL0, ++ P_GPLL0_DIV2, ++ P_GPLL0_OUT_AUX, ++ P_GPLL2, ++ P_GPLL4, ++ P_PI_SLEEP, ++ P_BIAS_PLL_UBI_NC_CLK, ++}; ++ ++static const struct parent_map gcc_xo_map[] = { ++ { P_XO, 0 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_data[] = { ++ { .index = DT_XO }, ++}; ++ ++static const struct clk_parent_data gcc_sleep_clk_data[] = { ++ { .index = DT_SLEEP_CLK }, ++}; ++ ++static struct clk_alpha_pll gpll0_main = { ++ .offset = 0x20000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .clkr = { ++ .enable_reg = 0x0b000, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gpll0_main", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .ops = &clk_alpha_pll_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor gpll0_out_main_div2 = { ++ .mult = 1, ++ .div = 2, ++ .hw.init = &(struct clk_init_data) { ++ .name = "gpll0_out_main_div2", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gpll0_main.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_alpha_pll_postdiv gpll0 = { ++ .offset = 0x20000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .width = 4, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gpll0", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gpll0_main.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_alpha_pll_postdiv_ro_ops, ++ }, ++}; ++ ++static struct clk_alpha_pll gpll4_main = { ++ .offset = 0x22000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .clkr = { ++ .enable_reg = 0x0b000, ++ .enable_mask = BIT(2), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gpll4_main", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .ops = &clk_alpha_pll_ops, ++ }, ++ }, ++}; ++ ++static struct clk_alpha_pll_postdiv gpll4 = { ++ .offset = 0x22000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .width = 4, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gpll4", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gpll4_main.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_alpha_pll_postdiv_ro_ops, ++ }, ++}; ++ ++static struct clk_alpha_pll gpll2_main = { ++ .offset = 0x21000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .clkr = { ++ .enable_reg = 0x0b000, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gpll2_main", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .ops = &clk_alpha_pll_ops, ++ }, ++ }, ++}; ++ ++static struct clk_alpha_pll_postdiv gpll2 = { ++ .offset = 0x21000, ++ .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT], ++ .width = 4, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gpll2", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gpll2_main.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_alpha_pll_postdiv_ro_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_sleep_clk_src = { ++ .halt_reg = 0x3400c, ++ .clkr = { ++ .enable_reg = 0x3400c, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sleep_clk_src", ++ .parent_data = gcc_sleep_clk_data, ++ .num_parents = ARRAY_SIZE(gcc_sleep_clk_data), ++ .flags = CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll0_out_main_div2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll0_out_main_div2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll4[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll4.clkr.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll4_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL4, 2 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll0_div2_gpll0[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++ { .hw = &gpll0.clkr.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll0_div2_gpll0_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_DIV2, 4 }, ++ { P_GPLL0, 5 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll0_sleep_clk[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++ { .index = DT_SLEEP_CLK }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll0_sleep_clk_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_DIV2, 4 }, ++ { P_PI_SLEEP, 6 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_core_pi_sleep_clk[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .index = DT_SLEEP_CLK }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_core_pi_sleep_clk_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 2 }, ++ { P_PI_SLEEP, 6 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll4.clkr.hw }, ++ { .index = DT_BIAS_PLL_UBI_NC_CLK }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL4, 2 }, ++ { P_BIAS_PLL_UBI_NC_CLK, 3 }, ++}; ++ ++static const struct clk_parent_data ++ gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0.clkr.hw }, ++ { .index = DT_SLEEP_CLK }, ++}; ++ ++static const struct parent_map ++ gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_OUT_AUX, 2 }, ++ { P_PI_SLEEP, 6 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_out_main_div2_gpll0[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_out_main_div2_gpll0_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data ++ gcc_xo_gpll4_gpll0_gpll0_out_main_div2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll4.clkr.hw }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll4_gpll0_gpll0_out_main_div2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL4, 1 }, ++ { P_GPLL0, 3 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data gcc_usb3phy_0_cc_pipe_clk_xo[] = { ++ { .index = DT_USB3PHY_0_CC_PIPE_CLK }, ++ { .index = DT_XO }, ++}; ++ ++static const struct parent_map gcc_usb3phy_0_cc_pipe_clk_xo_map[] = { ++ { P_USB3PHY_0_PIPE, 0 }, ++ { P_XO, 2 }, ++}; ++ ++static const struct clk_parent_data ++ gcc_xo_gpll0_gpll2_gpll0_out_main_div2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll2.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll2_gpll0_out_main_div2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL2, 2 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll4_gpll0_div2[] = { ++ { .index = DT_XO}, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll4.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll4_gpll0_div2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL4, 2 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll4_gpll0_gpll0_div2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll4.clkr.hw }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0_out_main_div2.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll4_gpll0_gpll0_div2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL4, 1 }, ++ { P_GPLL0, 2 }, ++ { P_GPLL0_DIV2, 4 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll2.clkr.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL2, 2 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll2_gpll4_pi_sleep[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll2.clkr.hw }, ++ { .hw = &gpll4.clkr.hw }, ++ { .index = DT_SLEEP_CLK }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll2_gpll4_pi_sleep_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL2, 2 }, ++ { P_GPLL4, 3 }, ++ { P_PI_SLEEP, 6 }, ++}; ++ ++static const struct clk_parent_data gcc_xo_gpll0_gpll0_aux_gpll2[] = { ++ { .index = DT_XO }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll0.clkr.hw }, ++ { .hw = &gpll2.clkr.hw }, ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll0_aux_gpll2_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL0_OUT_AUX, 2 }, ++ { P_GPLL2, 3 }, ++}; ++ ++static const struct freq_tbl ftbl_apss_ahb_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(50000000, P_GPLL0, 16, 0, 0), ++ F(100000000, P_GPLL0, 8, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 apss_ahb_clk_src = { ++ .cmd_rcgr = 0x2400c, ++ .freq_tbl = ftbl_apss_ahb_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "apss_ahb_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_apss_axi_clk_src[] = { ++ F(533000000, P_GPLL0, 1.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 apss_axi_clk_src = { ++ .cmd_rcgr = 0x24004, ++ .freq_tbl = ftbl_apss_axi_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_div2_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "apss_axi_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_div2_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_div2_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_blsp1_qup_i2c_apps_clk_src[] = { ++ F(9600000, P_XO, 2.5, 0, 0), ++ F(24000000, P_XO, 1, 0, 0), ++ F(50000000, P_GPLL0, 16, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 blsp1_qup1_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x02018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup1_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_blsp1_qup_spi_apps_clk_src[] = { ++ F(960000, P_XO, 10, 2, 5), ++ F(4800000, P_XO, 5, 0, 0), ++ F(9600000, P_XO, 2, 4, 5), ++ F(16000000, P_GPLL0, 10, 1, 5), ++ F(24000000, P_XO, 1, 0, 0), ++ F(25000000, P_GPLL0, 16, 1, 2), ++ F(50000000, P_GPLL0, 16, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 blsp1_qup1_spi_apps_clk_src = { ++ .cmd_rcgr = 0x02004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup1_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup2_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x03018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup2_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup2_spi_apps_clk_src = { ++ .cmd_rcgr = 0x03004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup2_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup3_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x04018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup3_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup3_spi_apps_clk_src = { ++ .cmd_rcgr = 0x04004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup3_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup4_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x05018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup4_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup4_spi_apps_clk_src = { ++ .cmd_rcgr = 0x05004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup4_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup5_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x06018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup5_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup5_spi_apps_clk_src = { ++ .cmd_rcgr = 0x06004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup5_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup6_i2c_apps_clk_src = { ++ .cmd_rcgr = 0x07018, ++ .freq_tbl = ftbl_blsp1_qup_i2c_apps_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup6_i2c_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_qup6_spi_apps_clk_src = { ++ .cmd_rcgr = 0x07004, ++ .freq_tbl = ftbl_blsp1_qup_spi_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_qup6_spi_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_blsp1_uart_apps_clk_src[] = { ++ F(3686400, P_GPLL0_DIV2, 1, 144, 15625), ++ F(7372800, P_GPLL0_DIV2, 1, 288, 15625), ++ F(14745600, P_GPLL0_DIV2, 1, 576, 15625), ++ F(24000000, P_XO, 1, 0, 0), ++ F(25000000, P_GPLL0, 16, 1, 2), ++ F(32000000, P_GPLL0, 1, 1, 25), ++ F(40000000, P_GPLL0, 1, 1, 20), ++ F(46400000, P_GPLL0, 1, 29, 500), ++ F(48000000, P_GPLL0, 1, 3, 50), ++ F(51200000, P_GPLL0, 1, 8, 125), ++ F(56000000, P_GPLL0, 1, 7, 100), ++ F(58982400, P_GPLL0, 1, 1152, 15625), ++ F(60000000, P_GPLL0, 1, 3, 40), ++ F(64000000, P_GPLL0, 12.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 blsp1_uart1_apps_clk_src = { ++ .cmd_rcgr = 0x0202c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart1_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_uart2_apps_clk_src = { ++ .cmd_rcgr = 0x0302c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart2_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_uart3_apps_clk_src = { ++ .cmd_rcgr = 0x0402c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart3_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_uart4_apps_clk_src = { ++ .cmd_rcgr = 0x0502c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart4_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_uart5_apps_clk_src = { ++ .cmd_rcgr = 0x0602c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart5_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 blsp1_uart6_apps_clk_src = { ++ .cmd_rcgr = 0x0702c, ++ .freq_tbl = ftbl_blsp1_uart_apps_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "blsp1_uart6_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_apss_ahb_clk = { ++ .halt_reg = 0x24018, ++ .halt_check = BRANCH_HALT_VOTED, ++ .clkr = { ++ .enable_reg = 0x0b004, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_apss_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &apss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_apss_axi_clk = { ++ .halt_reg = 0x2401c, ++ .halt_check = BRANCH_HALT_VOTED, ++ .clkr = { ++ .enable_reg = 0x0b004, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_apss_axi_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &apss_axi_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup1_i2c_apps_clk = { ++ .halt_reg = 0x2024, ++ .clkr = { ++ .enable_reg = 0x2024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup1_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup1_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup1_spi_apps_clk = { ++ .halt_reg = 0x02020, ++ .clkr = { ++ .enable_reg = 0x02020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup1_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup1_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup2_i2c_apps_clk = { ++ .halt_reg = 0x03024, ++ .clkr = { ++ .enable_reg = 0x03024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup2_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup2_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup2_spi_apps_clk = { ++ .halt_reg = 0x03020, ++ .clkr = { ++ .enable_reg = 0x03020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup2_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup2_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup3_i2c_apps_clk = { ++ .halt_reg = 0x04024, ++ .clkr = { ++ .enable_reg = 0x04024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup3_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup3_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup3_spi_apps_clk = { ++ .halt_reg = 0x04020, ++ .clkr = { ++ .enable_reg = 0x04020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup3_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup3_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup4_i2c_apps_clk = { ++ .halt_reg = 0x05024, ++ .clkr = { ++ .enable_reg = 0x05024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup4_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup4_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup4_spi_apps_clk = { ++ .halt_reg = 0x05020, ++ .clkr = { ++ .enable_reg = 0x05020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup4_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup4_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup5_i2c_apps_clk = { ++ .halt_reg = 0x06024, ++ .clkr = { ++ .enable_reg = 0x06024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup5_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup5_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup5_spi_apps_clk = { ++ .halt_reg = 0x06020, ++ .clkr = { ++ .enable_reg = 0x06020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup5_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup5_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup6_i2c_apps_clk = { ++ .halt_reg = 0x07024, ++ .clkr = { ++ .enable_reg = 0x07024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup6_i2c_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup6_i2c_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_qup6_spi_apps_clk = { ++ .halt_reg = 0x07020, ++ .clkr = { ++ .enable_reg = 0x07020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_qup6_spi_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_qup6_spi_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart1_apps_clk = { ++ .halt_reg = 0x02040, ++ .clkr = { ++ .enable_reg = 0x02040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart1_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart1_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart2_apps_clk = { ++ .halt_reg = 0x03040, ++ .clkr = { ++ .enable_reg = 0x03040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart2_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart2_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart3_apps_clk = { ++ .halt_reg = 0x04054, ++ .clkr = { ++ .enable_reg = 0x04054, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart3_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart3_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart4_apps_clk = { ++ .halt_reg = 0x05040, ++ .clkr = { ++ .enable_reg = 0x05040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart4_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart4_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart5_apps_clk = { ++ .halt_reg = 0x06040, ++ .clkr = { ++ .enable_reg = 0x06040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart5_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart5_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_uart6_apps_clk = { ++ .halt_reg = 0x07040, ++ .clkr = { ++ .enable_reg = 0x07040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_uart6_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &blsp1_uart6_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_pcie0_axi_m_clk_src[] = { ++ F(240000000, P_GPLL4, 5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 pcie0_axi_m_clk_src = { ++ .cmd_rcgr = 0x28018, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie0_axi_m_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_axi_m_clk = { ++ .halt_reg = 0x28038, ++ .clkr = { ++ .enable_reg = 0x28038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_axi_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_pcie0_1lane_m_clk = { ++ .halt_reg = 0x2e07c, ++ .clkr = { ++ .enable_reg = 0x2e07c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_pcie0_1lane_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie1_axi_m_clk_src = { ++ .cmd_rcgr = 0x29018, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie1_axi_m_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_axi_m_clk = { ++ .halt_reg = 0x29038, ++ .clkr = { ++ .enable_reg = 0x29038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_axi_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_pcie1_1lane_m_clk = { ++ .halt_reg = 0x2e08c, ++ .clkr = { ++ .enable_reg = 0x2e08c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_pcie1_1lane_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_pcie2_axi_m_clk_src[] = { ++ F(342857143, P_GPLL4, 3.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 pcie2_axi_m_clk_src = { ++ .cmd_rcgr = 0x2a018, ++ .freq_tbl = ftbl_pcie2_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie2_axi_m_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_axi_m_clk = { ++ .halt_reg = 0x2a038, ++ .clkr = { ++ .enable_reg = 0x2a038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_axi_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_pcie2_2lane_m_clk = { ++ .halt_reg = 0x2e080, ++ .clkr = { ++ .enable_reg = 0x2e080, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_pcie2_2lane_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie3_axi_m_clk_src = { ++ .cmd_rcgr = 0x2b018, ++ .freq_tbl = ftbl_pcie2_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie3_axi_m_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_axi_m_clk = { ++ .halt_reg = 0x2b038, ++ .clkr = { ++ .enable_reg = 0x2b038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_axi_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_pcie3_2lane_m_clk = { ++ .halt_reg = 0x2e090, ++ .clkr = { ++ .enable_reg = 0x2e090, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_pcie3_2lane_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie0_axi_s_clk_src = { ++ .cmd_rcgr = 0x28020, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie0_axi_s_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_axi_s_clk = { ++ .halt_reg = 0x2803c, ++ .clkr = { ++ .enable_reg = 0x2803c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_axi_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_axi_s_bridge_clk = { ++ .halt_reg = 0x28040, ++ .clkr = { ++ .enable_reg = 0x28040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_axi_s_bridge_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_snoc_pcie0_1lane_s_clk = { ++ .halt_reg = 0x2e048, ++ .clkr = { ++ .enable_reg = 0x2e048, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_snoc_pcie0_1lane_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie1_axi_s_clk_src = { ++ .cmd_rcgr = 0x29020, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie1_axi_s_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_axi_s_clk = { ++ .halt_reg = 0x2903c, ++ .clkr = { ++ .enable_reg = 0x2903c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_axi_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_axi_s_bridge_clk = { ++ .halt_reg = 0x29040, ++ .clkr = { ++ .enable_reg = 0x29040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_axi_s_bridge_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_snoc_pcie1_1lane_s_clk = { ++ .halt_reg = 0x2e04c, ++ .clkr = { ++ .enable_reg = 0x2e04c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_snoc_pcie1_1lane_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie2_axi_s_clk_src = { ++ .cmd_rcgr = 0x2a020, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie2_axi_s_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_axi_s_clk = { ++ .halt_reg = 0x2a03c, ++ .clkr = { ++ .enable_reg = 0x2a03c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_axi_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_axi_s_bridge_clk = { ++ .halt_reg = 0x2a040, ++ .clkr = { ++ .enable_reg = 0x2a040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_axi_s_bridge_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_snoc_pcie2_2lane_s_clk = { ++ .halt_reg = 0x2e050, ++ .clkr = { ++ .enable_reg = 0x2e050, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_snoc_pcie2_2lane_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie3_axi_s_clk_src = { ++ .cmd_rcgr = 0x2b020, ++ .freq_tbl = ftbl_pcie0_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie3_axi_s_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_axi_s_clk = { ++ .halt_reg = 0x2b03c, ++ .clkr = { ++ .enable_reg = 0x2b03c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_axi_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_axi_s_bridge_clk = { ++ .halt_reg = 0x2b040, ++ .clkr = { ++ .enable_reg = 0x2b040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_axi_s_bridge_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_snoc_pcie3_2lane_s_clk = { ++ .halt_reg = 0x2e054, ++ .clkr = { ++ .enable_reg = 0x2e054, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_snoc_pcie3_2lane_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_axi_s_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_regmap_phy_mux pcie0_pipe_clk_src = { ++ .reg = 0x28064, ++ .clkr = { ++ .hw.init = &(struct clk_init_data) { ++ .name = "pcie0_pipe_clk_src", ++ .parent_data = &(const struct clk_parent_data) { ++ .index = DT_PCIE30_PHY0_PIPE_CLK, ++ }, ++ .num_parents = 1, ++ .ops = &clk_regmap_phy_mux_ops, ++ }, ++ }, ++}; ++ ++static struct clk_regmap_phy_mux pcie1_pipe_clk_src = { ++ .reg = 0x29064, ++ .clkr = { ++ .hw.init = &(struct clk_init_data) { ++ .name = "pcie1_pipe_clk_src", ++ .parent_data = &(const struct clk_parent_data) { ++ .index = DT_PCIE30_PHY1_PIPE_CLK, ++ }, ++ .num_parents = 1, ++ .ops = &clk_regmap_phy_mux_ops, ++ }, ++ }, ++}; ++ ++static struct clk_regmap_phy_mux pcie2_pipe_clk_src = { ++ .reg = 0x2a064, ++ .clkr = { ++ .hw.init = &(struct clk_init_data) { ++ .name = "pcie2_pipe_clk_src", ++ .parent_data = &(const struct clk_parent_data) { ++ .index = DT_PCIE30_PHY2_PIPE_CLK, ++ }, ++ .num_parents = 1, ++ .ops = &clk_regmap_phy_mux_ops, ++ }, ++ }, ++}; ++ ++static struct clk_regmap_phy_mux pcie3_pipe_clk_src = { ++ .reg = 0x2b064, ++ .clkr = { ++ .hw.init = &(struct clk_init_data) { ++ .name = "pcie3_pipe_clk_src", ++ .parent_data = &(const struct clk_parent_data) { ++ .index = DT_PCIE30_PHY3_PIPE_CLK, ++ }, ++ .num_parents = 1, ++ .ops = &clk_regmap_phy_mux_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_pcie_rchng_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(100000000, P_GPLL0, 8, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 pcie0_rchng_clk_src = { ++ .cmd_rcgr = 0x28028, ++ .freq_tbl = ftbl_pcie_rchng_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie0_rchng_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_rchng_clk = { ++ .halt_reg = 0x28028, ++ .clkr = { ++ .enable_reg = 0x28028, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_rchng_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie0_rchng_clk_src.clkr.hw ++ ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie1_rchng_clk_src = { ++ .cmd_rcgr = 0x29028, ++ .freq_tbl = ftbl_pcie_rchng_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie1_rchng_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_rchng_clk = { ++ .halt_reg = 0x29028, ++ .clkr = { ++ .enable_reg = 0x29028, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_rchng_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie1_rchng_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie2_rchng_clk_src = { ++ .cmd_rcgr = 0x2a028, ++ .freq_tbl = ftbl_pcie_rchng_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie2_rchng_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_rchng_clk = { ++ .halt_reg = 0x2a028, ++ .clkr = { ++ .enable_reg = 0x2a028, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_rchng_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie2_rchng_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_rcg2 pcie3_rchng_clk_src = { ++ .cmd_rcgr = 0x2b028, ++ .freq_tbl = ftbl_pcie_rchng_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie3_rchng_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_rchng_clk = { ++ .halt_reg = 0x2b028, ++ .clkr = { ++ .enable_reg = 0x2b028, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_rchng_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie3_rchng_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_pcie_aux_clk_src[] = { ++ F(20000000, P_GPLL0, 10, 1, 4), ++ { } ++}; ++ ++static struct clk_rcg2 pcie_aux_clk_src = { ++ .cmd_rcgr = 0x28004, ++ .freq_tbl = ftbl_pcie_aux_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcie_aux_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_aux_core_pi_sleep_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_aux_clk = { ++ .halt_reg = 0x28034, ++ .clkr = { ++ .enable_reg = 0x28034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_aux_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie_aux_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_aux_clk = { ++ .halt_reg = 0x29034, ++ .clkr = { ++ .enable_reg = 0x29034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_aux_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie_aux_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_aux_clk = { ++ .halt_reg = 0x2a034, ++ .clkr = { ++ .enable_reg = 0x2a034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_aux_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie_aux_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_aux_clk = { ++ .halt_reg = 0x2b034, ++ .clkr = { ++ .enable_reg = 0x2b034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_aux_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcie_aux_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_usb_aux_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 usb0_aux_clk_src = { ++ .cmd_rcgr = 0x2c018, ++ .freq_tbl = ftbl_usb_aux_clk_src, ++ .mnd_width = 16, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_core_pi_sleep_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "usb0_aux_clk_src", ++ .parent_data = gcc_xo_gpll0_core_pi_sleep_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_core_pi_sleep_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_usb0_aux_clk = { ++ .halt_reg = 0x2c048, ++ .clkr = { ++ .enable_reg = 0x2c048, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_usb0_aux_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &usb0_aux_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_usb0_master_clk_src[] = { ++ F(100000000, P_GPLL0, 8, 0, 0), ++ F(200000000, P_GPLL0, 4, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 usb0_master_clk_src = { ++ .cmd_rcgr = 0x2c004, ++ .freq_tbl = ftbl_usb0_master_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_out_main_div2_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "usb0_master_clk_src", ++ .parent_data = gcc_xo_gpll0_out_main_div2_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_out_main_div2_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_usb0_master_clk = { ++ .halt_reg = 0x2c044, ++ .clkr = { ++ .enable_reg = 0x2c044, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_usb0_master_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &usb0_master_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_snoc_usb_clk = { ++ .halt_reg = 0x2e058, ++ .clkr = { ++ .enable_reg = 0x2e058, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_snoc_usb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &usb0_master_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_usb_axi_clk = { ++ .halt_reg = 0x2e084, ++ .clkr = { ++ .enable_reg = 0x2e084, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_usb_axi_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &usb0_master_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_usb0_mock_utmi_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(60000000, P_GPLL4, 10, 1, 2), ++ { } ++}; ++ ++static struct clk_rcg2 usb0_mock_utmi_clk_src = { ++ .cmd_rcgr = 0x2c02c, ++ .freq_tbl = ftbl_usb0_mock_utmi_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll4_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "usb0_mock_utmi_clk_src", ++ .parent_data = gcc_xo_gpll4_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_regmap_div usb0_mock_utmi_div_clk_src = { ++ .reg = 0x2c040, ++ .shift = 0, ++ .width = 2, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "usb0_mock_utmi_div_clk_src", ++ .parent_data = &(const struct clk_parent_data) { ++ .hw = &usb0_mock_utmi_clk_src.clkr.hw, ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_regmap_div_ro_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_usb0_mock_utmi_clk = { ++ .halt_reg = 0x2c04c, ++ .clkr = { ++ .enable_reg = 0x2c04c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_usb0_mock_utmi_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &usb0_mock_utmi_div_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_regmap_mux usb0_pipe_clk_src = { ++ .reg = 0x2C074, ++ .shift = 8, ++ .width = 2, ++ .parent_map = gcc_usb3phy_0_cc_pipe_clk_xo_map, ++ .clkr = { ++ .hw.init = &(struct clk_init_data) { ++ .name = "usb0_pipe_clk_src", ++ .parent_data = gcc_usb3phy_0_cc_pipe_clk_xo, ++ .num_parents = ARRAY_SIZE(gcc_usb3phy_0_cc_pipe_clk_xo), ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_regmap_mux_closest_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_sdcc_apps_clk_src[] = { ++ F(144000, P_XO, 16, 12, 125), ++ F(400000, P_XO, 12, 1, 5), ++ F(24000000, P_GPLL2, 12, 1, 4), ++ F(48000000, P_GPLL2, 12, 1, 2), ++ F(96000000, P_GPLL2, 12, 0, 0), ++ F(177777778, P_GPLL0, 4.5, 0, 0), ++ F(192000000, P_GPLL2, 6, 0, 0), ++ F(384000000, P_GPLL2, 3, 0, 0), ++ F(400000000, P_GPLL0, 2, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 sdcc1_apps_clk_src = { ++ .cmd_rcgr = 0x33004, ++ .freq_tbl = ftbl_sdcc_apps_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll2_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "sdcc1_apps_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll2_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_gpll0_out_main_div2), ++ .ops = &clk_rcg2_floor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_sdcc1_apps_clk = { ++ .halt_reg = 0x3302c, ++ .clkr = { ++ .enable_reg = 0x3302c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sdcc1_apps_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &sdcc1_apps_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_sdcc_ice_core_clk_src[] = { ++ F(150000000, P_GPLL4, 8, 0, 0), ++ F(300000000, P_GPLL4, 4, 0, 0), ++}; ++ ++static struct clk_rcg2 sdcc1_ice_core_clk_src = { ++ .cmd_rcgr = 0x33018, ++ .freq_tbl = ftbl_sdcc_ice_core_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_gpll0_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "sdcc1_ice_core_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4_gpll0_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_gpll0_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_sdcc1_ice_core_clk = { ++ .halt_reg = 0x33030, ++ .clkr = { ++ .enable_reg = 0x33030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sdcc1_ice_core_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &sdcc1_ice_core_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_pcnoc_bfdcd_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(50000000, P_GPLL0, 16, 0, 0), ++ F(80000000, P_GPLL0, 10, 0, 0), ++ F(100000000, P_GPLL0, 8, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 pcnoc_bfdcd_clk_src = { ++ .cmd_rcgr = 0x31004, ++ .freq_tbl = ftbl_pcnoc_bfdcd_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "pcnoc_bfdcd_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .flags = CLK_IS_CRITICAL, ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_nsscfg_clk = { ++ .halt_reg = 0x1702c, ++ .clkr = { ++ .enable_reg = 0x1702c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nsscfg_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_nsscc_clk = { ++ .halt_reg = 0x17030, ++ .clkr = { ++ .enable_reg = 0x17030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_nsscc_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nsscc_clk = { ++ .halt_reg = 0x17034, ++ .clkr = { ++ .enable_reg = 0x17034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nsscc_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_pcnoc_1_clk = { ++ .halt_reg = 0x17080, ++ .clkr = { ++ .enable_reg = 0x17080, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_pcnoc_1_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_dap_ahb_clk = { ++ .halt_reg = 0x2d064, ++ .clkr = { ++ .enable_reg = 0x2d064, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_dap_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_cfg_ahb_clk = { ++ .halt_reg = 0x2d068, ++ .clkr = { ++ .enable_reg = 0x2d068, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_cfg_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qpic_ahb_clk = { ++ .halt_reg = 0x32010, ++ .clkr = { ++ .enable_reg = 0x32010, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qpic_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qpic_clk = { ++ .halt_reg = 0x32014, ++ .clkr = { ++ .enable_reg = 0x32014, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qpic_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_blsp1_ahb_clk = { ++ .halt_reg = 0x01004, ++ .halt_check = BRANCH_HALT_VOTED, ++ .clkr = { ++ .enable_reg = 0x0b004, ++ .enable_mask = BIT(4), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_blsp1_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_mdio_ahb_clk = { ++ .halt_reg = 0x17040, ++ .clkr = { ++ .enable_reg = 0x17040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_mdio_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_prng_ahb_clk = { ++ .halt_reg = 0x13024, ++ .halt_check = BRANCH_HALT_VOTED, ++ .clkr = { ++ .enable_reg = 0x0b004, ++ .enable_mask = BIT(10), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_prng_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy0_ahb_clk = { ++ .halt_reg = 0x1704c, ++ .clkr = { ++ .enable_reg = 0x1704c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy0_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy1_ahb_clk = { ++ .halt_reg = 0x1705c, ++ .clkr = { ++ .enable_reg = 0x1705c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy1_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy2_ahb_clk = { ++ .halt_reg = 0x1706c, ++ .clkr = { ++ .enable_reg = 0x1706c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy2_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_cmn_12gpll_ahb_clk = { ++ .halt_reg = 0x3a004, ++ .clkr = { ++ .enable_reg = 0x3a004, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_cmn_12gpll_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_cmn_12gpll_apu_clk = { ++ .halt_reg = 0x3a00c, ++ .clkr = { ++ .enable_reg = 0x3a00c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_cmn_12gpll_apu_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie0_ahb_clk = { ++ .halt_reg = 0x28030, ++ .clkr = { ++ .enable_reg = 0x28030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie0_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie1_ahb_clk = { ++ .halt_reg = 0x29030, ++ .clkr = { ++ .enable_reg = 0x29030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie1_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie2_ahb_clk = { ++ .halt_reg = 0x2a030, ++ .clkr = { ++ .enable_reg = 0x2a030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie2_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcie3_ahb_clk = { ++ .halt_reg = 0x2b030, ++ .clkr = { ++ .enable_reg = 0x2b030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcie3_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_usb0_phy_cfg_ahb_clk = { ++ .halt_reg = 0x2c05c, ++ .clkr = { ++ .enable_reg = 0x2c05c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_usb0_phy_cfg_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_sdcc1_ahb_clk = { ++ .halt_reg = 0x33034, ++ .clkr = { ++ .enable_reg = 0x33034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sdcc1_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &pcnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_system_noc_bfdcd_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(133333333, P_GPLL0, 6, 0, 0), ++ F(200000000, P_GPLL0, 4, 0, 0), ++ F(342850000, P_GPLL4, 3.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 system_noc_bfdcd_clk_src = { ++ .cmd_rcgr = 0x2e004, ++ .freq_tbl = ftbl_system_noc_bfdcd_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "system_noc_bfdcd_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4), ++ .flags = CLK_IS_CRITICAL, ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_q6ss_boot_clk = { ++ .halt_reg = 0x25080, ++ .halt_check = BRANCH_HALT_SKIP, ++ .clkr = { ++ .enable_reg = 0x25080, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6ss_boot_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &system_noc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_snoc_clk = { ++ .halt_reg = 0x17028, ++ .clkr = { ++ .enable_reg = 0x17028, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_snoc_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &system_noc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_snoc_1_clk = { ++ .halt_reg = 0x1707c, ++ .clkr = { ++ .enable_reg = 0x1707c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_snoc_1_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &system_noc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_etr_usb_clk = { ++ .halt_reg = 0x2d060, ++ .clkr = { ++ .enable_reg = 0x2d060, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_etr_usb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &system_noc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_wcss_ahb_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(133333333, P_GPLL0, 6, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 wcss_ahb_clk_src = { ++ .cmd_rcgr = 0x25030, ++ .freq_tbl = ftbl_wcss_ahb_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "wcss_ahb_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_q6_ahb_clk = { ++ .halt_reg = 0x25014, ++ .clkr = { ++ .enable_reg = 0x25014, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_q6_ahb_s_clk = { ++ .halt_reg = 0x25018, ++ .clkr = { ++ .enable_reg = 0x25018, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6_ahb_s_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_ecahb_clk = { ++ .halt_reg = 0x25058, ++ .clkr = { ++ .enable_reg = 0x25058, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_ecahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_acmt_clk = { ++ .halt_reg = 0x2505c, ++ .clkr = { ++ .enable_reg = 0x2505c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_acmt_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_sys_noc_wcss_ahb_clk = { ++ .halt_reg = 0x2e030, ++ .clkr = { ++ .enable_reg = 0x2e030, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sys_noc_wcss_ahb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_ahb_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_wcss_axi_m_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(133333333, P_GPLL0, 6, 0, 0), ++ F(266666667, P_GPLL0, 3, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 wcss_axi_m_clk_src = { ++ .cmd_rcgr = 0x25078, ++ .freq_tbl = ftbl_wcss_axi_m_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "wcss_axi_m_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_anoc_wcss_axi_m_clk = { ++ .halt_reg = 0x2e0a8, ++ .clkr = { ++ .enable_reg = 0x2e0a8, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_anoc_wcss_axi_m_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &wcss_axi_m_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_qdss_at_clk_src[] = { ++ F(240000000, P_GPLL4, 5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 qdss_at_clk_src = { ++ .cmd_rcgr = 0x2d004, ++ .freq_tbl = ftbl_qdss_at_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "qdss_at_clk_src", ++ .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_q6ss_atbm_clk = { ++ .halt_reg = 0x2501c, ++ .clkr = { ++ .enable_reg = 0x2501c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6ss_atbm_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_dbg_ifc_atb_clk = { ++ .halt_reg = 0x2503c, ++ .clkr = { ++ .enable_reg = 0x2503c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_dbg_ifc_atb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_atb_clk = { ++ .halt_reg = 0x17014, ++ .clkr = { ++ .enable_reg = 0x17014, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_atb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_at_clk = { ++ .halt_reg = 0x2d038, ++ .clkr = { ++ .enable_reg = 0x2d038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_at_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_sys_noc_at_clk = { ++ .halt_reg = 0x2e038, ++ .clkr = { ++ .enable_reg = 0x2e038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sys_noc_at_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_pcnoc_at_clk = { ++ .halt_reg = 0x31024, ++ .clkr = { ++ .enable_reg = 0x31024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_pcnoc_at_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor gcc_eud_at_div_clk_src = { ++ .mult = 1, ++ .div = 6, ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_eud_at_div_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_at_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_usb0_eud_at_clk = { ++ .halt_reg = 0x30004, ++ .clkr = { ++ .enable_reg = 0x30004, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_usb0_eud_at_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_eud_at_div_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_eud_at_clk = { ++ .halt_reg = 0x2d06c, ++ .clkr = { ++ .enable_reg = 0x2d06c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_eud_at_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_eud_at_div_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_qdss_stm_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(200000000, P_GPLL0, 4, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 qdss_stm_clk_src = { ++ .cmd_rcgr = 0x2d00c, ++ .freq_tbl = ftbl_qdss_stm_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_out_main_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "qdss_stm_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_out_main_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_out_main_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_stm_clk = { ++ .halt_reg = 0x2d03c, ++ .clkr = { ++ .enable_reg = 0x2d03c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_stm_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_stm_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_sys_noc_qdss_stm_axi_clk = { ++ .halt_reg = 0x2e034, ++ .clkr = { ++ .enable_reg = 0x2e034, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_sys_noc_qdss_stm_axi_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_stm_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_qdss_traceclkin_clk_src[] = { ++ F(300000000, P_GPLL4, 4, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 qdss_traceclkin_clk_src = { ++ .cmd_rcgr = 0x2d014, ++ .freq_tbl = ftbl_qdss_traceclkin_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "qdss_traceclkin_clk_src", ++ .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_traceclkin_clk = { ++ .halt_reg = 0x2d040, ++ .clkr = { ++ .enable_reg = 0x2d040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_traceclkin_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_traceclkin_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_qdss_tsctr_clk_src[] = { ++ F(600000000, P_GPLL4, 2, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 qdss_tsctr_clk_src = { ++ .cmd_rcgr = 0x2d01c, ++ .freq_tbl = ftbl_qdss_tsctr_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll4_gpll0_gpll0_div2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "qdss_tsctr_clk_src", ++ .parent_data = gcc_xo_gpll4_gpll0_gpll0_div2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll4_gpll0_gpll0_div2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_fixed_factor qdss_tsctr_div2_clk_src = { ++ .mult = 1, ++ .div = 2, ++ .hw.init = &(struct clk_init_data) { ++ .name = "qdss_tsctr_div2_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_q6_tsctr_1to2_clk = { ++ .halt_reg = 0x25020, ++ .clkr = { ++ .enable_reg = 0x25020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6_tsctr_1to2_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div2_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_dbg_ifc_nts_clk = { ++ .halt_reg = 0x25040, ++ .clkr = { ++ .enable_reg = 0x25040, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_dbg_ifc_nts_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div2_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_tsctr_div2_clk = { ++ .halt_reg = 0x2d044, ++ .clkr = { ++ .enable_reg = 0x2d044, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_tsctr_div2_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div2_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_uniphy_sys_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 uniphy_sys_clk_src = { ++ .cmd_rcgr = 0x17090, ++ .freq_tbl = ftbl_uniphy_sys_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "uniphy_sys_clk_src", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 nss_ts_clk_src = { ++ .cmd_rcgr = 0x17088, ++ .freq_tbl = ftbl_uniphy_sys_clk_src, ++ .mnd_width = 8, ++ .hid_width = 5, ++ .parent_map = gcc_xo_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "nss_ts_clk_src", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_ts_clk = { ++ .halt_reg = 0x2d078, ++ .clkr = { ++ .enable_reg = 0x2d078, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_ts_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nss_ts_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor qdss_dap_sync_clk_src = { ++ .mult = 1, ++ .div = 4, ++ .hw.init = &(struct clk_init_data) { ++ .name = "qdss_dap_sync_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_tsctr_div4_clk = { ++ .halt_reg = 0x2d04c, ++ .clkr = { ++ .enable_reg = 0x2d04c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_tsctr_div4_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor qdss_tsctr_div8_clk_src = { ++ .mult = 1, ++ .div = 8, ++ .hw.init = &(struct clk_init_data) { ++ .name = "qdss_tsctr_div8_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_nss_ts_clk = { ++ .halt_reg = 0x17018, ++ .clkr = { ++ .enable_reg = 0x17018, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nss_ts_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nss_ts_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_tsctr_div8_clk = { ++ .halt_reg = 0x2d050, ++ .clkr = { ++ .enable_reg = 0x2d050, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_tsctr_div8_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div8_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor qdss_tsctr_div16_clk_src = { ++ .mult = 1, ++ .div = 16, ++ .hw.init = &(struct clk_init_data) { ++ .name = "qdss_tsctr_div16_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_tsctr_div16_clk = { ++ .halt_reg = 0x2d054, ++ .clkr = { ++ .enable_reg = 0x2d054, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_tsctr_div16_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div16_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_q6ss_pclkdbg_clk = { ++ .halt_reg = 0x25024, ++ .clkr = { ++ .enable_reg = 0x25024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6ss_pclkdbg_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_q6ss_trig_clk = { ++ .halt_reg = 0x25068, ++ .clkr = { ++ .enable_reg = 0x25068, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6ss_trig_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_dbg_ifc_apb_clk = { ++ .halt_reg = 0x25038, ++ .clkr = { ++ .enable_reg = 0x25038, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_dbg_ifc_apb_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_dbg_ifc_dapbus_clk = { ++ .halt_reg = 0x25044, ++ .clkr = { ++ .enable_reg = 0x25044, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_dbg_ifc_dapbus_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_dap_clk = { ++ .halt_reg = 0x2d058, ++ .clkr = { ++ .enable_reg = 0x2d058, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_dap_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_apb2jtag_clk = { ++ .halt_reg = 0x2d05c, ++ .clkr = { ++ .enable_reg = 0x2d05c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_apb2jtag_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_dap_sync_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor qdss_tsctr_div3_clk_src = { ++ .mult = 1, ++ .div = 3, ++ .hw.init = &(struct clk_init_data) { ++ .name = "qdss_tsctr_div3_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qdss_tsctr_div3_clk = { ++ .halt_reg = 0x2d048, ++ .clkr = { ++ .enable_reg = 0x2d048, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_qdss_tsctr_div3_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &qdss_tsctr_div3_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_qpic_io_macro_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(100000000, P_GPLL0, 8, 0, 0), ++ F(200000000, P_GPLL0, 4, 0, 0), ++ F(320000000, P_GPLL0, 2.5, 0, 0), ++ F(400000000, P_GPLL0, 2, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 qpic_io_macro_clk_src = { ++ .cmd_rcgr = 0x32004, ++ .freq_tbl = ftbl_qpic_io_macro_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "qpic_io_macro_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_qpic_io_macro_clk = { ++ .halt_reg = 0x3200c, ++ .clkr = { ++ .enable_reg = 0x3200c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "gcc_qpic_io_macro_clk", ++ .parent_hws = (const struct clk_hw *[]){ ++ &qpic_io_macro_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_q6_axi_clk_src[] = { ++ F(533333333, P_GPLL0, 1.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 q6_axi_clk_src = { ++ .cmd_rcgr = 0x25004, ++ .freq_tbl = ftbl_q6_axi_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll2_gpll4_pi_sleep_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "q6_axi_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll2_gpll4_pi_sleep, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll2_gpll4_pi_sleep), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_q6_axim_clk = { ++ .halt_reg = 0x2500c, ++ .clkr = { ++ .enable_reg = 0x2500c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_q6_axim_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &q6_axi_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_wcss_q6_tbu_clk = { ++ .halt_reg = 0x12050, ++ .halt_check = BRANCH_HALT_DELAY, ++ .clkr = { ++ .enable_reg = 0xb00c, ++ .enable_mask = BIT(6), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_wcss_q6_tbu_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &q6_axi_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_mem_noc_q6_axi_clk = { ++ .halt_reg = 0x19010, ++ .clkr = { ++ .enable_reg = 0x19010, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_mem_noc_q6_axi_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &q6_axi_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_q6_axim2_clk_src[] = { ++ F(342857143, P_GPLL4, 3.5, 0, 0), ++ { } ++}; ++ ++static const struct parent_map gcc_xo_gpll0_gpll4_bias_pll_ubinc_clk_map[] = { ++ { P_XO, 0 }, ++ { P_GPLL0, 1 }, ++ { P_GPLL4, 2 }, ++ { P_BIAS_PLL_UBI_NC_CLK, 4 }, ++}; ++ ++static struct clk_rcg2 q6_axim2_clk_src = { ++ .cmd_rcgr = 0x25028, ++ .freq_tbl = ftbl_q6_axim2_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll4_bias_pll_ubinc_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "q6_axim2_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll4_bias_pll_ubi_nc_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_nssnoc_memnoc_bfdcd_clk_src[] = { ++ F(533333333, P_GPLL0, 1.5, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 nssnoc_memnoc_bfdcd_clk_src = { ++ .cmd_rcgr = 0x17004, ++ .freq_tbl = ftbl_nssnoc_memnoc_bfdcd_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_aux_gpll2_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "nssnoc_memnoc_bfdcd_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_aux_gpll2, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_aux_gpll2), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_memnoc_clk = { ++ .halt_reg = 0x17024, ++ .clkr = { ++ .enable_reg = 0x17024, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_memnoc_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nssnoc_memnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_mem_noc_1_clk = { ++ .halt_reg = 0x17084, ++ .clkr = { ++ .enable_reg = 0x17084, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_mem_noc_1_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nssnoc_memnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nss_tbu_clk = { ++ .halt_reg = 0x12040, ++ .clkr = { ++ .enable_reg = 0xb00c, ++ .enable_mask = BIT(4), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nss_tbu_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nssnoc_memnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_mem_noc_nssnoc_clk = { ++ .halt_reg = 0x19014, ++ .clkr = { ++ .enable_reg = 0x19014, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_mem_noc_nssnoc_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &nssnoc_memnoc_bfdcd_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_lpass_axim_clk_src[] = { ++ F(133333333, P_GPLL0, 6, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 lpass_axim_clk_src = { ++ .cmd_rcgr = 0x2700c, ++ .freq_tbl = ftbl_lpass_axim_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "lpass_axim_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 lpass_sway_clk_src = { ++ .cmd_rcgr = 0x27004, ++ .freq_tbl = ftbl_lpass_axim_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "lpass_sway_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_adss_pwm_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(100000000, P_GPLL0, 8, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 adss_pwm_clk_src = { ++ .cmd_rcgr = 0x1c004, ++ .freq_tbl = ftbl_adss_pwm_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "adss_pwm_clk_src", ++ .parent_data = gcc_xo_gpll0, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_adss_pwm_clk = { ++ .halt_reg = 0x1c00c, ++ .clkr = { ++ .enable_reg = 0x1c00c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_adss_pwm_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &adss_pwm_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static const struct freq_tbl ftbl_gp1_clk_src[] = { ++ F(24000000, P_XO, 1, 0, 0), ++ F(200000000, P_GPLL0, 4, 0, 0), ++ { } ++}; ++ ++static struct clk_rcg2 gp1_clk_src = { ++ .cmd_rcgr = 0x8004, ++ .freq_tbl = ftbl_gp1_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gp1_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_sleep_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 gp2_clk_src = { ++ .cmd_rcgr = 0x9004, ++ .freq_tbl = ftbl_gp1_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gp2_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_sleep_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_rcg2 gp3_clk_src = { ++ .cmd_rcgr = 0xa004, ++ .freq_tbl = ftbl_gp1_clk_src, ++ .hid_width = 5, ++ .parent_map = gcc_xo_gpll0_gpll0_sleep_clk_map, ++ .clkr.hw.init = &(struct clk_init_data) { ++ .name = "gp3_clk_src", ++ .parent_data = gcc_xo_gpll0_gpll0_sleep_clk, ++ .num_parents = ARRAY_SIZE(gcc_xo_gpll0_gpll0_sleep_clk), ++ .ops = &clk_rcg2_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_xo_clk_src = { ++ .halt_reg = 0x34004, ++ .clkr = { ++ .enable_reg = 0x34004, ++ .enable_mask = BIT(1), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_xo_clk_src", ++ .parent_data = gcc_xo_data, ++ .num_parents = ARRAY_SIZE(gcc_xo_data), ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_xo_dcd_clk = { ++ .halt_reg = 0x17074, ++ .clkr = { ++ .enable_reg = 0x17074, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_xo_dcd_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_xo_clk = { ++ .halt_reg = 0x34018, ++ .clkr = { ++ .enable_reg = 0x34018, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_xo_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy0_sys_clk = { ++ .halt_reg = 0x17048, ++ .clkr = { ++ .enable_reg = 0x17048, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy0_sys_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &uniphy_sys_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy1_sys_clk = { ++ .halt_reg = 0x17058, ++ .clkr = { ++ .enable_reg = 0x17058, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy1_sys_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &uniphy_sys_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_uniphy2_sys_clk = { ++ .halt_reg = 0x17068, ++ .clkr = { ++ .enable_reg = 0x17068, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_uniphy2_sys_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &uniphy_sys_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_cmn_12gpll_sys_clk = { ++ .halt_reg = 0x3a008, ++ .clkr = { ++ .enable_reg = 0x3a008, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_cmn_12gpll_sys_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &uniphy_sys_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_fixed_factor gcc_xo_div4_clk_src = { ++ .mult = 1, ++ .div = 4, ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_xo_div4_clk_src", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_clk_src.clkr.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_fixed_factor_ops, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_qosgen_ref_clk = { ++ .halt_reg = 0x1701c, ++ .clkr = { ++ .enable_reg = 0x1701c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_qosgen_ref_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_div4_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_nssnoc_timeout_ref_clk = { ++ .halt_reg = 0x17020, ++ .clkr = { ++ .enable_reg = 0x17020, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_nssnoc_timeout_ref_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_div4_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_branch gcc_xo_div4_clk = { ++ .halt_reg = 0x3401c, ++ .clkr = { ++ .enable_reg = 0x3401c, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data) { ++ .name = "gcc_xo_div4_clk", ++ .parent_hws = (const struct clk_hw *[]) { ++ &gcc_xo_div4_clk_src.hw ++ }, ++ .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, ++ .ops = &clk_branch2_ops, ++ }, ++ }, ++}; ++ ++static struct clk_hw *gcc_ipq9574_hws[] = { ++ &gpll0_out_main_div2.hw, ++ &gcc_xo_div4_clk_src.hw, ++ &qdss_dap_sync_clk_src.hw, ++ &qdss_tsctr_div2_clk_src.hw, ++ &qdss_tsctr_div8_clk_src.hw, ++ &qdss_tsctr_div16_clk_src.hw, ++ &qdss_tsctr_div3_clk_src.hw, ++ &gcc_eud_at_div_clk_src.hw, ++}; ++ ++static struct clk_regmap *gcc_ipq9574_clks[] = { ++ [GPLL0_MAIN] = &gpll0_main.clkr, ++ [GPLL0] = &gpll0.clkr, ++ [GPLL4_MAIN] = &gpll4_main.clkr, ++ [GPLL4] = &gpll4.clkr, ++ [GPLL2_MAIN] = &gpll2_main.clkr, ++ [GPLL2] = &gpll2.clkr, ++ [GCC_SLEEP_CLK_SRC] = &gcc_sleep_clk_src.clkr, ++ [APSS_AHB_CLK_SRC] = &apss_ahb_clk_src.clkr, ++ [APSS_AXI_CLK_SRC] = &apss_axi_clk_src.clkr, ++ [BLSP1_QUP1_I2C_APPS_CLK_SRC] = &blsp1_qup1_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP1_SPI_APPS_CLK_SRC] = &blsp1_qup1_spi_apps_clk_src.clkr, ++ [BLSP1_QUP2_I2C_APPS_CLK_SRC] = &blsp1_qup2_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP2_SPI_APPS_CLK_SRC] = &blsp1_qup2_spi_apps_clk_src.clkr, ++ [BLSP1_QUP3_I2C_APPS_CLK_SRC] = &blsp1_qup3_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP3_SPI_APPS_CLK_SRC] = &blsp1_qup3_spi_apps_clk_src.clkr, ++ [BLSP1_QUP4_I2C_APPS_CLK_SRC] = &blsp1_qup4_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP4_SPI_APPS_CLK_SRC] = &blsp1_qup4_spi_apps_clk_src.clkr, ++ [BLSP1_QUP5_I2C_APPS_CLK_SRC] = &blsp1_qup5_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP5_SPI_APPS_CLK_SRC] = &blsp1_qup5_spi_apps_clk_src.clkr, ++ [BLSP1_QUP6_I2C_APPS_CLK_SRC] = &blsp1_qup6_i2c_apps_clk_src.clkr, ++ [BLSP1_QUP6_SPI_APPS_CLK_SRC] = &blsp1_qup6_spi_apps_clk_src.clkr, ++ [BLSP1_UART1_APPS_CLK_SRC] = &blsp1_uart1_apps_clk_src.clkr, ++ [BLSP1_UART2_APPS_CLK_SRC] = &blsp1_uart2_apps_clk_src.clkr, ++ [BLSP1_UART3_APPS_CLK_SRC] = &blsp1_uart3_apps_clk_src.clkr, ++ [BLSP1_UART4_APPS_CLK_SRC] = &blsp1_uart4_apps_clk_src.clkr, ++ [BLSP1_UART5_APPS_CLK_SRC] = &blsp1_uart5_apps_clk_src.clkr, ++ [BLSP1_UART6_APPS_CLK_SRC] = &blsp1_uart6_apps_clk_src.clkr, ++ [GCC_APSS_AHB_CLK] = &gcc_apss_ahb_clk.clkr, ++ [GCC_APSS_AXI_CLK] = &gcc_apss_axi_clk.clkr, ++ [GCC_BLSP1_QUP1_I2C_APPS_CLK] = &gcc_blsp1_qup1_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP1_SPI_APPS_CLK] = &gcc_blsp1_qup1_spi_apps_clk.clkr, ++ [GCC_BLSP1_QUP2_I2C_APPS_CLK] = &gcc_blsp1_qup2_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP2_SPI_APPS_CLK] = &gcc_blsp1_qup2_spi_apps_clk.clkr, ++ [GCC_BLSP1_QUP3_I2C_APPS_CLK] = &gcc_blsp1_qup3_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP3_SPI_APPS_CLK] = &gcc_blsp1_qup3_spi_apps_clk.clkr, ++ [GCC_BLSP1_QUP4_I2C_APPS_CLK] = &gcc_blsp1_qup4_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP4_SPI_APPS_CLK] = &gcc_blsp1_qup4_spi_apps_clk.clkr, ++ [GCC_BLSP1_QUP5_I2C_APPS_CLK] = &gcc_blsp1_qup5_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP5_SPI_APPS_CLK] = &gcc_blsp1_qup5_spi_apps_clk.clkr, ++ [GCC_BLSP1_QUP6_I2C_APPS_CLK] = &gcc_blsp1_qup6_i2c_apps_clk.clkr, ++ [GCC_BLSP1_QUP6_SPI_APPS_CLK] = &gcc_blsp1_qup6_spi_apps_clk.clkr, ++ [GCC_BLSP1_UART1_APPS_CLK] = &gcc_blsp1_uart1_apps_clk.clkr, ++ [GCC_BLSP1_UART2_APPS_CLK] = &gcc_blsp1_uart2_apps_clk.clkr, ++ [GCC_BLSP1_UART3_APPS_CLK] = &gcc_blsp1_uart3_apps_clk.clkr, ++ [GCC_BLSP1_UART4_APPS_CLK] = &gcc_blsp1_uart4_apps_clk.clkr, ++ [GCC_BLSP1_UART5_APPS_CLK] = &gcc_blsp1_uart5_apps_clk.clkr, ++ [GCC_BLSP1_UART6_APPS_CLK] = &gcc_blsp1_uart6_apps_clk.clkr, ++ [PCIE0_AXI_M_CLK_SRC] = &pcie0_axi_m_clk_src.clkr, ++ [GCC_PCIE0_AXI_M_CLK] = &gcc_pcie0_axi_m_clk.clkr, ++ [PCIE1_AXI_M_CLK_SRC] = &pcie1_axi_m_clk_src.clkr, ++ [GCC_PCIE1_AXI_M_CLK] = &gcc_pcie1_axi_m_clk.clkr, ++ [PCIE2_AXI_M_CLK_SRC] = &pcie2_axi_m_clk_src.clkr, ++ [GCC_PCIE2_AXI_M_CLK] = &gcc_pcie2_axi_m_clk.clkr, ++ [PCIE3_AXI_M_CLK_SRC] = &pcie3_axi_m_clk_src.clkr, ++ [GCC_PCIE3_AXI_M_CLK] = &gcc_pcie3_axi_m_clk.clkr, ++ [PCIE0_AXI_S_CLK_SRC] = &pcie0_axi_s_clk_src.clkr, ++ [GCC_PCIE0_AXI_S_BRIDGE_CLK] = &gcc_pcie0_axi_s_bridge_clk.clkr, ++ [GCC_PCIE0_AXI_S_CLK] = &gcc_pcie0_axi_s_clk.clkr, ++ [PCIE1_AXI_S_CLK_SRC] = &pcie1_axi_s_clk_src.clkr, ++ [GCC_PCIE1_AXI_S_BRIDGE_CLK] = &gcc_pcie1_axi_s_bridge_clk.clkr, ++ [GCC_PCIE1_AXI_S_CLK] = &gcc_pcie1_axi_s_clk.clkr, ++ [PCIE2_AXI_S_CLK_SRC] = &pcie2_axi_s_clk_src.clkr, ++ [GCC_PCIE2_AXI_S_BRIDGE_CLK] = &gcc_pcie2_axi_s_bridge_clk.clkr, ++ [GCC_PCIE2_AXI_S_CLK] = &gcc_pcie2_axi_s_clk.clkr, ++ [PCIE3_AXI_S_CLK_SRC] = &pcie3_axi_s_clk_src.clkr, ++ [GCC_PCIE3_AXI_S_BRIDGE_CLK] = &gcc_pcie3_axi_s_bridge_clk.clkr, ++ [GCC_PCIE3_AXI_S_CLK] = &gcc_pcie3_axi_s_clk.clkr, ++ [PCIE0_PIPE_CLK_SRC] = &pcie0_pipe_clk_src.clkr, ++ [PCIE1_PIPE_CLK_SRC] = &pcie1_pipe_clk_src.clkr, ++ [PCIE2_PIPE_CLK_SRC] = &pcie2_pipe_clk_src.clkr, ++ [PCIE3_PIPE_CLK_SRC] = &pcie3_pipe_clk_src.clkr, ++ [PCIE_AUX_CLK_SRC] = &pcie_aux_clk_src.clkr, ++ [GCC_PCIE0_AUX_CLK] = &gcc_pcie0_aux_clk.clkr, ++ [GCC_PCIE1_AUX_CLK] = &gcc_pcie1_aux_clk.clkr, ++ [GCC_PCIE2_AUX_CLK] = &gcc_pcie2_aux_clk.clkr, ++ [GCC_PCIE3_AUX_CLK] = &gcc_pcie3_aux_clk.clkr, ++ [PCIE0_RCHNG_CLK_SRC] = &pcie0_rchng_clk_src.clkr, ++ [GCC_PCIE0_RCHNG_CLK] = &gcc_pcie0_rchng_clk.clkr, ++ [PCIE1_RCHNG_CLK_SRC] = &pcie1_rchng_clk_src.clkr, ++ [GCC_PCIE1_RCHNG_CLK] = &gcc_pcie1_rchng_clk.clkr, ++ [PCIE2_RCHNG_CLK_SRC] = &pcie2_rchng_clk_src.clkr, ++ [GCC_PCIE2_RCHNG_CLK] = &gcc_pcie2_rchng_clk.clkr, ++ [PCIE3_RCHNG_CLK_SRC] = &pcie3_rchng_clk_src.clkr, ++ [GCC_PCIE3_RCHNG_CLK] = &gcc_pcie3_rchng_clk.clkr, ++ [GCC_PCIE0_AHB_CLK] = &gcc_pcie0_ahb_clk.clkr, ++ [GCC_PCIE1_AHB_CLK] = &gcc_pcie1_ahb_clk.clkr, ++ [GCC_PCIE2_AHB_CLK] = &gcc_pcie2_ahb_clk.clkr, ++ [GCC_PCIE3_AHB_CLK] = &gcc_pcie3_ahb_clk.clkr, ++ [USB0_AUX_CLK_SRC] = &usb0_aux_clk_src.clkr, ++ [GCC_USB0_AUX_CLK] = &gcc_usb0_aux_clk.clkr, ++ [USB0_MASTER_CLK_SRC] = &usb0_master_clk_src.clkr, ++ [GCC_USB0_MASTER_CLK] = &gcc_usb0_master_clk.clkr, ++ [GCC_SNOC_USB_CLK] = &gcc_snoc_usb_clk.clkr, ++ [GCC_ANOC_USB_AXI_CLK] = &gcc_anoc_usb_axi_clk.clkr, ++ [USB0_MOCK_UTMI_CLK_SRC] = &usb0_mock_utmi_clk_src.clkr, ++ [USB0_MOCK_UTMI_DIV_CLK_SRC] = &usb0_mock_utmi_div_clk_src.clkr, ++ [GCC_USB0_MOCK_UTMI_CLK] = &gcc_usb0_mock_utmi_clk.clkr, ++ [USB0_PIPE_CLK_SRC] = &usb0_pipe_clk_src.clkr, ++ [GCC_USB0_PHY_CFG_AHB_CLK] = &gcc_usb0_phy_cfg_ahb_clk.clkr, ++ [SDCC1_APPS_CLK_SRC] = &sdcc1_apps_clk_src.clkr, ++ [GCC_SDCC1_APPS_CLK] = &gcc_sdcc1_apps_clk.clkr, ++ [SDCC1_ICE_CORE_CLK_SRC] = &sdcc1_ice_core_clk_src.clkr, ++ [GCC_SDCC1_ICE_CORE_CLK] = &gcc_sdcc1_ice_core_clk.clkr, ++ [GCC_SDCC1_AHB_CLK] = &gcc_sdcc1_ahb_clk.clkr, ++ [PCNOC_BFDCD_CLK_SRC] = &pcnoc_bfdcd_clk_src.clkr, ++ [GCC_NSSCFG_CLK] = &gcc_nsscfg_clk.clkr, ++ [GCC_NSSNOC_NSSCC_CLK] = &gcc_nssnoc_nsscc_clk.clkr, ++ [GCC_NSSCC_CLK] = &gcc_nsscc_clk.clkr, ++ [GCC_NSSNOC_PCNOC_1_CLK] = &gcc_nssnoc_pcnoc_1_clk.clkr, ++ [GCC_QDSS_DAP_AHB_CLK] = &gcc_qdss_dap_ahb_clk.clkr, ++ [GCC_QDSS_CFG_AHB_CLK] = &gcc_qdss_cfg_ahb_clk.clkr, ++ [GCC_QPIC_AHB_CLK] = &gcc_qpic_ahb_clk.clkr, ++ [GCC_QPIC_CLK] = &gcc_qpic_clk.clkr, ++ [GCC_BLSP1_AHB_CLK] = &gcc_blsp1_ahb_clk.clkr, ++ [GCC_MDIO_AHB_CLK] = &gcc_mdio_ahb_clk.clkr, ++ [GCC_PRNG_AHB_CLK] = &gcc_prng_ahb_clk.clkr, ++ [GCC_UNIPHY0_AHB_CLK] = &gcc_uniphy0_ahb_clk.clkr, ++ [GCC_UNIPHY1_AHB_CLK] = &gcc_uniphy1_ahb_clk.clkr, ++ [GCC_UNIPHY2_AHB_CLK] = &gcc_uniphy2_ahb_clk.clkr, ++ [GCC_CMN_12GPLL_AHB_CLK] = &gcc_cmn_12gpll_ahb_clk.clkr, ++ [GCC_CMN_12GPLL_APU_CLK] = &gcc_cmn_12gpll_apu_clk.clkr, ++ [SYSTEM_NOC_BFDCD_CLK_SRC] = &system_noc_bfdcd_clk_src.clkr, ++ [GCC_NSSNOC_SNOC_CLK] = &gcc_nssnoc_snoc_clk.clkr, ++ [GCC_NSSNOC_SNOC_1_CLK] = &gcc_nssnoc_snoc_1_clk.clkr, ++ [GCC_QDSS_ETR_USB_CLK] = &gcc_qdss_etr_usb_clk.clkr, ++ [WCSS_AHB_CLK_SRC] = &wcss_ahb_clk_src.clkr, ++ [GCC_Q6_AHB_CLK] = &gcc_q6_ahb_clk.clkr, ++ [GCC_Q6_AHB_S_CLK] = &gcc_q6_ahb_s_clk.clkr, ++ [GCC_WCSS_ECAHB_CLK] = &gcc_wcss_ecahb_clk.clkr, ++ [GCC_WCSS_ACMT_CLK] = &gcc_wcss_acmt_clk.clkr, ++ [GCC_SYS_NOC_WCSS_AHB_CLK] = &gcc_sys_noc_wcss_ahb_clk.clkr, ++ [WCSS_AXI_M_CLK_SRC] = &wcss_axi_m_clk_src.clkr, ++ [GCC_ANOC_WCSS_AXI_M_CLK] = &gcc_anoc_wcss_axi_m_clk.clkr, ++ [QDSS_AT_CLK_SRC] = &qdss_at_clk_src.clkr, ++ [GCC_Q6SS_ATBM_CLK] = &gcc_q6ss_atbm_clk.clkr, ++ [GCC_WCSS_DBG_IFC_ATB_CLK] = &gcc_wcss_dbg_ifc_atb_clk.clkr, ++ [GCC_NSSNOC_ATB_CLK] = &gcc_nssnoc_atb_clk.clkr, ++ [GCC_QDSS_AT_CLK] = &gcc_qdss_at_clk.clkr, ++ [GCC_SYS_NOC_AT_CLK] = &gcc_sys_noc_at_clk.clkr, ++ [GCC_PCNOC_AT_CLK] = &gcc_pcnoc_at_clk.clkr, ++ [GCC_USB0_EUD_AT_CLK] = &gcc_usb0_eud_at_clk.clkr, ++ [GCC_QDSS_EUD_AT_CLK] = &gcc_qdss_eud_at_clk.clkr, ++ [QDSS_STM_CLK_SRC] = &qdss_stm_clk_src.clkr, ++ [GCC_QDSS_STM_CLK] = &gcc_qdss_stm_clk.clkr, ++ [GCC_SYS_NOC_QDSS_STM_AXI_CLK] = &gcc_sys_noc_qdss_stm_axi_clk.clkr, ++ [QDSS_TRACECLKIN_CLK_SRC] = &qdss_traceclkin_clk_src.clkr, ++ [GCC_QDSS_TRACECLKIN_CLK] = &gcc_qdss_traceclkin_clk.clkr, ++ [QDSS_TSCTR_CLK_SRC] = &qdss_tsctr_clk_src.clkr, ++ [GCC_Q6_TSCTR_1TO2_CLK] = &gcc_q6_tsctr_1to2_clk.clkr, ++ [GCC_WCSS_DBG_IFC_NTS_CLK] = &gcc_wcss_dbg_ifc_nts_clk.clkr, ++ [GCC_QDSS_TSCTR_DIV2_CLK] = &gcc_qdss_tsctr_div2_clk.clkr, ++ [GCC_QDSS_TS_CLK] = &gcc_qdss_ts_clk.clkr, ++ [GCC_QDSS_TSCTR_DIV4_CLK] = &gcc_qdss_tsctr_div4_clk.clkr, ++ [GCC_NSS_TS_CLK] = &gcc_nss_ts_clk.clkr, ++ [GCC_QDSS_TSCTR_DIV8_CLK] = &gcc_qdss_tsctr_div8_clk.clkr, ++ [GCC_QDSS_TSCTR_DIV16_CLK] = &gcc_qdss_tsctr_div16_clk.clkr, ++ [GCC_Q6SS_PCLKDBG_CLK] = &gcc_q6ss_pclkdbg_clk.clkr, ++ [GCC_Q6SS_TRIG_CLK] = &gcc_q6ss_trig_clk.clkr, ++ [GCC_WCSS_DBG_IFC_APB_CLK] = &gcc_wcss_dbg_ifc_apb_clk.clkr, ++ [GCC_WCSS_DBG_IFC_DAPBUS_CLK] = &gcc_wcss_dbg_ifc_dapbus_clk.clkr, ++ [GCC_QDSS_DAP_CLK] = &gcc_qdss_dap_clk.clkr, ++ [GCC_QDSS_APB2JTAG_CLK] = &gcc_qdss_apb2jtag_clk.clkr, ++ [GCC_QDSS_TSCTR_DIV3_CLK] = &gcc_qdss_tsctr_div3_clk.clkr, ++ [QPIC_IO_MACRO_CLK_SRC] = &qpic_io_macro_clk_src.clkr, ++ [GCC_QPIC_IO_MACRO_CLK] = &gcc_qpic_io_macro_clk.clkr, ++ [Q6_AXI_CLK_SRC] = &q6_axi_clk_src.clkr, ++ [GCC_Q6_AXIM_CLK] = &gcc_q6_axim_clk.clkr, ++ [GCC_WCSS_Q6_TBU_CLK] = &gcc_wcss_q6_tbu_clk.clkr, ++ [GCC_MEM_NOC_Q6_AXI_CLK] = &gcc_mem_noc_q6_axi_clk.clkr, ++ [Q6_AXIM2_CLK_SRC] = &q6_axim2_clk_src.clkr, ++ [NSSNOC_MEMNOC_BFDCD_CLK_SRC] = &nssnoc_memnoc_bfdcd_clk_src.clkr, ++ [GCC_NSSNOC_MEMNOC_CLK] = &gcc_nssnoc_memnoc_clk.clkr, ++ [GCC_NSSNOC_MEM_NOC_1_CLK] = &gcc_nssnoc_mem_noc_1_clk.clkr, ++ [GCC_NSS_TBU_CLK] = &gcc_nss_tbu_clk.clkr, ++ [GCC_MEM_NOC_NSSNOC_CLK] = &gcc_mem_noc_nssnoc_clk.clkr, ++ [LPASS_AXIM_CLK_SRC] = &lpass_axim_clk_src.clkr, ++ [LPASS_SWAY_CLK_SRC] = &lpass_sway_clk_src.clkr, ++ [ADSS_PWM_CLK_SRC] = &adss_pwm_clk_src.clkr, ++ [GCC_ADSS_PWM_CLK] = &gcc_adss_pwm_clk.clkr, ++ [GP1_CLK_SRC] = &gp1_clk_src.clkr, ++ [GP2_CLK_SRC] = &gp2_clk_src.clkr, ++ [GP3_CLK_SRC] = &gp3_clk_src.clkr, ++ [GCC_XO_CLK_SRC] = &gcc_xo_clk_src.clkr, ++ [GCC_NSSNOC_XO_DCD_CLK] = &gcc_nssnoc_xo_dcd_clk.clkr, ++ [GCC_XO_CLK] = &gcc_xo_clk.clkr, ++ [GCC_NSSNOC_QOSGEN_REF_CLK] = &gcc_nssnoc_qosgen_ref_clk.clkr, ++ [GCC_NSSNOC_TIMEOUT_REF_CLK] = &gcc_nssnoc_timeout_ref_clk.clkr, ++ [GCC_XO_DIV4_CLK] = &gcc_xo_div4_clk.clkr, ++ [GCC_UNIPHY0_SYS_CLK] = &gcc_uniphy0_sys_clk.clkr, ++ [GCC_UNIPHY1_SYS_CLK] = &gcc_uniphy1_sys_clk.clkr, ++ [GCC_UNIPHY2_SYS_CLK] = &gcc_uniphy2_sys_clk.clkr, ++ [GCC_CMN_12GPLL_SYS_CLK] = &gcc_cmn_12gpll_sys_clk.clkr, ++ [GCC_Q6SS_BOOT_CLK] = &gcc_q6ss_boot_clk.clkr, ++ [UNIPHY_SYS_CLK_SRC] = &uniphy_sys_clk_src.clkr, ++ [NSS_TS_CLK_SRC] = &nss_ts_clk_src.clkr, ++ [GCC_ANOC_PCIE0_1LANE_M_CLK] = &gcc_anoc_pcie0_1lane_m_clk.clkr, ++ [GCC_ANOC_PCIE1_1LANE_M_CLK] = &gcc_anoc_pcie1_1lane_m_clk.clkr, ++ [GCC_ANOC_PCIE2_2LANE_M_CLK] = &gcc_anoc_pcie2_2lane_m_clk.clkr, ++ [GCC_ANOC_PCIE3_2LANE_M_CLK] = &gcc_anoc_pcie3_2lane_m_clk.clkr, ++ [GCC_SNOC_PCIE0_1LANE_S_CLK] = &gcc_snoc_pcie0_1lane_s_clk.clkr, ++ [GCC_SNOC_PCIE1_1LANE_S_CLK] = &gcc_snoc_pcie1_1lane_s_clk.clkr, ++ [GCC_SNOC_PCIE2_2LANE_S_CLK] = &gcc_snoc_pcie2_2lane_s_clk.clkr, ++ [GCC_SNOC_PCIE3_2LANE_S_CLK] = &gcc_snoc_pcie3_2lane_s_clk.clkr, ++}; ++ ++static const struct qcom_reset_map gcc_ipq9574_resets[] = { ++ [GCC_ADSS_BCR] = { 0x1c000, 0 }, ++ [GCC_ANOC0_TBU_BCR] = { 0x1203c, 0 }, ++ [GCC_ANOC1_TBU_BCR] = { 0x1204c, 0 }, ++ [GCC_ANOC_BCR] = { 0x2e074, 0 }, ++ [GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR] = { 0x38000, 0 }, ++ [GCC_APSS_TCU_BCR] = { 0x12014, 0 }, ++ [GCC_BLSP1_BCR] = { 0x01000, 0 }, ++ [GCC_BLSP1_QUP1_BCR] = { 0x02000, 0 }, ++ [GCC_BLSP1_QUP2_BCR] = { 0x03000, 0 }, ++ [GCC_BLSP1_QUP3_BCR] = { 0x04000, 0 }, ++ [GCC_BLSP1_QUP4_BCR] = { 0x05000, 0 }, ++ [GCC_BLSP1_QUP5_BCR] = { 0x06000, 0 }, ++ [GCC_BLSP1_QUP6_BCR] = { 0x07000, 0 }, ++ [GCC_BLSP1_UART1_BCR] = { 0x02028, 0 }, ++ [GCC_BLSP1_UART2_BCR] = { 0x03028, 0 }, ++ [GCC_BLSP1_UART3_BCR] = { 0x04028, 0 }, ++ [GCC_BLSP1_UART4_BCR] = { 0x05028, 0 }, ++ [GCC_BLSP1_UART5_BCR] = { 0x06028, 0 }, ++ [GCC_BLSP1_UART6_BCR] = { 0x07028, 0 }, ++ [GCC_BOOT_ROM_BCR] = { 0x13028, 0 }, ++ [GCC_CMN_BLK_BCR] = { 0x3a000, 0 }, ++ [GCC_CMN_BLK_AHB_ARES] = { 0x3a010, 0 }, ++ [GCC_CMN_BLK_SYS_ARES] = { 0x3a010, 1 }, ++ [GCC_CMN_BLK_APU_ARES] = { 0x3a010, 2 }, ++ [GCC_DCC_BCR] = { 0x35000, 0 }, ++ [GCC_DDRSS_BCR] = { 0x11000, 0 }, ++ [GCC_IMEM_BCR] = { 0x0e000, 0 }, ++ [GCC_LPASS_BCR] = { 0x27000, 0 }, ++ [GCC_MDIO_BCR] = { 0x1703c, 0 }, ++ [GCC_MPM_BCR] = { 0x37000, 0 }, ++ [GCC_MSG_RAM_BCR] = { 0x26000, 0 }, ++ [GCC_NSS_BCR] = { 0x17000, 0 }, ++ [GCC_NSS_TBU_BCR] = { 0x12044, 0 }, ++ [GCC_NSSNOC_MEMNOC_1_ARES] = { 0x17038, 13 }, ++ [GCC_NSSNOC_PCNOC_1_ARES] = { 0x17038, 12 }, ++ [GCC_NSSNOC_SNOC_1_ARES] = { 0x17038, 11 }, ++ [GCC_NSSNOC_XO_DCD_ARES] = { 0x17038, 10 }, ++ [GCC_NSSNOC_TS_ARES] = { 0x17038, 9 }, ++ [GCC_NSSCC_ARES] = { 0x17038, 8 }, ++ [GCC_NSSNOC_NSSCC_ARES] = { 0x17038, 7 }, ++ [GCC_NSSNOC_ATB_ARES] = { 0x17038, 6 }, ++ [GCC_NSSNOC_MEMNOC_ARES] = { 0x17038, 5 }, ++ [GCC_NSSNOC_QOSGEN_REF_ARES] = { 0x17038, 4 }, ++ [GCC_NSSNOC_SNOC_ARES] = { 0x17038, 3 }, ++ [GCC_NSSNOC_TIMEOUT_REF_ARES] = { 0x17038, 2 }, ++ [GCC_NSS_CFG_ARES] = { 0x17038, 1 }, ++ [GCC_UBI0_DBG_ARES] = { 0x17038, 0 }, ++ [GCC_PCIE0PHY_PHY_BCR] = { 0x2805c, 0 }, ++ [GCC_PCIE0_AHB_ARES] = { 0x28058, 7 }, ++ [GCC_PCIE0_AUX_ARES] = { 0x28058, 6 }, ++ [GCC_PCIE0_AXI_M_ARES] = { 0x28058, 5 }, ++ [GCC_PCIE0_AXI_M_STICKY_ARES] = { 0x28058, 4 }, ++ [GCC_PCIE0_AXI_S_ARES] = { 0x28058, 3 }, ++ [GCC_PCIE0_AXI_S_STICKY_ARES] = { 0x28058, 2 }, ++ [GCC_PCIE0_CORE_STICKY_ARES] = { 0x28058, 1 }, ++ [GCC_PCIE0_PIPE_ARES] = { 0x28058, 0 }, ++ [GCC_PCIE1_AHB_ARES] = { 0x29058, 7 }, ++ [GCC_PCIE1_AUX_ARES] = { 0x29058, 6 }, ++ [GCC_PCIE1_AXI_M_ARES] = { 0x29058, 5 }, ++ [GCC_PCIE1_AXI_M_STICKY_ARES] = { 0x29058, 4 }, ++ [GCC_PCIE1_AXI_S_ARES] = { 0x29058, 3 }, ++ [GCC_PCIE1_AXI_S_STICKY_ARES] = { 0x29058, 2 }, ++ [GCC_PCIE1_CORE_STICKY_ARES] = { 0x29058, 1 }, ++ [GCC_PCIE1_PIPE_ARES] = { 0x29058, 0 }, ++ [GCC_PCIE2_AHB_ARES] = { 0x2a058, 7 }, ++ [GCC_PCIE2_AUX_ARES] = { 0x2a058, 6 }, ++ [GCC_PCIE2_AXI_M_ARES] = { 0x2a058, 5 }, ++ [GCC_PCIE2_AXI_M_STICKY_ARES] = { 0x2a058, 4 }, ++ [GCC_PCIE2_AXI_S_ARES] = { 0x2a058, 3 }, ++ [GCC_PCIE2_AXI_S_STICKY_ARES] = { 0x2a058, 2 }, ++ [GCC_PCIE2_CORE_STICKY_ARES] = { 0x2a058, 1 }, ++ [GCC_PCIE2_PIPE_ARES] = { 0x2a058, 0 }, ++ [GCC_PCIE3_AHB_ARES] = { 0x2b058, 7 }, ++ [GCC_PCIE3_AUX_ARES] = { 0x2b058, 6 }, ++ [GCC_PCIE3_AXI_M_ARES] = { 0x2b058, 5 }, ++ [GCC_PCIE3_AXI_M_STICKY_ARES] = { 0x2b058, 4 }, ++ [GCC_PCIE3_AXI_S_ARES] = { 0x2b058, 3 }, ++ [GCC_PCIE3_AXI_S_STICKY_ARES] = { 0x2b058, 2 }, ++ [GCC_PCIE3_CORE_STICKY_ARES] = { 0x2b058, 1 }, ++ [GCC_PCIE3_PIPE_ARES] = { 0x2b058, 0 }, ++ [GCC_PCIE0_BCR] = { 0x28000, 0 }, ++ [GCC_PCIE0_LINK_DOWN_BCR] = { 0x28054, 0 }, ++ [GCC_PCIE0_PHY_BCR] = { 0x28060, 0 }, ++ [GCC_PCIE1_BCR] = { 0x29000, 0 }, ++ [GCC_PCIE1_LINK_DOWN_BCR] = { 0x29054, 0 }, ++ [GCC_PCIE1_PHY_BCR] = { 0x29060, 0 }, ++ [GCC_PCIE1PHY_PHY_BCR] = { 0x2905c, 0 }, ++ [GCC_PCIE2_BCR] = { 0x2a000, 0 }, ++ [GCC_PCIE2_LINK_DOWN_BCR] = { 0x2a054, 0 }, ++ [GCC_PCIE2_PHY_BCR] = { 0x2a060, 0 }, ++ [GCC_PCIE2PHY_PHY_BCR] = { 0x2a05c, 0 }, ++ [GCC_PCIE3_BCR] = { 0x2b000, 0 }, ++ [GCC_PCIE3_LINK_DOWN_BCR] = { 0x2b054, 0 }, ++ [GCC_PCIE3PHY_PHY_BCR] = { 0x2b05c, 0 }, ++ [GCC_PCIE3_PHY_BCR] = { 0x2b060, 0 }, ++ [GCC_PCNOC_BCR] = { 0x31000, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT0_BCR] = { 0x31030, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT1_BCR] = { 0x31038, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT2_BCR] = { 0x31040, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT3_BCR] = { 0x31048, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT4_BCR] = { 0x31050, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT5_BCR] = { 0x31058, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT6_BCR] = { 0x31060, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT7_BCR] = { 0x31068, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT8_BCR] = { 0x31070, 0 }, ++ [GCC_PCNOC_BUS_TIMEOUT9_BCR] = { 0x31078, 0 }, ++ [GCC_PCNOC_TBU_BCR] = { 0x12034, 0 }, ++ [GCC_PRNG_BCR] = { 0x13020, 0 }, ++ [GCC_Q6SS_DBG_ARES] = { 0x2506c, 4 }, ++ [GCC_Q6_AHB_ARES] = { 0x2506c, 3 }, ++ [GCC_Q6_AHB_S_ARES] = { 0x2506c, 2 }, ++ [GCC_Q6_AXIM2_ARES] = { 0x2506c, 1 }, ++ [GCC_Q6_AXIM_ARES] = { 0x2506c, 0 }, ++ [GCC_QDSS_BCR] = { 0x2d000, 0 }, ++ [GCC_QPIC_BCR] = { 0x32000, 0 }, ++ [GCC_QPIC_AHB_ARES] = { 0x3201c, 1 }, ++ [GCC_QPIC_ARES] = { 0x3201c, 0 }, ++ [GCC_QUSB2_0_PHY_BCR] = { 0x2c068, 0 }, ++ [GCC_RBCPR_BCR] = { 0x39000, 0 }, ++ [GCC_RBCPR_MX_BCR] = { 0x39014, 0 }, ++ [GCC_SDCC_BCR] = { 0x33000, 0 }, ++ [GCC_SEC_CTRL_BCR] = { 0x1a000, 0 }, ++ [GCC_SMMU_CFG_BCR] = { 0x1202c, 0 }, ++ [GCC_SNOC_BCR] = { 0x2e000, 0 }, ++ [GCC_SPDM_BCR] = { 0x36000, 0 }, ++ [GCC_TCSR_BCR] = { 0x3d000, 0 }, ++ [GCC_TLMM_BCR] = { 0x3e000, 0 }, ++ [GCC_TME_BCR] = { 0x10000, 0 }, ++ [GCC_UNIPHY0_BCR] = { 0x17044, 0 }, ++ [GCC_UNIPHY0_SYS_RESET] = { 0x17050, 0 }, ++ [GCC_UNIPHY0_AHB_RESET] = { 0x17050, 1 }, ++ [GCC_UNIPHY0_XPCS_RESET] = { 0x17050, 2 }, ++ [GCC_UNIPHY1_SYS_RESET] = { 0x17060, 0 }, ++ [GCC_UNIPHY1_AHB_RESET] = { 0x17060, 1 }, ++ [GCC_UNIPHY1_XPCS_RESET] = { 0x17060, 2 }, ++ [GCC_UNIPHY2_SYS_RESET] = { 0x17070, 0 }, ++ [GCC_UNIPHY2_AHB_RESET] = { 0x17070, 1 }, ++ [GCC_UNIPHY2_XPCS_RESET] = { 0x17070, 2 }, ++ [GCC_UNIPHY1_BCR] = { 0x17054, 0 }, ++ [GCC_UNIPHY2_BCR] = { 0x17064, 0 }, ++ [GCC_USB0_PHY_BCR] = { 0x2c06c, 0 }, ++ [GCC_USB3PHY_0_PHY_BCR] = { 0x2c070, 0 }, ++ [GCC_USB_BCR] = { 0x2c000, 0 }, ++ [GCC_USB_MISC_RESET] = { 0x2c064, 0 }, ++ [GCC_WCSSAON_RESET] = { 0x25074, 0 }, ++ [GCC_WCSS_ACMT_ARES] = { 0x25070, 5 }, ++ [GCC_WCSS_AHB_S_ARES] = { 0x25070, 4 }, ++ [GCC_WCSS_AXI_M_ARES] = { 0x25070, 3 }, ++ [GCC_WCSS_BCR] = { 0x18004, 0 }, ++ [GCC_WCSS_DBG_ARES] = { 0x25070, 2 }, ++ [GCC_WCSS_DBG_BDG_ARES] = { 0x25070, 1 }, ++ [GCC_WCSS_ECAHB_ARES] = { 0x25070, 0 }, ++ [GCC_WCSS_Q6_BCR] = { 0x18000, 0 }, ++ [GCC_WCSS_Q6_TBU_BCR] = { 0x12054, 0 }, ++}; ++ ++static const struct of_device_id gcc_ipq9574_match_table[] = { ++ { .compatible = "qcom,ipq9574-gcc" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, gcc_ipq9574_match_table); ++ ++static const struct regmap_config gcc_ipq9574_regmap_config = { ++ .reg_bits = 32, ++ .reg_stride = 4, ++ .val_bits = 32, ++ .max_register = 0x7fffc, ++ .fast_io = true, ++}; ++ ++static const struct qcom_cc_desc gcc_ipq9574_desc = { ++ .config = &gcc_ipq9574_regmap_config, ++ .clks = gcc_ipq9574_clks, ++ .num_clks = ARRAY_SIZE(gcc_ipq9574_clks), ++ .resets = gcc_ipq9574_resets, ++ .num_resets = ARRAY_SIZE(gcc_ipq9574_resets), ++ .clk_hws = gcc_ipq9574_hws, ++ .num_clk_hws = ARRAY_SIZE(gcc_ipq9574_hws), ++}; ++ ++static int gcc_ipq9574_probe(struct platform_device *pdev) ++{ ++ return qcom_cc_probe(pdev, &gcc_ipq9574_desc); ++} ++ ++static struct platform_driver gcc_ipq9574_driver = { ++ .probe = gcc_ipq9574_probe, ++ .driver = { ++ .name = "qcom,gcc-ipq9574", ++ .of_match_table = gcc_ipq9574_match_table, ++ }, ++}; ++ ++static int __init gcc_ipq9574_init(void) ++{ ++ return platform_driver_register(&gcc_ipq9574_driver); ++} ++core_initcall(gcc_ipq9574_init); ++ ++static void __exit gcc_ipq9574_exit(void) ++{ ++ platform_driver_unregister(&gcc_ipq9574_driver); ++} ++module_exit(gcc_ipq9574_exit); ++ ++MODULE_DESCRIPTION("Qualcomm Technologies, Inc. GCC IPQ9574 Driver"); ++MODULE_LICENSE("GPL"); +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch b/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch new file mode 100644 index 00000000000000..abdea2ab2b893a --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch @@ -0,0 +1,482 @@ +From 471b2c31ee9c3a0ab76f9ccb6a514cb9713afd80 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 16 Mar 2023 12:59:35 +0530 +Subject: [PATCH 08/41] dt-bindings: clock: Add ipq9574 clock and reset + definitions + +Add clock and reset ID definitions for ipq9574 + +Reviewed-by: Krzysztof Kozlowski +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230316072940.29137-2-quic_devipriy@quicinc.com +--- + .../bindings/clock/qcom,ipq9574-gcc.yaml | 61 +++++ + include/dt-bindings/clock/qcom,ipq9574-gcc.h | 213 ++++++++++++++++++ + include/dt-bindings/reset/qcom,ipq9574-gcc.h | 164 ++++++++++++++ + 3 files changed, 438 insertions(+) + create mode 100644 Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml + create mode 100644 include/dt-bindings/clock/qcom,ipq9574-gcc.h + create mode 100644 include/dt-bindings/reset/qcom,ipq9574-gcc.h + +diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml +new file mode 100644 +index 000000000000..afc68eb9d7cc +--- /dev/null ++++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml +@@ -0,0 +1,61 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/clock/qcom,ipq9574-gcc.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Qualcomm Global Clock & Reset Controller on IPQ9574 ++ ++maintainers: ++ - Anusha Rao ++ ++description: | ++ Qualcomm global clock control module provides the clocks, resets and power ++ domains on IPQ9574 ++ ++ See also:: ++ include/dt-bindings/clock/qcom,ipq9574-gcc.h ++ include/dt-bindings/reset/qcom,ipq9574-gcc.h ++ ++properties: ++ compatible: ++ const: qcom,ipq9574-gcc ++ ++ clocks: ++ items: ++ - description: Board XO source ++ - description: Sleep clock source ++ - description: Bias PLL ubi clock source ++ - description: PCIE30 PHY0 pipe clock source ++ - description: PCIE30 PHY1 pipe clock source ++ - description: PCIE30 PHY2 pipe clock source ++ - description: PCIE30 PHY3 pipe clock source ++ - description: USB3 PHY pipe clock source ++ ++required: ++ - compatible ++ - clocks ++ ++allOf: ++ - $ref: qcom,gcc.yaml# ++ ++unevaluatedProperties: false ++ ++examples: ++ - | ++ clock-controller@1800000 { ++ compatible = "qcom,ipq9574-gcc"; ++ reg = <0x01800000 0x80000>; ++ clocks = <&xo_board_clk>, ++ <&sleep_clk>, ++ <&bias_pll_ubi_nc_clk>, ++ <&pcie30_phy0_pipe_clk>, ++ <&pcie30_phy1_pipe_clk>, ++ <&pcie30_phy2_pipe_clk>, ++ <&pcie30_phy3_pipe_clk>, ++ <&usb3phy_0_cc_pipe_clk>; ++ #clock-cells = <1>; ++ #reset-cells = <1>; ++ #power-domain-cells = <1>; ++ }; ++... +diff --git a/include/dt-bindings/clock/qcom,ipq9574-gcc.h b/include/dt-bindings/clock/qcom,ipq9574-gcc.h +new file mode 100644 +index 000000000000..5a2961bfe893 +--- /dev/null ++++ b/include/dt-bindings/clock/qcom,ipq9574-gcc.h +@@ -0,0 +1,213 @@ ++/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ ++/* ++ * Copyright (c) 2018-2023 The Linux Foundation. All rights reserved. ++ */ ++ ++#ifndef _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H ++#define _DT_BINDINGS_CLOCK_IPQ_GCC_9574_H ++ ++#define GPLL0_MAIN 0 ++#define GPLL0 1 ++#define GPLL2_MAIN 2 ++#define GPLL2 3 ++#define GPLL4_MAIN 4 ++#define GPLL4 5 ++#define GCC_SLEEP_CLK_SRC 6 ++#define APSS_AHB_CLK_SRC 7 ++#define APSS_AXI_CLK_SRC 8 ++#define BLSP1_QUP1_I2C_APPS_CLK_SRC 9 ++#define BLSP1_QUP1_SPI_APPS_CLK_SRC 10 ++#define BLSP1_QUP2_I2C_APPS_CLK_SRC 11 ++#define BLSP1_QUP2_SPI_APPS_CLK_SRC 12 ++#define BLSP1_QUP3_I2C_APPS_CLK_SRC 13 ++#define BLSP1_QUP3_SPI_APPS_CLK_SRC 14 ++#define BLSP1_QUP4_I2C_APPS_CLK_SRC 15 ++#define BLSP1_QUP4_SPI_APPS_CLK_SRC 16 ++#define BLSP1_QUP5_I2C_APPS_CLK_SRC 17 ++#define BLSP1_QUP5_SPI_APPS_CLK_SRC 18 ++#define BLSP1_QUP6_I2C_APPS_CLK_SRC 19 ++#define BLSP1_QUP6_SPI_APPS_CLK_SRC 20 ++#define BLSP1_UART1_APPS_CLK_SRC 21 ++#define BLSP1_UART2_APPS_CLK_SRC 22 ++#define BLSP1_UART3_APPS_CLK_SRC 23 ++#define BLSP1_UART4_APPS_CLK_SRC 24 ++#define BLSP1_UART5_APPS_CLK_SRC 25 ++#define BLSP1_UART6_APPS_CLK_SRC 26 ++#define GCC_APSS_AHB_CLK 27 ++#define GCC_APSS_AXI_CLK 28 ++#define GCC_BLSP1_QUP1_I2C_APPS_CLK 29 ++#define GCC_BLSP1_QUP1_SPI_APPS_CLK 30 ++#define GCC_BLSP1_QUP2_I2C_APPS_CLK 31 ++#define GCC_BLSP1_QUP2_SPI_APPS_CLK 32 ++#define GCC_BLSP1_QUP3_I2C_APPS_CLK 33 ++#define GCC_BLSP1_QUP3_SPI_APPS_CLK 34 ++#define GCC_BLSP1_QUP4_I2C_APPS_CLK 35 ++#define GCC_BLSP1_QUP4_SPI_APPS_CLK 36 ++#define GCC_BLSP1_QUP5_I2C_APPS_CLK 37 ++#define GCC_BLSP1_QUP5_SPI_APPS_CLK 38 ++#define GCC_BLSP1_QUP6_I2C_APPS_CLK 39 ++#define GCC_BLSP1_QUP6_SPI_APPS_CLK 40 ++#define GCC_BLSP1_UART1_APPS_CLK 41 ++#define GCC_BLSP1_UART2_APPS_CLK 42 ++#define GCC_BLSP1_UART3_APPS_CLK 43 ++#define GCC_BLSP1_UART4_APPS_CLK 44 ++#define GCC_BLSP1_UART5_APPS_CLK 45 ++#define GCC_BLSP1_UART6_APPS_CLK 46 ++#define PCIE0_AXI_M_CLK_SRC 47 ++#define GCC_PCIE0_AXI_M_CLK 48 ++#define PCIE1_AXI_M_CLK_SRC 49 ++#define GCC_PCIE1_AXI_M_CLK 50 ++#define PCIE2_AXI_M_CLK_SRC 51 ++#define GCC_PCIE2_AXI_M_CLK 52 ++#define PCIE3_AXI_M_CLK_SRC 53 ++#define GCC_PCIE3_AXI_M_CLK 54 ++#define PCIE0_AXI_S_CLK_SRC 55 ++#define GCC_PCIE0_AXI_S_BRIDGE_CLK 56 ++#define GCC_PCIE0_AXI_S_CLK 57 ++#define PCIE1_AXI_S_CLK_SRC 58 ++#define GCC_PCIE1_AXI_S_BRIDGE_CLK 59 ++#define GCC_PCIE1_AXI_S_CLK 60 ++#define PCIE2_AXI_S_CLK_SRC 61 ++#define GCC_PCIE2_AXI_S_BRIDGE_CLK 62 ++#define GCC_PCIE2_AXI_S_CLK 63 ++#define PCIE3_AXI_S_CLK_SRC 64 ++#define GCC_PCIE3_AXI_S_BRIDGE_CLK 65 ++#define GCC_PCIE3_AXI_S_CLK 66 ++#define PCIE0_PIPE_CLK_SRC 67 ++#define PCIE1_PIPE_CLK_SRC 68 ++#define PCIE2_PIPE_CLK_SRC 69 ++#define PCIE3_PIPE_CLK_SRC 70 ++#define PCIE_AUX_CLK_SRC 71 ++#define GCC_PCIE0_AUX_CLK 72 ++#define GCC_PCIE1_AUX_CLK 73 ++#define GCC_PCIE2_AUX_CLK 74 ++#define GCC_PCIE3_AUX_CLK 75 ++#define PCIE0_RCHNG_CLK_SRC 76 ++#define GCC_PCIE0_RCHNG_CLK 77 ++#define PCIE1_RCHNG_CLK_SRC 78 ++#define GCC_PCIE1_RCHNG_CLK 79 ++#define PCIE2_RCHNG_CLK_SRC 80 ++#define GCC_PCIE2_RCHNG_CLK 81 ++#define PCIE3_RCHNG_CLK_SRC 82 ++#define GCC_PCIE3_RCHNG_CLK 83 ++#define GCC_PCIE0_AHB_CLK 84 ++#define GCC_PCIE1_AHB_CLK 85 ++#define GCC_PCIE2_AHB_CLK 86 ++#define GCC_PCIE3_AHB_CLK 87 ++#define USB0_AUX_CLK_SRC 88 ++#define GCC_USB0_AUX_CLK 89 ++#define USB0_MASTER_CLK_SRC 90 ++#define GCC_USB0_MASTER_CLK 91 ++#define GCC_SNOC_USB_CLK 92 ++#define GCC_ANOC_USB_AXI_CLK 93 ++#define USB0_MOCK_UTMI_CLK_SRC 94 ++#define USB0_MOCK_UTMI_DIV_CLK_SRC 95 ++#define GCC_USB0_MOCK_UTMI_CLK 96 ++#define USB0_PIPE_CLK_SRC 97 ++#define GCC_USB0_PHY_CFG_AHB_CLK 98 ++#define SDCC1_APPS_CLK_SRC 99 ++#define GCC_SDCC1_APPS_CLK 100 ++#define SDCC1_ICE_CORE_CLK_SRC 101 ++#define GCC_SDCC1_ICE_CORE_CLK 102 ++#define GCC_SDCC1_AHB_CLK 103 ++#define PCNOC_BFDCD_CLK_SRC 104 ++#define GCC_NSSCFG_CLK 105 ++#define GCC_NSSNOC_NSSCC_CLK 106 ++#define GCC_NSSCC_CLK 107 ++#define GCC_NSSNOC_PCNOC_1_CLK 108 ++#define GCC_QDSS_DAP_AHB_CLK 109 ++#define GCC_QDSS_CFG_AHB_CLK 110 ++#define GCC_QPIC_AHB_CLK 111 ++#define GCC_QPIC_CLK 112 ++#define GCC_BLSP1_AHB_CLK 113 ++#define GCC_MDIO_AHB_CLK 114 ++#define GCC_PRNG_AHB_CLK 115 ++#define GCC_UNIPHY0_AHB_CLK 116 ++#define GCC_UNIPHY1_AHB_CLK 117 ++#define GCC_UNIPHY2_AHB_CLK 118 ++#define GCC_CMN_12GPLL_AHB_CLK 119 ++#define GCC_CMN_12GPLL_APU_CLK 120 ++#define SYSTEM_NOC_BFDCD_CLK_SRC 121 ++#define GCC_NSSNOC_SNOC_CLK 122 ++#define GCC_NSSNOC_SNOC_1_CLK 123 ++#define GCC_QDSS_ETR_USB_CLK 124 ++#define WCSS_AHB_CLK_SRC 125 ++#define GCC_Q6_AHB_CLK 126 ++#define GCC_Q6_AHB_S_CLK 127 ++#define GCC_WCSS_ECAHB_CLK 128 ++#define GCC_WCSS_ACMT_CLK 129 ++#define GCC_SYS_NOC_WCSS_AHB_CLK 130 ++#define WCSS_AXI_M_CLK_SRC 131 ++#define GCC_ANOC_WCSS_AXI_M_CLK 132 ++#define QDSS_AT_CLK_SRC 133 ++#define GCC_Q6SS_ATBM_CLK 134 ++#define GCC_WCSS_DBG_IFC_ATB_CLK 135 ++#define GCC_NSSNOC_ATB_CLK 136 ++#define GCC_QDSS_AT_CLK 137 ++#define GCC_SYS_NOC_AT_CLK 138 ++#define GCC_PCNOC_AT_CLK 139 ++#define GCC_USB0_EUD_AT_CLK 140 ++#define GCC_QDSS_EUD_AT_CLK 141 ++#define QDSS_STM_CLK_SRC 142 ++#define GCC_QDSS_STM_CLK 143 ++#define GCC_SYS_NOC_QDSS_STM_AXI_CLK 144 ++#define QDSS_TRACECLKIN_CLK_SRC 145 ++#define GCC_QDSS_TRACECLKIN_CLK 146 ++#define QDSS_TSCTR_CLK_SRC 147 ++#define GCC_Q6_TSCTR_1TO2_CLK 148 ++#define GCC_WCSS_DBG_IFC_NTS_CLK 149 ++#define GCC_QDSS_TSCTR_DIV2_CLK 150 ++#define GCC_QDSS_TS_CLK 151 ++#define GCC_QDSS_TSCTR_DIV4_CLK 152 ++#define GCC_NSS_TS_CLK 153 ++#define GCC_QDSS_TSCTR_DIV8_CLK 154 ++#define GCC_QDSS_TSCTR_DIV16_CLK 155 ++#define GCC_Q6SS_PCLKDBG_CLK 156 ++#define GCC_Q6SS_TRIG_CLK 157 ++#define GCC_WCSS_DBG_IFC_APB_CLK 158 ++#define GCC_WCSS_DBG_IFC_DAPBUS_CLK 159 ++#define GCC_QDSS_DAP_CLK 160 ++#define GCC_QDSS_APB2JTAG_CLK 161 ++#define GCC_QDSS_TSCTR_DIV3_CLK 162 ++#define QPIC_IO_MACRO_CLK_SRC 163 ++#define GCC_QPIC_IO_MACRO_CLK 164 ++#define Q6_AXI_CLK_SRC 165 ++#define GCC_Q6_AXIM_CLK 166 ++#define GCC_WCSS_Q6_TBU_CLK 167 ++#define GCC_MEM_NOC_Q6_AXI_CLK 168 ++#define Q6_AXIM2_CLK_SRC 169 ++#define NSSNOC_MEMNOC_BFDCD_CLK_SRC 170 ++#define GCC_NSSNOC_MEMNOC_CLK 171 ++#define GCC_NSSNOC_MEM_NOC_1_CLK 172 ++#define GCC_NSS_TBU_CLK 173 ++#define GCC_MEM_NOC_NSSNOC_CLK 174 ++#define LPASS_AXIM_CLK_SRC 175 ++#define LPASS_SWAY_CLK_SRC 176 ++#define ADSS_PWM_CLK_SRC 177 ++#define GCC_ADSS_PWM_CLK 178 ++#define GP1_CLK_SRC 179 ++#define GP2_CLK_SRC 180 ++#define GP3_CLK_SRC 181 ++#define DDRSS_SMS_SLOW_CLK_SRC 182 ++#define GCC_XO_CLK_SRC 183 ++#define GCC_XO_CLK 184 ++#define GCC_NSSNOC_QOSGEN_REF_CLK 185 ++#define GCC_NSSNOC_TIMEOUT_REF_CLK 186 ++#define GCC_XO_DIV4_CLK 187 ++#define GCC_UNIPHY0_SYS_CLK 188 ++#define GCC_UNIPHY1_SYS_CLK 189 ++#define GCC_UNIPHY2_SYS_CLK 190 ++#define GCC_CMN_12GPLL_SYS_CLK 191 ++#define GCC_NSSNOC_XO_DCD_CLK 192 ++#define GCC_Q6SS_BOOT_CLK 193 ++#define UNIPHY_SYS_CLK_SRC 194 ++#define NSS_TS_CLK_SRC 195 ++#define GCC_ANOC_PCIE0_1LANE_M_CLK 196 ++#define GCC_ANOC_PCIE1_1LANE_M_CLK 197 ++#define GCC_ANOC_PCIE2_2LANE_M_CLK 198 ++#define GCC_ANOC_PCIE3_2LANE_M_CLK 199 ++#define GCC_SNOC_PCIE0_1LANE_S_CLK 200 ++#define GCC_SNOC_PCIE1_1LANE_S_CLK 201 ++#define GCC_SNOC_PCIE2_2LANE_S_CLK 202 ++#define GCC_SNOC_PCIE3_2LANE_S_CLK 203 ++#endif +diff --git a/include/dt-bindings/reset/qcom,ipq9574-gcc.h b/include/dt-bindings/reset/qcom,ipq9574-gcc.h +new file mode 100644 +index 000000000000..d01dc6a24cf1 +--- /dev/null ++++ b/include/dt-bindings/reset/qcom,ipq9574-gcc.h +@@ -0,0 +1,164 @@ ++/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ ++/* ++ * Copyright (c) 2018-2023, The Linux Foundation. All rights reserved. ++ */ ++ ++#ifndef _DT_BINDINGS_RESET_IPQ_GCC_9574_H ++#define _DT_BINDINGS_RESET_IPQ_GCC_9574_H ++ ++#define GCC_ADSS_BCR 0 ++#define GCC_APC0_VOLTAGE_DROOP_DETECTOR_BCR 1 ++#define GCC_BLSP1_BCR 2 ++#define GCC_BLSP1_QUP1_BCR 3 ++#define GCC_BLSP1_QUP2_BCR 4 ++#define GCC_BLSP1_QUP3_BCR 5 ++#define GCC_BLSP1_QUP4_BCR 6 ++#define GCC_BLSP1_QUP5_BCR 7 ++#define GCC_BLSP1_QUP6_BCR 8 ++#define GCC_BLSP1_UART1_BCR 9 ++#define GCC_BLSP1_UART2_BCR 10 ++#define GCC_BLSP1_UART3_BCR 11 ++#define GCC_BLSP1_UART4_BCR 12 ++#define GCC_BLSP1_UART5_BCR 13 ++#define GCC_BLSP1_UART6_BCR 14 ++#define GCC_BOOT_ROM_BCR 15 ++#define GCC_MDIO_BCR 16 ++#define GCC_NSS_BCR 17 ++#define GCC_NSS_TBU_BCR 18 ++#define GCC_PCIE0_BCR 19 ++#define GCC_PCIE0_LINK_DOWN_BCR 20 ++#define GCC_PCIE0_PHY_BCR 21 ++#define GCC_PCIE0PHY_PHY_BCR 22 ++#define GCC_PCIE1_BCR 23 ++#define GCC_PCIE1_LINK_DOWN_BCR 24 ++#define GCC_PCIE1_PHY_BCR 25 ++#define GCC_PCIE1PHY_PHY_BCR 26 ++#define GCC_PCIE2_BCR 27 ++#define GCC_PCIE2_LINK_DOWN_BCR 28 ++#define GCC_PCIE2_PHY_BCR 29 ++#define GCC_PCIE2PHY_PHY_BCR 30 ++#define GCC_PCIE3_BCR 31 ++#define GCC_PCIE3_LINK_DOWN_BCR 32 ++#define GCC_PCIE3_PHY_BCR 33 ++#define GCC_PCIE3PHY_PHY_BCR 34 ++#define GCC_PRNG_BCR 35 ++#define GCC_QUSB2_0_PHY_BCR 36 ++#define GCC_SDCC_BCR 37 ++#define GCC_TLMM_BCR 38 ++#define GCC_UNIPHY0_BCR 39 ++#define GCC_UNIPHY1_BCR 40 ++#define GCC_UNIPHY2_BCR 41 ++#define GCC_USB0_PHY_BCR 42 ++#define GCC_USB3PHY_0_PHY_BCR 43 ++#define GCC_USB_BCR 44 ++#define GCC_ANOC0_TBU_BCR 45 ++#define GCC_ANOC1_TBU_BCR 46 ++#define GCC_ANOC_BCR 47 ++#define GCC_APSS_TCU_BCR 48 ++#define GCC_CMN_BLK_BCR 49 ++#define GCC_CMN_BLK_AHB_ARES 50 ++#define GCC_CMN_BLK_SYS_ARES 51 ++#define GCC_CMN_BLK_APU_ARES 52 ++#define GCC_DCC_BCR 53 ++#define GCC_DDRSS_BCR 54 ++#define GCC_IMEM_BCR 55 ++#define GCC_LPASS_BCR 56 ++#define GCC_MPM_BCR 57 ++#define GCC_MSG_RAM_BCR 58 ++#define GCC_NSSNOC_MEMNOC_1_ARES 59 ++#define GCC_NSSNOC_PCNOC_1_ARES 60 ++#define GCC_NSSNOC_SNOC_1_ARES 61 ++#define GCC_NSSNOC_XO_DCD_ARES 62 ++#define GCC_NSSNOC_TS_ARES 63 ++#define GCC_NSSCC_ARES 64 ++#define GCC_NSSNOC_NSSCC_ARES 65 ++#define GCC_NSSNOC_ATB_ARES 66 ++#define GCC_NSSNOC_MEMNOC_ARES 67 ++#define GCC_NSSNOC_QOSGEN_REF_ARES 68 ++#define GCC_NSSNOC_SNOC_ARES 69 ++#define GCC_NSSNOC_TIMEOUT_REF_ARES 70 ++#define GCC_NSS_CFG_ARES 71 ++#define GCC_UBI0_DBG_ARES 72 ++#define GCC_PCIE0_AHB_ARES 73 ++#define GCC_PCIE0_AUX_ARES 74 ++#define GCC_PCIE0_AXI_M_ARES 75 ++#define GCC_PCIE0_AXI_M_STICKY_ARES 76 ++#define GCC_PCIE0_AXI_S_ARES 77 ++#define GCC_PCIE0_AXI_S_STICKY_ARES 78 ++#define GCC_PCIE0_CORE_STICKY_ARES 79 ++#define GCC_PCIE0_PIPE_ARES 80 ++#define GCC_PCIE1_AHB_ARES 81 ++#define GCC_PCIE1_AUX_ARES 82 ++#define GCC_PCIE1_AXI_M_ARES 83 ++#define GCC_PCIE1_AXI_M_STICKY_ARES 84 ++#define GCC_PCIE1_AXI_S_ARES 85 ++#define GCC_PCIE1_AXI_S_STICKY_ARES 86 ++#define GCC_PCIE1_CORE_STICKY_ARES 87 ++#define GCC_PCIE1_PIPE_ARES 88 ++#define GCC_PCIE2_AHB_ARES 89 ++#define GCC_PCIE2_AUX_ARES 90 ++#define GCC_PCIE2_AXI_M_ARES 91 ++#define GCC_PCIE2_AXI_M_STICKY_ARES 92 ++#define GCC_PCIE2_AXI_S_ARES 93 ++#define GCC_PCIE2_AXI_S_STICKY_ARES 94 ++#define GCC_PCIE2_CORE_STICKY_ARES 95 ++#define GCC_PCIE2_PIPE_ARES 96 ++#define GCC_PCIE3_AHB_ARES 97 ++#define GCC_PCIE3_AUX_ARES 98 ++#define GCC_PCIE3_AXI_M_ARES 99 ++#define GCC_PCIE3_AXI_M_STICKY_ARES 100 ++#define GCC_PCIE3_AXI_S_ARES 101 ++#define GCC_PCIE3_AXI_S_STICKY_ARES 102 ++#define GCC_PCIE3_CORE_STICKY_ARES 103 ++#define GCC_PCIE3_PIPE_ARES 104 ++#define GCC_PCNOC_BCR 105 ++#define GCC_PCNOC_BUS_TIMEOUT0_BCR 106 ++#define GCC_PCNOC_BUS_TIMEOUT1_BCR 107 ++#define GCC_PCNOC_BUS_TIMEOUT2_BCR 108 ++#define GCC_PCNOC_BUS_TIMEOUT3_BCR 109 ++#define GCC_PCNOC_BUS_TIMEOUT4_BCR 110 ++#define GCC_PCNOC_BUS_TIMEOUT5_BCR 111 ++#define GCC_PCNOC_BUS_TIMEOUT6_BCR 112 ++#define GCC_PCNOC_BUS_TIMEOUT7_BCR 113 ++#define GCC_PCNOC_BUS_TIMEOUT8_BCR 114 ++#define GCC_PCNOC_BUS_TIMEOUT9_BCR 115 ++#define GCC_PCNOC_TBU_BCR 116 ++#define GCC_Q6SS_DBG_ARES 117 ++#define GCC_Q6_AHB_ARES 118 ++#define GCC_Q6_AHB_S_ARES 119 ++#define GCC_Q6_AXIM2_ARES 120 ++#define GCC_Q6_AXIM_ARES 121 ++#define GCC_QDSS_BCR 122 ++#define GCC_QPIC_BCR 123 ++#define GCC_QPIC_AHB_ARES 124 ++#define GCC_QPIC_ARES 125 ++#define GCC_RBCPR_BCR 126 ++#define GCC_RBCPR_MX_BCR 127 ++#define GCC_SEC_CTRL_BCR 128 ++#define GCC_SMMU_CFG_BCR 129 ++#define GCC_SNOC_BCR 130 ++#define GCC_SPDM_BCR 131 ++#define GCC_TME_BCR 132 ++#define GCC_UNIPHY0_SYS_RESET 133 ++#define GCC_UNIPHY0_AHB_RESET 134 ++#define GCC_UNIPHY0_XPCS_RESET 135 ++#define GCC_UNIPHY1_SYS_RESET 136 ++#define GCC_UNIPHY1_AHB_RESET 137 ++#define GCC_UNIPHY1_XPCS_RESET 138 ++#define GCC_UNIPHY2_SYS_RESET 139 ++#define GCC_UNIPHY2_AHB_RESET 140 ++#define GCC_UNIPHY2_XPCS_RESET 141 ++#define GCC_USB_MISC_RESET 142 ++#define GCC_WCSSAON_RESET 143 ++#define GCC_WCSS_ACMT_ARES 144 ++#define GCC_WCSS_AHB_S_ARES 145 ++#define GCC_WCSS_AXI_M_ARES 146 ++#define GCC_WCSS_BCR 147 ++#define GCC_WCSS_DBG_ARES 148 ++#define GCC_WCSS_DBG_BDG_ARES 149 ++#define GCC_WCSS_ECAHB_ARES 150 ++#define GCC_WCSS_Q6_BCR 151 ++#define GCC_WCSS_Q6_TBU_BCR 152 ++#define GCC_TCSR_BCR 153 ++ ++#endif +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch b/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch new file mode 100644 index 00000000000000..087f7766779474 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch @@ -0,0 +1,889 @@ +From 1d437190764f774f61f1ab389b4c074e0f69bbb1 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 16 Mar 2023 12:59:38 +0530 +Subject: [PATCH 09/41] pinctrl: qcom: Add IPQ9574 pinctrl driver + +Add pinctrl definitions for the TLMM of IPQ9574 + +Reviewed-by: Krzysztof Kozlowski +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Signed-off-by: Devi Priya +Link: https://lore.kernel.org/r/20230316072940.29137-5-quic_devipriy@quicinc.com +Signed-off-by: Linus Walleij +--- + drivers/pinctrl/qcom/Kconfig | 11 + + drivers/pinctrl/qcom/Makefile | 1 + + drivers/pinctrl/qcom/pinctrl-ipq9574.c | 826 +++++++++++++++++++++++++ + 3 files changed, 838 insertions(+) + create mode 100644 drivers/pinctrl/qcom/pinctrl-ipq9574.c + +diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig +index 9dc2d803a586..c8b6a4d90f3c 100644 +--- a/drivers/pinctrl/qcom/Kconfig ++++ b/drivers/pinctrl/qcom/Kconfig +@@ -70,6 +70,17 @@ config PINCTRL_IPQ6018 + Qualcomm Technologies Inc. IPQ6018 platform. Select this for + IPQ6018. + ++config PINCTRL_IPQ9574 ++ tristate "Qualcomm Technologies, Inc. IPQ9574 pin controller driver" ++ depends on OF || COMPILE_TEST ++ depends on ARM64 || COMPILE_TEST ++ depends on PINCTRL_MSM ++ help ++ This is the pinctrl, pinmux, pinconf and gpiolib driver for ++ the Qualcomm Technologies Inc. TLMM block found on the ++ Qualcomm Technologies Inc. IPQ9574 platform. Select this for ++ IPQ9574. ++ + config PINCTRL_MSM8226 + tristate "Qualcomm 8226 pin controller driver" + depends on OF +diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile +index 8269a1db8794..79302d518ff3 100644 +--- a/drivers/pinctrl/qcom/Makefile ++++ b/drivers/pinctrl/qcom/Makefile +@@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_IPQ4019) += pinctrl-ipq4019.o + obj-$(CONFIG_PINCTRL_IPQ8064) += pinctrl-ipq8064.o + obj-$(CONFIG_PINCTRL_IPQ8074) += pinctrl-ipq8074.o + obj-$(CONFIG_PINCTRL_IPQ6018) += pinctrl-ipq6018.o ++obj-$(CONFIG_PINCTRL_IPQ9574) += pinctrl-ipq9574.o + obj-$(CONFIG_PINCTRL_MSM8226) += pinctrl-msm8226.o + obj-$(CONFIG_PINCTRL_MSM8660) += pinctrl-msm8660.o + obj-$(CONFIG_PINCTRL_MSM8960) += pinctrl-msm8960.o +diff --git a/drivers/pinctrl/qcom/pinctrl-ipq9574.c b/drivers/pinctrl/qcom/pinctrl-ipq9574.c +new file mode 100644 +index 000000000000..7f057b62475f +--- /dev/null ++++ b/drivers/pinctrl/qcom/pinctrl-ipq9574.c +@@ -0,0 +1,826 @@ ++// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++/* ++ * Copyright (c) 2023 The Linux Foundation. All rights reserved. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include "pinctrl-msm.h" ++ ++#define FUNCTION(fname) \ ++ [msm_mux_##fname] = { \ ++ .name = #fname, \ ++ .groups = fname##_groups, \ ++ .ngroups = ARRAY_SIZE(fname##_groups), \ ++ } ++ ++#define REG_SIZE 0x1000 ++#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7, f8, f9) \ ++ { \ ++ .name = "gpio" #id, \ ++ .pins = gpio##id##_pins, \ ++ .npins = (unsigned int)ARRAY_SIZE(gpio##id##_pins), \ ++ .funcs = (int[]){ \ ++ msm_mux_gpio, /* gpio mode */ \ ++ msm_mux_##f1, \ ++ msm_mux_##f2, \ ++ msm_mux_##f3, \ ++ msm_mux_##f4, \ ++ msm_mux_##f5, \ ++ msm_mux_##f6, \ ++ msm_mux_##f7, \ ++ msm_mux_##f8, \ ++ msm_mux_##f9 \ ++ }, \ ++ .nfuncs = 10, \ ++ .ctl_reg = REG_SIZE * id, \ ++ .io_reg = 0x4 + REG_SIZE * id, \ ++ .intr_cfg_reg = 0x8 + REG_SIZE * id, \ ++ .intr_status_reg = 0xc + REG_SIZE * id, \ ++ .intr_target_reg = 0x8 + REG_SIZE * id, \ ++ .mux_bit = 2, \ ++ .pull_bit = 0, \ ++ .drv_bit = 6, \ ++ .oe_bit = 9, \ ++ .in_bit = 0, \ ++ .out_bit = 1, \ ++ .intr_enable_bit = 0, \ ++ .intr_status_bit = 0, \ ++ .intr_target_bit = 5, \ ++ .intr_target_kpss_val = 3, \ ++ .intr_raw_status_bit = 4, \ ++ .intr_polarity_bit = 1, \ ++ .intr_detection_bit = 2, \ ++ .intr_detection_width = 2, \ ++ } ++ ++static const struct pinctrl_pin_desc ipq9574_pins[] = { ++ PINCTRL_PIN(0, "GPIO_0"), ++ PINCTRL_PIN(1, "GPIO_1"), ++ PINCTRL_PIN(2, "GPIO_2"), ++ PINCTRL_PIN(3, "GPIO_3"), ++ PINCTRL_PIN(4, "GPIO_4"), ++ PINCTRL_PIN(5, "GPIO_5"), ++ PINCTRL_PIN(6, "GPIO_6"), ++ PINCTRL_PIN(7, "GPIO_7"), ++ PINCTRL_PIN(8, "GPIO_8"), ++ PINCTRL_PIN(9, "GPIO_9"), ++ PINCTRL_PIN(10, "GPIO_10"), ++ PINCTRL_PIN(11, "GPIO_11"), ++ PINCTRL_PIN(12, "GPIO_12"), ++ PINCTRL_PIN(13, "GPIO_13"), ++ PINCTRL_PIN(14, "GPIO_14"), ++ PINCTRL_PIN(15, "GPIO_15"), ++ PINCTRL_PIN(16, "GPIO_16"), ++ PINCTRL_PIN(17, "GPIO_17"), ++ PINCTRL_PIN(18, "GPIO_18"), ++ PINCTRL_PIN(19, "GPIO_19"), ++ PINCTRL_PIN(20, "GPIO_20"), ++ PINCTRL_PIN(21, "GPIO_21"), ++ PINCTRL_PIN(22, "GPIO_22"), ++ PINCTRL_PIN(23, "GPIO_23"), ++ PINCTRL_PIN(24, "GPIO_24"), ++ PINCTRL_PIN(25, "GPIO_25"), ++ PINCTRL_PIN(26, "GPIO_26"), ++ PINCTRL_PIN(27, "GPIO_27"), ++ PINCTRL_PIN(28, "GPIO_28"), ++ PINCTRL_PIN(29, "GPIO_29"), ++ PINCTRL_PIN(30, "GPIO_30"), ++ PINCTRL_PIN(31, "GPIO_31"), ++ PINCTRL_PIN(32, "GPIO_32"), ++ PINCTRL_PIN(33, "GPIO_33"), ++ PINCTRL_PIN(34, "GPIO_34"), ++ PINCTRL_PIN(35, "GPIO_35"), ++ PINCTRL_PIN(36, "GPIO_36"), ++ PINCTRL_PIN(37, "GPIO_37"), ++ PINCTRL_PIN(38, "GPIO_38"), ++ PINCTRL_PIN(39, "GPIO_39"), ++ PINCTRL_PIN(40, "GPIO_40"), ++ PINCTRL_PIN(41, "GPIO_41"), ++ PINCTRL_PIN(42, "GPIO_42"), ++ PINCTRL_PIN(43, "GPIO_43"), ++ PINCTRL_PIN(44, "GPIO_44"), ++ PINCTRL_PIN(45, "GPIO_45"), ++ PINCTRL_PIN(46, "GPIO_46"), ++ PINCTRL_PIN(47, "GPIO_47"), ++ PINCTRL_PIN(48, "GPIO_48"), ++ PINCTRL_PIN(49, "GPIO_49"), ++ PINCTRL_PIN(50, "GPIO_50"), ++ PINCTRL_PIN(51, "GPIO_51"), ++ PINCTRL_PIN(52, "GPIO_52"), ++ PINCTRL_PIN(53, "GPIO_53"), ++ PINCTRL_PIN(54, "GPIO_54"), ++ PINCTRL_PIN(55, "GPIO_55"), ++ PINCTRL_PIN(56, "GPIO_56"), ++ PINCTRL_PIN(57, "GPIO_57"), ++ PINCTRL_PIN(58, "GPIO_58"), ++ PINCTRL_PIN(59, "GPIO_59"), ++ PINCTRL_PIN(60, "GPIO_60"), ++ PINCTRL_PIN(61, "GPIO_61"), ++ PINCTRL_PIN(62, "GPIO_62"), ++ PINCTRL_PIN(63, "GPIO_63"), ++ PINCTRL_PIN(64, "GPIO_64"), ++}; ++ ++#define DECLARE_MSM_GPIO_PINS(pin) \ ++ static const unsigned int gpio##pin##_pins[] = { pin } ++DECLARE_MSM_GPIO_PINS(0); ++DECLARE_MSM_GPIO_PINS(1); ++DECLARE_MSM_GPIO_PINS(2); ++DECLARE_MSM_GPIO_PINS(3); ++DECLARE_MSM_GPIO_PINS(4); ++DECLARE_MSM_GPIO_PINS(5); ++DECLARE_MSM_GPIO_PINS(6); ++DECLARE_MSM_GPIO_PINS(7); ++DECLARE_MSM_GPIO_PINS(8); ++DECLARE_MSM_GPIO_PINS(9); ++DECLARE_MSM_GPIO_PINS(10); ++DECLARE_MSM_GPIO_PINS(11); ++DECLARE_MSM_GPIO_PINS(12); ++DECLARE_MSM_GPIO_PINS(13); ++DECLARE_MSM_GPIO_PINS(14); ++DECLARE_MSM_GPIO_PINS(15); ++DECLARE_MSM_GPIO_PINS(16); ++DECLARE_MSM_GPIO_PINS(17); ++DECLARE_MSM_GPIO_PINS(18); ++DECLARE_MSM_GPIO_PINS(19); ++DECLARE_MSM_GPIO_PINS(20); ++DECLARE_MSM_GPIO_PINS(21); ++DECLARE_MSM_GPIO_PINS(22); ++DECLARE_MSM_GPIO_PINS(23); ++DECLARE_MSM_GPIO_PINS(24); ++DECLARE_MSM_GPIO_PINS(25); ++DECLARE_MSM_GPIO_PINS(26); ++DECLARE_MSM_GPIO_PINS(27); ++DECLARE_MSM_GPIO_PINS(28); ++DECLARE_MSM_GPIO_PINS(29); ++DECLARE_MSM_GPIO_PINS(30); ++DECLARE_MSM_GPIO_PINS(31); ++DECLARE_MSM_GPIO_PINS(32); ++DECLARE_MSM_GPIO_PINS(33); ++DECLARE_MSM_GPIO_PINS(34); ++DECLARE_MSM_GPIO_PINS(35); ++DECLARE_MSM_GPIO_PINS(36); ++DECLARE_MSM_GPIO_PINS(37); ++DECLARE_MSM_GPIO_PINS(38); ++DECLARE_MSM_GPIO_PINS(39); ++DECLARE_MSM_GPIO_PINS(40); ++DECLARE_MSM_GPIO_PINS(41); ++DECLARE_MSM_GPIO_PINS(42); ++DECLARE_MSM_GPIO_PINS(43); ++DECLARE_MSM_GPIO_PINS(44); ++DECLARE_MSM_GPIO_PINS(45); ++DECLARE_MSM_GPIO_PINS(46); ++DECLARE_MSM_GPIO_PINS(47); ++DECLARE_MSM_GPIO_PINS(48); ++DECLARE_MSM_GPIO_PINS(49); ++DECLARE_MSM_GPIO_PINS(50); ++DECLARE_MSM_GPIO_PINS(51); ++DECLARE_MSM_GPIO_PINS(52); ++DECLARE_MSM_GPIO_PINS(53); ++DECLARE_MSM_GPIO_PINS(54); ++DECLARE_MSM_GPIO_PINS(55); ++DECLARE_MSM_GPIO_PINS(56); ++DECLARE_MSM_GPIO_PINS(57); ++DECLARE_MSM_GPIO_PINS(58); ++DECLARE_MSM_GPIO_PINS(59); ++DECLARE_MSM_GPIO_PINS(60); ++DECLARE_MSM_GPIO_PINS(61); ++DECLARE_MSM_GPIO_PINS(62); ++DECLARE_MSM_GPIO_PINS(63); ++DECLARE_MSM_GPIO_PINS(64); ++ ++enum ipq9574_functions { ++ msm_mux_atest_char, ++ msm_mux_atest_char0, ++ msm_mux_atest_char1, ++ msm_mux_atest_char2, ++ msm_mux_atest_char3, ++ msm_mux_audio_pdm0, ++ msm_mux_audio_pdm1, ++ msm_mux_audio_pri, ++ msm_mux_audio_sec, ++ msm_mux_blsp0_spi, ++ msm_mux_blsp0_uart, ++ msm_mux_blsp1_i2c, ++ msm_mux_blsp1_spi, ++ msm_mux_blsp1_uart, ++ msm_mux_blsp2_i2c, ++ msm_mux_blsp2_spi, ++ msm_mux_blsp2_uart, ++ msm_mux_blsp3_i2c, ++ msm_mux_blsp3_spi, ++ msm_mux_blsp3_uart, ++ msm_mux_blsp4_i2c, ++ msm_mux_blsp4_spi, ++ msm_mux_blsp4_uart, ++ msm_mux_blsp5_i2c, ++ msm_mux_blsp5_uart, ++ msm_mux_cri_trng0, ++ msm_mux_cri_trng1, ++ msm_mux_cri_trng2, ++ msm_mux_cri_trng3, ++ msm_mux_cxc0, ++ msm_mux_cxc1, ++ msm_mux_dbg_out, ++ msm_mux_dwc_ddrphy, ++ msm_mux_gcc_plltest, ++ msm_mux_gcc_tlmm, ++ msm_mux_gpio, ++ msm_mux_mac, ++ msm_mux_mdc, ++ msm_mux_mdio, ++ msm_mux_pcie0_clk, ++ msm_mux_pcie0_wake, ++ msm_mux_pcie1_clk, ++ msm_mux_pcie1_wake, ++ msm_mux_pcie2_clk, ++ msm_mux_pcie2_wake, ++ msm_mux_pcie3_clk, ++ msm_mux_pcie3_wake, ++ msm_mux_prng_rosc0, ++ msm_mux_prng_rosc1, ++ msm_mux_prng_rosc2, ++ msm_mux_prng_rosc3, ++ msm_mux_pta, ++ msm_mux_pwm, ++ msm_mux_qdss_cti_trig_in_a0, ++ msm_mux_qdss_cti_trig_in_a1, ++ msm_mux_qdss_cti_trig_in_b0, ++ msm_mux_qdss_cti_trig_in_b1, ++ msm_mux_qdss_cti_trig_out_a0, ++ msm_mux_qdss_cti_trig_out_a1, ++ msm_mux_qdss_cti_trig_out_b0, ++ msm_mux_qdss_cti_trig_out_b1, ++ msm_mux_qdss_traceclk_a, ++ msm_mux_qdss_traceclk_b, ++ msm_mux_qdss_tracectl_a, ++ msm_mux_qdss_tracectl_b, ++ msm_mux_qdss_tracedata_a, ++ msm_mux_qdss_tracedata_b, ++ msm_mux_qspi_data, ++ msm_mux_qspi_clk, ++ msm_mux_qspi_cs, ++ msm_mux_rx0, ++ msm_mux_rx1, ++ msm_mux_sdc_data, ++ msm_mux_sdc_clk, ++ msm_mux_sdc_cmd, ++ msm_mux_sdc_rclk, ++ msm_mux_tsens_max, ++ msm_mux_wci20, ++ msm_mux_wci21, ++ msm_mux_wsa_swrm, ++ msm_mux__, ++}; ++ ++static const char * const gpio_groups[] = { ++ "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", ++ "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", ++ "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", ++ "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28", ++ "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35", ++ "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42", ++ "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49", ++ "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56", ++ "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63", ++ "gpio64", ++}; ++ ++static const char * const sdc_data_groups[] = { ++ "gpio0", ++ "gpio1", ++ "gpio2", ++ "gpio3", ++ "gpio6", ++ "gpio7", ++ "gpio8", ++ "gpio9", ++}; ++ ++static const char * const qspi_data_groups[] = { ++ "gpio0", ++ "gpio1", ++ "gpio2", ++ "gpio3", ++}; ++ ++static const char * const qdss_traceclk_b_groups[] = { ++ "gpio0", ++}; ++ ++static const char * const qdss_tracectl_b_groups[] = { ++ "gpio1", ++}; ++ ++static const char * const qdss_tracedata_b_groups[] = { ++ "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio8", "gpio9", ++ "gpio10", "gpio11", "gpio12", "gpio13", "gpio14", "gpio15", "gpio16", ++ "gpio17", ++}; ++ ++static const char * const sdc_cmd_groups[] = { ++ "gpio4", ++}; ++ ++static const char * const qspi_cs_groups[] = { ++ "gpio4", ++}; ++ ++static const char * const sdc_clk_groups[] = { ++ "gpio5", ++}; ++ ++static const char * const qspi_clk_groups[] = { ++ "gpio5", ++}; ++ ++static const char * const sdc_rclk_groups[] = { ++ "gpio10", ++}; ++ ++static const char * const blsp0_spi_groups[] = { ++ "gpio11", "gpio12", "gpio13", "gpio14", ++}; ++ ++static const char * const blsp0_uart_groups[] = { ++ "gpio11", "gpio12", "gpio13", "gpio14", ++}; ++ ++static const char * const blsp3_spi_groups[] = { ++ "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", ++}; ++ ++static const char * const blsp3_i2c_groups[] = { ++ "gpio15", "gpio16", ++}; ++ ++static const char * const blsp3_uart_groups[] = { ++ "gpio15", "gpio16", "gpio17", "gpio18", ++}; ++ ++static const char * const dbg_out_groups[] = { ++ "gpio17", ++}; ++ ++static const char * const cri_trng0_groups[] = { ++ "gpio20", "gpio38", ++}; ++ ++static const char * const cri_trng1_groups[] = { ++ "gpio21", "gpio34", ++}; ++ ++static const char * const pcie0_clk_groups[] = { ++ "gpio22", ++}; ++ ++static const char * const pta_groups[] = { ++ "gpio22", "gpio23", "gpio24", "gpio54", "gpio55", "gpio56", "gpio61", ++ "gpio62", "gpio63", ++}; ++ ++static const char * const wci21_groups[] = { ++ "gpio23", "gpio24", ++}; ++ ++static const char * const cxc0_groups[] = { ++ "gpio23", "gpio24", ++}; ++ ++static const char * const pcie0_wake_groups[] = { ++ "gpio24", ++}; ++ ++static const char * const qdss_cti_trig_out_b0_groups[] = { ++ "gpio24", ++}; ++ ++static const char * const pcie1_clk_groups[] = { ++ "gpio25", ++}; ++ ++static const char * const qdss_cti_trig_in_b0_groups[] = { ++ "gpio25", ++}; ++ ++static const char * const atest_char0_groups[] = { ++ "gpio26", ++}; ++ ++static const char * const qdss_cti_trig_out_b1_groups[] = { ++ "gpio26", ++}; ++ ++static const char * const pcie1_wake_groups[] = { ++ "gpio27", ++}; ++ ++static const char * const atest_char1_groups[] = { ++ "gpio27", ++}; ++ ++static const char * const qdss_cti_trig_in_b1_groups[] = { ++ "gpio27", ++}; ++ ++static const char * const pcie2_clk_groups[] = { ++ "gpio28", ++}; ++ ++static const char * const atest_char2_groups[] = { ++ "gpio28", ++}; ++ ++static const char * const atest_char3_groups[] = { ++ "gpio29", ++}; ++ ++static const char * const pcie2_wake_groups[] = { ++ "gpio30", ++}; ++ ++static const char * const pwm_groups[] = { ++ "gpio30", "gpio31", "gpio32", "gpio33", "gpio44", "gpio45", "gpio46", ++ "gpio47", "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", ++ "gpio56", "gpio57", "gpio58", "gpio59", "gpio60", ++}; ++ ++static const char * const atest_char_groups[] = { ++ "gpio30", ++}; ++ ++static const char * const pcie3_clk_groups[] = { ++ "gpio31", ++}; ++ ++static const char * const qdss_cti_trig_in_a1_groups[] = { ++ "gpio31", ++}; ++ ++static const char * const qdss_cti_trig_out_a1_groups[] = { ++ "gpio32", ++}; ++ ++static const char * const pcie3_wake_groups[] = { ++ "gpio33", ++}; ++ ++static const char * const qdss_cti_trig_in_a0_groups[] = { ++ "gpio33", ++}; ++ ++static const char * const blsp2_uart_groups[] = { ++ "gpio34", "gpio35", ++}; ++ ++static const char * const blsp2_i2c_groups[] = { ++ "gpio34", "gpio35", ++}; ++ ++static const char * const blsp2_spi_groups[] = { ++ "gpio34", "gpio35", "gpio36", "gpio37", ++}; ++ ++static const char * const blsp1_uart_groups[] = { ++ "gpio34", "gpio35", "gpio36", "gpio37", ++}; ++ ++static const char * const qdss_cti_trig_out_a0_groups[] = { ++ "gpio34", ++}; ++ ++static const char * const cri_trng2_groups[] = { ++ "gpio35", ++}; ++ ++static const char * const blsp1_i2c_groups[] = { ++ "gpio36", "gpio37", ++}; ++ ++static const char * const cri_trng3_groups[] = { ++ "gpio36", ++}; ++ ++static const char * const dwc_ddrphy_groups[] = { ++ "gpio37", ++}; ++ ++static const char * const mdc_groups[] = { ++ "gpio38", ++}; ++ ++static const char * const mdio_groups[] = { ++ "gpio39", ++}; ++ ++static const char * const audio_pri_groups[] = { ++ "gpio40", "gpio41", "gpio42", "gpio43", "gpio61", "gpio61", ++}; ++ ++static const char * const audio_pdm0_groups[] = { ++ "gpio40", "gpio41", "gpio42", "gpio43", ++}; ++ ++static const char * const qdss_traceclk_a_groups[] = { ++ "gpio43", ++}; ++ ++static const char * const audio_sec_groups[] = { ++ "gpio44", "gpio45", "gpio46", "gpio47", "gpio62", "gpio62", ++}; ++ ++static const char * const wsa_swrm_groups[] = { ++ "gpio44", "gpio45", ++}; ++ ++static const char * const qdss_tracectl_a_groups[] = { ++ "gpio44", ++}; ++ ++static const char * const qdss_tracedata_a_groups[] = { ++ "gpio45", "gpio46", "gpio47", "gpio48", "gpio49", "gpio50", "gpio51", ++ "gpio52", "gpio53", "gpio54", "gpio55", "gpio56", "gpio57", "gpio58", ++ "gpio59", "gpio60", ++}; ++ ++static const char * const rx1_groups[] = { ++ "gpio46", ++}; ++ ++static const char * const mac_groups[] = { ++ "gpio46", "gpio47", "gpio57", "gpio58", ++}; ++ ++static const char * const blsp5_i2c_groups[] = { ++ "gpio48", "gpio49", ++}; ++ ++static const char * const blsp5_uart_groups[] = { ++ "gpio48", "gpio49", ++}; ++ ++static const char * const blsp4_uart_groups[] = { ++ "gpio50", "gpio51", "gpio52", "gpio53", ++}; ++ ++static const char * const blsp4_i2c_groups[] = { ++ "gpio50", "gpio51", ++}; ++ ++static const char * const blsp4_spi_groups[] = { ++ "gpio50", "gpio51", "gpio52", "gpio53", ++}; ++ ++static const char * const wci20_groups[] = { ++ "gpio57", "gpio58", ++}; ++ ++static const char * const cxc1_groups[] = { ++ "gpio57", "gpio58", ++}; ++ ++static const char * const rx0_groups[] = { ++ "gpio59", ++}; ++ ++static const char * const prng_rosc0_groups[] = { ++ "gpio60", ++}; ++ ++static const char * const gcc_plltest_groups[] = { ++ "gpio60", "gpio62", ++}; ++ ++static const char * const blsp1_spi_groups[] = { ++ "gpio61", "gpio62", "gpio63", "gpio64", ++}; ++ ++static const char * const audio_pdm1_groups[] = { ++ "gpio61", "gpio62", "gpio63", "gpio64", ++}; ++ ++static const char * const prng_rosc1_groups[] = { ++ "gpio61", ++}; ++ ++static const char * const gcc_tlmm_groups[] = { ++ "gpio61", ++}; ++ ++static const char * const prng_rosc2_groups[] = { ++ "gpio62", ++}; ++ ++static const char * const prng_rosc3_groups[] = { ++ "gpio63", ++}; ++ ++static const char * const tsens_max_groups[] = { ++ "gpio64", ++}; ++ ++static const struct msm_function ipq9574_functions[] = { ++ FUNCTION(atest_char), ++ FUNCTION(atest_char0), ++ FUNCTION(atest_char1), ++ FUNCTION(atest_char2), ++ FUNCTION(atest_char3), ++ FUNCTION(audio_pdm0), ++ FUNCTION(audio_pdm1), ++ FUNCTION(audio_pri), ++ FUNCTION(audio_sec), ++ FUNCTION(blsp0_spi), ++ FUNCTION(blsp0_uart), ++ FUNCTION(blsp1_i2c), ++ FUNCTION(blsp1_spi), ++ FUNCTION(blsp1_uart), ++ FUNCTION(blsp2_i2c), ++ FUNCTION(blsp2_spi), ++ FUNCTION(blsp2_uart), ++ FUNCTION(blsp3_i2c), ++ FUNCTION(blsp3_spi), ++ FUNCTION(blsp3_uart), ++ FUNCTION(blsp4_i2c), ++ FUNCTION(blsp4_spi), ++ FUNCTION(blsp4_uart), ++ FUNCTION(blsp5_i2c), ++ FUNCTION(blsp5_uart), ++ FUNCTION(cri_trng0), ++ FUNCTION(cri_trng1), ++ FUNCTION(cri_trng2), ++ FUNCTION(cri_trng3), ++ FUNCTION(cxc0), ++ FUNCTION(cxc1), ++ FUNCTION(dbg_out), ++ FUNCTION(dwc_ddrphy), ++ FUNCTION(gcc_plltest), ++ FUNCTION(gcc_tlmm), ++ FUNCTION(gpio), ++ FUNCTION(mac), ++ FUNCTION(mdc), ++ FUNCTION(mdio), ++ FUNCTION(pcie0_clk), ++ FUNCTION(pcie0_wake), ++ FUNCTION(pcie1_clk), ++ FUNCTION(pcie1_wake), ++ FUNCTION(pcie2_clk), ++ FUNCTION(pcie2_wake), ++ FUNCTION(pcie3_clk), ++ FUNCTION(pcie3_wake), ++ FUNCTION(prng_rosc0), ++ FUNCTION(prng_rosc1), ++ FUNCTION(prng_rosc2), ++ FUNCTION(prng_rosc3), ++ FUNCTION(pta), ++ FUNCTION(pwm), ++ FUNCTION(qdss_cti_trig_in_a0), ++ FUNCTION(qdss_cti_trig_in_a1), ++ FUNCTION(qdss_cti_trig_in_b0), ++ FUNCTION(qdss_cti_trig_in_b1), ++ FUNCTION(qdss_cti_trig_out_a0), ++ FUNCTION(qdss_cti_trig_out_a1), ++ FUNCTION(qdss_cti_trig_out_b0), ++ FUNCTION(qdss_cti_trig_out_b1), ++ FUNCTION(qdss_traceclk_a), ++ FUNCTION(qdss_traceclk_b), ++ FUNCTION(qdss_tracectl_a), ++ FUNCTION(qdss_tracectl_b), ++ FUNCTION(qdss_tracedata_a), ++ FUNCTION(qdss_tracedata_b), ++ FUNCTION(qspi_data), ++ FUNCTION(qspi_clk), ++ FUNCTION(qspi_cs), ++ FUNCTION(rx0), ++ FUNCTION(rx1), ++ FUNCTION(sdc_data), ++ FUNCTION(sdc_clk), ++ FUNCTION(sdc_cmd), ++ FUNCTION(sdc_rclk), ++ FUNCTION(tsens_max), ++ FUNCTION(wci20), ++ FUNCTION(wci21), ++ FUNCTION(wsa_swrm), ++}; ++ ++static const struct msm_pingroup ipq9574_groups[] = { ++ PINGROUP(0, sdc_data, qspi_data, qdss_traceclk_b, _, _, _, _, _, _), ++ PINGROUP(1, sdc_data, qspi_data, qdss_tracectl_b, _, _, _, _, _, _), ++ PINGROUP(2, sdc_data, qspi_data, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(3, sdc_data, qspi_data, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(4, sdc_cmd, qspi_cs, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(5, sdc_clk, qspi_clk, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(6, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _), ++ PINGROUP(7, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _), ++ PINGROUP(8, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _), ++ PINGROUP(9, sdc_data, qdss_tracedata_b, _, _, _, _, _, _, _), ++ PINGROUP(10, sdc_rclk, qdss_tracedata_b, _, _, _, _, _, _, _), ++ PINGROUP(11, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(12, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(13, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(14, blsp0_spi, blsp0_uart, qdss_tracedata_b, _, _, _, _, _, _), ++ PINGROUP(15, blsp3_spi, blsp3_i2c, blsp3_uart, qdss_tracedata_b, _, _, _, _, _), ++ PINGROUP(16, blsp3_spi, blsp3_i2c, blsp3_uart, qdss_tracedata_b, _, _, _, _, _), ++ PINGROUP(17, blsp3_spi, blsp3_uart, dbg_out, qdss_tracedata_b, _, _, _, _, _), ++ PINGROUP(18, blsp3_spi, blsp3_uart, _, _, _, _, _, _, _), ++ PINGROUP(19, blsp3_spi, _, _, _, _, _, _, _, _), ++ PINGROUP(20, blsp3_spi, _, cri_trng0, _, _, _, _, _, _), ++ PINGROUP(21, blsp3_spi, _, cri_trng1, _, _, _, _, _, _), ++ PINGROUP(22, pcie0_clk, _, pta, _, _, _, _, _, _), ++ PINGROUP(23, _, pta, wci21, cxc0, _, _, _, _, _), ++ PINGROUP(24, pcie0_wake, _, pta, wci21, cxc0, _, qdss_cti_trig_out_b0, _, _), ++ PINGROUP(25, pcie1_clk, _, _, qdss_cti_trig_in_b0, _, _, _, _, _), ++ PINGROUP(26, _, atest_char0, _, qdss_cti_trig_out_b1, _, _, _, _, _), ++ PINGROUP(27, pcie1_wake, _, atest_char1, qdss_cti_trig_in_b1, _, _, _, _, _), ++ PINGROUP(28, pcie2_clk, atest_char2, _, _, _, _, _, _, _), ++ PINGROUP(29, atest_char3, _, _, _, _, _, _, _, _), ++ PINGROUP(30, pcie2_wake, pwm, atest_char, _, _, _, _, _, _), ++ PINGROUP(31, pcie3_clk, pwm, _, qdss_cti_trig_in_a1, _, _, _, _, _), ++ PINGROUP(32, pwm, _, qdss_cti_trig_out_a1, _, _, _, _, _, _), ++ PINGROUP(33, pcie3_wake, pwm, _, qdss_cti_trig_in_a0, _, _, _, _, _), ++ PINGROUP(34, blsp2_uart, blsp2_i2c, blsp2_spi, blsp1_uart, _, cri_trng1, qdss_cti_trig_out_a0, _, _), ++ PINGROUP(35, blsp2_uart, blsp2_i2c, blsp2_spi, blsp1_uart, _, cri_trng2, _, _, _), ++ PINGROUP(36, blsp1_uart, blsp1_i2c, blsp2_spi, _, cri_trng3, _, _, _, _), ++ PINGROUP(37, blsp1_uart, blsp1_i2c, blsp2_spi, _, dwc_ddrphy, _, _, _, _), ++ PINGROUP(38, mdc, _, cri_trng0, _, _, _, _, _, _), ++ PINGROUP(39, mdio, _, _, _, _, _, _, _, _), ++ PINGROUP(40, audio_pri, audio_pdm0, _, _, _, _, _, _, _), ++ PINGROUP(41, audio_pri, audio_pdm0, _, _, _, _, _, _, _), ++ PINGROUP(42, audio_pri, audio_pdm0, _, _, _, _, _, _, _), ++ PINGROUP(43, audio_pri, audio_pdm0, _, qdss_traceclk_a, _, _, _, _, _), ++ PINGROUP(44, pwm, audio_sec, wsa_swrm, _, qdss_tracectl_a, _, _, _, _), ++ PINGROUP(45, pwm, audio_sec, wsa_swrm, _, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(46, pwm, audio_sec, rx1, mac, _, qdss_tracedata_a, _, _, _), ++ PINGROUP(47, pwm, audio_sec, mac, _, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(48, blsp5_i2c, blsp5_uart, _, qdss_tracedata_a, _, _, _, _, _), ++ PINGROUP(49, blsp5_i2c, blsp5_uart, _, qdss_tracedata_a, _, _, _, _, _), ++ PINGROUP(50, blsp4_uart, blsp4_i2c, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(51, blsp4_uart, blsp4_i2c, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(52, blsp4_uart, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _, _), ++ PINGROUP(53, blsp4_uart, blsp4_spi, pwm, qdss_tracedata_a, _, _, _, _, _), ++ PINGROUP(54, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _), ++ PINGROUP(55, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _), ++ PINGROUP(56, pta, pwm, qdss_tracedata_a, _, _, _, _, _, _), ++ PINGROUP(57, wci20, cxc1, mac, pwm, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(58, wci20, cxc1, mac, pwm, qdss_tracedata_a, _, _, _, _), ++ PINGROUP(59, rx0, pwm, qdss_tracedata_a, _, _, _, _, _, _), ++ PINGROUP(60, pwm, prng_rosc0, qdss_tracedata_a, _, gcc_plltest, _, _, _, _), ++ PINGROUP(61, blsp1_spi, audio_pri, audio_pdm1, audio_pri, pta, prng_rosc1, gcc_tlmm, _, _), ++ PINGROUP(62, blsp1_spi, audio_sec, audio_pdm1, audio_sec, pta, prng_rosc2, gcc_plltest, _, _), ++ PINGROUP(63, blsp1_spi, audio_pdm1, pta, prng_rosc3, _, _, _, _, _), ++ PINGROUP(64, blsp1_spi, audio_pdm1, tsens_max, _, _, _, _, _, _), ++}; ++ ++/* Reserving GPIO59 for controlling the QFPROM LDO regulator */ ++static const int ipq9574_reserved_gpios[] = { ++ 59, -1 ++}; ++ ++static const struct msm_pinctrl_soc_data ipq9574_pinctrl = { ++ .pins = ipq9574_pins, ++ .npins = ARRAY_SIZE(ipq9574_pins), ++ .functions = ipq9574_functions, ++ .nfunctions = ARRAY_SIZE(ipq9574_functions), ++ .groups = ipq9574_groups, ++ .ngroups = ARRAY_SIZE(ipq9574_groups), ++ .reserved_gpios = ipq9574_reserved_gpios, ++ .ngpios = 65, ++}; ++ ++static int ipq9574_pinctrl_probe(struct platform_device *pdev) ++{ ++ return msm_pinctrl_probe(pdev, &ipq9574_pinctrl); ++} ++ ++static const struct of_device_id ipq9574_pinctrl_of_match[] = { ++ { .compatible = "qcom,ipq9574-tlmm", }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, ipq9574_pinctrl_of_match); ++ ++static struct platform_driver ipq9574_pinctrl_driver = { ++ .driver = { ++ .name = "ipq9574-tlmm", ++ .of_match_table = ipq9574_pinctrl_of_match, ++ }, ++ .probe = ipq9574_pinctrl_probe, ++ .remove = msm_pinctrl_remove, ++}; ++ ++static int __init ipq9574_pinctrl_init(void) ++{ ++ return platform_driver_register(&ipq9574_pinctrl_driver); ++} ++arch_initcall(ipq9574_pinctrl_init); ++ ++static void __exit ipq9574_pinctrl_exit(void) ++{ ++ platform_driver_unregister(&ipq9574_pinctrl_driver); ++} ++module_exit(ipq9574_pinctrl_exit); ++ ++MODULE_DESCRIPTION("QTI IPQ9574 TLMM driver"); ++MODULE_LICENSE("GPL"); +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch b/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch new file mode 100644 index 00000000000000..fb65338b03eebf --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch @@ -0,0 +1,48 @@ +From 7fd33c757ae079f5fcba4ab1de145392247462d0 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 6 Apr 2023 11:43:13 +0530 +Subject: [PATCH 10/41] arm64: dts: qcom: ipq9574: Add support for APSS clock + controller + +Add the APCS & A73 PLL nodes to support CPU frequency scaling. + +Signed-off-by: Devi Priya +Reviewed-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230406061314.10916-5-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 18 ++++++++++++++++++ + 1 file changed, 18 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 3bb7435f5e7f..00aeb994ee60 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -201,6 +201,24 @@ v2m2: v2m@2000 { + }; + }; + ++ apcs_glb: mailbox@b111000 { ++ compatible = "qcom,ipq9574-apcs-apps-global", ++ "qcom,ipq6018-apcs-apps-global"; ++ reg = <0x0b111000 0x1000>; ++ #clock-cells = <1>; ++ clocks = <&a73pll>, <&xo_board_clk>; ++ clock-names = "pll", "xo"; ++ #mbox-cells = <1>; ++ }; ++ ++ a73pll: clock@b116000 { ++ compatible = "qcom,ipq9574-a73pll"; ++ reg = <0x0b116000 0x40>; ++ #clock-cells = <0>; ++ clocks = <&xo_board_clk>; ++ clock-names = "xo"; ++ }; ++ + timer@b120000 { + compatible = "arm,armv7-timer-mem"; + reg = <0x0b120000 0x1000>; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch b/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch new file mode 100644 index 00000000000000..3dcab1e25d8b7b --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch @@ -0,0 +1,66 @@ +From f2e33970f45a9ce5c94da83980d1e95e21a565fe Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 6 Apr 2023 11:43:11 +0530 +Subject: [PATCH 11/41] clk: qcom: apss-ipq-pll: Add support for IPQ9574 + +Add the compatible and configuration values for A73 Huayra PLL found +on IPQ9574. + +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: Devi Priya +Acked-by: Stephen Boyd +Reviewed-by: Konrad Dybcio +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230406061314.10916-3-quic_devipriy@quicinc.com +--- + drivers/clk/qcom/apss-ipq-pll.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c +index 4f2a147e9fb2..56f33af11311 100644 +--- a/drivers/clk/qcom/apss-ipq-pll.c ++++ b/drivers/clk/qcom/apss-ipq-pll.c +@@ -68,6 +68,18 @@ static const struct alpha_pll_config ipq8074_pll_config = { + .test_ctl_hi_val = 0x4000, + }; + ++static const struct alpha_pll_config ipq9574_pll_config = { ++ .l = 0x3b, ++ .config_ctl_val = 0x200d4828, ++ .config_ctl_hi_val = 0x6, ++ .early_output_mask = BIT(3), ++ .aux2_output_mask = BIT(2), ++ .aux_output_mask = BIT(1), ++ .main_output_mask = BIT(0), ++ .test_ctl_val = 0x0, ++ .test_ctl_hi_val = 0x4000, ++}; ++ + struct apss_pll_data { + struct clk_alpha_pll *pll; + const struct alpha_pll_config *pll_config; +@@ -83,6 +95,12 @@ static struct apss_pll_data ipq6018_pll_data = { + .pll_config = &ipq6018_pll_config, + }; + ++static struct apss_pll_data ipq9574_pll_data = { ++ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA, ++ .pll = &ipq_pll_huayra, ++ .pll_config = &ipq9574_pll_config, ++}; ++ + static const struct regmap_config ipq_pll_regmap_config = { + .reg_bits = 32, + .reg_stride = 4, +@@ -124,6 +142,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) + static const struct of_device_id apss_ipq_pll_match_table[] = { + { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data }, + { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data }, ++ { .compatible = "qcom,ipq9574-a73pll", .data = &ipq9574_pll_data }, + { } + }; + MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table); +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch b/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch new file mode 100644 index 00000000000000..043a60a05bdc63 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch @@ -0,0 +1,43 @@ +From 10b07ee264b5cc807939be4cbc60a3abad3ddf03 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Fri, 7 Apr 2023 21:27:24 +0530 +Subject: [PATCH 12/41] regulator: qcom_smd: Add MP5496 S1 regulator + +Adding support for MP5496 S1 regulator on IPQ9574 SoC. + +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: Devi Priya +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20230407155727.20615-3-quic_devipriy@quicinc.com +Signed-off-by: Mark Brown +--- + drivers/regulator/qcom_smd-regulator.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c +index f98168d58dce..88ef56a60b2a 100644 +--- a/drivers/regulator/qcom_smd-regulator.c ++++ b/drivers/regulator/qcom_smd-regulator.c +@@ -731,7 +731,7 @@ static const struct regulator_desc pms405_pldo600 = { + .ops = &rpm_smps_ldo_ops, + }; + +-static const struct regulator_desc mp5496_smpa2 = { ++static const struct regulator_desc mp5496_smps = { + .linear_ranges = (struct linear_range[]) { + REGULATOR_LINEAR_RANGE(600000, 0, 127, 12500), + }, +@@ -776,7 +776,8 @@ struct rpm_regulator_data { + }; + + static const struct rpm_regulator_data rpm_mp5496_regulators[] = { +- { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smpa2, "s2" }, ++ { "s1", QCOM_SMD_RPM_SMPA, 1, &mp5496_smps, "s1" }, ++ { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smps, "s2" }, + { "l2", QCOM_SMD_RPM_LDOA, 2, &mp5496_ldoa2, "l2" }, + {} + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch b/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch new file mode 100644 index 00000000000000..64523c9e3d6735 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch @@ -0,0 +1,49 @@ +From 89978464908147356b67ee57dd07482dc7ffe332 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Tue, 25 Apr 2023 14:10:10 +0530 +Subject: [PATCH 13/41] arm64: dts: qcom: ipq9574: rename al02-c7 dts to rdp433 + +Rename the dts after Reference Design Platform(RDP) to adopt +standard naming convention. + +Acked-by: Konrad Dybcio +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230425084010.15581-7-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 2 +- + .../boot/dts/qcom/{ipq9574-al02-c7.dts => ipq9574-rdp433.dts} | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + rename arch/arm64/boot/dts/qcom/{ipq9574-al02-c7.dts => ipq9574-rdp433.dts} (97%) + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index 8e04f0f663da..3754d83ed2cb 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -7,7 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb +-dtb-$(CONFIG_ARCH_QCOM) += ipq9574-al02-c7.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +similarity index 97% +rename from arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts +rename to arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +index 2c8430197ec0..2ce8e09e7565 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +@@ -1,6 +1,6 @@ + // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) + /* +- * IPQ9574 AL02-C7 board device tree source ++ * IPQ9574 RDP433 board device tree source + * + * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch b/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch new file mode 100644 index 00000000000000..2f37a145aeb57a --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch @@ -0,0 +1,44 @@ +From 20576d5e55831df510ed60f53d83c6e0618c2343 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Tue, 25 Apr 2023 14:10:09 +0530 +Subject: [PATCH 14/41] arm64: dts: qcom: ipq9574: Drop bias_pll_ubi_nc_clk + input + +Drop unused bias_pll_ubi_nc_clk input to the clock controller. + +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230425084010.15581-6-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 +------- + 1 file changed, 1 insertion(+), 7 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 00aeb994ee60..0b8cd6ca0abe 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -16,12 +16,6 @@ / { + #size-cells = <2>; + + clocks { +- bias_pll_ubi_nc_clk: bias-pll-ubi-nc-clk { +- compatible = "fixed-clock"; +- clock-frequency = <353000000>; +- #clock-cells = <0>; +- }; +- + sleep_clk: sleep-clk { + compatible = "fixed-clock"; + #clock-cells = <0>; +@@ -131,7 +125,7 @@ gcc: clock-controller@1800000 { + reg = <0x01800000 0x80000>; + clocks = <&xo_board_clk>, + <&sleep_clk>, +- <&bias_pll_ubi_nc_clk>, ++ <0>, + <0>, + <0>, + <0>, +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch b/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch new file mode 100644 index 00000000000000..7f7bd63031a7ab --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch @@ -0,0 +1,42 @@ +From d7a20702b072333cc36cc78eb715295d65159196 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Tue, 25 Apr 2023 14:10:05 +0530 +Subject: [PATCH 15/41] arm64: dts: qcom: ipq9574: Update the size of GICC & + GICV regions + +Update the size of GICC and GICV regions to 8kB as the GICC_DIR & GICV_DIR +registers lie in the second 4kB region. Also, add target CPU encoding. + +Fixes: 97cb36ff52a1 ("arm64: dts: qcom: Add ipq9574 SoC and AL02 board support") +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230425084010.15581-2-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 0b8cd6ca0abe..77fd9b02df69 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -166,14 +166,14 @@ blsp1_uart2: serial@78b1000 { + intc: interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0x0b000000 0x1000>, /* GICD */ +- <0x0b002000 0x1000>, /* GICC */ ++ <0x0b002000 0x2000>, /* GICC */ + <0x0b001000 0x1000>, /* GICH */ +- <0x0b004000 0x1000>; /* GICV */ ++ <0x0b004000 0x2000>; /* GICV */ + #address-cells = <1>; + #size-cells = <1>; + interrupt-controller; + #interrupt-cells = <3>; +- interrupts = ; ++ interrupts = ; + ranges = <0 0x0b00c000 0x3000>; + + v2m0: v2m@0 { +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch b/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch new file mode 100644 index 00000000000000..118aeb807a2427 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch @@ -0,0 +1,166 @@ +From e218ade7d728582bce795f6cce6fff39c4107dd5 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Wed, 10 May 2023 16:13:59 +0530 +Subject: [PATCH 16/41] arm64: dts: qcom: ipq9574: add support for RDP418 + variant + +Add the initial device tree support for the Reference Design Platform (RDP) +418 based on IPQ9574 family of SoCs. This patch adds support for Console +UART, SPI NOR, eMMC and SMPA1 regulator node. + +Co-developed-by: Anusha Rao +Signed-off-by: Anusha Rao +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230510104359.16678-3-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 1 + + arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 124 ++++++++++++++++++++ + 2 files changed, 125 insertions(+) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index 3754d83ed2cb..c3aaa9e91dce 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +new file mode 100644 +index 000000000000..2b093e02637b +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +@@ -0,0 +1,124 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 RDP418 board device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C2"; ++ compatible = "qcom,ipq9574-ap-al02-c2", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_spi0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "micron,n25q128a11", "jedec,spi-nor"; ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ }; ++}; ++ ++&sdhc_1 { ++ pinctrl-0 = <&sdc_default_state>; ++ pinctrl-names = "default"; ++ mmc-ddr-1_8v; ++ mmc-hs200-1_8v; ++ mmc-hs400-1_8v; ++ mmc-hs400-enhanced-strobe; ++ max-frequency = <384000000>; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ sdc_default_state: sdc-default-state { ++ clk-pins { ++ pins = "gpio5"; ++ function = "sdc_clk"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ ++ cmd-pins { ++ pins = "gpio4"; ++ function = "sdc_cmd"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ data-pins { ++ pins = "gpio0", "gpio1", "gpio2", ++ "gpio3", "gpio6", "gpio7", ++ "gpio8", "gpio9"; ++ function = "sdc_data"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ rclk-pins { ++ pins = "gpio10"; ++ function = "sdc_rclk"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++ ++ spi_0_pins: spi-0-state { ++ pins = "gpio11", "gpio12", "gpio13", "gpio14"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch b/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch new file mode 100644 index 00000000000000..d6b1156c67d14a --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch @@ -0,0 +1,48 @@ +From dcd3cd850131c36cc52ccee74e509d6cf194af2b Mon Sep 17 00:00:00 2001 +From: Poovendhan Selvaraj +Date: Thu, 11 May 2023 13:28:14 +0530 +Subject: [PATCH 17/41] arm64: dts: qcom: ipq9574: Add SMEM support + +Add the required nodes to support SMEM + +Signed-off-by: Poovendhan Selvaraj +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230511075814.2370-3-quic_poovendh@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 77fd9b02df69..a8ce148e52e4 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -94,6 +94,13 @@ tz_region: tz@4a600000 { + reg = <0x0 0x4a600000 0x0 0x400000>; + no-map; + }; ++ ++ smem@4aa00000 { ++ compatible = "qcom,smem"; ++ reg = <0x0 0x4aa00000 0x0 0x00100000>; ++ hwlocks = <&tcsr_mutex 0>; ++ no-map; ++ }; + }; + + soc: soc@0 { +@@ -136,6 +143,12 @@ gcc: clock-controller@1800000 { + #power-domain-cells = <1>; + }; + ++ tcsr_mutex: hwlock@1905000 { ++ compatible = "qcom,tcsr-mutex"; ++ reg = <0x01905000 0x20000>; ++ #hwlock-cells = <1>; ++ }; ++ + sdhc_1: mmc@7804000 { + compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5"; + reg = <0x07804000 0x1000>, <0x07805000 0x1000>; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch b/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch new file mode 100644 index 00000000000000..4d2d3fdf50dff3 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch @@ -0,0 +1,121 @@ +From 013dab443b763648d450931df3f73a6c783c8197 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Tue, 16 May 2023 19:20:13 +0530 +Subject: [PATCH 18/41] arm64: dts: qcom: ipq9574: add support for RDP449 + variant + +Add the initial device tree support for the Reference Design Platform (RDP) +449 based on IPQ9574 family of SoCs. This patch adds support for Console +UART, SPI NOR and SMPA1 regulator node. + +Signed-off-by: Devi Priya +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230516135013.3547-3-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 1 + + arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 80 +++++++++++++++++++++ + 2 files changed, 81 insertions(+) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index c3aaa9e91dce..f237a3683ca4 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +new file mode 100644 +index 000000000000..c8fa54e1a62c +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 RDP449 board device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C6"; ++ compatible = "qcom,ipq9574-ap-al02-c6", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_spi0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "micron,n25q128a11", "jedec,spi-nor"; ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ }; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ spi_0_pins: spi-0-state { ++ pins = "gpio11", "gpio12", "gpio13", "gpio14"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch b/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch new file mode 100644 index 00000000000000..938dee32dcebbe --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch @@ -0,0 +1,127 @@ +From 13ad51cfa78defdafd717ed89785c7bab8330a7b Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Wed, 17 May 2023 22:55:27 +0530 +Subject: [PATCH 19/41] arm64: dts: qcom: ipq9574: Add cpufreq support + +Add cpu freq nodes in the device tree to bump cpu frequency above 800MHz. + +Reviewed-by: Konrad Dybcio +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230517172527.1968-4-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 60 ++++++++++++++++++++++++++- + 1 file changed, 59 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index a8ce148e52e4..2d0a10f6c302 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -6,8 +6,9 @@ + * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. + */ + +-#include ++#include + #include ++#include + #include + + / { +@@ -37,6 +38,10 @@ CPU0: cpu@0 { + reg = <0x0>; + enable-method = "psci"; + next-level-cache = <&L2_0>; ++ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>; ++ clock-names = "cpu"; ++ operating-points-v2 = <&cpu_opp_table>; ++ cpu-supply = <&ipq9574_s1>; + }; + + CPU1: cpu@1 { +@@ -45,6 +50,10 @@ CPU1: cpu@1 { + reg = <0x1>; + enable-method = "psci"; + next-level-cache = <&L2_0>; ++ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>; ++ clock-names = "cpu"; ++ operating-points-v2 = <&cpu_opp_table>; ++ cpu-supply = <&ipq9574_s1>; + }; + + CPU2: cpu@2 { +@@ -53,6 +62,10 @@ CPU2: cpu@2 { + reg = <0x2>; + enable-method = "psci"; + next-level-cache = <&L2_0>; ++ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>; ++ clock-names = "cpu"; ++ operating-points-v2 = <&cpu_opp_table>; ++ cpu-supply = <&ipq9574_s1>; + }; + + CPU3: cpu@3 { +@@ -61,6 +74,10 @@ CPU3: cpu@3 { + reg = <0x3>; + enable-method = "psci"; + next-level-cache = <&L2_0>; ++ clocks = <&apcs_glb APCS_ALIAS0_CORE_CLK>; ++ clock-names = "cpu"; ++ operating-points-v2 = <&cpu_opp_table>; ++ cpu-supply = <&ipq9574_s1>; + }; + + L2_0: l2-cache { +@@ -75,6 +92,47 @@ memory@40000000 { + reg = <0x0 0x40000000 0x0 0x0>; + }; + ++ cpu_opp_table: opp-table-cpu { ++ compatible = "operating-points-v2"; ++ opp-shared; ++ ++ opp-936000000 { ++ opp-hz = /bits/ 64 <936000000>; ++ opp-microvolt = <725000>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-1104000000 { ++ opp-hz = /bits/ 64 <1104000000>; ++ opp-microvolt = <787500>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-1416000000 { ++ opp-hz = /bits/ 64 <1416000000>; ++ opp-microvolt = <862500>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-1488000000 { ++ opp-hz = /bits/ 64 <1488000000>; ++ opp-microvolt = <925000>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-1800000000 { ++ opp-hz = /bits/ 64 <1800000000>; ++ opp-microvolt = <987500>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-2208000000 { ++ opp-hz = /bits/ 64 <2208000000>; ++ opp-microvolt = <1062500>; ++ clock-latency-ns = <200000>; ++ }; ++ }; ++ + pmu { + compatible = "arm,cortex-a73-pmu"; + interrupts = ; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch b/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch new file mode 100644 index 00000000000000..f4a471b75a1f98 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch @@ -0,0 +1,50 @@ +From d02b30b6e397d2ab09a703bb873fe722406ab06a Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Wed, 17 May 2023 22:55:26 +0530 +Subject: [PATCH 20/41] arm64: dts: qcom: ipq9574: Add SMPA1 regulator node + +Add support for SMPA1 regulator node in IPQ9574. + +Reviewed-by: Konrad Dybcio +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230517172527.1968-3-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +index 2ce8e09e7565..2b3ed8d351f7 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +@@ -29,6 +29,25 @@ &blsp1_uart2 { + status = "okay"; + }; + ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ }; ++}; ++ + &sdhc_1 { + pinctrl-0 = <&sdc_default_state>; + pinctrl-names = "default"; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch b/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch new file mode 100644 index 00000000000000..c1fc3b23c59c10 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch @@ -0,0 +1,55 @@ +From 3ef03d409e8cb97d6659fa7b130b14f1726ea8bb Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Wed, 17 May 2023 22:55:25 +0530 +Subject: [PATCH 21/41] arm64: dts: qcom: ipq9574: Add RPM related nodes + +Add RPM Glink & RPM message RAM nodes to support frequency scaling +on IPQ9574. + +Reviewed-by: Konrad Dybcio +Co-developed-by: Praveenkumar I +Signed-off-by: Praveenkumar I +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230517172527.1968-2-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 2d0a10f6c302..5d99b9660e33 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -161,12 +161,29 @@ smem@4aa00000 { + }; + }; + ++ rpm-glink { ++ compatible = "qcom,glink-rpm"; ++ interrupts = ; ++ qcom,rpm-msg-ram = <&rpm_msg_ram>; ++ mboxes = <&apcs_glb 0>; ++ ++ rpm_requests: rpm-requests { ++ compatible = "qcom,rpm-ipq9574"; ++ qcom,glink-channels = "rpm_requests"; ++ }; ++ }; ++ + soc: soc@0 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0 0 0xffffffff>; + ++ rpm_msg_ram: sram@60000 { ++ compatible = "qcom,rpm-msg-ram"; ++ reg = <0x00060000 0x6000>; ++ }; ++ + tlmm: pinctrl@1000000 { + compatible = "qcom,ipq9574-tlmm"; + reg = <0x01000000 0x300000>; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch b/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch new file mode 100644 index 00000000000000..7c91c4a5639e76 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch @@ -0,0 +1,252 @@ +From 0a8b1ac041c37115b7d09afeb203ed8900225cd1 Mon Sep 17 00:00:00 2001 +From: Kathiravan T +Date: Wed, 17 May 2023 12:58:06 +0530 +Subject: [PATCH 22/41] arm64: dts: qcom: ipq9574: add few device nodes + +Add QUP(SPI / I2C) peripheral, PRNG, WDOG and the remaining UART nodes. +While at it, enable the SPI NOR in RDP433 board. + +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230517072806.13170-1-quic_kathirav@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 202 ++++++++++++++++++++++++++ + 1 file changed, 202 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 5d99b9660e33..3bef06ea1c19 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -184,6 +184,13 @@ rpm_msg_ram: sram@60000 { + reg = <0x00060000 0x6000>; + }; + ++ rng: rng@e3000 { ++ compatible = "qcom,prng-ee"; ++ reg = <0x000e3000 0x1000>; ++ clocks = <&gcc GCC_PRNG_AHB_CLK>; ++ clock-names = "core"; ++ }; ++ + tlmm: pinctrl@1000000 { + compatible = "qcom,ipq9574-tlmm"; + reg = <0x01000000 0x300000>; +@@ -241,6 +248,36 @@ sdhc_1: mmc@7804000 { + status = "disabled"; + }; + ++ blsp_dma: dma-controller@7884000 { ++ compatible = "qcom,bam-v1.7.0"; ++ reg = <0x07884000 0x2b000>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "bam_clk"; ++ #dma-cells = <1>; ++ qcom,ee = <0>; ++ }; ++ ++ blsp1_uart0: serial@78af000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078af000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART1_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ blsp1_uart1: serial@78b0000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078b0000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ + blsp1_uart2: serial@78b1000 { + compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; + reg = <0x078b1000 0x200>; +@@ -251,6 +288,163 @@ blsp1_uart2: serial@78b1000 { + status = "disabled"; + }; + ++ blsp1_uart3: serial@78b2000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078b2000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART4_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ blsp1_uart4: serial@78b3000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078b3000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART5_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ blsp1_uart5: serial@78b4000 { ++ compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; ++ reg = <0x078b4000 0x200>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_UART6_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ status = "disabled"; ++ }; ++ ++ blsp1_spi0: spi@78b5000 { ++ compatible = "qcom,spi-qup-v2.2.1"; ++ reg = <0x078b5000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP1_SPI_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 12>, <&blsp_dma 13>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_i2c1: i2c@78b6000 { ++ compatible = "qcom,i2c-qup-v2.2.1"; ++ reg = <0x078b6000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 14>, <&blsp_dma 15>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_spi1: spi@78b6000 { ++ compatible = "qcom,spi-qup-v2.2.1"; ++ reg = <0x078b6000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP2_SPI_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 14>, <&blsp_dma 15>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_i2c2: i2c@78b7000 { ++ compatible = "qcom,i2c-qup-v2.2.1"; ++ reg = <0x078b7000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 16>, <&blsp_dma 17>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_spi2: spi@78b7000 { ++ compatible = "qcom,spi-qup-v2.2.1"; ++ reg = <0x078b7000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP3_SPI_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 16>, <&blsp_dma 17>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_i2c3: i2c@78b8000 { ++ compatible = "qcom,i2c-qup-v2.2.1"; ++ reg = <0x078b8000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 18>, <&blsp_dma 19>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_spi3: spi@78b8000 { ++ compatible = "qcom,spi-qup-v2.2.1"; ++ reg = <0x078b8000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ spi-max-frequency = <50000000>; ++ clocks = <&gcc GCC_BLSP1_QUP4_SPI_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 18>, <&blsp_dma 19>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_i2c4: i2c@78b9000 { ++ compatible = "qcom,i2c-qup-v2.2.1"; ++ reg = <0x078b9000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 20>, <&blsp_dma 21>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ ++ blsp1_spi4: spi@78b9000 { ++ compatible = "qcom,spi-qup-v2.2.1"; ++ reg = <0x078b9000 0x600>; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ interrupts = ; ++ clocks = <&gcc GCC_BLSP1_QUP5_SPI_APPS_CLK>, ++ <&gcc GCC_BLSP1_AHB_CLK>; ++ clock-names = "core", "iface"; ++ dmas = <&blsp_dma 20>, <&blsp_dma 21>; ++ dma-names = "tx", "rx"; ++ status = "disabled"; ++ }; ++ + intc: interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + reg = <0x0b000000 0x1000>, /* GICD */ +@@ -301,6 +495,14 @@ a73pll: clock@b116000 { + clock-names = "xo"; + }; + ++ watchdog: watchdog@b017000 { ++ compatible = "qcom,apss-wdt-ipq9574", "qcom,kpss-wdt"; ++ reg = <0x0b017000 0x1000>; ++ interrupts = ; ++ clocks = <&sleep_clk>; ++ timeout-sec = <30>; ++ }; ++ + timer@b120000 { + compatible = "arm,armv7-timer-mem"; + reg = <0x0b120000 0x1000>; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch b/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch new file mode 100644 index 00000000000000..7d5cb0fa5534be --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch @@ -0,0 +1,99 @@ +From d8dc9c70bb55769ebcf17ed9b1ff085c7fb09bff Mon Sep 17 00:00:00 2001 +From: Vignesh Viswanathan +Date: Fri, 26 May 2023 16:36:53 +0530 +Subject: [PATCH 23/41] arm64: dts: qcom: add few more reserved memory region + +In IPQ SoCs, bootloader will collect the system RAM contents upon crash +for the post morterm analysis. If we don't reserve the memory region used +by bootloader, obviously linux will consume it and upon next boot on +crash, bootloader will be loaded in the same region, which will lead to +loose some of the data, sometimes we may miss out critical information. +So lets reserve the region used by the bootloader. + +Similarly SBL copies some data into the reserved region and it will be +used in the crash scenario. So reserve 1MB for SBL as well. + +While at it, drop the size padding in the reserved memory region, +wherever applicable. + +Signed-off-by: Vignesh Viswanathan +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230526110653.27777-4-quic_viswanat@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq6018.dtsi | 16 +++++++++++++--- + arch/arm64/boot/dts/qcom/ipq8074.dtsi | 14 ++++++++++++-- + 2 files changed, 25 insertions(+), 5 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq6018.dtsi b/arch/arm64/boot/dts/qcom/ipq6018.dtsi +index c3492a383155..25cc02d30356 100644 +--- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi +@@ -150,18 +150,28 @@ rpm_msg_ram: memory@60000 { + no-map; + }; + ++ bootloader@4a100000 { ++ reg = <0x0 0x4a100000 0x0 0x400000>; ++ no-map; ++ }; ++ ++ sbl@4a500000 { ++ reg = <0x0 0x4a500000 0x0 0x100000>; ++ no-map; ++ }; ++ + tz: memory@4a600000 { +- reg = <0x0 0x4a600000 0x0 0x00400000>; ++ reg = <0x0 0x4a600000 0x0 0x400000>; + no-map; + }; + + smem_region: memory@4aa00000 { +- reg = <0x0 0x4aa00000 0x0 0x00100000>; ++ reg = <0x0 0x4aa00000 0x0 0x100000>; + no-map; + }; + + q6_region: memory@4ab00000 { +- reg = <0x0 0x4ab00000 0x0 0x05500000>; ++ reg = <0x0 0x4ab00000 0x0 0x5500000>; + no-map; + }; + }; +diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +index 3f7cf3fdd319..18e2cbe5687b 100644 +--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +@@ -85,17 +85,27 @@ reserved-memory { + #size-cells = <2>; + ranges; + ++ bootloader@4a600000 { ++ reg = <0x0 0x4a600000 0x0 0x400000>; ++ no-map; ++ }; ++ ++ sbl@4aa00000 { ++ reg = <0x0 0x4aa00000 0x0 0x100000>; ++ no-map; ++ }; ++ + smem@4ab00000 { + compatible = "qcom,smem"; +- reg = <0x0 0x4ab00000 0x0 0x00100000>; ++ reg = <0x0 0x4ab00000 0x0 0x100000>; + no-map; + + hwlocks = <&tcsr_mutex 0>; + }; + + memory@4ac00000 { ++ reg = <0x0 0x4ac00000 0x0 0x400000>; + no-map; +- reg = <0x0 0x4ac00000 0x0 0x00400000>; + }; + }; + +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch b/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch new file mode 100644 index 00000000000000..4c49a6cb95f3cd --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch @@ -0,0 +1,38 @@ +From 040e839870bb864a62a1e769fdfbbc5de64a724d Mon Sep 17 00:00:00 2001 +From: Kathiravan T +Date: Fri, 26 May 2023 18:23:05 +0530 +Subject: [PATCH 24/41] arm64: dts: qcom: ipq9574: add QFPROM node + +IPQ9574 has efuse region to determine the various HW quirks. Lets +add the initial support and the individual fuses will be added as they +are required. + +Reviewed-by: Konrad Dybcio +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230526125305.19626-5-quic_kathirav@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 3bef06ea1c19..b6e4a8a73354 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -191,6 +191,13 @@ rng: rng@e3000 { + clock-names = "core"; + }; + ++ qfprom: efuse@a4000 { ++ compatible = "qcom,ipq9574-qfprom", "qcom,qfprom"; ++ reg = <0x000a4000 0x5a1>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ }; ++ + tlmm: pinctrl@1000000 { + compatible = "qcom,ipq9574-tlmm"; + reg = <0x01000000 0x300000>; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch b/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch new file mode 100644 index 00000000000000..f50db9dc94a6c2 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch @@ -0,0 +1,120 @@ +From cc88e897a8fe19d2a611a51321577c11a7997e68 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Fri, 26 May 2023 21:01:52 +0530 +Subject: [PATCH 25/41] arm64: dts: qcom: ipq9574: add support for RDP453 + variant + +Add the initial device tree support for the Reference Design Platform (RDP) +453 based on IPQ9574 family of SoCs. This patch adds support for Console +UART, SPI NOR and SMPA1 regulator node. + +Signed-off-by: Devi Priya +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230526153152.777-3-quic_devipriy@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 1 + + arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 80 +++++++++++++++++++++ + 2 files changed, 81 insertions(+) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index f237a3683ca4..082a5c975288 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp453.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +new file mode 100644 +index 000000000000..f01de6628c3b +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 RDP453 board device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C8"; ++ compatible = "qcom,ipq9574-ap-al02-c8", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_spi0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "micron,n25q128a11", "jedec,spi-nor"; ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ }; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ spi_0_pins: spi-0-state { ++ pins = "gpio11", "gpio12", "gpio13", "gpio14"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch b/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch new file mode 100644 index 00000000000000..0403ae55fff98a --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch @@ -0,0 +1,120 @@ +From acd0e1607b9d113fe2240a571358d8bbdb6f2504 Mon Sep 17 00:00:00 2001 +From: Poovendhan Selvaraj +Date: Wed, 31 May 2023 08:56:48 +0530 +Subject: [PATCH 26/41] arm64: dts: qcom: ipq9574: add support for RDP454 + variant + +Add the initial device tree support for the Reference Design Platform (RDP) +454 based on IPQ9574 family of SoCs. This patch adds support for Console +UART, SPI NOR and SMPA1 regulator node. + +Signed-off-by: Poovendhan Selvaraj +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230531032648.23816-3-quic_poovendh@quicinc.com +--- + arch/arm64/boot/dts/qcom/Makefile | 1 + + arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 80 +++++++++++++++++++++ + 2 files changed, 81 insertions(+) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts + +diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile +index 082a5c975288..a3816c25181e 100644 +--- a/arch/arm64/boot/dts/qcom/Makefile ++++ b/arch/arm64/boot/dts/qcom/Makefile +@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb + dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp453.dtb ++dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp454.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb + dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +new file mode 100644 +index 000000000000..6efae3426cb8 +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 RDP454 board device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C9"; ++ compatible = "qcom,ipq9574-ap-al02-c9", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_spi0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "micron,n25q128a11", "jedec,spi-nor"; ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ }; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ spi_0_pins: spi-0-state { ++ pins = "gpio11", "gpio12", "gpio13", "gpio14"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch b/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch new file mode 100644 index 00000000000000..e1b7d0da563598 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch @@ -0,0 +1,60 @@ +From cf53f8937fa9241f6d873a469c04d509e3062539 Mon Sep 17 00:00:00 2001 +From: Anusha Rao +Date: Fri, 2 Jun 2023 14:14:31 +0530 +Subject: [PATCH 27/41] arm64: dts: qcom: ipq9574: add few more reserved memory + region + +In IPQ SoCs, bootloader will collect the system RAM contents upon crash +for post-morterm analysis. If we don't reserve the memory region used +by bootloader, obviously linux will consume it and upon next boot on +crash, bootloader will be loaded in the same region, which will lead to +loss of some data, sometimes we may miss out critical information. +So lets reserve the region used by the bootloader. + +Similarly SBL copies some data into the reserved region and it will be +used in the crash scenario. So reserve 1MB for SBL as well. + +While at it, drop the size padding in the reserved memory region, +wherever applicable + +Signed-off-by: Anusha Rao +Reviewed-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230602084431.19134-1-quic_anusha@quicinc.com +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index b6e4a8a73354..30430133e39a 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -148,6 +148,16 @@ reserved-memory { + #size-cells = <2>; + ranges; + ++ bootloader@4a100000 { ++ reg = <0x0 0x4a100000 0x0 0x400000>; ++ no-map; ++ }; ++ ++ sbl@4a500000 { ++ reg = <0x0 0x4a500000 0x0 0x100000>; ++ no-map; ++ }; ++ + tz_region: tz@4a600000 { + reg = <0x0 0x4a600000 0x0 0x400000>; + no-map; +@@ -155,7 +165,7 @@ tz_region: tz@4a600000 { + + smem@4aa00000 { + compatible = "qcom,smem"; +- reg = <0x0 0x4aa00000 0x0 0x00100000>; ++ reg = <0x0 0x4aa00000 0x0 0x100000>; + hwlocks = <&tcsr_mutex 0>; + no-map; + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch b/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch new file mode 100644 index 00000000000000..2575f6903d6a69 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch @@ -0,0 +1,59 @@ +From 366d78e84d2a737d75d72b2fb201aacac3a86696 Mon Sep 17 00:00:00 2001 +From: Devi Priya +Date: Thu, 15 Jun 2023 14:18:41 +0530 +Subject: [PATCH 28/41] arm64: dts: qcom: ipq9574: Use assigned-clock-rates for + QUP I2C core clks + +Use assigned-clock-rates property for configuring the QUP I2C core clocks +to operate at nominal frequency. + +Signed-off-by: Devi Priya +Link: https://lore.kernel.org/r/20230615084841.12375-1-quic_devipriy@quicinc.com +Signed-off-by: Bjorn Andersson +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 30430133e39a..ced7779f87ac 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -358,6 +358,8 @@ blsp1_i2c1: i2c@78b6000 { + clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>, + <&gcc GCC_BLSP1_AHB_CLK>; + clock-names = "core", "iface"; ++ assigned-clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>; ++ assigned-clock-rates = <50000000>; + dmas = <&blsp_dma 14>, <&blsp_dma 15>; + dma-names = "tx", "rx"; + status = "disabled"; +@@ -386,6 +388,8 @@ blsp1_i2c2: i2c@78b7000 { + clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>, + <&gcc GCC_BLSP1_AHB_CLK>; + clock-names = "core", "iface"; ++ assigned-clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>; ++ assigned-clock-rates = <50000000>; + dmas = <&blsp_dma 16>, <&blsp_dma 17>; + dma-names = "tx", "rx"; + status = "disabled"; +@@ -414,6 +418,8 @@ blsp1_i2c3: i2c@78b8000 { + clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>, + <&gcc GCC_BLSP1_AHB_CLK>; + clock-names = "core", "iface"; ++ assigned-clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>; ++ assigned-clock-rates = <50000000>; + dmas = <&blsp_dma 18>, <&blsp_dma 19>; + dma-names = "tx", "rx"; + status = "disabled"; +@@ -443,6 +449,8 @@ blsp1_i2c4: i2c@78b9000 { + clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>, + <&gcc GCC_BLSP1_AHB_CLK>; + clock-names = "core", "iface"; ++ assigned-clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>; ++ assigned-clock-rates = <50000000>; + dmas = <&blsp_dma 20>, <&blsp_dma 21>; + dma-names = "tx", "rx"; + status = "disabled"; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch b/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch new file mode 100644 index 00000000000000..46eb3c9ce2c1dd --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch @@ -0,0 +1,36 @@ +From 4de55890566a8ca941af940c1ada4826c069969e Mon Sep 17 00:00:00 2001 +From: Vignesh Viswanathan +Date: Mon, 4 Sep 2023 22:55:15 +0530 +Subject: [PATCH 29/41] arm64: dts: qcom: ipq9574: Fix hwlock index for SMEM + +SMEM uses lock index 3 of the TCSR Mutex hwlock for allocations +in SMEM region shared by the Host and FW. + +Fix the SMEM hwlock index to 3 for IPQ9574. + +Cc: stable@vger.kernel.org +Fixes: 46384ac7a618 ("arm64: dts: qcom: ipq9574: Add SMEM support") +Signed-off-by: Vignesh Viswanathan +Acked-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20230904172516.479866-5-quic_viswanat@quicinc.com +Signed-off-by: Bjorn Andersson +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index ced7779f87ac..3b4ebf165380 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -166,7 +166,7 @@ tz_region: tz@4a600000 { + smem@4aa00000 { + compatible = "qcom,smem"; + reg = <0x0 0x4aa00000 0x0 0x100000>; +- hwlocks = <&tcsr_mutex 0>; ++ hwlocks = <&tcsr_mutex 3>; + no-map; + }; + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch b/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch new file mode 100644 index 00000000000000..74e5b6d63675b0 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch @@ -0,0 +1,40 @@ +From ceeec9e4dbd9561b9483b3ad8648e66eba3c8016 Mon Sep 17 00:00:00 2001 +From: Kathiravan Thirumoorthy +Date: Thu, 14 Sep 2023 12:30:00 +0530 +Subject: [PATCH 30/41] arm64: dts: qcom: ipq9574: include the GPLL0 as clock + provider for mailbox + +While the kernel is booting up, APSS clock / CPU clock will be running +at 800MHz with GPLL0 as source. Once the cpufreq driver is available, +APSS PLL will be configured to the rate based on the opp table and the +source also will be changed to APSS_PLL_EARLY. So allow the mailbox to +consume the GPLL0, with this inclusion, CPU Freq correctly reports that +CPU is running at 800MHz rather than 24MHz. + +Signed-off-by: Kathiravan Thirumoorthy +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-10-c8ceb1a37680@quicinc.com +[bjorn: Updated commit message, as requested by Kathiravan] +Signed-off-by: Bjorn Andersson +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 3b4ebf165380..452ac4deed0b 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -507,8 +507,8 @@ apcs_glb: mailbox@b111000 { + "qcom,ipq6018-apcs-apps-global"; + reg = <0x0b111000 0x1000>; + #clock-cells = <1>; +- clocks = <&a73pll>, <&xo_board_clk>; +- clock-names = "pll", "xo"; ++ clocks = <&a73pll>, <&xo_board_clk>, <&gcc GPLL0>; ++ clock-names = "pll", "xo", "gpll0"; + #mbox-cells = <1>; + }; + +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch b/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch new file mode 100644 index 00000000000000..c9a341af11cd5d --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch @@ -0,0 +1,50 @@ +From 618e80e9a977954c06fd6fa5d65b6f712562bdaf Mon Sep 17 00:00:00 2001 +From: Kathiravan Thirumoorthy +Date: Thu, 14 Sep 2023 12:29:57 +0530 +Subject: [PATCH 31/41] clk: qcom: apss-ipq6018: add the GPLL0 clock also as + clock provider + +While the kernel is booting up, APSS PLL will be running at 800MHz with +GPLL0 as source. Once the cpufreq driver is available, APSS PLL will be +configured and select the rate based on the opp table and the source will +be changed to APSS_PLL_EARLY. + +Without this patch, CPU Freq driver reports that CPU is running at 24MHz +instead of the 800MHz. + +Reviewed-by: Konrad Dybcio +Tested-by: Robert Marko +Signed-off-by: Kathiravan Thirumoorthy +Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-7-c8ceb1a37680@quicinc.com +Signed-off-by: Bjorn Andersson +--- + drivers/clk/qcom/apss-ipq6018.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/clk/qcom/apss-ipq6018.c b/drivers/clk/qcom/apss-ipq6018.c +index f2f502e2d5a4..4e13a085a857 100644 +--- a/drivers/clk/qcom/apss-ipq6018.c ++++ b/drivers/clk/qcom/apss-ipq6018.c +@@ -20,16 +20,19 @@ + + enum { + P_XO, ++ P_GPLL0, + P_APSS_PLL_EARLY, + }; + + static const struct clk_parent_data parents_apcs_alias0_clk_src[] = { + { .fw_name = "xo" }, ++ { .fw_name = "gpll0" }, + { .fw_name = "pll" }, + }; + + static const struct parent_map parents_apcs_alias0_clk_src_map[] = { + { P_XO, 0 }, ++ { P_GPLL0, 4 }, + { P_APSS_PLL_EARLY, 5 }, + }; + +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch b/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch new file mode 100644 index 00000000000000..38bd8a5b5150c8 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch @@ -0,0 +1,62 @@ +From f0869d5304a548b18bd0402ed2ebe6e6fa66ec04 Mon Sep 17 00:00:00 2001 +From: Kathiravan Thirumoorthy +Date: Thu, 14 Sep 2023 12:29:54 +0530 +Subject: [PATCH 32/41] clk: qcom: ipq9574: drop the CLK_SET_RATE_PARENT flag + from GPLL clocks + +GPLL clock rates are fixed and shouldn't be scaled based on the request +from dependent clocks. Doing so will result in the unexpected behaviour. +So drop the CLK_SET_RATE_PARENT flag from the GPLL clocks. + +---- +Changes in V2: + - No changes + +Fixes: d75b82cff488 ("clk: qcom: Add Global Clock Controller driver for IPQ9574") +Signed-off-by: Kathiravan Thirumoorthy +Reviewed-by: Konrad Dybcio +Link: https://lore.kernel.org/r/20230913-gpll_cleanup-v2-4-c8ceb1a37680@quicinc.com +Signed-off-by: Bjorn Andersson +--- + drivers/clk/qcom/gcc-ipq9574.c | 4 ---- + 1 file changed, 4 deletions(-) + +diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c +index b2a2d618a5ec..806b8ba9633c 100644 +--- a/drivers/clk/qcom/gcc-ipq9574.c ++++ b/drivers/clk/qcom/gcc-ipq9574.c +@@ -87,7 +87,6 @@ static struct clk_fixed_factor gpll0_out_main_div2 = { + &gpll0_main.clkr.hw + }, + .num_parents = 1, +- .flags = CLK_SET_RATE_PARENT, + .ops = &clk_fixed_factor_ops, + }, + }; +@@ -102,7 +101,6 @@ static struct clk_alpha_pll_postdiv gpll0 = { + &gpll0_main.clkr.hw + }, + .num_parents = 1, +- .flags = CLK_SET_RATE_PARENT, + .ops = &clk_alpha_pll_postdiv_ro_ops, + }, + }; +@@ -132,7 +130,6 @@ static struct clk_alpha_pll_postdiv gpll4 = { + &gpll4_main.clkr.hw + }, + .num_parents = 1, +- .flags = CLK_SET_RATE_PARENT, + .ops = &clk_alpha_pll_postdiv_ro_ops, + }, + }; +@@ -162,7 +159,6 @@ static struct clk_alpha_pll_postdiv gpll2 = { + &gpll2_main.clkr.hw + }, + .num_parents = 1, +- .flags = CLK_SET_RATE_PARENT, + .ops = &clk_alpha_pll_postdiv_ro_ops, + }, + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch b/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch new file mode 100644 index 00000000000000..b103ec67281e76 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch @@ -0,0 +1,53 @@ +From e9449be0c59beb0de16b7719ae5d9555a1a1ada7 Mon Sep 17 00:00:00 2001 +From: Kathiravan Thirumoorthy +Date: Mon, 25 Sep 2023 13:59:22 +0530 +Subject: [PATCH 33/41] firmware: qcom_scm: use 64-bit calling convention only + when client is 64-bit + +Per the "SMC calling convention specification", the 64-bit calling +convention can only be used when the client is 64-bit. Whereas the +32-bit calling convention can be used by either a 32-bit or a 64-bit +client. + +Currently during SCM probe, irrespective of the client, 64-bit calling +convention is made, which is incorrect and may lead to the undefined +behaviour when the client is 32-bit. Let's fix it. + +Cc: stable@vger.kernel.org +Fixes: 9a434cee773a ("firmware: qcom_scm: Dynamically support SMCCC and legacy conventions") +Reviewed-By: Elliot Berman +Signed-off-by: Kathiravan Thirumoorthy +Link: https://lore.kernel.org/r/20230925-scm-v3-1-8790dff6a749@quicinc.com +Signed-off-by: Bjorn Andersson +--- + drivers/firmware/qcom_scm.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c +index 51eb85354c05..58f1a86065dc 100644 +--- a/drivers/firmware/qcom_scm.c ++++ b/drivers/firmware/qcom_scm.c +@@ -164,6 +164,12 @@ static enum qcom_scm_convention __get_convention(void) + if (likely(qcom_scm_convention != SMC_CONVENTION_UNKNOWN)) + return qcom_scm_convention; + ++ /* ++ * Per the "SMC calling convention specification", the 64-bit calling ++ * convention can only be used when the client is 64-bit, otherwise ++ * system will encounter the undefined behaviour. ++ */ ++#if IS_ENABLED(CONFIG_ARM64) + /* + * Device isn't required as there is only one argument - no device + * needed to dma_map_single to secure world +@@ -184,6 +190,7 @@ static enum qcom_scm_convention __get_convention(void) + forced = true; + goto found; + } ++#endif + + probed_convention = SMC_CONVENTION_ARM_32; + ret = __scm_smc_call(NULL, &desc, probed_convention, &res, true); +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch b/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch new file mode 100644 index 00000000000000..f1b55835fce7f5 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch @@ -0,0 +1,519 @@ +From 0f868f286529001ee37334815f4962b8a2f283dd Mon Sep 17 00:00:00 2001 +From: Anusha Rao +Date: Wed, 27 Sep 2023 12:13:18 +0530 +Subject: [PATCH 34/41] arm64: dts: qcom: ipq9574: Add common RDP dtsi file + +Add a dtsi file to include interfaces that are common +across RDPs. + +Signed-off-by: Anusha Rao +Signed-off-by: Kathiravan Thirumoorthy +Link: https://lore.kernel.org/r/20230927-common-rdp-v3-1-3d07b3ff6d42@quicinc.com +Signed-off-by: Bjorn Andersson +--- + .../boot/dts/qcom/ipq9574-rdp-common.dtsi | 102 ++++++++++++++++++ + arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts | 63 +---------- + arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 38 +------ + arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts | 65 +---------- + arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts | 65 +---------- + arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts | 66 +----------- + 6 files changed, 107 insertions(+), 292 deletions(-) + create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +new file mode 100644 +index 000000000000..c935ac53efe6 +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +@@ -0,0 +1,102 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* ++ * IPQ9574 RDP board common device tree source ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023, Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++ ++ regulator_fixed_3p3: s3300 { ++ compatible = "regulator-fixed"; ++ regulator-min-microvolt = <3300000>; ++ regulator-max-microvolt = <3300000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-name = "fixed_3p3"; ++ }; ++ ++ regulator_fixed_0p925: s0925 { ++ compatible = "regulator-fixed"; ++ regulator-min-microvolt = <925000>; ++ regulator-max-microvolt = <925000>; ++ regulator-boot-on; ++ regulator-always-on; ++ regulator-name = "fixed_0p925"; ++ }; ++}; ++ ++&blsp1_spi0 { ++ pinctrl-0 = <&spi_0_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++ ++ flash@0 { ++ compatible = "micron,n25q128a11", "jedec,spi-nor"; ++ reg = <0>; ++ #address-cells = <1>; ++ #size-cells = <1>; ++ spi-max-frequency = <50000000>; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&rpm_requests { ++ regulators { ++ compatible = "qcom,rpm-mp5496-regulators"; ++ ++ ipq9574_s1: s1 { ++ /* ++ * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. ++ * During regulator registration, kernel not knowing the initial voltage, ++ * considers it as zero and brings up the regulators with minimum supported voltage. ++ * Update the regulator-min-microvolt with SVS voltage of 725mV so that ++ * the regulators are brought up with 725mV which is sufficient for all the ++ * corner parts to operate at 800MHz ++ */ ++ regulator-min-microvolt = <725000>; ++ regulator-max-microvolt = <1075000>; ++ }; ++ ++ mp5496_l2: l2 { ++ regulator-min-microvolt = <1800000>; ++ regulator-max-microvolt = <1800000>; ++ regulator-always-on; ++ regulator-boot-on; ++ }; ++ }; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ spi_0_pins: spi-0-state { ++ pins = "gpio11", "gpio12", "gpio13", "gpio14"; ++ function = "blsp0_spi"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +index 2b093e02637b..f4f9199d4ab1 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +@@ -8,58 +8,12 @@ + + /dts-v1/; + +-#include "ipq9574.dtsi" ++#include "ipq9574-rdp-common.dtsi" + + / { + model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C2"; + compatible = "qcom,ipq9574-ap-al02-c2", "qcom,ipq9574"; + +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_spi0 { +- pinctrl-0 = <&spi_0_pins>; +- pinctrl-names = "default"; +- status = "okay"; +- +- flash@0 { +- compatible = "micron,n25q128a11", "jedec,spi-nor"; +- reg = <0>; +- #address-cells = <1>; +- #size-cells = <1>; +- spi-max-frequency = <50000000>; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&rpm_requests { +- regulators { +- compatible = "qcom,rpm-mp5496-regulators"; +- +- ipq9574_s1: s1 { +- /* +- * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. +- * During regulator registration, kernel not knowing the initial voltage, +- * considers it as zero and brings up the regulators with minimum supported voltage. +- * Update the regulator-min-microvolt with SVS voltage of 725mV so that +- * the regulators are brought up with 725mV which is sufficient for all the +- * corner parts to operate at 800MHz +- */ +- regulator-min-microvolt = <725000>; +- regulator-max-microvolt = <1075000>; +- }; +- }; + }; + + &sdhc_1 { +@@ -74,10 +28,6 @@ &sdhc_1 { + status = "okay"; + }; + +-&sleep_clk { +- clock-frequency = <32000>; +-}; +- + &tlmm { + sdc_default_state: sdc-default-state { + clk-pins { +@@ -110,15 +60,4 @@ rclk-pins { + bias-pull-down; + }; + }; +- +- spi_0_pins: spi-0-state { +- pins = "gpio11", "gpio12", "gpio13", "gpio14"; +- function = "blsp0_spi"; +- drive-strength = <8>; +- bias-disable; +- }; +-}; +- +-&xo_board_clk { +- clock-frequency = <24000000>; + }; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +index 2b3ed8d351f7..16217471893d 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +@@ -8,44 +8,12 @@ + + /dts-v1/; + +-#include "ipq9574.dtsi" ++#include "ipq9574-rdp-common.dtsi" + + / { + model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7"; + compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574"; + +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&rpm_requests { +- regulators { +- compatible = "qcom,rpm-mp5496-regulators"; +- +- ipq9574_s1: s1 { +- /* +- * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. +- * During regulator registration, kernel not knowing the initial voltage, +- * considers it as zero and brings up the regulators with minimum supported voltage. +- * Update the regulator-min-microvolt with SVS voltage of 725mV so that +- * the regulators are brought up with 725mV which is sufficient for all the +- * corner parts to operate at 800MHz +- */ +- regulator-min-microvolt = <725000>; +- regulator-max-microvolt = <1075000>; +- }; +- }; + }; + + &sdhc_1 { +@@ -97,7 +65,3 @@ rclk-pins { + }; + }; + }; +- +-&xo_board_clk { +- clock-frequency = <24000000>; +-}; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +index c8fa54e1a62c..d36d1078763e 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +@@ -8,73 +8,10 @@ + + /dts-v1/; + +-#include "ipq9574.dtsi" ++#include "ipq9574-rdp-common.dtsi" + + / { + model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C6"; + compatible = "qcom,ipq9574-ap-al02-c6", "qcom,ipq9574"; + +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_spi0 { +- pinctrl-0 = <&spi_0_pins>; +- pinctrl-names = "default"; +- status = "okay"; +- +- flash@0 { +- compatible = "micron,n25q128a11", "jedec,spi-nor"; +- reg = <0>; +- #address-cells = <1>; +- #size-cells = <1>; +- spi-max-frequency = <50000000>; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&rpm_requests { +- regulators { +- compatible = "qcom,rpm-mp5496-regulators"; +- +- ipq9574_s1: s1 { +- /* +- * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. +- * During regulator registration, kernel not knowing the initial voltage, +- * considers it as zero and brings up the regulators with minimum supported voltage. +- * Update the regulator-min-microvolt with SVS voltage of 725mV so that +- * the regulators are brought up with 725mV which is sufficient for all the +- * corner parts to operate at 800MHz +- */ +- regulator-min-microvolt = <725000>; +- regulator-max-microvolt = <1075000>; +- }; +- }; +-}; +- +-&sleep_clk { +- clock-frequency = <32000>; +-}; +- +-&tlmm { +- spi_0_pins: spi-0-state { +- pins = "gpio11", "gpio12", "gpio13", "gpio14"; +- function = "blsp0_spi"; +- drive-strength = <8>; +- bias-disable; +- }; +-}; +- +-&xo_board_clk { +- clock-frequency = <24000000>; + }; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +index f01de6628c3b..c30c9fbedf26 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +@@ -8,73 +8,10 @@ + + /dts-v1/; + +-#include "ipq9574.dtsi" ++#include "ipq9574-rdp-common.dtsi" + + / { + model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C8"; + compatible = "qcom,ipq9574-ap-al02-c8", "qcom,ipq9574"; + +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_spi0 { +- pinctrl-0 = <&spi_0_pins>; +- pinctrl-names = "default"; +- status = "okay"; +- +- flash@0 { +- compatible = "micron,n25q128a11", "jedec,spi-nor"; +- reg = <0>; +- #address-cells = <1>; +- #size-cells = <1>; +- spi-max-frequency = <50000000>; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&rpm_requests { +- regulators { +- compatible = "qcom,rpm-mp5496-regulators"; +- +- ipq9574_s1: s1 { +- /* +- * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. +- * During regulator registration, kernel not knowing the initial voltage, +- * considers it as zero and brings up the regulators with minimum supported voltage. +- * Update the regulator-min-microvolt with SVS voltage of 725mV so that +- * the regulators are brought up with 725mV which is sufficient for all the +- * corner parts to operate at 800MHz +- */ +- regulator-min-microvolt = <725000>; +- regulator-max-microvolt = <1075000>; +- }; +- }; +-}; +- +-&sleep_clk { +- clock-frequency = <32000>; +-}; +- +-&tlmm { +- spi_0_pins: spi-0-state { +- pins = "gpio11", "gpio12", "gpio13", "gpio14"; +- function = "blsp0_spi"; +- drive-strength = <8>; +- bias-disable; +- }; +-}; +- +-&xo_board_clk { +- clock-frequency = <24000000>; + }; +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +index 6efae3426cb8..0dc382f5d5ec 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +@@ -8,73 +8,9 @@ + + /dts-v1/; + +-#include "ipq9574.dtsi" ++#include "ipq9574-rdp-common.dtsi" + + / { + model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C9"; + compatible = "qcom,ipq9574-ap-al02-c9", "qcom,ipq9574"; +- +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_spi0 { +- pinctrl-0 = <&spi_0_pins>; +- pinctrl-names = "default"; +- status = "okay"; +- +- flash@0 { +- compatible = "micron,n25q128a11", "jedec,spi-nor"; +- reg = <0>; +- #address-cells = <1>; +- #size-cells = <1>; +- spi-max-frequency = <50000000>; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&rpm_requests { +- regulators { +- compatible = "qcom,rpm-mp5496-regulators"; +- +- ipq9574_s1: s1 { +- /* +- * During kernel bootup, the SoC runs at 800MHz with 875mV set by the bootloaders. +- * During regulator registration, kernel not knowing the initial voltage, +- * considers it as zero and brings up the regulators with minimum supported voltage. +- * Update the regulator-min-microvolt with SVS voltage of 725mV so that +- * the regulators are brought up with 725mV which is sufficient for all the +- * corner parts to operate at 800MHz +- */ +- regulator-min-microvolt = <725000>; +- regulator-max-microvolt = <1075000>; +- }; +- }; +-}; +- +-&sleep_clk { +- clock-frequency = <32000>; +-}; +- +-&tlmm { +- spi_0_pins: spi-0-state { +- pins = "gpio11", "gpio12", "gpio13", "gpio14"; +- function = "blsp0_spi"; +- drive-strength = <8>; +- bias-disable; +- }; +-}; +- +-&xo_board_clk { +- clock-frequency = <24000000>; + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch b/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch new file mode 100644 index 00000000000000..c4eb599500e285 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch @@ -0,0 +1,110 @@ +From f1001470268206073905a37fdba06355eb43d32c Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Fri, 20 Oct 2023 11:49:39 +0530 +Subject: [PATCH 35/41] arm64: dts: qcom: ipq9574: populate the opp table based + on the eFuse + +IPQ95xx SoCs have different OPPs available for the CPU based on +SoC variant. This can be determined from an eFuse register +present in the silicon. + +Add support to read the eFuse and populate the OPPs based on it. + +Frequency 1.2GHz 1.8GHz 1.5GHz No opp-supported-hw + Limit +------------------------------------------------------------ +936000000 1 1 1 1 0xf +1104000000 1 1 1 1 0xf +1200000000 1 1 1 1 0xf +1416000000 0 1 1 1 0x7 +1488000000 0 1 1 1 0x7 +1800000000 0 1 0 1 0x5 +2208000000 0 0 0 1 0x1 +----------------------------------------------------------- + +Reviewed-by: Konrad Dybcio +Signed-off-by: Kathiravan T +Signed-off-by: Varadarajan Narayanan +Link: https://lore.kernel.org/r/14ab08b7cfd904433ca6065fac798d4f221c9d95.1697781921.git.quic_varada@quicinc.com +Signed-off-by: Bjorn Andersson +--- + arch/arm64/boot/dts/qcom/ipq9574.dtsi | 21 ++++++++++++++++++++- + 1 file changed, 20 insertions(+), 1 deletion(-) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +index 452ac4deed0b..a4123453f5e8 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi +@@ -93,42 +93,56 @@ memory@40000000 { + }; + + cpu_opp_table: opp-table-cpu { +- compatible = "operating-points-v2"; ++ compatible = "operating-points-v2-kryo-cpu"; + opp-shared; ++ nvmem-cells = <&cpu_speed_bin>; + + opp-936000000 { + opp-hz = /bits/ 64 <936000000>; + opp-microvolt = <725000>; ++ opp-supported-hw = <0xf>; + clock-latency-ns = <200000>; + }; + + opp-1104000000 { + opp-hz = /bits/ 64 <1104000000>; + opp-microvolt = <787500>; ++ opp-supported-hw = <0xf>; ++ clock-latency-ns = <200000>; ++ }; ++ ++ opp-1200000000 { ++ opp-hz = /bits/ 64 <1200000000>; ++ opp-microvolt = <862500>; ++ opp-supported-hw = <0xf>; + clock-latency-ns = <200000>; + }; + + opp-1416000000 { + opp-hz = /bits/ 64 <1416000000>; + opp-microvolt = <862500>; ++ opp-supported-hw = <0x7>; + clock-latency-ns = <200000>; + }; + + opp-1488000000 { + opp-hz = /bits/ 64 <1488000000>; + opp-microvolt = <925000>; ++ opp-supported-hw = <0x7>; + clock-latency-ns = <200000>; + }; + + opp-1800000000 { + opp-hz = /bits/ 64 <1800000000>; + opp-microvolt = <987500>; ++ opp-supported-hw = <0x5>; + clock-latency-ns = <200000>; + }; + + opp-2208000000 { + opp-hz = /bits/ 64 <2208000000>; + opp-microvolt = <1062500>; ++ opp-supported-hw = <0x1>; + clock-latency-ns = <200000>; + }; + }; +@@ -206,6 +220,11 @@ qfprom: efuse@a4000 { + reg = <0x000a4000 0x5a1>; + #address-cells = <1>; + #size-cells = <1>; ++ ++ cpu_speed_bin: cpu-speed-bin@15 { ++ reg = <0x15 0x2>; ++ bits = <7 2>; ++ }; + }; + + tlmm: pinctrl@1000000 { +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch b/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch new file mode 100644 index 00000000000000..d4f85449784a35 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch @@ -0,0 +1,106 @@ +From 539a79c58042c7902bfff6453a589d5dc2e0230c Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Fri, 20 Oct 2023 11:49:32 +0530 +Subject: [PATCH 36/41] clk: qcom: clk-alpha-pll: introduce stromer plus ops + +Stromer plus APSS PLL does not support dynamic frequency scaling. +To switch between frequencies, we have to shut down the PLL, +configure the L and ALPHA values and turn on again. So introduce the +separate set of ops for Stromer Plus PLL. + +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Kathiravan T +Signed-off-by: Varadarajan Narayanan +Link: https://lore.kernel.org/r/2affa6c63ff0c4342230623a7d4eef02ec7c02d4.1697781921.git.quic_varada@quicinc.com +Signed-off-by: Bjorn Andersson +--- + drivers/clk/qcom/clk-alpha-pll.c | 63 ++++++++++++++++++++++++++++++++ + drivers/clk/qcom/clk-alpha-pll.h | 1 + + 2 files changed, 64 insertions(+) + +diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c +index 8e5e7a26bcc4..56f1795847cd 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.c ++++ b/drivers/clk/qcom/clk-alpha-pll.c +@@ -2434,3 +2434,66 @@ const struct clk_ops clk_alpha_pll_stromer_ops = { + .set_rate = clk_alpha_pll_stromer_set_rate, + }; + EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops); ++ ++static int clk_alpha_pll_stromer_plus_set_rate(struct clk_hw *hw, ++ unsigned long rate, ++ unsigned long prate) ++{ ++ struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); ++ u32 l, alpha_width = pll_alpha_width(pll); ++ int ret, pll_mode; ++ u64 a; ++ ++ rate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width); ++ ++ ret = regmap_read(pll->clkr.regmap, PLL_MODE(pll), &pll_mode); ++ if (ret) ++ return ret; ++ ++ regmap_write(pll->clkr.regmap, PLL_MODE(pll), 0); ++ ++ /* Delay of 2 output clock ticks required until output is disabled */ ++ udelay(1); ++ ++ regmap_write(pll->clkr.regmap, PLL_L_VAL(pll), l); ++ ++ if (alpha_width > ALPHA_BITWIDTH) ++ a <<= alpha_width - ALPHA_BITWIDTH; ++ ++ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL(pll), a); ++ regmap_write(pll->clkr.regmap, PLL_ALPHA_VAL_U(pll), ++ a >> ALPHA_BITWIDTH); ++ ++ regmap_write(pll->clkr.regmap, PLL_MODE(pll), PLL_BYPASSNL); ++ ++ /* Wait five micro seconds or more */ ++ udelay(5); ++ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_RESET_N, ++ PLL_RESET_N); ++ ++ /* The lock time should be less than 50 micro seconds worst case */ ++ usleep_range(50, 60); ++ ++ ret = wait_for_pll_enable_lock(pll); ++ if (ret) { ++ pr_err("Wait for PLL enable lock failed [%s] %d\n", ++ clk_hw_get_name(hw), ret); ++ return ret; ++ } ++ ++ if (pll_mode & PLL_OUTCTRL) ++ regmap_update_bits(pll->clkr.regmap, PLL_MODE(pll), PLL_OUTCTRL, ++ PLL_OUTCTRL); ++ ++ return 0; ++} ++ ++const struct clk_ops clk_alpha_pll_stromer_plus_ops = { ++ .prepare = clk_alpha_pll_enable, ++ .unprepare = clk_alpha_pll_disable, ++ .is_enabled = clk_alpha_pll_is_enabled, ++ .recalc_rate = clk_alpha_pll_recalc_rate, ++ .determine_rate = clk_alpha_pll_stromer_determine_rate, ++ .set_rate = clk_alpha_pll_stromer_plus_set_rate, ++}; ++EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_plus_ops); +diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h +index 51d4043c7e4f..eb072ae7861c 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.h ++++ b/drivers/clk/qcom/clk-alpha-pll.h +@@ -145,6 +145,7 @@ extern const struct clk_ops clk_alpha_pll_postdiv_ops; + extern const struct clk_ops clk_alpha_pll_huayra_ops; + extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; + extern const struct clk_ops clk_alpha_pll_stromer_ops; ++extern const struct clk_ops clk_alpha_pll_stromer_plus_ops; + + extern const struct clk_ops clk_alpha_pll_fabia_ops; + extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch b/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch new file mode 100644 index 00000000000000..a178ef4d8a63f5 --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch @@ -0,0 +1,74 @@ +From 80838ab7ebd416cbac38c1cd30a76d61641f7ee1 Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Tue, 31 Oct 2023 12:41:39 +0530 +Subject: [PATCH 37/41] cpufreq: qcom-nvmem: Introduce cpufreq for ipq95xx + +IPQ95xx SoCs have different OPPs available for the CPU based on +the SoC variant. This can be determined from an eFuse register +present in the silicon. + +Added support for ipq95xx on nvmem driver which helps to +determine OPPs at runtime based on the eFuse register which +has the CPU frequency limits. opp-supported-hw dt binding +can be used to indicate the available OPPs for each limit. + +Reviewed-by: Dmitry Baryshkov +Signed-off-by: Praveenkumar I +Signed-off-by: Kathiravan T +Signed-off-by: Varadarajan Narayanan +[ Viresh: Fixed subject ] +Signed-off-by: Viresh Kumar +--- + drivers/cpufreq/cpufreq-dt-platdev.c | 1 + + drivers/cpufreq/qcom-cpufreq-nvmem.c | 5 +++++ + include/dt-bindings/arm/qcom,ids.h | 6 ++++++ + 3 files changed, 12 insertions(+) + +diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c +index 69a8742c0a7a..3df1d5747ab7 100644 +--- a/drivers/cpufreq/cpufreq-dt-platdev.c ++++ b/drivers/cpufreq/cpufreq-dt-platdev.c +@@ -164,6 +164,7 @@ static const struct of_device_id blocklist[] __initconst = { + { .compatible = "ti,omap3", }, + + { .compatible = "qcom,ipq8064", }, ++ { .compatible = "qcom,ipq9574", }, + { .compatible = "qcom,apq8064", }, + { .compatible = "qcom,msm8974", }, + { .compatible = "qcom,msm8960", }, +diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c +index a88b6fe5db50..902a0557d832 100644 +--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c ++++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c +@@ -149,6 +149,11 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev, + switch (msm_id) { + case QCOM_ID_MSM8996: + case QCOM_ID_APQ8096: ++ case QCOM_ID_IPQ9514: ++ case QCOM_ID_IPQ9550: ++ case QCOM_ID_IPQ9554: ++ case QCOM_ID_IPQ9570: ++ case QCOM_ID_IPQ9574: + drv->versions = 1 << (unsigned int)(*speedbin); + break; + case QCOM_ID_MSM8996SG: +diff --git a/include/dt-bindings/arm/qcom,ids.h b/include/dt-bindings/arm/qcom,ids.h +index 755e08d494c5..7e77a7d84e2a 100644 +--- a/include/dt-bindings/arm/qcom,ids.h ++++ b/include/dt-bindings/arm/qcom,ids.h +@@ -140,6 +140,12 @@ + #define QCOM_ID_SC7280 487 + #define QCOM_ID_SC7180P 495 + #define QCOM_ID_SM6375 507 ++#define QCOM_ID_IPQ9514 510 ++#define QCOM_ID_IPQ9550 511 ++#define QCOM_ID_IPQ9554 512 ++#define QCOM_ID_IPQ9570 513 ++#define QCOM_ID_IPQ9574 514 ++#define QCOM_ID_IPQ9510 521 + + /* + * The board type and revision information, used by Qualcomm bootloaders and +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch b/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch new file mode 100644 index 00000000000000..6e3c85529c203d --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch @@ -0,0 +1,66 @@ +From ff1925f7070d4cc3c5772565672632854444317e Mon Sep 17 00:00:00 2001 +From: Anusha Rao +Date: Wed, 27 Sep 2023 12:13:19 +0530 +Subject: [PATCH 38/41] arm64: dts: qcom: ipq9574: Enable WPS buttons + +Add support for wps buttons on GPIO 37. + +Reviewed-by: Konrad Dybcio +Signed-off-by: Anusha Rao +Signed-off-by: Kathiravan Thirumoorthy +Link: https://lore.kernel.org/r/20230927-common-rdp-v3-2-3d07b3ff6d42@quicinc.com +Signed-off-by: Bjorn Andersson +--- + .../boot/dts/qcom/ipq9574-rdp-common.dtsi | 22 +++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +index c935ac53efe6..526f0dbbdbe9 100644 +--- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +@@ -8,6 +8,8 @@ + + /dts-v1/; + ++#include ++#include + #include "ipq9574.dtsi" + + / { +@@ -36,6 +38,19 @@ regulator_fixed_0p925: s0925 { + regulator-always-on; + regulator-name = "fixed_0p925"; + }; ++ ++ gpio-keys { ++ compatible = "gpio-keys"; ++ pinctrl-0 = <&gpio_keys_default>; ++ pinctrl-names = "default"; ++ ++ button-wps { ++ label = "wps"; ++ linux,code = ; ++ gpios = <&tlmm 37 GPIO_ACTIVE_LOW>; ++ debounce-interval = <60>; ++ }; ++ }; + }; + + &blsp1_spi0 { +@@ -95,6 +110,13 @@ spi_0_pins: spi-0-state { + drive-strength = <8>; + bias-disable; + }; ++ ++ gpio_keys_default: gpio-keys-default-state { ++ pins = "gpio37"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; + }; + + &xo_board_clk { +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch b/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch new file mode 100644 index 00000000000000..57c572dea32a7f --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch @@ -0,0 +1,131 @@ +From 7b20271bc8c2982ab1e7bcfcf896ca5320b16a6f Mon Sep 17 00:00:00 2001 +From: Kathiravan T +Date: Fri, 17 Feb 2023 14:03:06 +0530 +Subject: [PATCH 39/41] clk: qcom: apss-ipq-pll: add support for IPQ5332 + +IPQ5332 APSS PLL is of type Stromer Plus. Add support for the same. + +To configure the stromer plus PLL separate API +(clock_stromer_pll_configure) to be used. To achieve this, introduce the +new member pll_type in device data structure and call the appropriate +function based on this. + +Reviewed-by: Konrad Dybcio +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230217083308.12017-4-quic_kathirav@quicinc.com +--- + drivers/clk/qcom/apss-ipq-pll.c | 59 ++++++++++++++++++++++++++++++++- + 1 file changed, 58 insertions(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c +index 56f33af11311..4ec347f0e8b1 100644 +--- a/drivers/clk/qcom/apss-ipq-pll.c ++++ b/drivers/clk/qcom/apss-ipq-pll.c +@@ -24,6 +24,18 @@ static const u8 ipq_pll_offsets[][PLL_OFF_MAX_REGS] = { + [PLL_OFF_TEST_CTL] = 0x30, + [PLL_OFF_TEST_CTL_U] = 0x34, + }, ++ ++ [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = { ++ [PLL_OFF_L_VAL] = 0x08, ++ [PLL_OFF_ALPHA_VAL] = 0x10, ++ [PLL_OFF_ALPHA_VAL_U] = 0x14, ++ [PLL_OFF_USER_CTL] = 0x18, ++ [PLL_OFF_USER_CTL_U] = 0x1c, ++ [PLL_OFF_CONFIG_CTL] = 0x20, ++ [PLL_OFF_STATUS] = 0x28, ++ [PLL_OFF_TEST_CTL] = 0x30, ++ [PLL_OFF_TEST_CTL_U] = 0x34, ++ }, + }; + + static struct clk_alpha_pll ipq_pll_huayra = { +@@ -44,6 +56,38 @@ static struct clk_alpha_pll ipq_pll_huayra = { + }, + }; + ++static struct clk_alpha_pll ipq_pll_stromer_plus = { ++ .offset = 0x0, ++ .regs = ipq_pll_offsets[CLK_ALPHA_PLL_TYPE_STROMER_PLUS], ++ .flags = SUPPORTS_DYNAMIC_UPDATE, ++ .clkr = { ++ .enable_reg = 0x0, ++ .enable_mask = BIT(0), ++ .hw.init = &(struct clk_init_data){ ++ .name = "a53pll", ++ .parent_data = &(const struct clk_parent_data) { ++ .fw_name = "xo", ++ }, ++ .num_parents = 1, ++ .ops = &clk_alpha_pll_stromer_ops, ++ }, ++ }, ++}; ++ ++static const struct alpha_pll_config ipq5332_pll_config = { ++ .l = 0x3e, ++ .config_ctl_val = 0x4001075b, ++ .config_ctl_hi_val = 0x304, ++ .main_output_mask = BIT(0), ++ .aux_output_mask = BIT(1), ++ .early_output_mask = BIT(3), ++ .alpha_en_mask = BIT(24), ++ .status_val = 0x3, ++ .status_mask = GENMASK(10, 8), ++ .lock_det = BIT(2), ++ .test_ctl_hi_val = 0x00400003, ++}; ++ + static const struct alpha_pll_config ipq6018_pll_config = { + .l = 0x37, + .config_ctl_val = 0x240d4828, +@@ -81,16 +125,25 @@ static const struct alpha_pll_config ipq9574_pll_config = { + }; + + struct apss_pll_data { ++ int pll_type; + struct clk_alpha_pll *pll; + const struct alpha_pll_config *pll_config; + }; + ++static struct apss_pll_data ipq5332_pll_data = { ++ .pll_type = CLK_ALPHA_PLL_TYPE_STROMER_PLUS, ++ .pll = &ipq_pll_stromer_plus, ++ .pll_config = &ipq5332_pll_config, ++}; ++ + static struct apss_pll_data ipq8074_pll_data = { ++ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA, + .pll = &ipq_pll_huayra, + .pll_config = &ipq8074_pll_config, + }; + + static struct apss_pll_data ipq6018_pll_data = { ++ .pll_type = CLK_ALPHA_PLL_TYPE_HUAYRA, + .pll = &ipq_pll_huayra, + .pll_config = &ipq6018_pll_config, + }; +@@ -129,7 +182,10 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) + if (!data) + return -ENODEV; + +- clk_alpha_pll_configure(data->pll, regmap, data->pll_config); ++ if (data->pll_type == CLK_ALPHA_PLL_TYPE_HUAYRA) ++ clk_alpha_pll_configure(data->pll, regmap, data->pll_config); ++ else if (data->pll_type == CLK_ALPHA_PLL_TYPE_STROMER_PLUS) ++ clk_stromer_pll_configure(data->pll, regmap, data->pll_config); + + ret = devm_clk_register_regmap(dev, &data->pll->clkr); + if (ret) +@@ -140,6 +196,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) + } + + static const struct of_device_id apss_ipq_pll_match_table[] = { ++ { .compatible = "qcom,ipq5332-a53pll", .data = &ipq5332_pll_data }, + { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data }, + { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data }, + { .compatible = "qcom,ipq9574-a73pll", .data = &ipq9574_pll_data }, +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch b/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch new file mode 100644 index 00000000000000..7efaad2da4e00e --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch @@ -0,0 +1,39 @@ +From 998d251c67072059c80a5747d19e8c34a154a213 Mon Sep 17 00:00:00 2001 +From: Varadarajan Narayanan +Date: Fri, 20 Oct 2023 11:49:33 +0530 +Subject: [PATCH 40/41] clk: qcom: apss-ipq-pll: Use stromer plus ops for + stromer plus pll + +The set rate and determine rate operations are different between +Stromer and Stromer Plus PLLs. Since the programming sequence is +different, the PLLs dont get configured properly and random, +inexplicable crash/freeze is seen. Hence, use stromer plus ops +for ipq_pll_stromer_plus. + +Reviewed-by: Dmitry Baryshkov +Acked-by: Stephen Boyd +Fixes: c7ef7fbb1ccf ("clk: qcom: apss-ipq-pll: add support for IPQ5332") +Signed-off-by: Kathiravan T +Signed-off-by: Varadarajan Narayanan +Link: https://lore.kernel.org/r/c86ecaa23dc4f39650bcf4a3bd54a617a932e4fd.1697781921.git.quic_varada@quicinc.com +Signed-off-by: Bjorn Andersson +--- + drivers/clk/qcom/apss-ipq-pll.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c +index 4ec347f0e8b1..87547db3bfb3 100644 +--- a/drivers/clk/qcom/apss-ipq-pll.c ++++ b/drivers/clk/qcom/apss-ipq-pll.c +@@ -69,7 +69,7 @@ static struct clk_alpha_pll ipq_pll_stromer_plus = { + .fw_name = "xo", + }, + .num_parents = 1, +- .ops = &clk_alpha_pll_stromer_ops, ++ .ops = &clk_alpha_pll_stromer_plus_ops, + }, + }, + }; +-- +2.34.1 + diff --git a/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch b/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch new file mode 100644 index 00000000000000..65b2de61952e5d --- /dev/null +++ b/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch @@ -0,0 +1,55 @@ +From d10112948b0ff58b749f6f89a963185a190ce885 Mon Sep 17 00:00:00 2001 +From: Kathiravan T +Date: Tue, 7 Mar 2023 11:52:25 +0530 +Subject: [PATCH 41/41] clk: qcom: Add STROMER PLUS PLL type for IPQ5332 + +Add the support for stromer plus pll, which is found on the IPQ5332 +SoCs. Programming sequence is same as the stromer pll, so we can re-use +the same. + +Reviewed-by: Stephen Boyd +Signed-off-by: Kathiravan T +Signed-off-by: Bjorn Andersson +Link: https://lore.kernel.org/r/20230307062232.4889-3-quic_kathirav@quicinc.com +--- + drivers/clk/qcom/clk-alpha-pll.c | 11 +++++++++++ + drivers/clk/qcom/clk-alpha-pll.h | 1 + + 2 files changed, 12 insertions(+) + +diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c +index 56f1795847cd..b3d1a39c835b 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.c ++++ b/drivers/clk/qcom/clk-alpha-pll.c +@@ -200,6 +200,17 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { + [PLL_OFF_TEST_CTL_U] = 0x34, + [PLL_OFF_STATUS] = 0x28, + }, ++ [CLK_ALPHA_PLL_TYPE_STROMER_PLUS] = { ++ [PLL_OFF_L_VAL] = 0x04, ++ [PLL_OFF_USER_CTL] = 0x08, ++ [PLL_OFF_USER_CTL_U] = 0x0c, ++ [PLL_OFF_CONFIG_CTL] = 0x10, ++ [PLL_OFF_TEST_CTL] = 0x14, ++ [PLL_OFF_TEST_CTL_U] = 0x18, ++ [PLL_OFF_STATUS] = 0x1c, ++ [PLL_OFF_ALPHA_VAL] = 0x24, ++ [PLL_OFF_ALPHA_VAL_U] = 0x28, ++ }, + }; + EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); + +diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h +index eb072ae7861c..42d2a93a28ba 100644 +--- a/drivers/clk/qcom/clk-alpha-pll.h ++++ b/drivers/clk/qcom/clk-alpha-pll.h +@@ -26,6 +26,7 @@ enum { + CLK_ALPHA_PLL_TYPE_DEFAULT_EVO, + CLK_ALPHA_PLL_TYPE_BRAMMO_EVO, + CLK_ALPHA_PLL_TYPE_STROMER, ++ CLK_ALPHA_PLL_TYPE_STROMER_PLUS, + CLK_ALPHA_PLL_TYPE_MAX, + }; + +-- +2.34.1 + From 62daffa7a2373210b234e7a8bf613f0105c96cc4 Mon Sep 17 00:00:00 2001 From: Ikko Eltociear Ashimine Date: Fri, 8 Dec 2023 16:09:24 +0900 Subject: [PATCH 6/8] docs: add Japanese readme (#11693) --- README.md | 2 +- README_EN.md | 2 +- README_JA.md | 329 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 331 insertions(+), 2 deletions(-) create mode 100644 README_JA.md diff --git a/README.md b/README.md index 765aa066faffd3..98248e46550e3e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 欢迎来到 Lean 的 LEDE 源码仓库 -I18N: [English](README_EN.md) | [简体中文](README.md) +I18N: [English](README_EN.md) | [简体中文](README.md) | [日本語](README_JA.md) ## 官方讨论群 如有技术问题需要讨论或者交流,欢迎加入以下群: diff --git a/README_EN.md b/README_EN.md index 32e32921d383dc..9705f50edbf96c 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,6 +1,6 @@ # Welcome to Lean's git source of OpenWrt and packages -I18N: [English](README_EN.md) | [简体中文](README.md) +I18N: [English](README_EN.md) | [简体中文](README.md) | [日本語](README_JA.md) ## Official Channels + +ディスカッションや共有したい技術的な質問がある場合は、以下のチャンネルにお気軽にご参加ください: +1. QQ グループ: *OpenWRT ファームウェア技術研究グループ*、グループ番号は `891659613` です。グループに参加する: [リンク](https://jq.qq.com/?_wv=1027&k=XL8SK5aC "Op固件技术研究群")。 + - [クリックして QQ クライアントをダウンロードする](https://im.qq.com/pcqq)。 +2. Telegram グループ: *OpenWRT ファームウェア技術研究グループ*。グループに参加する: [リンク](https://t.me/JhKgAA6Hx1 "OP 编译官方大群")。 +3. Rockchip **RK3568** コンパイル済みファームウェアリリース (H68K を含む): [クリックしてダウンロード](https://github.com/coolsnowwolf/lede/releases/tag/20220716)。 + + + +4. Rockchip **RK3588**コンパイル済みファームウェアリリース(H68K を含む): [クリックしてダウンロード](https://github.com/coolsnowwolf/lede/releases/tag/20230609)。 + + +## 注意 + +1. **OpenWRT を決して `root` としてコンパイルしないこと** +2. 中国本土にお住まいの方は、ぜひ **REAL** インターネットをご覧ください。 +3. デフォルトのログイン IP は `192.168.1.1` で、パスワードは `password` です。 + +## コンパイル方法 + + +1. Linuxディストリビューションをインストールし、Debian 11 または Ubuntu LTS を推奨します。 +2. 依存関係をインストールする: + + ```bash + sudo apt update -y + sudo apt full-upgrade -y + sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ + bzip2 ccache cmake cpio curl device-tree-compiler fastjar flex gawk gettext gcc-multilib g++-multilib \ + git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libglib2.0-dev libgmp3-dev libltdl-dev \ + libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libreadline-dev libssl-dev libtool lrzsz \ + mkisofs msmtp nano ninja-build p7zip p7zip-full patch pkgconf python2.7 python3 python3-pyelftools \ + libpython3-dev qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs upx-ucl unzip \ + vim wget xmlto xxd zlib1g-dev python3-setuptools + ``` + + + +3. ソースコードをクローンし、`feeds` を更新し、設定する: + + ```bash + git clone https://github.com/coolsnowwolf/lede + cd lede + ./scripts/feeds update -a + ./scripts/feeds install -a + make menuconfig + ``` + +4. ライブラリのダウンロードとファームウェアのコンパイル + > (`-j` はスレッドカウント、最初のビルドはシングルスレッドを推奨): + + ```bash + make -j8 download V=s + make -j1 V=s + ``` + + + +これらのコマンドは、ソースコードを正常にコンパイルするためのものです。 +R23 のソースコードは IPK を含めてすべて含まれています。 + +このソースコードはご自由にお使いいただけますが、再配布の際はこの GitHub リポジトリをリンクしてください。 +ご協力ありがとうございました! + + + +リビルド: + +```bash +cd lede +git pull +./scripts/feeds update -a +./scripts/feeds install -a +make defconfig +make download -j8 +make V=s -j$(nproc) +``` + +再設定が必要な場合: + +```bash +rm -rf ./tmp && rm -rf .config +make menuconfig +make V=s -j$(nproc) +``` + +ビルドの成果物は `bin/targets` ディレクトリに出力されます。 + +### WSL/WSL2 をビルド環境として使用している場合 + + +WSL の `PATH` には、Windows のパスが空白で含まれている可能性があり、コンパイルに失敗することがあります。コンパイルする前に、ローカルの環境プロファイルに以下の行を追加してください: + +```bash +# 例えば、~/.bashrc などのプロファイルを更新した後、再読み込みを行う。 +cat << EOF >> ~/.bashrc +export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" +EOF +source ~/.bashrc +``` + + + +WSL ディストリビューションにマウントされた NTFS フォーマットのドライブは、デフォルトで大文字と小文字が区別されません。このため、WSL/WSL2 でコンパイルすると、次のようなエラーが発生します: + +```txt +Build dependency: OpenWrt can only be built on a case-sensitive filesystem +``` + +単純な解決策は、`git clone` の前に大文字小文字を区別してリポジトリ用のディレクトリを作成することです: + +```powershell +# 管理者としてターミナルを開く +PS > fsutil.exe file setCaseSensitiveInfo enable +# 大文字と小文字を区別して、このリポジトリを ディレクトリにクローンする +PS > git clone git@github.com:coolsnowwolf/lede.git +``` + +> すでに `git clone` されたディレクトリでは、`fsutil.exe` は有効になりません。大文字小文字の区別はディレクトリの新しい変更に対してのみ有効になります。 + +### macOS コンパイル + + +1. AppStore から Xcode をインストールする +2. Homebrew をインストールする: + ```bash + /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" + ``` +3. Homebrew でツールチェーン、依存関係、パッケージをインストールする: + ```bash + brew unlink awk + brew install coreutils diffutils findutils gawk gnu-getopt gnu-tar grep make ncurses pkg-config wget quilt xz + brew install gcc@11 + ``` +4. システム環境のアップデート: + ```bash + echo 'export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/gnu-getopt/bin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/make/libexec/gnubin:$PATH"' >> ~/.bashrc + ``` +5. シェルプロファイル `source ~/.bashrc && bash` を再読み込みすれば、Linux のように普通にコンパイルできます。 + +## 宣言 + +1. このソースコードには、HTTPS トラフィックを監視/キャプチャできるバックドアやクローズドソースアプリケーションは含まれていません。SSL セキュリティはサイバーセキュリティの最後の城です。安全性はファームウェアがすべきことです。 +2. OpenWRT の開発を学びたいが、何から始めたらいいかわからないですか?自己学習のモチベーションが上がらない?基礎知識が足りない?ズオ氏の初心者 OpenWRT トレーニングコースで一緒に OpenWRT 開発を学びましょう。お申し込みは[こちら](http://forgotfun.org/2018/04/openwrt-training-2018.html)をクリックしてください。 +3. QCA IPQ60xx オープンソースリポジトリ: +4. OpenWRT アーカイブリポジトリ: + +## ソフトウェアルーター入門 + +Yingku R2 - N95/N300 Mini Four-Network HomeLab Server + +(紹介ページ - Yingku Technology (support AliPay Huabei)): + +[先行販売リンク](https://item.taobao.com/item.htm?ft=t&id=719159813003) +
+ + + +
+
+ +## 寄付 + + +このプロジェクトがあなたのお役に立てたのであれば、このプロジェクトの発展を支援するための寄付をご検討ください。 + +
+ +
+
From 93443d24b48aaf938aee4473dda4f8bd34a4d42a Mon Sep 17 00:00:00 2001 From: aakkll <94471752+aakkll@users.noreply.github.com> Date: Sat, 9 Dec 2023 13:08:34 +0800 Subject: [PATCH 7/8] kernel: bump 6.1 to 6.1.66 (#11694) --- include/kernel-6.1 | 4 +- ...i-gen-LRU-per-node-lru_gen_folio-lis.patch | 8 +- .../generic/hack-6.1/259-regmap_dynamic.patch | 2 +- .../780-usb-net-MeigLink_modem_support.patch | 4 +- .../hack-6.1/904-debloat_dma_buf.patch | 2 +- .../901-usb-add-more-modem-support.patch | 2 +- .../pending-6.1/920-mangle_bootargs.patch | 4 +- .../994-add-quectel-rm500u-support.patch | 2 +- ...-qcom-smd-rpm-Add-IPQ9574-compatible.patch | 7 +- ...q-pll-refactor-the-driver-to-accommo.patch | 11 +- ...pha-pll-Add-support-for-Stromer-PLLs.patch | 15 +- ...-Add-IDs-for-IPQ9574-and-its-variant.patch | 5 - ...dd-ipq9574-SoC-and-AL02-board-suppor.patch | 13 +- ...nfig-Enable-IPQ9574-SoC-base-configs.patch | 5 - ...bal-Clock-Controller-driver-for-IPQ9.patch | 12 +- ...k-Add-ipq9574-clock-and-reset-defini.patch | 12 -- ...ctrl-qcom-Add-IPQ9574-pinctrl-driver.patch | 12 +- ...pq9574-Add-support-for-APSS-clock-co.patch | 7 +- ...apss-ipq-pll-Add-support-for-IPQ9574.patch | 11 +- ...tor-qcom_smd-Add-MP5496-S1-regulator.patch | 7 +- ...ipq9574-rename-al02-c7-dts-to-rdp433.patch | 190 ++++++++++++++++-- ...pq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch | 9 +- ...pq9574-Update-the-size-of-GICC-GICV-.patch | 7 +- ...pq9574-add-support-for-RDP418-varian.patch | 10 +- ...64-dts-qcom-ipq9574-Add-SMEM-support.patch | 9 +- ...pq9574-add-support-for-RDP449-varian.patch | 10 +- ...dts-qcom-ipq9574-Add-cpufreq-support.patch | 15 +- ...com-ipq9574-Add-SMPA1-regulator-node.patch | 7 +- ...s-qcom-ipq9574-Add-RPM-related-nodes.patch | 7 +- ...ts-qcom-ipq9574-add-few-device-nodes.patch | 13 +- ...-add-few-more-reserved-memory-region.patch | 41 +--- ...m64-dts-qcom-ipq9574-add-QFPROM-node.patch | 7 +- ...pq9574-add-support-for-RDP453-varian.patch | 10 +- ...pq9574-add-support-for-RDP454-varian.patch | 10 +- ...pq9574-add-few-more-reserved-memory-.patch | 9 +- ...pq9574-Use-assigned-clock-rates-for-.patch | 13 +- ...om-ipq9574-Fix-hwlock-index-for-SMEM.patch | 7 +- ...pq9574-include-the-GPLL0-as-clock-pr.patch | 7 +- ...q6018-add-the-GPLL0-clock-also-as-cl.patch | 5 - ...-drop-the-CLK_SET_RATE_PARENT-flag-f.patch | 13 +- ...m-use-64-bit-calling-convention-only.patch | 27 +-- ...com-ipq9574-Add-common-RDP-dtsi-file.patch | 22 +- ...pq9574-populate-the-opp-table-based-.patch | 9 +- ...alpha-pll-introduce-stromer-plus-ops.patch | 11 +- ...-nvmem-Introduce-cpufreq-for-ipq95xx.patch | 13 +- ...-dts-qcom-ipq9574-Enable-WPS-buttons.patch | 9 +- ...apss-ipq-pll-add-support-for-IPQ5332.patch | 15 +- ...q-pll-Use-stromer-plus-ops-for-strom.patch | 7 +- ...dd-STROMER-PLUS-PLL-type-for-IPQ5332.patch | 9 +- ...-r8169-add-LED-configuration-from-OF.patch | 4 +- ...-initial-signal-voltage-on-power-off.patch | 2 +- ...eq-rockchip-dfi-add-more-soc-support.patch | 109 +--------- 52 files changed, 271 insertions(+), 510 deletions(-) diff --git a/include/kernel-6.1 b/include/kernel-6.1 index 1dd947e7bc0ccb..747079455a146f 100644 --- a/include/kernel-6.1 +++ b/include/kernel-6.1 @@ -1,2 +1,2 @@ -LINUX_VERSION-6.1 = .62 -LINUX_KERNEL_HASH-6.1.62 = b9fd616facd6becfceef88b9be718d0f16625cab3fe81d11384802a7091e85ec +LINUX_VERSION-6.1 = .66 +LINUX_KERNEL_HASH-6.1.66 = 419e62cd6c4239e6950b688db9e8753eb1e99c216dc3204f7932398a3fef1a0c diff --git a/target/linux/generic/backport-6.1/020-v6.3-06-BACKPORT-mm-multi-gen-LRU-per-node-lru_gen_folio-lis.patch b/target/linux/generic/backport-6.1/020-v6.3-06-BACKPORT-mm-multi-gen-LRU-per-node-lru_gen_folio-lis.patch index 612ed6f6bab8d1..10fee0adf6344f 100644 --- a/target/linux/generic/backport-6.1/020-v6.3-06-BACKPORT-mm-multi-gen-LRU-per-node-lru_gen_folio-lis.patch +++ b/target/linux/generic/backport-6.1/020-v6.3-06-BACKPORT-mm-multi-gen-LRU-per-node-lru_gen_folio-lis.patch @@ -325,7 +325,7 @@ Signed-off-by: T.J. Mercier mctz = soft_limit_tree.rb_tree_per_node[nid]; if (!mctz) return; -@@ -3523,6 +3533,9 @@ unsigned long mem_cgroup_soft_limit_recl +@@ -3524,6 +3534,9 @@ unsigned long mem_cgroup_soft_limit_recl struct mem_cgroup_tree_per_node *mctz; unsigned long excess; @@ -335,7 +335,7 @@ Signed-off-by: T.J. Mercier if (order > 0) return 0; -@@ -5386,6 +5399,7 @@ static int mem_cgroup_css_online(struct +@@ -5387,6 +5400,7 @@ static int mem_cgroup_css_online(struct if (unlikely(mem_cgroup_is_root(memcg))) queue_delayed_work(system_unbound_wq, &stats_flush_dwork, 2UL*HZ); @@ -343,7 +343,7 @@ Signed-off-by: T.J. Mercier return 0; offline_kmem: memcg_offline_kmem(memcg); -@@ -5417,6 +5431,7 @@ static void mem_cgroup_css_offline(struc +@@ -5418,6 +5432,7 @@ static void mem_cgroup_css_offline(struc memcg_offline_kmem(memcg); reparent_shrinker_deferred(memcg); wb_memcg_offline(memcg); @@ -351,7 +351,7 @@ Signed-off-by: T.J. Mercier drain_all_stock(memcg); -@@ -5428,6 +5443,7 @@ static void mem_cgroup_css_released(stru +@@ -5429,6 +5444,7 @@ static void mem_cgroup_css_released(stru struct mem_cgroup *memcg = mem_cgroup_from_css(css); invalidate_reclaim_iterators(memcg); diff --git a/target/linux/generic/hack-6.1/259-regmap_dynamic.patch b/target/linux/generic/hack-6.1/259-regmap_dynamic.patch index 407bc72ac8dbd1..8d25f59ce2823a 100644 --- a/target/linux/generic/hack-6.1/259-regmap_dynamic.patch +++ b/target/linux/generic/hack-6.1/259-regmap_dynamic.patch @@ -125,7 +125,7 @@ Signed-off-by: Felix Fietkau #include #include #include -@@ -3511,3 +3512,5 @@ static int __init regmap_initcall(void) +@@ -3513,3 +3514,5 @@ static int __init regmap_initcall(void) return 0; } postcore_initcall(regmap_initcall); diff --git a/target/linux/generic/hack-6.1/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-6.1/780-usb-net-MeigLink_modem_support.patch index 98b5433d063e1d..51f939356f176b 100644 --- a/target/linux/generic/hack-6.1/780-usb-net-MeigLink_modem_support.patch +++ b/target/linux/generic/hack-6.1/780-usb-net-MeigLink_modem_support.patch @@ -43,7 +43,7 @@ Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support #define QUECTEL_VENDOR_ID 0x2c7c /* These Quectel products use Quectel's vendor ID */ -@@ -1144,6 +1149,11 @@ static const struct usb_device_id option +@@ -1147,6 +1152,11 @@ static const struct usb_device_id option { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000), /* SIMCom SIM5218 */ .driver_info = NCTRL(0) | NCTRL(1) | NCTRL(2) | NCTRL(3) | RSVD(4) }, @@ -55,7 +55,7 @@ Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support /* Quectel products using Qualcomm vendor ID */ { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)}, { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20), -@@ -1185,6 +1195,11 @@ static const struct usb_device_id option +@@ -1188,6 +1198,11 @@ static const struct usb_device_id option .driver_info = ZLP }, { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), .driver_info = RSVD(4) }, diff --git a/target/linux/generic/hack-6.1/904-debloat_dma_buf.patch b/target/linux/generic/hack-6.1/904-debloat_dma_buf.patch index 8b6bd6a7862af4..105eb3da4bb67b 100644 --- a/target/linux/generic/hack-6.1/904-debloat_dma_buf.patch +++ b/target/linux/generic/hack-6.1/904-debloat_dma_buf.patch @@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau +MODULE_LICENSE("GPL"); --- a/kernel/sched/core.c +++ b/kernel/sched/core.c -@@ -4363,6 +4363,7 @@ int wake_up_state(struct task_struct *p, +@@ -4367,6 +4367,7 @@ int wake_up_state(struct task_struct *p, { return try_to_wake_up(p, state, 0); } diff --git a/target/linux/generic/pending-6.1/901-usb-add-more-modem-support.patch b/target/linux/generic/pending-6.1/901-usb-add-more-modem-support.patch index a2a933cf7a6594..18f3a52a190dad 100644 --- a/target/linux/generic/pending-6.1/901-usb-add-more-modem-support.patch +++ b/target/linux/generic/pending-6.1/901-usb-add-more-modem-support.patch @@ -12,7 +12,7 @@ {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c -@@ -2262,6 +2262,12 @@ static const struct usb_device_id option +@@ -2266,6 +2266,12 @@ static const struct usb_device_id option { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ .driver_info = RSVD(4) }, diff --git a/target/linux/generic/pending-6.1/920-mangle_bootargs.patch b/target/linux/generic/pending-6.1/920-mangle_bootargs.patch index 1015266084e2a4..db7274e7aadb94 100644 --- a/target/linux/generic/pending-6.1/920-mangle_bootargs.patch +++ b/target/linux/generic/pending-6.1/920-mangle_bootargs.patch @@ -31,7 +31,7 @@ Signed-off-by: Imre Kaloz help --- a/init/main.c +++ b/init/main.c -@@ -607,6 +607,29 @@ static inline void setup_nr_cpu_ids(void +@@ -611,6 +611,29 @@ static inline void setup_nr_cpu_ids(void static inline void smp_prepare_cpus(unsigned int maxcpus) { } #endif @@ -61,7 +61,7 @@ Signed-off-by: Imre Kaloz /* * We need to store the untouched command line for future reference. * We also need to store the touched command line since the parameter -@@ -954,6 +977,7 @@ asmlinkage __visible void __init __no_sa +@@ -958,6 +981,7 @@ asmlinkage __visible void __init __no_sa pr_notice("%s", linux_banner); early_security_init(); setup_arch(&command_line); diff --git a/target/linux/generic/pending-6.1/994-add-quectel-rm500u-support.patch b/target/linux/generic/pending-6.1/994-add-quectel-rm500u-support.patch index f68301d3b42273..8c52719649de4a 100644 --- a/target/linux/generic/pending-6.1/994-add-quectel-rm500u-support.patch +++ b/target/linux/generic/pending-6.1/994-add-quectel-rm500u-support.patch @@ -8,7 +8,7 @@ #define QUECTEL_PRODUCT_EC200U 0x0901 #define QUECTEL_PRODUCT_EC200S_CN 0x6002 #define QUECTEL_PRODUCT_EC200A 0x6005 -@@ -1243,6 +1244,7 @@ static const struct usb_device_id option +@@ -1245,6 +1246,7 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, diff --git a/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch b/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch index 81b7f4ba7b5081..588876d6601880 100644 --- a/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch +++ b/target/linux/ipq95xx/patches-6.1/0001-soc-qcom-smd-rpm-Add-IPQ9574-compatible.patch @@ -15,11 +15,9 @@ Link: https://lore.kernel.org/r/20230113150310.29709-2-quic_devipriy@quicinc.com drivers/soc/qcom/smd-rpm.c | 1 + 1 file changed, 1 insertion(+) -diff --git a/drivers/soc/qcom/smd-rpm.c b/drivers/soc/qcom/smd-rpm.c -index 413f9f4ae9cd..10765775ee17 100644 --- a/drivers/soc/qcom/smd-rpm.c +++ b/drivers/soc/qcom/smd-rpm.c -@@ -233,6 +233,7 @@ static void qcom_smd_rpm_remove(struct rpmsg_device *rpdev) +@@ -233,6 +233,7 @@ static void qcom_smd_rpm_remove(struct r static const struct of_device_id qcom_smd_rpm_of_match[] = { { .compatible = "qcom,rpm-apq8084" }, { .compatible = "qcom,rpm-ipq6018" }, @@ -27,6 +25,3 @@ index 413f9f4ae9cd..10765775ee17 100644 { .compatible = "qcom,rpm-msm8226" }, { .compatible = "qcom,rpm-msm8909" }, { .compatible = "qcom,rpm-msm8916" }, --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch b/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch index 20ed0935778234..ed74634c4c0b3e 100644 --- a/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch +++ b/target/linux/ipq95xx/patches-6.1/0002-clk-qcom-apss-ipq-pll-refactor-the-driver-to-accommo.patch @@ -17,8 +17,6 @@ Link: https://lore.kernel.org/r/20230217083308.12017-2-quic_kathirav@quicinc.com drivers/clk/qcom/apss-ipq-pll.c | 60 ++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 19 deletions(-) -diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c -index a5aea27eb867..4f2a147e9fb2 100644 --- a/drivers/clk/qcom/apss-ipq-pll.c +++ b/drivers/clk/qcom/apss-ipq-pll.c @@ -8,20 +8,27 @@ @@ -60,7 +58,7 @@ index a5aea27eb867..4f2a147e9fb2 100644 .flags = SUPPORTS_DYNAMIC_UPDATE, .clkr = { .enable_reg = 0x0, -@@ -61,6 +68,21 @@ static const struct alpha_pll_config ipq8074_pll_config = { +@@ -61,6 +68,21 @@ static const struct alpha_pll_config ipq .test_ctl_hi_val = 0x4000, }; @@ -82,7 +80,7 @@ index a5aea27eb867..4f2a147e9fb2 100644 static const struct regmap_config ipq_pll_regmap_config = { .reg_bits = 32, .reg_stride = 4, -@@ -71,7 +93,7 @@ static const struct regmap_config ipq_pll_regmap_config = { +@@ -71,7 +93,7 @@ static const struct regmap_config ipq_pl static int apss_ipq_pll_probe(struct platform_device *pdev) { @@ -91,7 +89,7 @@ index a5aea27eb867..4f2a147e9fb2 100644 struct device *dev = &pdev->dev; struct regmap *regmap; void __iomem *base; -@@ -85,23 +107,23 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) +@@ -85,23 +107,23 @@ static int apss_ipq_pll_probe(struct pla if (IS_ERR(regmap)) return PTR_ERR(regmap); @@ -122,6 +120,3 @@ index a5aea27eb867..4f2a147e9fb2 100644 { } }; MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table); --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch b/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch index 2e84493af1a194..efbfad7d1d8309 100644 --- a/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch +++ b/target/linux/ipq95xx/patches-6.1/0003-clk-qcom-clk-alpha-pll-Add-support-for-Stromer-PLLs.patch @@ -18,8 +18,6 @@ Link: https://lore.kernel.org/r/20230307062232.4889-2-quic_kathirav@quicinc.com drivers/clk/qcom/clk-alpha-pll.h | 13 +++- 2 files changed, 139 insertions(+), 2 deletions(-) -diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c -index 1973d79c9465..8e5e7a26bcc4 100644 --- a/drivers/clk/qcom/clk-alpha-pll.c +++ b/drivers/clk/qcom/clk-alpha-pll.c @@ -1,7 +1,7 @@ @@ -31,7 +29,7 @@ index 1973d79c9465..8e5e7a26bcc4 100644 */ #include -@@ -188,6 +188,18 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { +@@ -188,6 +188,18 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MA [PLL_OFF_CONFIG_CTL] = 0x1C, [PLL_OFF_STATUS] = 0x20, }, @@ -59,7 +57,7 @@ index 1973d79c9465..8e5e7a26bcc4 100644 #define PLL_HUAYRA_M_WIDTH 8 #define PLL_HUAYRA_M_SHIFT 8 #define PLL_HUAYRA_M_MASK 0xff -@@ -2308,3 +2322,115 @@ const struct clk_ops clk_alpha_pll_rivian_evo_ops = { +@@ -2308,3 +2322,115 @@ const struct clk_ops clk_alpha_pll_rivia .round_rate = clk_rivian_evo_pll_round_rate, }; EXPORT_SYMBOL_GPL(clk_alpha_pll_rivian_evo_ops); @@ -175,8 +173,6 @@ index 1973d79c9465..8e5e7a26bcc4 100644 + .set_rate = clk_alpha_pll_stromer_set_rate, +}; +EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops); -diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h -index f9524b3fce6b..51d4043c7e4f 100644 --- a/drivers/clk/qcom/clk-alpha-pll.h +++ b/drivers/clk/qcom/clk-alpha-pll.h @@ -1,5 +1,9 @@ @@ -208,7 +204,7 @@ index f9524b3fce6b..51d4043c7e4f 100644 }; extern const struct clk_ops clk_alpha_pll_ops; -@@ -136,6 +144,7 @@ extern const struct clk_ops clk_alpha_pll_hwfsm_ops; +@@ -136,6 +144,7 @@ extern const struct clk_ops clk_alpha_pl extern const struct clk_ops clk_alpha_pll_postdiv_ops; extern const struct clk_ops clk_alpha_pll_huayra_ops; extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; @@ -216,7 +212,7 @@ index f9524b3fce6b..51d4043c7e4f 100644 extern const struct clk_ops clk_alpha_pll_fabia_ops; extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; -@@ -182,5 +191,7 @@ void clk_lucid_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regma +@@ -182,5 +191,7 @@ void clk_lucid_evo_pll_configure(struct const struct alpha_pll_config *config); void clk_rivian_evo_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, const struct alpha_pll_config *config); @@ -224,6 +220,3 @@ index f9524b3fce6b..51d4043c7e4f 100644 + const struct alpha_pll_config *config); #endif --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch b/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch index dbdda814197cae..e44adb3cb95841 100644 --- a/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch +++ b/target/linux/ipq95xx/patches-6.1/0004-soc-qcom-socinfo-Add-IDs-for-IPQ9574-and-its-variant.patch @@ -16,8 +16,6 @@ Link: https://lore.kernel.org/r/1678774414-14414-3-git-send-email-quic_varada@qu drivers/soc/qcom/socinfo.c | 6 ++++++ 1 file changed, 6 insertions(+) -diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c -index 510a48dbc4ac..5b507f247a64 100644 --- a/drivers/soc/qcom/socinfo.c +++ b/drivers/soc/qcom/socinfo.c @@ -280,6 +280,12 @@ static const struct soc_id soc_id[] = { @@ -33,6 +31,3 @@ index 510a48dbc4ac..5b507f247a64 100644 }; static const char *socinfo_machine(struct device *dev, unsigned int id) --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch b/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch index 43941c1386c73e..ec922ee88bc662 100644 --- a/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch +++ b/target/linux/ipq95xx/patches-6.1/0005-arm64-dts-qcom-Add-ipq9574-SoC-and-AL02-board-suppor.patch @@ -21,11 +21,9 @@ Link: https://lore.kernel.org/r/20230316072940.29137-6-quic_devipriy@quicinc.com create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts create mode 100644 arch/arm64/boot/dts/qcom/ipq9574.dtsi -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index d7669a7cee9f..8e04f0f663da 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb +@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01- dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb @@ -33,9 +31,6 @@ index d7669a7cee9f..8e04f0f663da 100644 dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts b/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts -new file mode 100644 -index 000000000000..2c8430197ec0 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts @@ -0,0 +1,84 @@ @@ -123,9 +118,6 @@ index 000000000000..2c8430197ec0 +&xo_board_clk { + clock-frequency = <24000000>; +}; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -new file mode 100644 -index 000000000000..3bb7435f5e7f --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi @@ -0,0 +1,270 @@ @@ -399,6 +391,3 @@ index 000000000000..3bb7435f5e7f + ; + }; +}; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch b/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch index 39a373a915a2c3..bcec3db7f3c23d 100644 --- a/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch +++ b/target/linux/ipq95xx/patches-6.1/0006-arm64-defconfig-Enable-IPQ9574-SoC-base-configs.patch @@ -13,8 +13,6 @@ Link: https://lore.kernel.org/r/20230316072940.29137-7-quic_devipriy@quicinc.com arch/arm64/configs/defconfig | 2 ++ 1 file changed, 2 insertions(+) -diff --git a/arch/arm64/configs/defconfig b/arch/arm64/configs/defconfig -index 623e9f308f38..90dd3cf7bcad 100644 --- a/arch/arm64/configs/defconfig +++ b/arch/arm64/configs/defconfig @@ -537,6 +537,7 @@ CONFIG_PINCTRL_IMX93=y @@ -33,6 +31,3 @@ index 623e9f308f38..90dd3cf7bcad 100644 CONFIG_MSM_GCC_8916=y CONFIG_MSM_GCC_8994=y CONFIG_MSM_MMCC_8996=y --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch b/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch index a5d30558c2a50d..ebd2dce8990410 100644 --- a/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch +++ b/target/linux/ipq95xx/patches-6.1/0007-clk-qcom-Add-Global-Clock-Controller-driver-for-IPQ9.patch @@ -18,8 +18,6 @@ Link: https://lore.kernel.org/r/20230316072940.29137-3-quic_devipriy@quicinc.com 3 files changed, 4257 insertions(+) create mode 100644 drivers/clk/qcom/gcc-ipq9574.c -diff --git a/drivers/clk/qcom/Kconfig b/drivers/clk/qcom/Kconfig -index cbf55949c649..94340ee631c3 100644 --- a/drivers/clk/qcom/Kconfig +++ b/drivers/clk/qcom/Kconfig @@ -174,6 +174,14 @@ config IPQ_GCC_8074 @@ -37,11 +35,9 @@ index cbf55949c649..94340ee631c3 100644 config MSM_GCC_8660 tristate "MSM8660 Global Clock Controller" help -diff --git a/drivers/clk/qcom/Makefile b/drivers/clk/qcom/Makefile -index e6cecf9e0436..1a4c4d55cb17 100644 --- a/drivers/clk/qcom/Makefile +++ b/drivers/clk/qcom/Makefile -@@ -27,6 +27,7 @@ obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq4019.o +@@ -27,6 +27,7 @@ obj-$(CONFIG_IPQ_GCC_4019) += gcc-ipq401 obj-$(CONFIG_IPQ_GCC_6018) += gcc-ipq6018.o obj-$(CONFIG_IPQ_GCC_806X) += gcc-ipq806x.o obj-$(CONFIG_IPQ_GCC_8074) += gcc-ipq8074.o @@ -49,9 +45,6 @@ index e6cecf9e0436..1a4c4d55cb17 100644 obj-$(CONFIG_IPQ_LCC_806X) += lcc-ipq806x.o obj-$(CONFIG_MDM_GCC_9607) += gcc-mdm9607.o obj-$(CONFIG_MDM_GCC_9615) += gcc-mdm9615.o -diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c -new file mode 100644 -index 000000000000..b2a2d618a5ec --- /dev/null +++ b/drivers/clk/qcom/gcc-ipq9574.c @@ -0,0 +1,4248 @@ @@ -4303,6 +4296,3 @@ index 000000000000..b2a2d618a5ec + +MODULE_DESCRIPTION("Qualcomm Technologies, Inc. GCC IPQ9574 Driver"); +MODULE_LICENSE("GPL"); --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch b/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch index abdea2ab2b893a..61d2453b5e4bc1 100644 --- a/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch +++ b/target/linux/ipq95xx/patches-6.1/0008-dt-bindings-clock-Add-ipq9574-clock-and-reset-defini.patch @@ -21,9 +21,6 @@ Link: https://lore.kernel.org/r/20230316072940.29137-2-quic_devipriy@quicinc.com create mode 100644 include/dt-bindings/clock/qcom,ipq9574-gcc.h create mode 100644 include/dt-bindings/reset/qcom,ipq9574-gcc.h -diff --git a/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml -new file mode 100644 -index 000000000000..afc68eb9d7cc --- /dev/null +++ b/Documentation/devicetree/bindings/clock/qcom,ipq9574-gcc.yaml @@ -0,0 +1,61 @@ @@ -88,9 +85,6 @@ index 000000000000..afc68eb9d7cc + #power-domain-cells = <1>; + }; +... -diff --git a/include/dt-bindings/clock/qcom,ipq9574-gcc.h b/include/dt-bindings/clock/qcom,ipq9574-gcc.h -new file mode 100644 -index 000000000000..5a2961bfe893 --- /dev/null +++ b/include/dt-bindings/clock/qcom,ipq9574-gcc.h @@ -0,0 +1,213 @@ @@ -307,9 +301,6 @@ index 000000000000..5a2961bfe893 +#define GCC_SNOC_PCIE2_2LANE_S_CLK 202 +#define GCC_SNOC_PCIE3_2LANE_S_CLK 203 +#endif -diff --git a/include/dt-bindings/reset/qcom,ipq9574-gcc.h b/include/dt-bindings/reset/qcom,ipq9574-gcc.h -new file mode 100644 -index 000000000000..d01dc6a24cf1 --- /dev/null +++ b/include/dt-bindings/reset/qcom,ipq9574-gcc.h @@ -0,0 +1,164 @@ @@ -477,6 +468,3 @@ index 000000000000..d01dc6a24cf1 +#define GCC_TCSR_BCR 153 + +#endif --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch b/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch index 087f7766779474..b4461ebbb17c2f 100644 --- a/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch +++ b/target/linux/ipq95xx/patches-6.1/0009-pinctrl-qcom-Add-IPQ9574-pinctrl-driver.patch @@ -18,8 +18,6 @@ Signed-off-by: Linus Walleij 3 files changed, 838 insertions(+) create mode 100644 drivers/pinctrl/qcom/pinctrl-ipq9574.c -diff --git a/drivers/pinctrl/qcom/Kconfig b/drivers/pinctrl/qcom/Kconfig -index 9dc2d803a586..c8b6a4d90f3c 100644 --- a/drivers/pinctrl/qcom/Kconfig +++ b/drivers/pinctrl/qcom/Kconfig @@ -70,6 +70,17 @@ config PINCTRL_IPQ6018 @@ -40,11 +38,9 @@ index 9dc2d803a586..c8b6a4d90f3c 100644 config PINCTRL_MSM8226 tristate "Qualcomm 8226 pin controller driver" depends on OF -diff --git a/drivers/pinctrl/qcom/Makefile b/drivers/pinctrl/qcom/Makefile -index 8269a1db8794..79302d518ff3 100644 --- a/drivers/pinctrl/qcom/Makefile +++ b/drivers/pinctrl/qcom/Makefile -@@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_IPQ4019) += pinctrl-ipq4019.o +@@ -7,6 +7,7 @@ obj-$(CONFIG_PINCTRL_IPQ4019) += pinctrl obj-$(CONFIG_PINCTRL_IPQ8064) += pinctrl-ipq8064.o obj-$(CONFIG_PINCTRL_IPQ8074) += pinctrl-ipq8074.o obj-$(CONFIG_PINCTRL_IPQ6018) += pinctrl-ipq6018.o @@ -52,9 +48,6 @@ index 8269a1db8794..79302d518ff3 100644 obj-$(CONFIG_PINCTRL_MSM8226) += pinctrl-msm8226.o obj-$(CONFIG_PINCTRL_MSM8660) += pinctrl-msm8660.o obj-$(CONFIG_PINCTRL_MSM8960) += pinctrl-msm8960.o -diff --git a/drivers/pinctrl/qcom/pinctrl-ipq9574.c b/drivers/pinctrl/qcom/pinctrl-ipq9574.c -new file mode 100644 -index 000000000000..7f057b62475f --- /dev/null +++ b/drivers/pinctrl/qcom/pinctrl-ipq9574.c @@ -0,0 +1,826 @@ @@ -884,6 +877,3 @@ index 000000000000..7f057b62475f + +MODULE_DESCRIPTION("QTI IPQ9574 TLMM driver"); +MODULE_LICENSE("GPL"); --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch b/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch index fb65338b03eebf..3dd5c98d2a0a65 100644 --- a/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch +++ b/target/linux/ipq95xx/patches-6.1/0010-arm64-dts-qcom-ipq9574-Add-support-for-APSS-clock-co.patch @@ -14,11 +14,9 @@ Link: https://lore.kernel.org/r/20230406061314.10916-5-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 3bb7435f5e7f..00aeb994ee60 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -201,6 +201,24 @@ v2m2: v2m@2000 { +@@ -201,6 +201,24 @@ }; }; @@ -43,6 +41,3 @@ index 3bb7435f5e7f..00aeb994ee60 100644 timer@b120000 { compatible = "arm,armv7-timer-mem"; reg = <0x0b120000 0x1000>; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch b/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch index 3dcab1e25d8b7b..9c5bdb73f633b0 100644 --- a/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch +++ b/target/linux/ipq95xx/patches-6.1/0011-clk-qcom-apss-ipq-pll-Add-support-for-IPQ9574.patch @@ -17,11 +17,9 @@ Link: https://lore.kernel.org/r/20230406061314.10916-3-quic_devipriy@quicinc.com drivers/clk/qcom/apss-ipq-pll.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) -diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c -index 4f2a147e9fb2..56f33af11311 100644 --- a/drivers/clk/qcom/apss-ipq-pll.c +++ b/drivers/clk/qcom/apss-ipq-pll.c -@@ -68,6 +68,18 @@ static const struct alpha_pll_config ipq8074_pll_config = { +@@ -68,6 +68,18 @@ static const struct alpha_pll_config ipq .test_ctl_hi_val = 0x4000, }; @@ -40,7 +38,7 @@ index 4f2a147e9fb2..56f33af11311 100644 struct apss_pll_data { struct clk_alpha_pll *pll; const struct alpha_pll_config *pll_config; -@@ -83,6 +95,12 @@ static struct apss_pll_data ipq6018_pll_data = { +@@ -83,6 +95,12 @@ static struct apss_pll_data ipq6018_pll_ .pll_config = &ipq6018_pll_config, }; @@ -53,7 +51,7 @@ index 4f2a147e9fb2..56f33af11311 100644 static const struct regmap_config ipq_pll_regmap_config = { .reg_bits = 32, .reg_stride = 4, -@@ -124,6 +142,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) +@@ -124,6 +142,7 @@ static int apss_ipq_pll_probe(struct pla static const struct of_device_id apss_ipq_pll_match_table[] = { { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data }, { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data }, @@ -61,6 +59,3 @@ index 4f2a147e9fb2..56f33af11311 100644 { } }; MODULE_DEVICE_TABLE(of, apss_ipq_pll_match_table); --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch b/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch index 043a60a05bdc63..fd7b046099d3ee 100644 --- a/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch +++ b/target/linux/ipq95xx/patches-6.1/0012-regulator-qcom_smd-Add-MP5496-S1-regulator.patch @@ -15,11 +15,9 @@ Signed-off-by: Mark Brown drivers/regulator/qcom_smd-regulator.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) -diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c -index f98168d58dce..88ef56a60b2a 100644 --- a/drivers/regulator/qcom_smd-regulator.c +++ b/drivers/regulator/qcom_smd-regulator.c -@@ -731,7 +731,7 @@ static const struct regulator_desc pms405_pldo600 = { +@@ -731,7 +731,7 @@ static const struct regulator_desc pms40 .ops = &rpm_smps_ldo_ops, }; @@ -38,6 +36,3 @@ index f98168d58dce..88ef56a60b2a 100644 { "l2", QCOM_SMD_RPM_LDOA, 2, &mp5496_ldoa2, "l2" }, {} }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch b/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch index 64523c9e3d6735..cc1d654b03753c 100644 --- a/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch +++ b/target/linux/ipq95xx/patches-6.1/0013-arm64-dts-qcom-ipq9574-rename-al02-c7-dts-to-rdp433.patch @@ -16,11 +16,9 @@ Link: https://lore.kernel.org/r/20230425084010.15581-7-quic_devipriy@quicinc.com 2 files changed, 2 insertions(+), 2 deletions(-) rename arch/arm64/boot/dts/qcom/{ipq9574-al02-c7.dts => ipq9574-rdp433.dts} (97%) -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index 8e04f0f663da..3754d83ed2cb 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -7,7 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb +@@ -7,7 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01- dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb @@ -29,21 +27,177 @@ index 8e04f0f663da..3754d83ed2cb 100644 dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -similarity index 97% -rename from arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts -rename to arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -index 2c8430197ec0..2ce8e09e7565 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-al02-c7.dts -+++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -@@ -1,6 +1,6 @@ - // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) - /* ++++ /dev/null +@@ -1,84 +0,0 @@ +-// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) +-/* - * IPQ9574 AL02-C7 board device tree source +- * +- * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. +- * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. +- */ +- +-/dts-v1/; +- +-#include "ipq9574.dtsi" +- +-/ { +- model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7"; +- compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574"; +- +- aliases { +- serial0 = &blsp1_uart2; +- }; +- +- chosen { +- stdout-path = "serial0:115200n8"; +- }; +-}; +- +-&blsp1_uart2 { +- pinctrl-0 = <&uart2_pins>; +- pinctrl-names = "default"; +- status = "okay"; +-}; +- +-&sdhc_1 { +- pinctrl-0 = <&sdc_default_state>; +- pinctrl-names = "default"; +- mmc-ddr-1_8v; +- mmc-hs200-1_8v; +- mmc-hs400-1_8v; +- mmc-hs400-enhanced-strobe; +- max-frequency = <384000000>; +- bus-width = <8>; +- status = "okay"; +-}; +- +-&sleep_clk { +- clock-frequency = <32000>; +-}; +- +-&tlmm { +- sdc_default_state: sdc-default-state { +- clk-pins { +- pins = "gpio5"; +- function = "sdc_clk"; +- drive-strength = <8>; +- bias-disable; +- }; +- +- cmd-pins { +- pins = "gpio4"; +- function = "sdc_cmd"; +- drive-strength = <8>; +- bias-pull-up; +- }; +- +- data-pins { +- pins = "gpio0", "gpio1", "gpio2", +- "gpio3", "gpio6", "gpio7", +- "gpio8", "gpio9"; +- function = "sdc_data"; +- drive-strength = <8>; +- bias-pull-up; +- }; +- +- rclk-pins { +- pins = "gpio10"; +- function = "sdc_rclk"; +- drive-strength = <8>; +- bias-pull-down; +- }; +- }; +-}; +- +-&xo_board_clk { +- clock-frequency = <24000000>; +-}; +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +@@ -0,0 +1,84 @@ ++// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) ++/* + * IPQ9574 RDP433 board device tree source - * - * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. --- -2.34.1 - ++ * ++ * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved. ++ * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. ++ */ ++ ++/dts-v1/; ++ ++#include "ipq9574.dtsi" ++ ++/ { ++ model = "Qualcomm Technologies, Inc. IPQ9574/AP-AL02-C7"; ++ compatible = "qcom,ipq9574-ap-al02-c7", "qcom,ipq9574"; ++ ++ aliases { ++ serial0 = &blsp1_uart2; ++ }; ++ ++ chosen { ++ stdout-path = "serial0:115200n8"; ++ }; ++}; ++ ++&blsp1_uart2 { ++ pinctrl-0 = <&uart2_pins>; ++ pinctrl-names = "default"; ++ status = "okay"; ++}; ++ ++&sdhc_1 { ++ pinctrl-0 = <&sdc_default_state>; ++ pinctrl-names = "default"; ++ mmc-ddr-1_8v; ++ mmc-hs200-1_8v; ++ mmc-hs400-1_8v; ++ mmc-hs400-enhanced-strobe; ++ max-frequency = <384000000>; ++ bus-width = <8>; ++ status = "okay"; ++}; ++ ++&sleep_clk { ++ clock-frequency = <32000>; ++}; ++ ++&tlmm { ++ sdc_default_state: sdc-default-state { ++ clk-pins { ++ pins = "gpio5"; ++ function = "sdc_clk"; ++ drive-strength = <8>; ++ bias-disable; ++ }; ++ ++ cmd-pins { ++ pins = "gpio4"; ++ function = "sdc_cmd"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ data-pins { ++ pins = "gpio0", "gpio1", "gpio2", ++ "gpio3", "gpio6", "gpio7", ++ "gpio8", "gpio9"; ++ function = "sdc_data"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++ ++ rclk-pins { ++ pins = "gpio10"; ++ function = "sdc_rclk"; ++ drive-strength = <8>; ++ bias-pull-down; ++ }; ++ }; ++}; ++ ++&xo_board_clk { ++ clock-frequency = <24000000>; ++}; diff --git a/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch b/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch index 2f37a145aeb57a..bda5121cfed6ca 100644 --- a/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch +++ b/target/linux/ipq95xx/patches-6.1/0014-arm64-dts-qcom-ipq9574-Drop-bias_pll_ubi_nc_clk-inpu.patch @@ -13,11 +13,9 @@ Link: https://lore.kernel.org/r/20230425084010.15581-6-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 00aeb994ee60..0b8cd6ca0abe 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -16,12 +16,6 @@ / { +@@ -16,12 +16,6 @@ #size-cells = <2>; clocks { @@ -30,7 +28,7 @@ index 00aeb994ee60..0b8cd6ca0abe 100644 sleep_clk: sleep-clk { compatible = "fixed-clock"; #clock-cells = <0>; -@@ -131,7 +125,7 @@ gcc: clock-controller@1800000 { +@@ -131,7 +125,7 @@ reg = <0x01800000 0x80000>; clocks = <&xo_board_clk>, <&sleep_clk>, @@ -39,6 +37,3 @@ index 00aeb994ee60..0b8cd6ca0abe 100644 <0>, <0>, <0>, --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch b/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch index 7f7bd63031a7ab..302c6a5eb10f6a 100644 --- a/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch +++ b/target/linux/ipq95xx/patches-6.1/0015-arm64-dts-qcom-ipq9574-Update-the-size-of-GICC-GICV-.patch @@ -15,11 +15,9 @@ Link: https://lore.kernel.org/r/20230425084010.15581-2-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 0b8cd6ca0abe..77fd9b02df69 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -166,14 +166,14 @@ blsp1_uart2: serial@78b1000 { +@@ -166,14 +166,14 @@ intc: interrupt-controller@b000000 { compatible = "qcom,msm-qgic2"; reg = <0x0b000000 0x1000>, /* GICD */ @@ -37,6 +35,3 @@ index 0b8cd6ca0abe..77fd9b02df69 100644 ranges = <0 0x0b00c000 0x3000>; v2m0: v2m@0 { --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch b/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch index 118aeb807a2427..564e89b0d41e28 100644 --- a/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch +++ b/target/linux/ipq95xx/patches-6.1/0016-arm64-dts-qcom-ipq9574-add-support-for-RDP418-varian.patch @@ -19,11 +19,9 @@ Link: https://lore.kernel.org/r/20230510104359.16678-3-quic_devipriy@quicinc.com 2 files changed, 125 insertions(+) create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index 3754d83ed2cb..c3aaa9e91dce 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01-c1.dtb +@@ -7,6 +7,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq6018-cp01- dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk01.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb @@ -31,9 +29,6 @@ index 3754d83ed2cb..c3aaa9e91dce 100644 dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts -new file mode 100644 -index 000000000000..2b093e02637b --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts @@ -0,0 +1,124 @@ @@ -161,6 +156,3 @@ index 000000000000..2b093e02637b +&xo_board_clk { + clock-frequency = <24000000>; +}; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch b/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch index d6b1156c67d14a..e357482f37fa8c 100644 --- a/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch +++ b/target/linux/ipq95xx/patches-6.1/0017-arm64-dts-qcom-ipq9574-Add-SMEM-support.patch @@ -12,11 +12,9 @@ Link: https://lore.kernel.org/r/20230511075814.2370-3-quic_poovendh@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 13 +++++++++++++ 1 file changed, 13 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 77fd9b02df69..a8ce148e52e4 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -94,6 +94,13 @@ tz_region: tz@4a600000 { +@@ -94,6 +94,13 @@ reg = <0x0 0x4a600000 0x0 0x400000>; no-map; }; @@ -30,7 +28,7 @@ index 77fd9b02df69..a8ce148e52e4 100644 }; soc: soc@0 { -@@ -136,6 +143,12 @@ gcc: clock-controller@1800000 { +@@ -136,6 +143,12 @@ #power-domain-cells = <1>; }; @@ -43,6 +41,3 @@ index 77fd9b02df69..a8ce148e52e4 100644 sdhc_1: mmc@7804000 { compatible = "qcom,ipq9574-sdhci", "qcom,sdhci-msm-v5"; reg = <0x07804000 0x1000>, <0x07805000 0x1000>; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch b/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch index 4d2d3fdf50dff3..59c88969c428d7 100644 --- a/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch +++ b/target/linux/ipq95xx/patches-6.1/0018-arm64-dts-qcom-ipq9574-add-support-for-RDP449-varian.patch @@ -18,11 +18,9 @@ Link: https://lore.kernel.org/r/20230516135013.3547-3-quic_devipriy@quicinc.com 2 files changed, 81 insertions(+) create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index c3aaa9e91dce..f237a3683ca4 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c1.dtb +@@ -9,6 +9,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10- dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb @@ -30,9 +28,6 @@ index c3aaa9e91dce..f237a3683ca4 100644 dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts -new file mode 100644 -index 000000000000..c8fa54e1a62c --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts @@ -0,0 +1,80 @@ @@ -116,6 +111,3 @@ index 000000000000..c8fa54e1a62c +&xo_board_clk { + clock-frequency = <24000000>; +}; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch b/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch index 938dee32dcebbe..54ea709d548dd5 100644 --- a/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch +++ b/target/linux/ipq95xx/patches-6.1/0019-arm64-dts-qcom-ipq9574-Add-cpufreq-support.patch @@ -15,8 +15,6 @@ Link: https://lore.kernel.org/r/20230517172527.1968-4-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 60 ++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index a8ce148e52e4..2d0a10f6c302 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi @@ -6,8 +6,9 @@ @@ -30,7 +28,7 @@ index a8ce148e52e4..2d0a10f6c302 100644 #include / { -@@ -37,6 +38,10 @@ CPU0: cpu@0 { +@@ -37,6 +38,10 @@ reg = <0x0>; enable-method = "psci"; next-level-cache = <&L2_0>; @@ -41,7 +39,7 @@ index a8ce148e52e4..2d0a10f6c302 100644 }; CPU1: cpu@1 { -@@ -45,6 +50,10 @@ CPU1: cpu@1 { +@@ -45,6 +50,10 @@ reg = <0x1>; enable-method = "psci"; next-level-cache = <&L2_0>; @@ -52,7 +50,7 @@ index a8ce148e52e4..2d0a10f6c302 100644 }; CPU2: cpu@2 { -@@ -53,6 +62,10 @@ CPU2: cpu@2 { +@@ -53,6 +62,10 @@ reg = <0x2>; enable-method = "psci"; next-level-cache = <&L2_0>; @@ -63,7 +61,7 @@ index a8ce148e52e4..2d0a10f6c302 100644 }; CPU3: cpu@3 { -@@ -61,6 +74,10 @@ CPU3: cpu@3 { +@@ -61,6 +74,10 @@ reg = <0x3>; enable-method = "psci"; next-level-cache = <&L2_0>; @@ -74,7 +72,7 @@ index a8ce148e52e4..2d0a10f6c302 100644 }; L2_0: l2-cache { -@@ -75,6 +92,47 @@ memory@40000000 { +@@ -75,6 +92,47 @@ reg = <0x0 0x40000000 0x0 0x0>; }; @@ -122,6 +120,3 @@ index a8ce148e52e4..2d0a10f6c302 100644 pmu { compatible = "arm,cortex-a73-pmu"; interrupts = ; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch b/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch index f4a471b75a1f98..71e3278cd76de0 100644 --- a/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch +++ b/target/linux/ipq95xx/patches-6.1/0020-arm64-dts-qcom-ipq9574-Add-SMPA1-regulator-node.patch @@ -15,11 +15,9 @@ Link: https://lore.kernel.org/r/20230517172527.1968-3-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -index 2ce8e09e7565..2b3ed8d351f7 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -@@ -29,6 +29,25 @@ &blsp1_uart2 { +@@ -29,6 +29,25 @@ status = "okay"; }; @@ -45,6 +43,3 @@ index 2ce8e09e7565..2b3ed8d351f7 100644 &sdhc_1 { pinctrl-0 = <&sdc_default_state>; pinctrl-names = "default"; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch b/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch index c1fc3b23c59c10..fb89c28cb850fc 100644 --- a/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch +++ b/target/linux/ipq95xx/patches-6.1/0021-arm64-dts-qcom-ipq9574-Add-RPM-related-nodes.patch @@ -16,11 +16,9 @@ Link: https://lore.kernel.org/r/20230517172527.1968-2-quic_devipriy@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 2d0a10f6c302..5d99b9660e33 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -161,12 +161,29 @@ smem@4aa00000 { +@@ -161,12 +161,29 @@ }; }; @@ -50,6 +48,3 @@ index 2d0a10f6c302..5d99b9660e33 100644 tlmm: pinctrl@1000000 { compatible = "qcom,ipq9574-tlmm"; reg = <0x01000000 0x300000>; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch b/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch index 7c91c4a5639e76..0f779485093368 100644 --- a/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch +++ b/target/linux/ipq95xx/patches-6.1/0022-arm64-dts-qcom-ipq9574-add-few-device-nodes.patch @@ -13,11 +13,9 @@ Link: https://lore.kernel.org/r/20230517072806.13170-1-quic_kathirav@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 202 ++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 5d99b9660e33..3bef06ea1c19 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -184,6 +184,13 @@ rpm_msg_ram: sram@60000 { +@@ -184,6 +184,13 @@ reg = <0x00060000 0x6000>; }; @@ -31,7 +29,7 @@ index 5d99b9660e33..3bef06ea1c19 100644 tlmm: pinctrl@1000000 { compatible = "qcom,ipq9574-tlmm"; reg = <0x01000000 0x300000>; -@@ -241,6 +248,36 @@ sdhc_1: mmc@7804000 { +@@ -241,6 +248,36 @@ status = "disabled"; }; @@ -68,7 +66,7 @@ index 5d99b9660e33..3bef06ea1c19 100644 blsp1_uart2: serial@78b1000 { compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm"; reg = <0x078b1000 0x200>; -@@ -251,6 +288,163 @@ blsp1_uart2: serial@78b1000 { +@@ -251,6 +288,163 @@ status = "disabled"; }; @@ -232,7 +230,7 @@ index 5d99b9660e33..3bef06ea1c19 100644 intc: interrupt-controller@b000000 { compatible = "qcom,msm-qgic2"; reg = <0x0b000000 0x1000>, /* GICD */ -@@ -301,6 +495,14 @@ a73pll: clock@b116000 { +@@ -301,6 +495,14 @@ clock-names = "xo"; }; @@ -247,6 +245,3 @@ index 5d99b9660e33..3bef06ea1c19 100644 timer@b120000 { compatible = "arm,armv7-timer-mem"; reg = <0x0b120000 0x1000>; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch b/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch index 7d5cb0fa5534be..c429ef0b4667c8 100644 --- a/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch +++ b/target/linux/ipq95xx/patches-6.1/0023-arm64-dts-qcom-add-few-more-reserved-memory-region.patch @@ -24,11 +24,9 @@ Link: https://lore.kernel.org/r/20230526110653.27777-4-quic_viswanat@quicinc.com arch/arm64/boot/dts/qcom/ipq8074.dtsi | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 5 deletions(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq6018.dtsi b/arch/arm64/boot/dts/qcom/ipq6018.dtsi -index c3492a383155..25cc02d30356 100644 --- a/arch/arm64/boot/dts/qcom/ipq6018.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq6018.dtsi -@@ -150,18 +150,28 @@ rpm_msg_ram: memory@60000 { +@@ -150,18 +150,28 @@ no-map; }; @@ -60,40 +58,3 @@ index c3492a383155..25cc02d30356 100644 no-map; }; }; -diff --git a/arch/arm64/boot/dts/qcom/ipq8074.dtsi b/arch/arm64/boot/dts/qcom/ipq8074.dtsi -index 3f7cf3fdd319..18e2cbe5687b 100644 ---- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi -+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi -@@ -85,17 +85,27 @@ reserved-memory { - #size-cells = <2>; - ranges; - -+ bootloader@4a600000 { -+ reg = <0x0 0x4a600000 0x0 0x400000>; -+ no-map; -+ }; -+ -+ sbl@4aa00000 { -+ reg = <0x0 0x4aa00000 0x0 0x100000>; -+ no-map; -+ }; -+ - smem@4ab00000 { - compatible = "qcom,smem"; -- reg = <0x0 0x4ab00000 0x0 0x00100000>; -+ reg = <0x0 0x4ab00000 0x0 0x100000>; - no-map; - - hwlocks = <&tcsr_mutex 0>; - }; - - memory@4ac00000 { -+ reg = <0x0 0x4ac00000 0x0 0x400000>; - no-map; -- reg = <0x0 0x4ac00000 0x0 0x00400000>; - }; - }; - --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch b/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch index 4c49a6cb95f3cd..6ad52b4982c30a 100644 --- a/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch +++ b/target/linux/ipq95xx/patches-6.1/0024-arm64-dts-qcom-ipq9574-add-QFPROM-node.patch @@ -15,11 +15,9 @@ Link: https://lore.kernel.org/r/20230526125305.19626-5-quic_kathirav@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 7 +++++++ 1 file changed, 7 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 3bef06ea1c19..b6e4a8a73354 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -191,6 +191,13 @@ rng: rng@e3000 { +@@ -191,6 +191,13 @@ clock-names = "core"; }; @@ -33,6 +31,3 @@ index 3bef06ea1c19..b6e4a8a73354 100644 tlmm: pinctrl@1000000 { compatible = "qcom,ipq9574-tlmm"; reg = <0x01000000 0x300000>; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch b/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch index f50db9dc94a6c2..57eb656cbd0be9 100644 --- a/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch +++ b/target/linux/ipq95xx/patches-6.1/0025-arm64-dts-qcom-ipq9574-add-support-for-RDP453-varian.patch @@ -17,11 +17,9 @@ Link: https://lore.kernel.org/r/20230526153152.777-3-quic_devipriy@quicinc.com 2 files changed, 81 insertions(+) create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index f237a3683ca4..082a5c975288 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10-c2.dtb +@@ -10,6 +10,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq8074-hk10- dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb @@ -29,9 +27,6 @@ index f237a3683ca4..082a5c975288 100644 dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts -new file mode 100644 -index 000000000000..f01de6628c3b --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts @@ -0,0 +1,80 @@ @@ -115,6 +110,3 @@ index 000000000000..f01de6628c3b +&xo_board_clk { + clock-frequency = <24000000>; +}; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch b/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch index 0403ae55fff98a..fa8e886bd0830c 100644 --- a/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch +++ b/target/linux/ipq95xx/patches-6.1/0026-arm64-dts-qcom-ipq9574-add-support-for-RDP454-varian.patch @@ -17,11 +17,9 @@ Link: https://lore.kernel.org/r/20230531032648.23816-3-quic_poovendh@quicinc.com 2 files changed, 81 insertions(+) create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts -diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile -index 082a5c975288..a3816c25181e 100644 --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp418.dtb +@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp41 dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp433.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp449.dtb dtb-$(CONFIG_ARCH_QCOM) += ipq9574-rdp453.dtb @@ -29,9 +27,6 @@ index 082a5c975288..a3816c25181e 100644 dtb-$(CONFIG_ARCH_QCOM) += msm8916-alcatel-idol347.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-asus-z00l.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-huawei-g7.dtb -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts -new file mode 100644 -index 000000000000..6efae3426cb8 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts @@ -0,0 +1,80 @@ @@ -115,6 +110,3 @@ index 000000000000..6efae3426cb8 +&xo_board_clk { + clock-frequency = <24000000>; +}; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch b/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch index e1b7d0da563598..f30d3e47d2fe88 100644 --- a/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch +++ b/target/linux/ipq95xx/patches-6.1/0027-arm64-dts-qcom-ipq9574-add-few-more-reserved-memory-.patch @@ -25,11 +25,9 @@ Link: https://lore.kernel.org/r/20230602084431.19134-1-quic_anusha@quicinc.com arch/arm64/boot/dts/qcom/ipq9574.dtsi | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index b6e4a8a73354..30430133e39a 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -148,6 +148,16 @@ reserved-memory { +@@ -148,6 +148,16 @@ #size-cells = <2>; ranges; @@ -46,7 +44,7 @@ index b6e4a8a73354..30430133e39a 100644 tz_region: tz@4a600000 { reg = <0x0 0x4a600000 0x0 0x400000>; no-map; -@@ -155,7 +165,7 @@ tz_region: tz@4a600000 { +@@ -155,7 +165,7 @@ smem@4aa00000 { compatible = "qcom,smem"; @@ -55,6 +53,3 @@ index b6e4a8a73354..30430133e39a 100644 hwlocks = <&tcsr_mutex 0>; no-map; }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch b/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch index 2575f6903d6a69..943b55960375d0 100644 --- a/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch +++ b/target/linux/ipq95xx/patches-6.1/0028-arm64-dts-qcom-ipq9574-Use-assigned-clock-rates-for-.patch @@ -14,11 +14,9 @@ Signed-off-by: Bjorn Andersson arch/arm64/boot/dts/qcom/ipq9574.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 30430133e39a..ced7779f87ac 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -358,6 +358,8 @@ blsp1_i2c1: i2c@78b6000 { +@@ -358,6 +358,8 @@ clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; @@ -27,7 +25,7 @@ index 30430133e39a..ced7779f87ac 100644 dmas = <&blsp_dma 14>, <&blsp_dma 15>; dma-names = "tx", "rx"; status = "disabled"; -@@ -386,6 +388,8 @@ blsp1_i2c2: i2c@78b7000 { +@@ -386,6 +388,8 @@ clocks = <&gcc GCC_BLSP1_QUP3_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; @@ -36,7 +34,7 @@ index 30430133e39a..ced7779f87ac 100644 dmas = <&blsp_dma 16>, <&blsp_dma 17>; dma-names = "tx", "rx"; status = "disabled"; -@@ -414,6 +418,8 @@ blsp1_i2c3: i2c@78b8000 { +@@ -414,6 +418,8 @@ clocks = <&gcc GCC_BLSP1_QUP4_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; @@ -45,7 +43,7 @@ index 30430133e39a..ced7779f87ac 100644 dmas = <&blsp_dma 18>, <&blsp_dma 19>; dma-names = "tx", "rx"; status = "disabled"; -@@ -443,6 +449,8 @@ blsp1_i2c4: i2c@78b9000 { +@@ -443,6 +449,8 @@ clocks = <&gcc GCC_BLSP1_QUP5_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; clock-names = "core", "iface"; @@ -54,6 +52,3 @@ index 30430133e39a..ced7779f87ac 100644 dmas = <&blsp_dma 20>, <&blsp_dma 21>; dma-names = "tx", "rx"; status = "disabled"; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch b/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch index 46eb3c9ce2c1dd..77140650ef9030 100644 --- a/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch +++ b/target/linux/ipq95xx/patches-6.1/0029-arm64-dts-qcom-ipq9574-Fix-hwlock-index-for-SMEM.patch @@ -18,11 +18,9 @@ Signed-off-by: Bjorn Andersson arch/arm64/boot/dts/qcom/ipq9574.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index ced7779f87ac..3b4ebf165380 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -166,7 +166,7 @@ tz_region: tz@4a600000 { +@@ -166,7 +166,7 @@ smem@4aa00000 { compatible = "qcom,smem"; reg = <0x0 0x4aa00000 0x0 0x100000>; @@ -31,6 +29,3 @@ index ced7779f87ac..3b4ebf165380 100644 no-map; }; }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch b/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch index 74e5b6d63675b0..bbdb49b9de39d7 100644 --- a/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch +++ b/target/linux/ipq95xx/patches-6.1/0030-arm64-dts-qcom-ipq9574-include-the-GPLL0-as-clock-pr.patch @@ -20,11 +20,9 @@ Signed-off-by: Bjorn Andersson arch/arm64/boot/dts/qcom/ipq9574.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 3b4ebf165380..452ac4deed0b 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -507,8 +507,8 @@ apcs_glb: mailbox@b111000 { +@@ -507,8 +507,8 @@ "qcom,ipq6018-apcs-apps-global"; reg = <0x0b111000 0x1000>; #clock-cells = <1>; @@ -35,6 +33,3 @@ index 3b4ebf165380..452ac4deed0b 100644 #mbox-cells = <1>; }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch b/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch index c9a341af11cd5d..767cb797177637 100644 --- a/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch +++ b/target/linux/ipq95xx/patches-6.1/0031-clk-qcom-apss-ipq6018-add-the-GPLL0-clock-also-as-cl.patch @@ -21,8 +21,6 @@ Signed-off-by: Bjorn Andersson drivers/clk/qcom/apss-ipq6018.c | 3 +++ 1 file changed, 3 insertions(+) -diff --git a/drivers/clk/qcom/apss-ipq6018.c b/drivers/clk/qcom/apss-ipq6018.c -index f2f502e2d5a4..4e13a085a857 100644 --- a/drivers/clk/qcom/apss-ipq6018.c +++ b/drivers/clk/qcom/apss-ipq6018.c @@ -20,16 +20,19 @@ @@ -45,6 +43,3 @@ index f2f502e2d5a4..4e13a085a857 100644 { P_APSS_PLL_EARLY, 5 }, }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch b/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch index 38bd8a5b5150c8..d07a21f5b9224b 100644 --- a/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch +++ b/target/linux/ipq95xx/patches-6.1/0032-clk-qcom-ipq9574-drop-the-CLK_SET_RATE_PARENT-flag-f.patch @@ -21,11 +21,9 @@ Signed-off-by: Bjorn Andersson drivers/clk/qcom/gcc-ipq9574.c | 4 ---- 1 file changed, 4 deletions(-) -diff --git a/drivers/clk/qcom/gcc-ipq9574.c b/drivers/clk/qcom/gcc-ipq9574.c -index b2a2d618a5ec..806b8ba9633c 100644 --- a/drivers/clk/qcom/gcc-ipq9574.c +++ b/drivers/clk/qcom/gcc-ipq9574.c -@@ -87,7 +87,6 @@ static struct clk_fixed_factor gpll0_out_main_div2 = { +@@ -87,7 +87,6 @@ static struct clk_fixed_factor gpll0_out &gpll0_main.clkr.hw }, .num_parents = 1, @@ -33,7 +31,7 @@ index b2a2d618a5ec..806b8ba9633c 100644 .ops = &clk_fixed_factor_ops, }, }; -@@ -102,7 +101,6 @@ static struct clk_alpha_pll_postdiv gpll0 = { +@@ -102,7 +101,6 @@ static struct clk_alpha_pll_postdiv gpll &gpll0_main.clkr.hw }, .num_parents = 1, @@ -41,7 +39,7 @@ index b2a2d618a5ec..806b8ba9633c 100644 .ops = &clk_alpha_pll_postdiv_ro_ops, }, }; -@@ -132,7 +130,6 @@ static struct clk_alpha_pll_postdiv gpll4 = { +@@ -132,7 +130,6 @@ static struct clk_alpha_pll_postdiv gpll &gpll4_main.clkr.hw }, .num_parents = 1, @@ -49,7 +47,7 @@ index b2a2d618a5ec..806b8ba9633c 100644 .ops = &clk_alpha_pll_postdiv_ro_ops, }, }; -@@ -162,7 +159,6 @@ static struct clk_alpha_pll_postdiv gpll2 = { +@@ -162,7 +159,6 @@ static struct clk_alpha_pll_postdiv gpll &gpll2_main.clkr.hw }, .num_parents = 1, @@ -57,6 +55,3 @@ index b2a2d618a5ec..806b8ba9633c 100644 .ops = &clk_alpha_pll_postdiv_ro_ops, }, }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch b/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch index b103ec67281e76..fc54c2db071d3d 100644 --- a/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch +++ b/target/linux/ipq95xx/patches-6.1/0033-firmware-qcom_scm-use-64-bit-calling-convention-only.patch @@ -23,31 +23,26 @@ Signed-off-by: Bjorn Andersson drivers/firmware/qcom_scm.c | 7 +++++++ 1 file changed, 7 insertions(+) -diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c -index 51eb85354c05..58f1a86065dc 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c -@@ -164,6 +164,12 @@ static enum qcom_scm_convention __get_convention(void) - if (likely(qcom_scm_convention != SMC_CONVENTION_UNKNOWN)) - return qcom_scm_convention; - -+ /* +@@ -171,6 +171,12 @@ static enum qcom_scm_convention __get_co + */ + #if IS_ENABLED(CONFIG_ARM64) + /* + * Per the "SMC calling convention specification", the 64-bit calling + * convention can only be used when the client is 64-bit, otherwise + * system will encounter the undefined behaviour. + */ +#if IS_ENABLED(CONFIG_ARM64) - /* ++ /* * Device isn't required as there is only one argument - no device * needed to dma_map_single to secure world -@@ -184,6 +190,7 @@ static enum qcom_scm_convention __get_convention(void) - forced = true; - goto found; + */ +@@ -286,6 +292,7 @@ static bool __qcom_scm_is_call_available + pr_err("Unknown SMC convention being used\n"); + return false; } +#endif - probed_convention = SMC_CONVENTION_ARM_32; - ret = __scm_smc_call(NULL, &desc, probed_convention, &res, true); --- -2.34.1 - + ret = qcom_scm_call(dev, &desc, &res); + diff --git a/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch b/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch index f1b55835fce7f5..139d4d663b04b9 100644 --- a/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch +++ b/target/linux/ipq95xx/patches-6.1/0034-arm64-dts-qcom-ipq9574-Add-common-RDP-dtsi-file.patch @@ -20,9 +20,6 @@ Signed-off-by: Bjorn Andersson 6 files changed, 107 insertions(+), 292 deletions(-) create mode 100644 arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi -new file mode 100644 -index 000000000000..c935ac53efe6 --- /dev/null +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi @@ -0,0 +1,102 @@ @@ -128,8 +125,6 @@ index 000000000000..c935ac53efe6 +&xo_board_clk { + clock-frequency = <24000000>; +}; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts -index 2b093e02637b..f4f9199d4ab1 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp418.dts @@ -8,58 +8,12 @@ @@ -192,7 +187,7 @@ index 2b093e02637b..f4f9199d4ab1 100644 }; &sdhc_1 { -@@ -74,10 +28,6 @@ &sdhc_1 { +@@ -74,10 +28,6 @@ status = "okay"; }; @@ -203,7 +198,7 @@ index 2b093e02637b..f4f9199d4ab1 100644 &tlmm { sdc_default_state: sdc-default-state { clk-pins { -@@ -110,15 +60,4 @@ rclk-pins { +@@ -110,15 +60,4 @@ bias-pull-down; }; }; @@ -219,8 +214,6 @@ index 2b093e02637b..f4f9199d4ab1 100644 -&xo_board_clk { - clock-frequency = <24000000>; }; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts -index 2b3ed8d351f7..16217471893d 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp433.dts @@ -8,44 +8,12 @@ @@ -269,7 +262,7 @@ index 2b3ed8d351f7..16217471893d 100644 }; &sdhc_1 { -@@ -97,7 +65,3 @@ rclk-pins { +@@ -97,7 +65,3 @@ }; }; }; @@ -277,8 +270,6 @@ index 2b3ed8d351f7..16217471893d 100644 -&xo_board_clk { - clock-frequency = <24000000>; -}; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts -index c8fa54e1a62c..d36d1078763e 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp449.dts @@ -8,73 +8,10 @@ @@ -356,8 +347,6 @@ index c8fa54e1a62c..d36d1078763e 100644 -&xo_board_clk { - clock-frequency = <24000000>; }; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts -index f01de6628c3b..c30c9fbedf26 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp453.dts @@ -8,73 +8,10 @@ @@ -435,8 +424,6 @@ index f01de6628c3b..c30c9fbedf26 100644 -&xo_board_clk { - clock-frequency = <24000000>; }; -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts -index 6efae3426cb8..0dc382f5d5ec 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp454.dts @@ -8,73 +8,9 @@ @@ -514,6 +501,3 @@ index 6efae3426cb8..0dc382f5d5ec 100644 -&xo_board_clk { - clock-frequency = <24000000>; }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch b/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch index c4eb599500e285..a5419d2d0cf7a5 100644 --- a/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch +++ b/target/linux/ipq95xx/patches-6.1/0035-arm64-dts-qcom-ipq9574-populate-the-opp-table-based-.patch @@ -31,11 +31,9 @@ Signed-off-by: Bjorn Andersson arch/arm64/boot/dts/qcom/ipq9574.dtsi | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574.dtsi b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -index 452ac4deed0b..a4123453f5e8 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574.dtsi -@@ -93,42 +93,56 @@ memory@40000000 { +@@ -93,42 +93,56 @@ }; cpu_opp_table: opp-table-cpu { @@ -93,7 +91,7 @@ index 452ac4deed0b..a4123453f5e8 100644 clock-latency-ns = <200000>; }; }; -@@ -206,6 +220,11 @@ qfprom: efuse@a4000 { +@@ -206,6 +220,11 @@ reg = <0x000a4000 0x5a1>; #address-cells = <1>; #size-cells = <1>; @@ -105,6 +103,3 @@ index 452ac4deed0b..a4123453f5e8 100644 }; tlmm: pinctrl@1000000 { --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch b/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch index d4f85449784a35..34213c41378d19 100644 --- a/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch +++ b/target/linux/ipq95xx/patches-6.1/0036-clk-qcom-clk-alpha-pll-introduce-stromer-plus-ops.patch @@ -18,11 +18,9 @@ Signed-off-by: Bjorn Andersson drivers/clk/qcom/clk-alpha-pll.h | 1 + 2 files changed, 64 insertions(+) -diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c -index 8e5e7a26bcc4..56f1795847cd 100644 --- a/drivers/clk/qcom/clk-alpha-pll.c +++ b/drivers/clk/qcom/clk-alpha-pll.c -@@ -2434,3 +2434,66 @@ const struct clk_ops clk_alpha_pll_stromer_ops = { +@@ -2434,3 +2434,66 @@ const struct clk_ops clk_alpha_pll_strom .set_rate = clk_alpha_pll_stromer_set_rate, }; EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_ops); @@ -89,11 +87,9 @@ index 8e5e7a26bcc4..56f1795847cd 100644 + .set_rate = clk_alpha_pll_stromer_plus_set_rate, +}; +EXPORT_SYMBOL_GPL(clk_alpha_pll_stromer_plus_ops); -diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h -index 51d4043c7e4f..eb072ae7861c 100644 --- a/drivers/clk/qcom/clk-alpha-pll.h +++ b/drivers/clk/qcom/clk-alpha-pll.h -@@ -145,6 +145,7 @@ extern const struct clk_ops clk_alpha_pll_postdiv_ops; +@@ -145,6 +145,7 @@ extern const struct clk_ops clk_alpha_pl extern const struct clk_ops clk_alpha_pll_huayra_ops; extern const struct clk_ops clk_alpha_pll_postdiv_ro_ops; extern const struct clk_ops clk_alpha_pll_stromer_ops; @@ -101,6 +97,3 @@ index 51d4043c7e4f..eb072ae7861c 100644 extern const struct clk_ops clk_alpha_pll_fabia_ops; extern const struct clk_ops clk_alpha_pll_fixed_fabia_ops; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch b/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch index a178ef4d8a63f5..e07815592d65a3 100644 --- a/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch +++ b/target/linux/ipq95xx/patches-6.1/0037-cpufreq-qcom-nvmem-Introduce-cpufreq-for-ipq95xx.patch @@ -24,11 +24,9 @@ Signed-off-by: Viresh Kumar include/dt-bindings/arm/qcom,ids.h | 6 ++++++ 3 files changed, 12 insertions(+) -diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c -index 69a8742c0a7a..3df1d5747ab7 100644 --- a/drivers/cpufreq/cpufreq-dt-platdev.c +++ b/drivers/cpufreq/cpufreq-dt-platdev.c -@@ -164,6 +164,7 @@ static const struct of_device_id blocklist[] __initconst = { +@@ -164,6 +164,7 @@ static const struct of_device_id blockli { .compatible = "ti,omap3", }, { .compatible = "qcom,ipq8064", }, @@ -36,11 +34,9 @@ index 69a8742c0a7a..3df1d5747ab7 100644 { .compatible = "qcom,apq8064", }, { .compatible = "qcom,msm8974", }, { .compatible = "qcom,msm8960", }, -diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c -index a88b6fe5db50..902a0557d832 100644 --- a/drivers/cpufreq/qcom-cpufreq-nvmem.c +++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c -@@ -149,6 +149,11 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev, +@@ -149,6 +149,11 @@ static int qcom_cpufreq_kryo_name_versio switch (msm_id) { case QCOM_ID_MSM8996: case QCOM_ID_APQ8096: @@ -52,8 +48,6 @@ index a88b6fe5db50..902a0557d832 100644 drv->versions = 1 << (unsigned int)(*speedbin); break; case QCOM_ID_MSM8996SG: -diff --git a/include/dt-bindings/arm/qcom,ids.h b/include/dt-bindings/arm/qcom,ids.h -index 755e08d494c5..7e77a7d84e2a 100644 --- a/include/dt-bindings/arm/qcom,ids.h +++ b/include/dt-bindings/arm/qcom,ids.h @@ -140,6 +140,12 @@ @@ -69,6 +63,3 @@ index 755e08d494c5..7e77a7d84e2a 100644 /* * The board type and revision information, used by Qualcomm bootloaders and --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch b/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch index 6e3c85529c203d..fe33b589d9d9a8 100644 --- a/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch +++ b/target/linux/ipq95xx/patches-6.1/0038-arm64-dts-qcom-ipq9574-Enable-WPS-buttons.patch @@ -14,8 +14,6 @@ Signed-off-by: Bjorn Andersson .../boot/dts/qcom/ipq9574-rdp-common.dtsi | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) -diff --git a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi -index c935ac53efe6..526f0dbbdbe9 100644 --- a/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq9574-rdp-common.dtsi @@ -8,6 +8,8 @@ @@ -27,7 +25,7 @@ index c935ac53efe6..526f0dbbdbe9 100644 #include "ipq9574.dtsi" / { -@@ -36,6 +38,19 @@ regulator_fixed_0p925: s0925 { +@@ -36,6 +38,19 @@ regulator-always-on; regulator-name = "fixed_0p925"; }; @@ -47,7 +45,7 @@ index c935ac53efe6..526f0dbbdbe9 100644 }; &blsp1_spi0 { -@@ -95,6 +110,13 @@ spi_0_pins: spi-0-state { +@@ -95,6 +110,13 @@ drive-strength = <8>; bias-disable; }; @@ -61,6 +59,3 @@ index c935ac53efe6..526f0dbbdbe9 100644 }; &xo_board_clk { --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch b/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch index 57c572dea32a7f..6dba5446531841 100644 --- a/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch +++ b/target/linux/ipq95xx/patches-6.1/0039-clk-qcom-apss-ipq-pll-add-support-for-IPQ5332.patch @@ -18,11 +18,9 @@ Link: https://lore.kernel.org/r/20230217083308.12017-4-quic_kathirav@quicinc.com drivers/clk/qcom/apss-ipq-pll.c | 59 ++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) -diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c -index 56f33af11311..4ec347f0e8b1 100644 --- a/drivers/clk/qcom/apss-ipq-pll.c +++ b/drivers/clk/qcom/apss-ipq-pll.c -@@ -24,6 +24,18 @@ static const u8 ipq_pll_offsets[][PLL_OFF_MAX_REGS] = { +@@ -24,6 +24,18 @@ static const u8 ipq_pll_offsets[][PLL_OF [PLL_OFF_TEST_CTL] = 0x30, [PLL_OFF_TEST_CTL_U] = 0x34, }, @@ -41,7 +39,7 @@ index 56f33af11311..4ec347f0e8b1 100644 }; static struct clk_alpha_pll ipq_pll_huayra = { -@@ -44,6 +56,38 @@ static struct clk_alpha_pll ipq_pll_huayra = { +@@ -44,6 +56,38 @@ static struct clk_alpha_pll ipq_pll_huay }, }; @@ -80,7 +78,7 @@ index 56f33af11311..4ec347f0e8b1 100644 static const struct alpha_pll_config ipq6018_pll_config = { .l = 0x37, .config_ctl_val = 0x240d4828, -@@ -81,16 +125,25 @@ static const struct alpha_pll_config ipq9574_pll_config = { +@@ -81,16 +125,25 @@ static const struct alpha_pll_config ipq }; struct apss_pll_data { @@ -106,7 +104,7 @@ index 56f33af11311..4ec347f0e8b1 100644 .pll = &ipq_pll_huayra, .pll_config = &ipq6018_pll_config, }; -@@ -129,7 +182,10 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) +@@ -129,7 +182,10 @@ static int apss_ipq_pll_probe(struct pla if (!data) return -ENODEV; @@ -118,7 +116,7 @@ index 56f33af11311..4ec347f0e8b1 100644 ret = devm_clk_register_regmap(dev, &data->pll->clkr); if (ret) -@@ -140,6 +196,7 @@ static int apss_ipq_pll_probe(struct platform_device *pdev) +@@ -140,6 +196,7 @@ static int apss_ipq_pll_probe(struct pla } static const struct of_device_id apss_ipq_pll_match_table[] = { @@ -126,6 +124,3 @@ index 56f33af11311..4ec347f0e8b1 100644 { .compatible = "qcom,ipq6018-a53pll", .data = &ipq6018_pll_data }, { .compatible = "qcom,ipq8074-a53pll", .data = &ipq8074_pll_data }, { .compatible = "qcom,ipq9574-a73pll", .data = &ipq9574_pll_data }, --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch b/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch index 7efaad2da4e00e..c405376cbc0e93 100644 --- a/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch +++ b/target/linux/ipq95xx/patches-6.1/0040-clk-qcom-apss-ipq-pll-Use-stromer-plus-ops-for-strom.patch @@ -21,11 +21,9 @@ Signed-off-by: Bjorn Andersson drivers/clk/qcom/apss-ipq-pll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) -diff --git a/drivers/clk/qcom/apss-ipq-pll.c b/drivers/clk/qcom/apss-ipq-pll.c -index 4ec347f0e8b1..87547db3bfb3 100644 --- a/drivers/clk/qcom/apss-ipq-pll.c +++ b/drivers/clk/qcom/apss-ipq-pll.c -@@ -69,7 +69,7 @@ static struct clk_alpha_pll ipq_pll_stromer_plus = { +@@ -69,7 +69,7 @@ static struct clk_alpha_pll ipq_pll_stro .fw_name = "xo", }, .num_parents = 1, @@ -34,6 +32,3 @@ index 4ec347f0e8b1..87547db3bfb3 100644 }, }, }; --- -2.34.1 - diff --git a/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch b/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch index 65b2de61952e5d..a4674a71906208 100644 --- a/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch +++ b/target/linux/ipq95xx/patches-6.1/0041-clk-qcom-Add-STROMER-PLUS-PLL-type-for-IPQ5332.patch @@ -16,11 +16,9 @@ Link: https://lore.kernel.org/r/20230307062232.4889-3-quic_kathirav@quicinc.com drivers/clk/qcom/clk-alpha-pll.h | 1 + 2 files changed, 12 insertions(+) -diff --git a/drivers/clk/qcom/clk-alpha-pll.c b/drivers/clk/qcom/clk-alpha-pll.c -index 56f1795847cd..b3d1a39c835b 100644 --- a/drivers/clk/qcom/clk-alpha-pll.c +++ b/drivers/clk/qcom/clk-alpha-pll.c -@@ -200,6 +200,17 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { +@@ -200,6 +200,17 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MA [PLL_OFF_TEST_CTL_U] = 0x34, [PLL_OFF_STATUS] = 0x28, }, @@ -38,8 +36,6 @@ index 56f1795847cd..b3d1a39c835b 100644 }; EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); -diff --git a/drivers/clk/qcom/clk-alpha-pll.h b/drivers/clk/qcom/clk-alpha-pll.h -index eb072ae7861c..42d2a93a28ba 100644 --- a/drivers/clk/qcom/clk-alpha-pll.h +++ b/drivers/clk/qcom/clk-alpha-pll.h @@ -26,6 +26,7 @@ enum { @@ -50,6 +46,3 @@ index eb072ae7861c..42d2a93a28ba 100644 CLK_ALPHA_PLL_TYPE_MAX, }; --- -2.34.1 - diff --git a/target/linux/rockchip/patches-6.1/101-net-realtek-r8169-add-LED-configuration-from-OF.patch b/target/linux/rockchip/patches-6.1/101-net-realtek-r8169-add-LED-configuration-from-OF.patch index eec258f7cdf0ba..cf434960735ebe 100644 --- a/target/linux/rockchip/patches-6.1/101-net-realtek-r8169-add-LED-configuration-from-OF.patch +++ b/target/linux/rockchip/patches-6.1/101-net-realtek-r8169-add-LED-configuration-from-OF.patch @@ -25,7 +25,7 @@ Subject: [PATCH] r8169: add LED configuration from OF TxDescStartAddrLow = 0x20, TxDescStartAddrHigh = 0x24, TxHDescStartAddrLow = 0x28, -@@ -5132,6 +5134,22 @@ static bool rtl_aspm_is_safe(struct rtl8 +@@ -5174,6 +5176,22 @@ static bool rtl_aspm_is_safe(struct rtl8 return false; } @@ -48,7 +48,7 @@ Subject: [PATCH] r8169: add LED configuration from OF static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { struct rtl8169_private *tp; -@@ -5299,6 +5317,7 @@ static int rtl_init_one(struct pci_dev * +@@ -5342,6 +5360,7 @@ static int rtl_init_one(struct pci_dev * if (!tp->counters) return -ENOMEM; diff --git a/target/linux/rockchip/patches-6.1/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-6.1/107-mmc-core-set-initial-signal-voltage-on-power-off.patch index 9b1f0bb0aaba43..d462899007ceb4 100644 --- a/target/linux/rockchip/patches-6.1/107-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-6.1/107-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1366,6 +1366,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1371,6 +1371,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host); diff --git a/target/linux/rockchip/patches-6.1/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch b/target/linux/rockchip/patches-6.1/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch index 0bde4e1c243997..2130f3ba443132 100644 --- a/target/linux/rockchip/patches-6.1/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch +++ b/target/linux/rockchip/patches-6.1/805-PM-devfreq-rockchip-dfi-add-more-soc-support.patch @@ -444,8 +444,7 @@ Signed-off-by: hmz007 + 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)) @@ -467,7 +466,8 @@ Signed-off-by: hmz007 + + return 0; +} -+ + +-static int rockchip_dfi_probe(struct platform_device *pdev) +static __init int rk3128_dfi_init(struct platform_device *pdev, + struct rockchip_dfi *data, + struct devfreq_event_desc *desc) @@ -557,106 +557,3 @@ Signed-off-by: hmz007 data->regs = devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(data->regs)) -@@ -201,21 +581,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); - } - From 4efca503b93f2139fbbb2604dc71cb5af3f46579 Mon Sep 17 00:00:00 2001 From: aakkll <94471752+aakkll@users.noreply.github.com> Date: Sat, 9 Dec 2023 13:09:25 +0800 Subject: [PATCH 8/8] kernel: bump 5.4 to 5.4.263 (#11695) --- include/kernel-5.4 | 4 ++-- ...the-dst-buffer-to-of_get_mac_address.patch | 4 ++-- .../generic/hack-5.4/259-regmap_dynamic.patch | 2 +- .../995-usb-serial-option-add-ec200a.patch | 2 +- ...w_table-add-hardware-offload-support.patch | 10 ++++----- .../850-soc-add-qualcomm-syscon.patch | 6 ++--- .../999-03a-qca-nss-ecm-support.patch | 22 +++++++++---------- ...-initial-signal-voltage-on-power-off.patch | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/kernel-5.4 b/include/kernel-5.4 index 6fb2fe85c6642d..24d8d69a184b2f 100644 --- a/include/kernel-5.4 +++ b/include/kernel-5.4 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.4 = .260 -LINUX_KERNEL_HASH-5.4.260 = 9830820714c8f5985c50071cc9e1b40533ee81a4f6c704916c7148d16e54ebfe +LINUX_VERSION-5.4 = .263 +LINUX_KERNEL_HASH-5.4.263 = 50d0db9a94118b2d45f2ea1ed7b094cfd39f32829e4a2b51473dd3a8257735f8 diff --git a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch index 4632b4672e12db..92bd39f9fed82b 100644 --- a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ b/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch @@ -1000,7 +1000,7 @@ Signed-off-by: David S. Miller u32 mahr = ravb_read(ndev, MAHR); u32 malr = ravb_read(ndev, MALR); -@@ -2154,7 +2156,7 @@ static int ravb_probe(struct platform_de +@@ -2165,7 +2167,7 @@ static int ravb_probe(struct platform_de priv->msg_enable = RAVB_DEF_MSG_ENABLE; /* Read and set MAC address */ @@ -1302,7 +1302,7 @@ Signed-off-by: David S. Miller int irq; --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -4477,7 +4477,7 @@ int stmmac_dvr_probe(struct device *devi +@@ -4519,7 +4519,7 @@ int stmmac_dvr_probe(struct device *devi priv->wol_irq = res->wol_irq; priv->lpi_irq = res->lpi_irq; diff --git a/target/linux/generic/hack-5.4/259-regmap_dynamic.patch b/target/linux/generic/hack-5.4/259-regmap_dynamic.patch index 872c2ea01bc231..73afc327553a6d 100644 --- a/target/linux/generic/hack-5.4/259-regmap_dynamic.patch +++ b/target/linux/generic/hack-5.4/259-regmap_dynamic.patch @@ -106,7 +106,7 @@ Signed-off-by: Felix Fietkau #include #include #include -@@ -3120,3 +3121,5 @@ static int __init regmap_initcall(void) +@@ -3122,3 +3123,5 @@ static int __init regmap_initcall(void) return 0; } postcore_initcall(regmap_initcall); diff --git a/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch b/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch index a87531c0360340..a6324c0236dcf4 100644 --- a/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch +++ b/target/linux/generic/hack-5.4/995-usb-serial-option-add-ec200a.patch @@ -8,7 +8,7 @@ #define QUECTEL_PRODUCT_RM500K 0x7001 #define CMOTECH_VENDOR_ID 0x16d8 -@@ -1242,6 +1243,7 @@ static const struct usb_device_id option +@@ -1244,6 +1245,7 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, diff --git a/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch b/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch index ba2f5966086c2f..48d7864a46fbfa 100644 --- a/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch +++ b/target/linux/generic/pending-5.4/640-netfilter-nf_flow_table-add-hardware-offload-support.patch @@ -110,7 +110,7 @@ Signed-off-by: Pablo Neira Ayuso --- a/include/uapi/linux/netfilter/nf_tables.h +++ b/include/uapi/linux/netfilter/nf_tables.h -@@ -1516,6 +1516,7 @@ enum nft_object_attributes { +@@ -1517,6 +1517,7 @@ enum nft_object_attributes { * @NFTA_FLOWTABLE_HOOK: netfilter hook configuration(NLA_U32) * @NFTA_FLOWTABLE_USE: number of references to this flow table (NLA_U32) * @NFTA_FLOWTABLE_HANDLE: object handle (NLA_U64) @@ -118,7 +118,7 @@ Signed-off-by: Pablo Neira Ayuso */ enum nft_flowtable_attributes { NFTA_FLOWTABLE_UNSPEC, -@@ -1525,6 +1526,7 @@ enum nft_flowtable_attributes { +@@ -1526,6 +1527,7 @@ enum nft_flowtable_attributes { NFTA_FLOWTABLE_USE, NFTA_FLOWTABLE_HANDLE, NFTA_FLOWTABLE_PAD, @@ -506,7 +506,7 @@ Signed-off-by: Pablo Neira Ayuso +MODULE_ALIAS("nf-flow-table-hw"); --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c -@@ -5889,6 +5889,13 @@ static int nf_tables_flowtable_parse_hoo +@@ -5974,6 +5974,13 @@ static int nf_tables_flowtable_parse_hoo if (err < 0) return err; @@ -520,7 +520,7 @@ Signed-off-by: Pablo Neira Ayuso ops = kcalloc(n, sizeof(struct nf_hook_ops), GFP_KERNEL); if (!ops) return -ENOMEM; -@@ -6024,10 +6031,19 @@ static int nf_tables_newflowtable(struct +@@ -6118,10 +6125,19 @@ static int nf_tables_newflowtable(struct } flowtable->data.type = type; @@ -540,7 +540,7 @@ Signed-off-by: Pablo Neira Ayuso err = nf_tables_flowtable_parse_hook(&ctx, nla[NFTA_FLOWTABLE_HOOK], flowtable); if (err < 0) -@@ -6150,7 +6166,8 @@ static int nf_tables_fill_flowtable_info +@@ -6247,7 +6263,8 @@ static int nf_tables_fill_flowtable_info nla_put_string(skb, NFTA_FLOWTABLE_NAME, flowtable->name) || nla_put_be32(skb, NFTA_FLOWTABLE_USE, htonl(flowtable->use)) || nla_put_be64(skb, NFTA_FLOWTABLE_HANDLE, cpu_to_be64(flowtable->handle), diff --git a/target/linux/ipq806x/patches-5.4/850-soc-add-qualcomm-syscon.patch b/target/linux/ipq806x/patches-5.4/850-soc-add-qualcomm-syscon.patch index bd2bc55521f7c6..dfc383684af1d4 100644 --- a/target/linux/ipq806x/patches-5.4/850-soc-add-qualcomm-syscon.patch +++ b/target/linux/ipq806x/patches-5.4/850-soc-add-qualcomm-syscon.patch @@ -8,11 +8,11 @@ Subject: SoC: add qualcomm syscon obj-$(CONFIG_QCOM_WCNSS_CTRL) += wcnss_ctrl.o +obj-$(CONFIG_QCOM_TCSR) += qcom_tcsr.o obj-$(CONFIG_QCOM_APR) += apr.o - obj-$(CONFIG_QCOM_LLCC) += llcc-slice.o - obj-$(CONFIG_QCOM_SDM845_LLCC) += llcc-sdm845.o + obj-$(CONFIG_QCOM_LLCC) += llcc-qcom.o + obj-$(CONFIG_QCOM_RPMHPD) += rpmhpd.o --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig -@@ -184,6 +184,13 @@ config QCOM_SOCINFO +@@ -176,6 +176,13 @@ config QCOM_SOCINFO Say yes here to support the Qualcomm socinfo driver, providing information about the SoC to user space. diff --git a/target/linux/ipq806x/patches-5.4/999-03a-qca-nss-ecm-support.patch b/target/linux/ipq806x/patches-5.4/999-03a-qca-nss-ecm-support.patch index 8ebf8fa8e6789a..a9d443ca156eb7 100644 --- a/target/linux/ipq806x/patches-5.4/999-03a-qca-nss-ecm-support.patch +++ b/target/linux/ipq806x/patches-5.4/999-03a-qca-nss-ecm-support.patch @@ -514,7 +514,7 @@ if (bond_is_lb(bond)) bond_alb_handle_link_change(bond, new_active, BOND_LINK_UP); } else { -@@ -1412,6 +1430,7 @@ int bond_enslave(struct net_device *bond +@@ -1418,6 +1436,7 @@ int bond_enslave(struct net_device *bond const struct net_device_ops *slave_ops = slave_dev->netdev_ops; struct slave *new_slave = NULL, *prev_slave; struct sockaddr_storage ss; @@ -522,7 +522,7 @@ int link_reporting; int res = 0, i; -@@ -1811,6 +1830,13 @@ int bond_enslave(struct net_device *bond +@@ -1817,6 +1836,13 @@ int bond_enslave(struct net_device *bond if (bond_mode_can_use_xmit_hash(bond)) bond_update_slave_arr(bond, NULL); @@ -536,7 +536,7 @@ slave_info(bond_dev, slave_dev, "Enslaving as %s interface with %s link\n", bond_is_active_slave(new_slave) ? "an active" : "a backup", -@@ -1883,6 +1909,14 @@ err_undo_flags: +@@ -1889,6 +1915,14 @@ err_undo_flags: } } @@ -551,7 +551,7 @@ return res; } -@@ -1904,6 +1938,7 @@ static int __bond_release_one(struct net +@@ -1910,6 +1944,7 @@ static int __bond_release_one(struct net struct bonding *bond = netdev_priv(bond_dev); struct slave *slave, *oldcurrent; struct sockaddr_storage ss; @@ -559,7 +559,7 @@ int old_flags = bond_dev->flags; netdev_features_t old_features = bond_dev->features; -@@ -1926,6 +1961,14 @@ static int __bond_release_one(struct net +@@ -1932,6 +1967,14 @@ static int __bond_release_one(struct net bond_set_slave_inactive_flags(slave, BOND_SLAVE_NOTIFY_NOW); @@ -574,7 +574,7 @@ bond_sysfs_slave_del(slave); /* recompute stats just before removing the slave */ -@@ -2231,6 +2274,10 @@ static void bond_miimon_commit(struct bo +@@ -2237,6 +2280,10 @@ static void bond_miimon_commit(struct bo { struct list_head *iter; struct slave *slave, *primary; @@ -585,7 +585,7 @@ bond_for_each_slave(bond, slave, iter) { switch (slave->link_new_state) { -@@ -2274,6 +2321,12 @@ static void bond_miimon_commit(struct bo +@@ -2280,6 +2327,12 @@ static void bond_miimon_commit(struct bo bond_miimon_link_change(bond, slave, BOND_LINK_UP); @@ -598,7 +598,7 @@ if (!bond->curr_active_slave || slave == primary) goto do_failover; -@@ -2315,6 +2368,15 @@ do_failover: +@@ -2321,6 +2374,15 @@ do_failover: } bond_set_carrier(bond); @@ -614,7 +614,7 @@ } /* bond_mii_monitor -@@ -4408,6 +4470,11 @@ static void bond_destructor(struct net_d +@@ -4414,6 +4476,11 @@ static void bond_destructor(struct net_d struct bonding *bond = netdev_priv(bond_dev); if (bond->wq) destroy_workqueue(bond->wq); @@ -626,7 +626,7 @@ } void bond_setup(struct net_device *bond_dev) -@@ -4961,6 +5028,16 @@ int bond_create(struct net *net, const c +@@ -4967,6 +5034,16 @@ int bond_create(struct net *net, const c bond_work_init_all(bond); rtnl_unlock(); @@ -643,7 +643,7 @@ return 0; } -@@ -5056,6 +5133,203 @@ static void __exit bonding_exit(void) +@@ -5062,6 +5139,203 @@ static void __exit bonding_exit(void) #endif } diff --git a/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch index f70cbb9e23834e..698f6465b38c1b 100644 --- a/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1377,6 +1377,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1380,6 +1380,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host);