ARM: SoC fixes for v5.1
A couple of minor fixes only for now - Incorrect DMA channels on Renesas R-Car - Broadcom bcm2835 error handling fixes - Kconfig dependency fixes for bcm2835 and davinci - CPU idle wakeup fix for i.MX6 - MMC regression on Tegra186 - Incorrect phy settings on one imx board -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJcmQBWAAoJEGCrR//JCVInXwQP/isXeyDBtT1xlJMUBU8CnIuz pDp1vZyEsGkLlErI9T299+sZL4XIfz1eHXiJmnQZvGMefumvim5zEvdo469Jk/Da 9Fu/1yo4Dy6pIIkoUFp4LeQVZoEVtWHrhH9IIIWuN7XlnLWeBxVPggp64gKIVXry iqRa7h7hM15dsYhmeri5fLkR9J3kMLfIkZCT1m6ysYGc0LBj5a9kcf+8B5Tebo+8 ffwiMSo3mNhsepPB1sFRDUNLzCsa3PiA/qycJlg5UTap2YkwmZ93ANHv6DbDztza Vgw7uFsZ04a6rZFa0jZs9On3GjxB1iLO1b8PM3dNHa2yBjprK5VYhUNh5tcIlPUL l5IPzJTnD6qEI/8H+kjbAyl53TYQh+YjRKnN6Khvbuec7BgMlBvLTNwZNJHGV9oo 2feTKhdpnHt2FhE/p+5MtXf5n+a//xY99HtKLu9EBGAG1rwMq0gahjfXVnBB+XSz 71m/anA2C9A/zNstNOlthziomenTLSQoE7RmKty7kIB6j/rzY9yOTlCcKnSgKnOD TU2MyIgEzvcxOmp+5wJBL4XncWX/9MjQ53GV+23NoRwIIFP9G7A4cVUykniPbugk 9H7bJv78O+sI/rr4vEBf3Og8yQcuLMULp0Tos7gD2b4QZ1hWWSMmKKWHQK1In4+n 3tUmvx7HfdWxHKkRMc0U =nCso -----END PGP SIGNATURE----- Merge tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc Pull ARM SoC fixes from Arnd Bergmann: "A couple of minor fixes only for now - fix for incorrect DMA channels on Renesas R-Car - Broadcom bcm2835 error handling fixes - Kconfig dependency fixes for bcm2835 and davinci - CPU idle wakeup fix for i.MX6 - MMC regression on Tegra186 - fix incorrect phy settings on one imx board" * tag 'armsoc-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: arm64: tegra: Disable CQE Support for SDMMC4 on Tegra186 ARM: dts: nomadik: Fix polarity of SPI CS ARM: davinci: fix build failure with allnoconfig ARM: imx_v4_v5_defconfig: enable PWM driver ARM: imx_v6_v7_defconfig: continue compiling the pwm driver ARM: dts: imx6dl-yapp4: Use correct pseudo PHY address for the switch ARM: dts: imx6qdl: Fix typo in imx6qdl-icore-rqs.dtsi ARM: dts: imx6ull: Use the correct style for SPDX License Identifier ARM: dts: pfla02: increase phy reset duration ARM: imx6q: cpuidle: fix bug that CPU might not wake up at expected time ARM: imx51: fix a leaked reference by adding missing of_node_put ARM: dts: imx6dl-yapp4: Use rgmii-id phy mode on the cpu port arm64: bcm2835: Add missing dependency on MFD_CORE. ARM: dts: bcm283x: Fix hdmi hpd gpio pull soc: bcm: bcm2835-pm: Fix error paths of initialization. soc: bcm: bcm2835-pm: Fix PM_IMAGE_PERI power domain support. arm64: dts: renesas: r8a774c0: Fix SCIF5 DMA channels arm64: dts: renesas: r8a77990: Fix SCIF5 DMA channels
This commit is contained in:
commit
97c41a6bdc
|
@ -596,6 +596,7 @@ config ARCH_DAVINCI
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select PM_GENERIC_DOMAINS if PM
|
select PM_GENERIC_DOMAINS if PM
|
||||||
select PM_GENERIC_DOMAINS_OF if PM && OF
|
select PM_GENERIC_DOMAINS_OF if PM && OF
|
||||||
|
select REGMAP_MMIO
|
||||||
select RESET_CONTROLLER
|
select RESET_CONTROLLER
|
||||||
select SPARSE_IRQ
|
select SPARSE_IRQ
|
||||||
select USE_OF
|
select USE_OF
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&hdmi {
|
&hdmi {
|
||||||
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
|
hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&pwm {
|
&pwm {
|
||||||
|
|
|
@ -114,9 +114,9 @@
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
};
|
};
|
||||||
|
|
||||||
switch@0 {
|
switch@10 {
|
||||||
compatible = "qca,qca8334";
|
compatible = "qca,qca8334";
|
||||||
reg = <0>;
|
reg = <10>;
|
||||||
|
|
||||||
switch_ports: ports {
|
switch_ports: ports {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -125,7 +125,7 @@
|
||||||
ethphy0: port@0 {
|
ethphy0: port@0 {
|
||||||
reg = <0>;
|
reg = <0>;
|
||||||
label = "cpu";
|
label = "cpu";
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii-id";
|
||||||
ethernet = <&fec>;
|
ethernet = <&fec>;
|
||||||
|
|
||||||
fixed-link {
|
fixed-link {
|
||||||
|
|
|
@ -264,7 +264,7 @@
|
||||||
pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
|
pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
|
||||||
vmcc-supply = <®_sd3_vmmc>;
|
vmcc-supply = <®_sd3_vmmc>;
|
||||||
cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
|
cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
|
||||||
bus-witdh = <4>;
|
bus-width = <4>;
|
||||||
no-1-8-v;
|
no-1-8-v;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
@ -275,7 +275,7 @@
|
||||||
pinctrl-1 = <&pinctrl_usdhc4_100mhz>;
|
pinctrl-1 = <&pinctrl_usdhc4_100mhz>;
|
||||||
pinctrl-2 = <&pinctrl_usdhc4_200mhz>;
|
pinctrl-2 = <&pinctrl_usdhc4_200mhz>;
|
||||||
vmcc-supply = <®_sd4_vmmc>;
|
vmcc-supply = <®_sd4_vmmc>;
|
||||||
bus-witdh = <8>;
|
bus-width = <8>;
|
||||||
no-1-8-v;
|
no-1-8-v;
|
||||||
non-removable;
|
non-removable;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
pinctrl-0 = <&pinctrl_enet>;
|
pinctrl-0 = <&pinctrl_enet>;
|
||||||
phy-handle = <ðphy>;
|
phy-handle = <ðphy>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
|
phy-reset-duration = <10>; /* in msecs */
|
||||||
phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
|
phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
|
||||||
phy-supply = <&vdd_eth_io_reg>;
|
phy-supply = <&vdd_eth_io_reg>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
||||||
* Copyright (C) 2017 NXP
|
* Copyright (C) 2017 NXP
|
||||||
|
|
|
@ -213,12 +213,13 @@
|
||||||
gpio-sck = <&gpio0 5 GPIO_ACTIVE_HIGH>;
|
gpio-sck = <&gpio0 5 GPIO_ACTIVE_HIGH>;
|
||||||
gpio-mosi = <&gpio0 4 GPIO_ACTIVE_HIGH>;
|
gpio-mosi = <&gpio0 4 GPIO_ACTIVE_HIGH>;
|
||||||
/*
|
/*
|
||||||
* It's not actually active high, but the frameworks assume
|
* This chipselect is active high. Just setting the flags
|
||||||
* the polarity of the passed-in GPIO is "normal" (active
|
* to GPIO_ACTIVE_HIGH is not enough for the SPI DT bindings,
|
||||||
* high) then actively drives the line low to select the
|
* it will be ignored, only the special "spi-cs-high" flag
|
||||||
* chip.
|
* really counts.
|
||||||
*/
|
*/
|
||||||
cs-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
|
cs-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>;
|
||||||
|
spi-cs-high;
|
||||||
num-chipselects = <1>;
|
num-chipselects = <1>;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -170,6 +170,9 @@ CONFIG_IMX_SDMA=y
|
||||||
# CONFIG_IOMMU_SUPPORT is not set
|
# CONFIG_IOMMU_SUPPORT is not set
|
||||||
CONFIG_IIO=y
|
CONFIG_IIO=y
|
||||||
CONFIG_FSL_MX25_ADC=y
|
CONFIG_FSL_MX25_ADC=y
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_IMX1=y
|
||||||
|
CONFIG_PWM_IMX27=y
|
||||||
CONFIG_EXT4_FS=y
|
CONFIG_EXT4_FS=y
|
||||||
# CONFIG_DNOTIFY is not set
|
# CONFIG_DNOTIFY is not set
|
||||||
CONFIG_VFAT_FS=y
|
CONFIG_VFAT_FS=y
|
||||||
|
|
|
@ -398,7 +398,7 @@ CONFIG_MAG3110=y
|
||||||
CONFIG_MPL3115=y
|
CONFIG_MPL3115=y
|
||||||
CONFIG_PWM=y
|
CONFIG_PWM=y
|
||||||
CONFIG_PWM_FSL_FTM=y
|
CONFIG_PWM_FSL_FTM=y
|
||||||
CONFIG_PWM_IMX=y
|
CONFIG_PWM_IMX27=y
|
||||||
CONFIG_NVMEM_IMX_OCOTP=y
|
CONFIG_NVMEM_IMX_OCOTP=y
|
||||||
CONFIG_NVMEM_VF610_OCOTP=y
|
CONFIG_NVMEM_VF610_OCOTP=y
|
||||||
CONFIG_TEE=y
|
CONFIG_TEE=y
|
||||||
|
|
|
@ -16,30 +16,23 @@
|
||||||
#include "cpuidle.h"
|
#include "cpuidle.h"
|
||||||
#include "hardware.h"
|
#include "hardware.h"
|
||||||
|
|
||||||
static atomic_t master = ATOMIC_INIT(0);
|
static int num_idle_cpus = 0;
|
||||||
static DEFINE_SPINLOCK(master_lock);
|
static DEFINE_SPINLOCK(cpuidle_lock);
|
||||||
|
|
||||||
static int imx6q_enter_wait(struct cpuidle_device *dev,
|
static int imx6q_enter_wait(struct cpuidle_device *dev,
|
||||||
struct cpuidle_driver *drv, int index)
|
struct cpuidle_driver *drv, int index)
|
||||||
{
|
{
|
||||||
if (atomic_inc_return(&master) == num_online_cpus()) {
|
spin_lock(&cpuidle_lock);
|
||||||
/*
|
if (++num_idle_cpus == num_online_cpus())
|
||||||
* With this lock, we prevent other cpu to exit and enter
|
|
||||||
* this function again and become the master.
|
|
||||||
*/
|
|
||||||
if (!spin_trylock(&master_lock))
|
|
||||||
goto idle;
|
|
||||||
imx6_set_lpm(WAIT_UNCLOCKED);
|
imx6_set_lpm(WAIT_UNCLOCKED);
|
||||||
cpu_do_idle();
|
spin_unlock(&cpuidle_lock);
|
||||||
imx6_set_lpm(WAIT_CLOCKED);
|
|
||||||
spin_unlock(&master_lock);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
idle:
|
|
||||||
cpu_do_idle();
|
cpu_do_idle();
|
||||||
done:
|
|
||||||
atomic_dec(&master);
|
spin_lock(&cpuidle_lock);
|
||||||
|
if (num_idle_cpus-- == num_online_cpus())
|
||||||
|
imx6_set_lpm(WAIT_CLOCKED);
|
||||||
|
spin_unlock(&cpuidle_lock);
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@ static void __init imx51_m4if_setup(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m4if_base = of_iomap(np, 0);
|
m4if_base = of_iomap(np, 0);
|
||||||
|
of_node_put(np);
|
||||||
if (!m4if_base) {
|
if (!m4if_base) {
|
||||||
pr_err("Unable to map M4IF registers\n");
|
pr_err("Unable to map M4IF registers\n");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -27,6 +27,7 @@ config ARCH_BCM2835
|
||||||
bool "Broadcom BCM2835 family"
|
bool "Broadcom BCM2835 family"
|
||||||
select TIMER_OF
|
select TIMER_OF
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
|
select MFD_CORE
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
select PINCTRL_BCM2835
|
select PINCTRL_BCM2835
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
|
|
|
@ -321,7 +321,6 @@
|
||||||
nvidia,default-trim = <0x9>;
|
nvidia,default-trim = <0x9>;
|
||||||
nvidia,dqs-trim = <63>;
|
nvidia,dqs-trim = <63>;
|
||||||
mmc-hs400-1_8v;
|
mmc-hs400-1_8v;
|
||||||
supports-cqe;
|
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* Device Tree Source for the RZ/G2E (R8A774C0) SoC
|
* Device Tree Source for the RZ/G2E (R8A774C0) SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 Renesas Electronics Corp.
|
* Copyright (C) 2018-2019 Renesas Electronics Corp.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/r8a774c0-cpg-mssr.h>
|
#include <dt-bindings/clock/r8a774c0-cpg-mssr.h>
|
||||||
|
@ -1150,9 +1150,8 @@
|
||||||
<&cpg CPG_CORE R8A774C0_CLK_S3D1C>,
|
<&cpg CPG_CORE R8A774C0_CLK_S3D1C>,
|
||||||
<&scif_clk>;
|
<&scif_clk>;
|
||||||
clock-names = "fck", "brg_int", "scif_clk";
|
clock-names = "fck", "brg_int", "scif_clk";
|
||||||
dmas = <&dmac1 0x5b>, <&dmac1 0x5a>,
|
dmas = <&dmac0 0x5b>, <&dmac0 0x5a>;
|
||||||
<&dmac2 0x5b>, <&dmac2 0x5a>;
|
dma-names = "tx", "rx";
|
||||||
dma-names = "tx", "rx", "tx", "rx";
|
|
||||||
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
|
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
|
||||||
resets = <&cpg 202>;
|
resets = <&cpg 202>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/*
|
/*
|
||||||
* Device Tree Source for the R-Car E3 (R8A77990) SoC
|
* Device Tree Source for the R-Car E3 (R8A77990) SoC
|
||||||
*
|
*
|
||||||
* Copyright (C) 2018 Renesas Electronics Corp.
|
* Copyright (C) 2018-2019 Renesas Electronics Corp.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <dt-bindings/clock/r8a77990-cpg-mssr.h>
|
#include <dt-bindings/clock/r8a77990-cpg-mssr.h>
|
||||||
|
@ -1067,9 +1067,8 @@
|
||||||
<&cpg CPG_CORE R8A77990_CLK_S3D1C>,
|
<&cpg CPG_CORE R8A77990_CLK_S3D1C>,
|
||||||
<&scif_clk>;
|
<&scif_clk>;
|
||||||
clock-names = "fck", "brg_int", "scif_clk";
|
clock-names = "fck", "brg_int", "scif_clk";
|
||||||
dmas = <&dmac1 0x5b>, <&dmac1 0x5a>,
|
dmas = <&dmac0 0x5b>, <&dmac0 0x5a>;
|
||||||
<&dmac2 0x5b>, <&dmac2 0x5a>;
|
dma-names = "tx", "rx";
|
||||||
dma-names = "tx", "rx", "tx", "rx";
|
|
||||||
power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
|
power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
|
||||||
resets = <&cpg 202>;
|
resets = <&cpg 202>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -150,7 +150,12 @@ struct bcm2835_power {
|
||||||
|
|
||||||
static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
|
static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
|
||||||
{
|
{
|
||||||
u64 start = ktime_get_ns();
|
u64 start;
|
||||||
|
|
||||||
|
if (!reg)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
start = ktime_get_ns();
|
||||||
|
|
||||||
/* Enable the module's async AXI bridges. */
|
/* Enable the module's async AXI bridges. */
|
||||||
ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
|
ASB_WRITE(reg, ASB_READ(reg) & ~ASB_REQ_STOP);
|
||||||
|
@ -165,7 +170,12 @@ static int bcm2835_asb_enable(struct bcm2835_power *power, u32 reg)
|
||||||
|
|
||||||
static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
|
static int bcm2835_asb_disable(struct bcm2835_power *power, u32 reg)
|
||||||
{
|
{
|
||||||
u64 start = ktime_get_ns();
|
u64 start;
|
||||||
|
|
||||||
|
if (!reg)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
start = ktime_get_ns();
|
||||||
|
|
||||||
/* Enable the module's async AXI bridges. */
|
/* Enable the module's async AXI bridges. */
|
||||||
ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
|
ASB_WRITE(reg, ASB_READ(reg) | ASB_REQ_STOP);
|
||||||
|
@ -475,7 +485,7 @@ static int bcm2835_power_pd_power_off(struct generic_pm_domain *domain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static int
|
||||||
bcm2835_init_power_domain(struct bcm2835_power *power,
|
bcm2835_init_power_domain(struct bcm2835_power *power,
|
||||||
int pd_xlate_index, const char *name)
|
int pd_xlate_index, const char *name)
|
||||||
{
|
{
|
||||||
|
@ -483,6 +493,17 @@ bcm2835_init_power_domain(struct bcm2835_power *power,
|
||||||
struct bcm2835_power_domain *dom = &power->domains[pd_xlate_index];
|
struct bcm2835_power_domain *dom = &power->domains[pd_xlate_index];
|
||||||
|
|
||||||
dom->clk = devm_clk_get(dev->parent, name);
|
dom->clk = devm_clk_get(dev->parent, name);
|
||||||
|
if (IS_ERR(dom->clk)) {
|
||||||
|
int ret = PTR_ERR(dom->clk);
|
||||||
|
|
||||||
|
if (ret == -EPROBE_DEFER)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Some domains don't have a clk, so make sure that we
|
||||||
|
* don't deref an error pointer later.
|
||||||
|
*/
|
||||||
|
dom->clk = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
dom->base.name = name;
|
dom->base.name = name;
|
||||||
dom->base.power_on = bcm2835_power_pd_power_on;
|
dom->base.power_on = bcm2835_power_pd_power_on;
|
||||||
|
@ -495,6 +516,8 @@ bcm2835_init_power_domain(struct bcm2835_power *power,
|
||||||
pm_genpd_init(&dom->base, NULL, true);
|
pm_genpd_init(&dom->base, NULL, true);
|
||||||
|
|
||||||
power->pd_xlate.domains[pd_xlate_index] = &dom->base;
|
power->pd_xlate.domains[pd_xlate_index] = &dom->base;
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** bcm2835_reset_reset - Resets a block that has a reset line in the
|
/** bcm2835_reset_reset - Resets a block that has a reset line in the
|
||||||
|
@ -592,7 +615,7 @@ static int bcm2835_power_probe(struct platform_device *pdev)
|
||||||
{ BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM0 },
|
{ BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM0 },
|
||||||
{ BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM1 },
|
{ BCM2835_POWER_DOMAIN_IMAGE_PERI, BCM2835_POWER_DOMAIN_CAM1 },
|
||||||
};
|
};
|
||||||
int ret, i;
|
int ret = 0, i;
|
||||||
u32 id;
|
u32 id;
|
||||||
|
|
||||||
power = devm_kzalloc(dev, sizeof(*power), GFP_KERNEL);
|
power = devm_kzalloc(dev, sizeof(*power), GFP_KERNEL);
|
||||||
|
@ -619,8 +642,11 @@ static int bcm2835_power_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
power->pd_xlate.num_domains = ARRAY_SIZE(power_domain_names);
|
power->pd_xlate.num_domains = ARRAY_SIZE(power_domain_names);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(power_domain_names); i++)
|
for (i = 0; i < ARRAY_SIZE(power_domain_names); i++) {
|
||||||
bcm2835_init_power_domain(power, i, power_domain_names[i]);
|
ret = bcm2835_init_power_domain(power, i, power_domain_names[i]);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(domain_deps); i++) {
|
for (i = 0; i < ARRAY_SIZE(domain_deps); i++) {
|
||||||
pm_genpd_add_subdomain(&power->domains[domain_deps[i].parent].base,
|
pm_genpd_add_subdomain(&power->domains[domain_deps[i].parent].base,
|
||||||
|
@ -634,12 +660,21 @@ static int bcm2835_power_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = devm_reset_controller_register(dev, &power->reset);
|
ret = devm_reset_controller_register(dev, &power->reset);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
goto fail;
|
||||||
|
|
||||||
of_genpd_add_provider_onecell(dev->parent->of_node, &power->pd_xlate);
|
of_genpd_add_provider_onecell(dev->parent->of_node, &power->pd_xlate);
|
||||||
|
|
||||||
dev_info(dev, "Broadcom BCM2835 power domains driver");
|
dev_info(dev, "Broadcom BCM2835 power domains driver");
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
for (i = 0; i < ARRAY_SIZE(power_domain_names); i++) {
|
||||||
|
struct generic_pm_domain *dom = &power->domains[i].base;
|
||||||
|
|
||||||
|
if (dom->name)
|
||||||
|
pm_genpd_remove(dom);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bcm2835_power_remove(struct platform_device *pdev)
|
static int bcm2835_power_remove(struct platform_device *pdev)
|
||||||
|
|
Loading…
Reference in New Issue