mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-29 09:13:38 +00:00
ARM: SoC fixes for 6.1, part 2
There are not a lot of important fixes for the soc tree yet this time, but it's time to upstream what I got so far: - DT Fixes for Arm Juno and ST-Ericsson Ux500 to add missing critical temperature points - A number of fixes for the Arm SCMI firmware, addressing correctness issues in the code, in particular error handling and resource leaks. - One error handling fix for the new i.MX93 power domain driver - Several devicetree fixes for NXP i.MX6/8/9 and Layerscape chips, fixing incorrect or missing DT properties for MDIO controller nodes, CPLD, USB and regulators for various boards, as well as some fixes for DT schema checks. - MAINTAINERS file updates for HiSilicon LPC Bus and Broadcom git URLs -----BEGIN PGP SIGNATURE----- iQIyBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmNk+VsACgkQmmx57+YA GNkGYw/4yAY5HoPidRbG6Ka9XKfwqxT9n/pp9gndg0ciESOV+1agRExeA7VJFprK VHoFaQ13GqDMEFr/D+FRx/2e9VNiXZKELIc6qFpFC8Vr+mCtH2/Hqalfus7hpvO1 o7T3xXKvqDUEOkG0VjcKcbLejIbPqw6Hiuq6f/MHf8BNi6nXRa+6EJJr0knMAmpF AzXMvFsVxnaYAqfT6puKrLvoYHArIQ6yguV+LDKpi2UstxjfKWmO84Io/drbedK1 ELzyssClUeiLLsqNwzMSeedHmizuiyiFZ5aKkqCgHkXei6VdSAy6u6XoOLc9CKeM H/fpIksaMnJVFx+fcQR+kg2WoYVW/0p6I4wEGzPNiGw2vZ/IkspzYb4yhJVu+VSZ rfoHgCpNklumVXVf5JvqAGPfgdTQQW4s3myWS/SxX1R2xd5ZA/3BcMktcNCQYAvZ iTA8tCAqd73gSxv+DBvX6BlweiJKIY+j+TcZqietSMFMj+PVRZz4kVp3gAe3abrx tRnvZchdjoCZv0Xap5J/qu+wbW/QOeDS/oy11jXSwlFEcau8ldfMUG899jx7k39w EkTH6Jo35tyP7rF3vETtnIYen6wUpKEAySWPZ/AO/VAP2zu1/9jgTOY8AY+t1q/d QZOR4C4GVlByFxtXJVgU1ZOPInaJhSIwB3/0gqPP9sd24T7Nng== =Apap -----END PGP SIGNATURE----- Merge tag 'soc-fixes-6.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc Pull ARM SoC fixes from Arnd Bergmann: "There are not a lot of important fixes for the soc tree yet this time, but it's time to upstream what I got so far: - DT Fixes for Arm Juno and ST-Ericsson Ux500 to add missing critical temperature points - A number of fixes for the Arm SCMI firmware, addressing correctness issues in the code, in particular error handling and resource leaks. - One error handling fix for the new i.MX93 power domain driver - Several devicetree fixes for NXP i.MX6/8/9 and Layerscape chips, fixing incorrect or missing DT properties for MDIO controller nodes, CPLD, USB and regulators for various boards, as well as some fixes for DT schema checks. - MAINTAINERS file updates for HiSilicon LPC Bus and Broadcom git URLs" * tag 'soc-fixes-6.1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (26 commits) arm64: dts: juno: Add thermal critical trip points firmware: arm_scmi: Fix deferred_tx_wq release on error paths firmware: arm_scmi: Fix devres allocation device in virtio transport firmware: arm_scmi: Make Rx chan_setup fail on memory errors firmware: arm_scmi: Make tx_prepare time out eventually firmware: arm_scmi: Suppress the driver's bind attributes firmware: arm_scmi: Cleanup the core driver removal callback MAINTAINERS: Update HiSilicon LPC BUS Driver maintainer ARM: dts: ux500: Add trips to battery thermal zones arm64: dts: ls208xa: specify clock frequencies for the MDIO controllers arm64: dts: ls1088a: specify clock frequencies for the MDIO controllers arm64: dts: lx2160a: specify clock frequencies for the MDIO controllers soc: imx: imx93-pd: Fix the error handling path of imx93_pd_probe() arm64: dts: imx93: correct gpio-ranges arm64: dts: imx93: correct s4mu interrupt names dt-bindings: power: gpcv2: add power-domains property arm64: dts: imx8: correct clock order ARM: dts: imx6dl-yapp4: Do not allow PM to switch PU regulator off on Q/QP ARM: dts: imx6qdl-gw59{10,13}: fix user pushbutton GPIO offset arm64: dts: imx8mn: Correct the usb power domain ...
This commit is contained in:
commit
10d916c86e
@ -81,6 +81,9 @@ properties:
|
||||
|
||||
power-supply: true
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
description: |
|
||||
A number of phandles to resets that need to be asserted during
|
||||
|
16
MAINTAINERS
16
MAINTAINERS
@ -3984,7 +3984,7 @@ M: Rafał Miłecki <rafal@milecki.pl>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
|
||||
F: arch/arm64/boot/dts/broadcom/bcmbca/*
|
||||
N: bcmbca
|
||||
@ -4009,7 +4009,7 @@ R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: drivers/pci/controller/pcie-brcmstb.c
|
||||
F: drivers/staging/vc04_services
|
||||
@ -4023,7 +4023,7 @@ M: Ray Jui <rjui@broadcom.com>
|
||||
M: Scott Branden <sbranden@broadcom.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/mach-bcm
|
||||
T: git https://github.com/broadcom/mach-bcm
|
||||
F: arch/arm/mach-bcm/
|
||||
N: bcm281*
|
||||
N: bcm113*
|
||||
@ -4088,7 +4088,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
|
||||
F: arch/arm/boot/dts/bcm7*.dts*
|
||||
F: arch/arm/include/asm/hardware/cache-b15-rac.h
|
||||
@ -4121,7 +4121,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-mips@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: arch/mips/bmips/*
|
||||
F: arch/mips/boot/dts/brcm/bcm*.dts*
|
||||
F: arch/mips/include/asm/mach-bmips/*
|
||||
@ -4262,7 +4262,7 @@ M: Scott Branden <sbranden@broadcom.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: arch/arm64/boot/dts/broadcom/northstar2/*
|
||||
F: arch/arm64/boot/dts/broadcom/stingray/*
|
||||
F: drivers/clk/bcm/clk-ns*
|
||||
@ -4332,7 +4332,7 @@ M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
|
||||
L: linux-pm@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://github.com/broadcom/stblinux.git
|
||||
T: git https://github.com/broadcom/stblinux.git
|
||||
F: drivers/soc/bcm/bcm63xx/bcm-pmb.c
|
||||
F: include/dt-bindings/soc/bcm-pmb.h
|
||||
|
||||
@ -9217,7 +9217,7 @@ W: https://www.hisilicon.com
|
||||
F: drivers/i2c/busses/i2c-hisi.c
|
||||
|
||||
HISILICON LPC BUS DRIVER
|
||||
M: john.garry@huawei.com
|
||||
M: Jay Fang <f.fangjian@huawei.com>
|
||||
S: Maintained
|
||||
W: http://www.hisilicon.com
|
||||
F: Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml
|
||||
|
@ -33,6 +33,10 @@ &oled_1309 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_pu {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
®_usb_h1_vbus {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -29,7 +29,7 @@ gpio-keys {
|
||||
|
||||
user-pb {
|
||||
label = "user_pb";
|
||||
gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gsc_gpio 2 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_0>;
|
||||
};
|
||||
|
||||
|
@ -26,7 +26,7 @@ gpio-keys {
|
||||
|
||||
user-pb {
|
||||
label = "user_pb";
|
||||
gpios = <&gsc_gpio 0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gsc_gpio 2 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <BTN_0>;
|
||||
};
|
||||
|
||||
|
@ -33,6 +33,10 @@ &oled_1309 {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
®_pu {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
®_usb_h1_vbus {
|
||||
status = "okay";
|
||||
};
|
||||
|
@ -24,6 +24,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -28,6 +28,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -44,6 +44,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -57,6 +57,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -34,6 +34,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -30,6 +30,14 @@ battery-thermal {
|
||||
polling-delay = <0>;
|
||||
polling-delay-passive = <0>;
|
||||
thermal-sensors = <&bat_therm>;
|
||||
|
||||
trips {
|
||||
battery-crit-hi {
|
||||
temperature = <70000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -751,12 +751,26 @@ pmic {
|
||||
polling-delay = <1000>;
|
||||
polling-delay-passive = <100>;
|
||||
thermal-sensors = <&scpi_sensors0 0>;
|
||||
trips {
|
||||
pmic_crit0: trip0 {
|
||||
temperature = <90000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
soc {
|
||||
polling-delay = <1000>;
|
||||
polling-delay-passive = <100>;
|
||||
thermal-sensors = <&scpi_sensors0 3>;
|
||||
trips {
|
||||
soc_crit0: trip0 {
|
||||
temperature = <80000>;
|
||||
hysteresis = <2000>;
|
||||
type = "critical";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
big_cluster_thermal_zone: big-cluster {
|
||||
|
@ -779,6 +779,9 @@ emdio1: mdio@8b96000 {
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(1)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -788,6 +791,9 @@ emdio2: mdio@8b97000 {
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(1)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -532,6 +532,9 @@ emdio1: mdio@8b96000 {
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -541,6 +544,9 @@ emdio2: mdio@8b97000 {
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -1385,6 +1385,9 @@ emdio1: mdio@8b96000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
little-endian;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1395,6 +1398,9 @@ emdio2: mdio@8b97000 {
|
||||
little-endian;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
clock-frequency = <2500000>;
|
||||
clocks = <&clockgen QORIQ_CLK_PLATFORM_PLL
|
||||
QORIQ_CLK_PLL_DIV(2)>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -38,9 +38,9 @@ usdhc1: mmc@5b010000 {
|
||||
interrupts = <GIC_SPI 232 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b010000 0x10000>;
|
||||
clocks = <&sdhc0_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc0_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_0>;
|
||||
status = "disabled";
|
||||
};
|
||||
@ -49,9 +49,9 @@ usdhc2: mmc@5b020000 {
|
||||
interrupts = <GIC_SPI 233 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b020000 0x10000>;
|
||||
clocks = <&sdhc1_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc1_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_1>;
|
||||
fsl,tuning-start-tap = <20>;
|
||||
fsl,tuning-step = <2>;
|
||||
@ -62,9 +62,9 @@ usdhc3: mmc@5b030000 {
|
||||
interrupts = <GIC_SPI 234 IRQ_TYPE_LEVEL_HIGH>;
|
||||
reg = <0x5b030000 0x10000>;
|
||||
clocks = <&sdhc2_lpcg IMX_LPCG_CLK_4>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_5>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_0>;
|
||||
clock-names = "ipg", "per", "ahb";
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_0>,
|
||||
<&sdhc2_lpcg IMX_LPCG_CLK_5>;
|
||||
clock-names = "ipg", "ahb", "per";
|
||||
power-domains = <&pd IMX_SC_R_SDHC_2>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -250,21 +250,21 @@ MX8MM_IOMUXC_SAI1_RXD1_GPIO4_IO3 0x1c4
|
||||
/* SODIMM 96 */
|
||||
MX8MM_IOMUXC_SAI1_RXD2_GPIO4_IO4 0x1c4
|
||||
/* CPLD_D[7] */
|
||||
MX8MM_IOMUXC_SAI1_RXD3_GPIO4_IO5 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_RXD3_GPIO4_IO5 0x184
|
||||
/* CPLD_D[6] */
|
||||
MX8MM_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_RXFS_GPIO4_IO0 0x184
|
||||
/* CPLD_D[5] */
|
||||
MX8MM_IOMUXC_SAI1_TXC_GPIO4_IO11 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXC_GPIO4_IO11 0x184
|
||||
/* CPLD_D[4] */
|
||||
MX8MM_IOMUXC_SAI1_TXD0_GPIO4_IO12 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD0_GPIO4_IO12 0x184
|
||||
/* CPLD_D[3] */
|
||||
MX8MM_IOMUXC_SAI1_TXD1_GPIO4_IO13 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD1_GPIO4_IO13 0x184
|
||||
/* CPLD_D[2] */
|
||||
MX8MM_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD2_GPIO4_IO14 0x184
|
||||
/* CPLD_D[1] */
|
||||
MX8MM_IOMUXC_SAI1_TXD3_GPIO4_IO15 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD3_GPIO4_IO15 0x184
|
||||
/* CPLD_D[0] */
|
||||
MX8MM_IOMUXC_SAI1_TXD4_GPIO4_IO16 0x1c4
|
||||
MX8MM_IOMUXC_SAI1_TXD4_GPIO4_IO16 0x184
|
||||
/* KBD_intK */
|
||||
MX8MM_IOMUXC_SAI2_MCLK_GPIO4_IO27 0x1c4
|
||||
/* DISP_reset */
|
||||
|
@ -276,6 +276,7 @@ usbphynop1: usbphynop1 {
|
||||
assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg1>;
|
||||
};
|
||||
|
||||
usbphynop2: usbphynop2 {
|
||||
@ -285,6 +286,7 @@ usbphynop2: usbphynop2 {
|
||||
assigned-clocks = <&clk IMX8MM_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg2>;
|
||||
};
|
||||
|
||||
soc: soc@0 {
|
||||
@ -674,13 +676,11 @@ pgc_pcie: power-domain@1 {
|
||||
pgc_otg1: power-domain@2 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MM_POWER_DOMAIN_OTG1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_otg2: power-domain@3 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MM_POWER_DOMAIN_OTG2>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_gpumix: power-domain@4 {
|
||||
@ -1186,7 +1186,7 @@ usbotg1: usb@32e40000 {
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop1>;
|
||||
fsl,usbmisc = <&usbmisc1 0>;
|
||||
power-domains = <&pgc_otg1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1206,7 +1206,7 @@ usbotg2: usb@32e50000 {
|
||||
assigned-clock-parents = <&clk IMX8MM_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop2>;
|
||||
fsl,usbmisc = <&usbmisc2 0>;
|
||||
power-domains = <&pgc_otg2>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -662,7 +662,6 @@ pgc_hsiomix: power-domain@0 {
|
||||
pgc_otg1: power-domain@1 {
|
||||
#power-domain-cells = <0>;
|
||||
reg = <IMX8MN_POWER_DOMAIN_OTG1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
};
|
||||
|
||||
pgc_gpumix: power-domain@2 {
|
||||
@ -1076,7 +1075,7 @@ usbotg1: usb@32e40000 {
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL2_500M>;
|
||||
phys = <&usbphynop1>;
|
||||
fsl,usbmisc = <&usbmisc1 0>;
|
||||
power-domains = <&pgc_otg1>;
|
||||
power-domains = <&pgc_hsiomix>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -1175,5 +1174,6 @@ usbphynop1: usbphynop1 {
|
||||
assigned-clocks = <&clk IMX8MN_CLK_USB_PHY_REF>;
|
||||
assigned-clock-parents = <&clk IMX8MN_SYS_PLL1_100M>;
|
||||
clock-names = "main_clk";
|
||||
power-domains = <&pgc_otg1>;
|
||||
};
|
||||
};
|
||||
|
@ -354,16 +354,6 @@ &gpio2 {
|
||||
"SODIMM_82",
|
||||
"SODIMM_70",
|
||||
"SODIMM_72";
|
||||
|
||||
ctrl-sleep-moci-hog {
|
||||
gpio-hog;
|
||||
/* Verdin CTRL_SLEEP_MOCI# (SODIMM 256) */
|
||||
gpios = <29 GPIO_ACTIVE_HIGH>;
|
||||
line-name = "CTRL_SLEEP_MOCI#";
|
||||
output-high;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ctrl_sleep_moci>;
|
||||
};
|
||||
};
|
||||
|
||||
&gpio3 {
|
||||
@ -432,6 +422,16 @@ &gpio4 {
|
||||
"SODIMM_256",
|
||||
"SODIMM_48",
|
||||
"SODIMM_44";
|
||||
|
||||
ctrl-sleep-moci-hog {
|
||||
gpio-hog;
|
||||
/* Verdin CTRL_SLEEP_MOCI# (SODIMM 256) */
|
||||
gpios = <29 GPIO_ACTIVE_HIGH>;
|
||||
line-name = "CTRL_SLEEP_MOCI#";
|
||||
output-high;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_ctrl_sleep_moci>;
|
||||
};
|
||||
};
|
||||
|
||||
/* On-module I2C */
|
||||
|
@ -451,7 +451,7 @@ gpio2: gpio@43810080 {
|
||||
clocks = <&clk IMX93_CLK_GPIO2_GATE>,
|
||||
<&clk IMX93_CLK_GPIO2_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 32 32>;
|
||||
gpio-ranges = <&iomuxc 0 4 30>;
|
||||
};
|
||||
|
||||
gpio3: gpio@43820080 {
|
||||
@ -465,7 +465,8 @@ gpio3: gpio@43820080 {
|
||||
clocks = <&clk IMX93_CLK_GPIO3_GATE>,
|
||||
<&clk IMX93_CLK_GPIO3_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 64 32>;
|
||||
gpio-ranges = <&iomuxc 0 84 8>, <&iomuxc 8 66 18>,
|
||||
<&iomuxc 26 34 2>, <&iomuxc 28 0 4>;
|
||||
};
|
||||
|
||||
gpio4: gpio@43830080 {
|
||||
@ -479,7 +480,7 @@ gpio4: gpio@43830080 {
|
||||
clocks = <&clk IMX93_CLK_GPIO4_GATE>,
|
||||
<&clk IMX93_CLK_GPIO4_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 96 32>;
|
||||
gpio-ranges = <&iomuxc 0 38 28>, <&iomuxc 28 36 2>;
|
||||
};
|
||||
|
||||
gpio1: gpio@47400080 {
|
||||
@ -493,7 +494,7 @@ gpio1: gpio@47400080 {
|
||||
clocks = <&clk IMX93_CLK_GPIO1_GATE>,
|
||||
<&clk IMX93_CLK_GPIO1_GATE>;
|
||||
clock-names = "gpio", "port";
|
||||
gpio-ranges = <&iomuxc 0 0 32>;
|
||||
gpio-ranges = <&iomuxc 0 92 16>;
|
||||
};
|
||||
|
||||
s4muap: mailbox@47520000 {
|
||||
@ -501,7 +502,7 @@ s4muap: mailbox@47520000 {
|
||||
reg = <0x47520000 0x10000>;
|
||||
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "txirq", "rxirq";
|
||||
interrupt-names = "tx", "rx";
|
||||
#mbox-cells = <2>;
|
||||
};
|
||||
|
||||
|
@ -216,9 +216,20 @@ void scmi_device_destroy(struct scmi_device *scmi_dev)
|
||||
device_unregister(&scmi_dev->dev);
|
||||
}
|
||||
|
||||
void scmi_device_link_add(struct device *consumer, struct device *supplier)
|
||||
{
|
||||
struct device_link *link;
|
||||
|
||||
link = device_link_add(consumer, supplier, DL_FLAG_AUTOREMOVE_CONSUMER);
|
||||
|
||||
WARN_ON(!link);
|
||||
}
|
||||
|
||||
void scmi_set_handle(struct scmi_device *scmi_dev)
|
||||
{
|
||||
scmi_dev->handle = scmi_handle_get(&scmi_dev->dev);
|
||||
if (scmi_dev->handle)
|
||||
scmi_device_link_add(&scmi_dev->dev, scmi_dev->handle->dev);
|
||||
}
|
||||
|
||||
int scmi_protocol_register(const struct scmi_protocol *proto)
|
||||
|
@ -97,6 +97,7 @@ static inline void unpack_scmi_header(u32 msg_hdr, struct scmi_msg_hdr *hdr)
|
||||
struct scmi_revision_info *
|
||||
scmi_revision_area_get(const struct scmi_protocol_handle *ph);
|
||||
int scmi_handle_put(const struct scmi_handle *handle);
|
||||
void scmi_device_link_add(struct device *consumer, struct device *supplier);
|
||||
struct scmi_handle *scmi_handle_get(struct device *dev);
|
||||
void scmi_set_handle(struct scmi_device *scmi_dev);
|
||||
void scmi_setup_protocol_implemented(const struct scmi_protocol_handle *ph,
|
||||
@ -117,6 +118,7 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id);
|
||||
*
|
||||
* @dev: Reference to device in the SCMI hierarchy corresponding to this
|
||||
* channel
|
||||
* @rx_timeout_ms: The configured RX timeout in milliseconds.
|
||||
* @handle: Pointer to SCMI entity handle
|
||||
* @no_completion_irq: Flag to indicate that this channel has no completion
|
||||
* interrupt mechanism for synchronous commands.
|
||||
@ -126,6 +128,7 @@ void scmi_protocol_release(const struct scmi_handle *handle, u8 protocol_id);
|
||||
*/
|
||||
struct scmi_chan_info {
|
||||
struct device *dev;
|
||||
unsigned int rx_timeout_ms;
|
||||
struct scmi_handle *handle;
|
||||
bool no_completion_irq;
|
||||
void *transport_info;
|
||||
@ -232,7 +235,7 @@ void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id);
|
||||
struct scmi_shared_mem;
|
||||
|
||||
void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer);
|
||||
struct scmi_xfer *xfer, struct scmi_chan_info *cinfo);
|
||||
u32 shmem_read_header(struct scmi_shared_mem __iomem *shmem);
|
||||
void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer);
|
||||
|
@ -2013,6 +2013,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device *dev,
|
||||
return -ENOMEM;
|
||||
|
||||
cinfo->dev = dev;
|
||||
cinfo->rx_timeout_ms = info->desc->max_rx_timeout_ms;
|
||||
|
||||
ret = info->desc->ops->chan_setup(cinfo, info->dev, tx);
|
||||
if (ret)
|
||||
@ -2044,8 +2045,12 @@ scmi_txrx_setup(struct scmi_info *info, struct device *dev, int prot_id)
|
||||
{
|
||||
int ret = scmi_chan_setup(info, dev, prot_id, true);
|
||||
|
||||
if (!ret) /* Rx is optional, hence no error check */
|
||||
scmi_chan_setup(info, dev, prot_id, false);
|
||||
if (!ret) {
|
||||
/* Rx is optional, report only memory errors */
|
||||
ret = scmi_chan_setup(info, dev, prot_id, false);
|
||||
if (ret && ret != -ENOMEM)
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -2273,10 +2278,16 @@ int scmi_protocol_device_request(const struct scmi_device_id *id_table)
|
||||
sdev = scmi_get_protocol_device(child, info,
|
||||
id_table->protocol_id,
|
||||
id_table->name);
|
||||
/* Set handle if not already set: device existed */
|
||||
if (sdev && !sdev->handle)
|
||||
sdev->handle =
|
||||
scmi_handle_get_from_info_unlocked(info);
|
||||
if (sdev) {
|
||||
/* Set handle if not already set: device existed */
|
||||
if (!sdev->handle)
|
||||
sdev->handle =
|
||||
scmi_handle_get_from_info_unlocked(info);
|
||||
/* Relink consumer and suppliers */
|
||||
if (sdev->handle)
|
||||
scmi_device_link_add(&sdev->dev,
|
||||
sdev->handle->dev);
|
||||
}
|
||||
} else {
|
||||
dev_err(info->dev,
|
||||
"Failed. SCMI protocol %d not active.\n",
|
||||
@ -2475,20 +2486,17 @@ void scmi_free_channel(struct scmi_chan_info *cinfo, struct idr *idr, int id)
|
||||
|
||||
static int scmi_remove(struct platform_device *pdev)
|
||||
{
|
||||
int ret = 0, id;
|
||||
int ret, id;
|
||||
struct scmi_info *info = platform_get_drvdata(pdev);
|
||||
struct device_node *child;
|
||||
|
||||
mutex_lock(&scmi_list_mutex);
|
||||
if (info->users)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
list_del(&info->node);
|
||||
dev_warn(&pdev->dev,
|
||||
"Still active SCMI users will be forcibly unbound.\n");
|
||||
list_del(&info->node);
|
||||
mutex_unlock(&scmi_list_mutex);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
scmi_notification_exit(&info->handle);
|
||||
|
||||
mutex_lock(&info->protocols_mtx);
|
||||
@ -2500,7 +2508,11 @@ static int scmi_remove(struct platform_device *pdev)
|
||||
idr_destroy(&info->active_protocols);
|
||||
|
||||
/* Safe to free channels since no more users */
|
||||
return scmi_cleanup_txrx_channels(info);
|
||||
ret = scmi_cleanup_txrx_channels(info);
|
||||
if (ret)
|
||||
dev_warn(&pdev->dev, "Failed to cleanup SCMI channels.\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t protocol_version_show(struct device *dev,
|
||||
@ -2571,6 +2583,7 @@ MODULE_DEVICE_TABLE(of, scmi_of_match);
|
||||
static struct platform_driver scmi_driver = {
|
||||
.driver = {
|
||||
.name = "arm-scmi",
|
||||
.suppress_bind_attrs = true,
|
||||
.of_match_table = scmi_of_match,
|
||||
.dev_groups = versions_groups,
|
||||
},
|
||||
|
@ -36,7 +36,7 @@ static void tx_prepare(struct mbox_client *cl, void *m)
|
||||
{
|
||||
struct scmi_mailbox *smbox = client_to_scmi_mailbox(cl);
|
||||
|
||||
shmem_tx_prepare(smbox->shmem, m);
|
||||
shmem_tx_prepare(smbox->shmem, m, smbox->cinfo);
|
||||
}
|
||||
|
||||
static void rx_callback(struct mbox_client *cl, void *m)
|
||||
|
@ -498,7 +498,7 @@ static int scmi_optee_send_message(struct scmi_chan_info *cinfo,
|
||||
msg_tx_prepare(channel->req.msg, xfer);
|
||||
ret = invoke_process_msg_channel(channel, msg_command_size(xfer));
|
||||
} else {
|
||||
shmem_tx_prepare(channel->req.shmem, xfer);
|
||||
shmem_tx_prepare(channel->req.shmem, xfer, cinfo);
|
||||
ret = invoke_process_smt_channel(channel);
|
||||
}
|
||||
|
||||
|
@ -5,10 +5,13 @@
|
||||
* Copyright (C) 2019 ARM Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/processor.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm-generic/bug.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
/*
|
||||
@ -30,16 +33,36 @@ struct scmi_shared_mem {
|
||||
};
|
||||
|
||||
void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem,
|
||||
struct scmi_xfer *xfer)
|
||||
struct scmi_xfer *xfer, struct scmi_chan_info *cinfo)
|
||||
{
|
||||
ktime_t stop;
|
||||
|
||||
/*
|
||||
* Ideally channel must be free by now unless OS timeout last
|
||||
* request and platform continued to process the same, wait
|
||||
* until it releases the shared memory, otherwise we may endup
|
||||
* overwriting its response with new message payload or vice-versa
|
||||
* overwriting its response with new message payload or vice-versa.
|
||||
* Giving up anyway after twice the expected channel timeout so as
|
||||
* not to bail-out on intermittent issues where the platform is
|
||||
* occasionally a bit slower to answer.
|
||||
*
|
||||
* Note that after a timeout is detected we bail-out and carry on but
|
||||
* the transport functionality is probably permanently compromised:
|
||||
* this is just to ease debugging and avoid complete hangs on boot
|
||||
* due to a misbehaving SCMI firmware.
|
||||
*/
|
||||
spin_until_cond(ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE);
|
||||
stop = ktime_add_ms(ktime_get(), 2 * cinfo->rx_timeout_ms);
|
||||
spin_until_cond((ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE) ||
|
||||
ktime_after(ktime_get(), stop));
|
||||
if (!(ioread32(&shmem->channel_status) &
|
||||
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE)) {
|
||||
WARN_ON_ONCE(1);
|
||||
dev_err(cinfo->dev,
|
||||
"Timeout waiting for a free TX channel !\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Mark channel busy + clear error */
|
||||
iowrite32(0x0, &shmem->channel_status);
|
||||
iowrite32(xfer->hdr.poll_completion ? 0 : SCMI_SHMEM_FLAG_INTR_ENABLED,
|
||||
|
@ -188,7 +188,7 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
|
||||
*/
|
||||
smc_channel_lock_acquire(scmi_info, xfer);
|
||||
|
||||
shmem_tx_prepare(scmi_info->shmem, xfer);
|
||||
shmem_tx_prepare(scmi_info->shmem, xfer, cinfo);
|
||||
|
||||
arm_smccc_1_1_invoke(scmi_info->func_id, 0, 0, 0, 0, 0, 0, 0, &res);
|
||||
|
||||
|
@ -148,7 +148,6 @@ static void scmi_vio_channel_cleanup_sync(struct scmi_vio_channel *vioch)
|
||||
{
|
||||
unsigned long flags;
|
||||
DECLARE_COMPLETION_ONSTACK(vioch_shutdown_done);
|
||||
void *deferred_wq = NULL;
|
||||
|
||||
/*
|
||||
* Prepare to wait for the last release if not already released
|
||||
@ -162,16 +161,11 @@ static void scmi_vio_channel_cleanup_sync(struct scmi_vio_channel *vioch)
|
||||
|
||||
vioch->shutdown_done = &vioch_shutdown_done;
|
||||
virtio_break_device(vioch->vqueue->vdev);
|
||||
if (!vioch->is_rx && vioch->deferred_tx_wq) {
|
||||
deferred_wq = vioch->deferred_tx_wq;
|
||||
if (!vioch->is_rx && vioch->deferred_tx_wq)
|
||||
/* Cannot be kicked anymore after this...*/
|
||||
vioch->deferred_tx_wq = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&vioch->lock, flags);
|
||||
|
||||
if (deferred_wq)
|
||||
destroy_workqueue(deferred_wq);
|
||||
|
||||
scmi_vio_channel_release(vioch);
|
||||
|
||||
/* Let any possibly concurrent RX path release the channel */
|
||||
@ -416,6 +410,11 @@ static bool virtio_chan_available(struct device *dev, int idx)
|
||||
return vioch && !vioch->cinfo;
|
||||
}
|
||||
|
||||
static void scmi_destroy_tx_workqueue(void *deferred_tx_wq)
|
||||
{
|
||||
destroy_workqueue(deferred_tx_wq);
|
||||
}
|
||||
|
||||
static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
bool tx)
|
||||
{
|
||||
@ -430,6 +429,8 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
|
||||
/* Setup a deferred worker for polling. */
|
||||
if (tx && !vioch->deferred_tx_wq) {
|
||||
int ret;
|
||||
|
||||
vioch->deferred_tx_wq =
|
||||
alloc_workqueue(dev_name(&scmi_vdev->dev),
|
||||
WQ_UNBOUND | WQ_FREEZABLE | WQ_SYSFS,
|
||||
@ -437,6 +438,11 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
if (!vioch->deferred_tx_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, scmi_destroy_tx_workqueue,
|
||||
vioch->deferred_tx_wq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
INIT_WORK(&vioch->deferred_tx_work,
|
||||
scmi_vio_deferred_tx_worker);
|
||||
}
|
||||
@ -444,12 +450,12 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
for (i = 0; i < vioch->max_msg; i++) {
|
||||
struct scmi_vio_msg *msg;
|
||||
|
||||
msg = devm_kzalloc(cinfo->dev, sizeof(*msg), GFP_KERNEL);
|
||||
msg = devm_kzalloc(dev, sizeof(*msg), GFP_KERNEL);
|
||||
if (!msg)
|
||||
return -ENOMEM;
|
||||
|
||||
if (tx) {
|
||||
msg->request = devm_kzalloc(cinfo->dev,
|
||||
msg->request = devm_kzalloc(dev,
|
||||
VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!msg->request)
|
||||
@ -458,7 +464,7 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
|
||||
refcount_set(&msg->users, 1);
|
||||
}
|
||||
|
||||
msg->input = devm_kzalloc(cinfo->dev, VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
msg->input = devm_kzalloc(dev, VIRTIO_SCMI_MAX_PDU_SIZE,
|
||||
GFP_KERNEL);
|
||||
if (!msg->input)
|
||||
return -ENOMEM;
|
||||
|
@ -135,11 +135,24 @@ static int imx93_pd_probe(struct platform_device *pdev)
|
||||
|
||||
ret = pm_genpd_init(&domain->genpd, NULL, domain->init_off);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_clk_unprepare;
|
||||
|
||||
platform_set_drvdata(pdev, domain);
|
||||
|
||||
return of_genpd_add_provider_simple(np, &domain->genpd);
|
||||
ret = of_genpd_add_provider_simple(np, &domain->genpd);
|
||||
if (ret)
|
||||
goto err_genpd_remove;
|
||||
|
||||
return 0;
|
||||
|
||||
err_genpd_remove:
|
||||
pm_genpd_remove(&domain->genpd);
|
||||
|
||||
err_clk_unprepare:
|
||||
if (!domain->init_off)
|
||||
clk_bulk_disable_unprepare(domain->num_clks, domain->clks);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct of_device_id imx93_pd_ids[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user