[U-Boot] [PATCH 0/4] dm: power: domain: add BCM6328 power domain driver

BCM6328 SoCs have power domain controllers which supports enabling and disabling power for the different peripherals.
Álvaro Fernández Rojas (4): dm: power: domain: add BCM6328 power domain driver mips: bmips: add bcm6328-power-domain driver support for BCM6328 mips: bmips: add bcm6328-power-domain driver support for BCM63268 mips: bmips: enable bcm6328-power-domain driver for BCM6328 and BCM63268 boards
arch/mips/dts/brcm,bcm63268.dtsi | 7 ++ arch/mips/dts/brcm,bcm6328.dtsi | 7 ++ configs/comtrend_ar5387un_ram_defconfig | 2 + configs/comtrend_vr3032u_ram_defconfig | 2 + drivers/power/domain/Kconfig | 7 ++ drivers/power/domain/Makefile | 1 + drivers/power/domain/bcm6328-power-domain.c | 83 ++++++++++++++++++++++ .../power-domain/bcm63268-power-domain.h | 25 +++++++ .../power-domain/bcm6328-power-domain.h | 21 ++++++ 9 files changed, 155 insertions(+) create mode 100644 drivers/power/domain/bcm6328-power-domain.c create mode 100644 include/dt-bindings/power-domain/bcm63268-power-domain.h create mode 100644 include/dt-bindings/power-domain/bcm6328-power-domain.h

This allows controlling MISC IDDQ register on BCM6328 SoCs.
Signed-off-by: Álvaro Fernández Rojas noltari@gmail.com --- drivers/power/domain/Kconfig | 7 +++ drivers/power/domain/Makefile | 1 + drivers/power/domain/bcm6328-power-domain.c | 83 +++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 drivers/power/domain/bcm6328-power-domain.c
diff --git a/drivers/power/domain/Kconfig b/drivers/power/domain/Kconfig index 132e332..7cfa761 100644 --- a/drivers/power/domain/Kconfig +++ b/drivers/power/domain/Kconfig @@ -9,6 +9,13 @@ config POWER_DOMAIN domains). This may be used to save power. This API provides the means to control such power management hardware.
+config BCM6328_POWER_DOMAIN + bool "Enable the BCM6328 power domain driver" + depends on POWER_DOMAIN && ARCH_BMIPS + help + Enable support for manipulating BCM6345 power domains via MMIO + mapped registers. + config SANDBOX_POWER_DOMAIN bool "Enable the sandbox power domain test driver" depends on POWER_DOMAIN && SANDBOX diff --git a/drivers/power/domain/Makefile b/drivers/power/domain/Makefile index 2c3d926..c7d7644 100644 --- a/drivers/power/domain/Makefile +++ b/drivers/power/domain/Makefile @@ -3,6 +3,7 @@ # SPDX-License-Identifier: GPL-2.0
obj-$(CONFIG_POWER_DOMAIN) += power-domain-uclass.o +obj-$(CONFIG_BCM6328_POWER_DOMAIN) += bcm6328-power-domain.o obj-$(CONFIG_SANDBOX_POWER_DOMAIN) += sandbox-power-domain.o obj-$(CONFIG_SANDBOX_POWER_DOMAIN) += sandbox-power-domain-test.o obj-$(CONFIG_TEGRA186_POWER_DOMAIN) += tegra186-power-domain.o diff --git a/drivers/power/domain/bcm6328-power-domain.c b/drivers/power/domain/bcm6328-power-domain.c new file mode 100644 index 0000000..15638bf --- /dev/null +++ b/drivers/power/domain/bcm6328-power-domain.c @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2017 Álvaro Fernández Rojas noltari@gmail.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include <common.h> +#include <dm.h> +#include <power-domain-uclass.h> +#include <asm/io.h> + +#define MAX_DOMAINS 32 + +struct bcm6328_power_domain { + void __iomem *regs; +}; + +static int bcm6328_power_domain_request(struct power_domain *power_domain) +{ + if (power_domain->id >= MAX_DOMAINS) + return -EINVAL; + + return 0; +} + +static int bcm6328_power_domain_free(struct power_domain *power_domain) +{ + return 0; +} + +static int bcm6328_power_domain_on(struct power_domain *power_domain) +{ + struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev); + + clrbits_be32(priv->regs, BIT(power_domain->id)); + + return 0; +} + +static int bcm6328_power_domain_off(struct power_domain *power_domain) +{ + struct bcm6328_power_domain *priv = dev_get_priv(power_domain->dev); + + setbits_be32(priv->regs, BIT(power_domain->id)); + + return 0; +} + +static int bcm6328_power_domain_probe(struct udevice *dev) +{ + struct bcm6328_power_domain *priv = dev_get_priv(dev); + fdt_addr_t addr; + fdt_size_t size; + + addr = dev_get_addr_size_index(dev, 0, &size); + if (addr == FDT_ADDR_T_NONE) + return -EINVAL; + + priv->regs = ioremap(addr, size); + + return 0; +} + +static const struct udevice_id bcm6328_power_domain_ids[] = { + { .compatible = "brcm,bcm6328-power-domain" }, + { /* sentinel */ } +}; + +struct power_domain_ops bcm6328_power_domain_ops = { + .free = bcm6328_power_domain_free, + .off = bcm6328_power_domain_off, + .on = bcm6328_power_domain_on, + .request = bcm6328_power_domain_request, +}; + +U_BOOT_DRIVER(bcm6328_power_domain) = { + .name = "bcm6328_power_domain", + .id = UCLASS_POWER_DOMAIN, + .of_match = bcm6328_power_domain_ids, + .ops = &bcm6328_power_domain_ops, + .priv_auto_alloc_size = sizeof(struct bcm6328_power_domain), + .probe = bcm6328_power_domain_probe, +};

This driver can control up to 32 power domains.
Signed-off-by: Álvaro Fernández Rojas noltari@gmail.com --- arch/mips/dts/brcm,bcm6328.dtsi | 7 +++++++ .../dt-bindings/power-domain/bcm6328-power-domain.h | 21 +++++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 include/dt-bindings/power-domain/bcm6328-power-domain.h
diff --git a/arch/mips/dts/brcm,bcm6328.dtsi b/arch/mips/dts/brcm,bcm6328.dtsi index 9b76a23..4adc83f 100644 --- a/arch/mips/dts/brcm,bcm6328.dtsi +++ b/arch/mips/dts/brcm,bcm6328.dtsi @@ -6,6 +6,7 @@
#include <dt-bindings/clock/bcm6328-clock.h> #include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/power-domain/bcm6328-power-domain.h> #include <dt-bindings/reset/bcm6328-reset.h> #include "skeleton.dtsi"
@@ -111,6 +112,12 @@ status = "disabled"; };
+ periph_pwr: power-controller@10001848 { + compatible = "brcm,bcm6328-power-domain"; + reg = <0x10001848 0x4>; + #power-domain-cells = <1>; + }; + memory-controller@10003000 { compatible = "brcm,bcm6328-mc"; reg = <0x10003000 0x1000>; diff --git a/include/dt-bindings/power-domain/bcm6328-power-domain.h b/include/dt-bindings/power-domain/bcm6328-power-domain.h new file mode 100644 index 0000000..006806c --- /dev/null +++ b/include/dt-bindings/power-domain/bcm6328-power-domain.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2017 Álvaro Fernández Rojas noltari@gmail.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __DT_BINDINGS_POWER_DOMAIN_BCM6328_H +#define __DT_BINDINGS_POWER_DOMAIN_BCM6328_H + +#define BCM6328_PWR_ADSL2_MIPS 0 +#define BCM6328_PWR_ADSL2_PHY 1 +#define BCM6328_PWR_ADSL2_AFE 2 +#define BCM6328_PWR_SAR 3 +#define BCM6328_PWR_PCM 4 +#define BCM6328_PWR_USBD 5 +#define BCM6328_PWR_USBH 6 +#define BCM6328_PWR_PCIE 7 +#define BCM6328_PWR_ROBOSW 8 +#define BCM6328_PWR_EPHY 9 + +#endif /* __DT_BINDINGS_POWER_DOMAIN_BCM6328_H */

This driver can control up to 32 power domains.
Signed-off-by: Álvaro Fernández Rojas noltari@gmail.com --- arch/mips/dts/brcm,bcm63268.dtsi | 7 ++++++ .../power-domain/bcm63268-power-domain.h | 25 ++++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 include/dt-bindings/power-domain/bcm63268-power-domain.h
diff --git a/arch/mips/dts/brcm,bcm63268.dtsi b/arch/mips/dts/brcm,bcm63268.dtsi index 8ff13c1..3d0f8e0 100644 --- a/arch/mips/dts/brcm,bcm63268.dtsi +++ b/arch/mips/dts/brcm,bcm63268.dtsi @@ -6,6 +6,7 @@
#include <dt-bindings/clock/bcm63268-clock.h> #include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/power-domain/bcm63268-power-domain.h> #include <dt-bindings/reset/bcm63268-reset.h> #include "skeleton.dtsi"
@@ -118,6 +119,12 @@ status = "disabled"; };
+ periph_pwr: power-controller@1000184c { + compatible = "brcm,bcm6328-power-domain"; + reg = <0x1000184c 0x4>; + #power-domain-cells = <1>; + }; + leds: led-controller@10001900 { compatible = "brcm,bcm6328-leds"; reg = <0x10001900 0x24>; diff --git a/include/dt-bindings/power-domain/bcm63268-power-domain.h b/include/dt-bindings/power-domain/bcm63268-power-domain.h new file mode 100644 index 0000000..d9eba44 --- /dev/null +++ b/include/dt-bindings/power-domain/bcm63268-power-domain.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2017 Álvaro Fernández Rojas noltari@gmail.com + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#ifndef __DT_BINDINGS_POWER_DOMAIN_BCM63268_H +#define __DT_BINDINGS_POWER_DOMAIN_BCM63268_H + +#define BCM63268_PWR_SAR 0 +#define BCM63268_PWR_IPSEC 1 +#define BCM63268_PWR_MIPS 2 +#define BCM63268_PWR_DECT 3 +#define BCM63268_PWR_USBH 4 +#define BCM63268_PWR_USBD 5 +#define BCM63268_PWR_ROBOSW 6 +#define BCM63268_PWR_PCM 7 +#define BCM63268_PWR_PERIPH 8 +#define BCM63268_PWR_VDSL_PHY 9 +#define BCM63268_PWR_VDSL_MIPS 10 +#define BCM63268_PWR_FAP 11 +#define BCM63268_PWR_PCIE 12 +#define BCM63268_PWR_WLAN_PADS 13 + +#endif /* __DT_BINDINGS_POWER_DOMAIN_BCM63268_H */

Signed-off-by: Álvaro Fernández Rojas noltari@gmail.com --- configs/comtrend_ar5387un_ram_defconfig | 2 ++ configs/comtrend_vr3032u_ram_defconfig | 2 ++ 2 files changed, 4 insertions(+)
diff --git a/configs/comtrend_ar5387un_ram_defconfig b/configs/comtrend_ar5387un_ram_defconfig index d613740..5b05fd2 100644 --- a/configs/comtrend_ar5387un_ram_defconfig +++ b/configs/comtrend_ar5387un_ram_defconfig @@ -1,5 +1,6 @@ CONFIG_ARCH_BMIPS=y CONFIG_BAUDRATE=115200 +CONFIG_BCM6328_POWER_DOMAIN=y CONFIG_BCM6345_CLK=y CONFIG_BCM6345_SERIAL=y CONFIG_BMIPS_BOOT_RAM=y @@ -42,6 +43,7 @@ CONFIG_MIPS=y # CONFIG_MIPS_BOOT_ENV_LEGACY is not set CONFIG_MIPS_BOOT_FDT=y CONFIG_OF_STDOUT_VIA_ALIAS=y +CONFIG_POWER_DOMAIN=y CONFIG_RESET=y CONFIG_RESET_BCM6345=y CONFIG_SOC_BMIPS_BCM6328=y diff --git a/configs/comtrend_vr3032u_ram_defconfig b/configs/comtrend_vr3032u_ram_defconfig index fa2b2ae..c056d73 100644 --- a/configs/comtrend_vr3032u_ram_defconfig +++ b/configs/comtrend_vr3032u_ram_defconfig @@ -1,5 +1,6 @@ CONFIG_ARCH_BMIPS=y CONFIG_BAUDRATE=115200 +CONFIG_BCM6328_POWER_DOMAIN=y CONFIG_BCM6345_CLK=y CONFIG_BCM6345_SERIAL=y CONFIG_BMIPS_BOOT_RAM=y @@ -42,6 +43,7 @@ CONFIG_MIPS=y # CONFIG_MIPS_BOOT_ENV_LEGACY is not set CONFIG_MIPS_BOOT_FDT=y CONFIG_OF_STDOUT_VIA_ALIAS=y +CONFIG_POWER_DOMAIN=y CONFIG_RESET=y CONFIG_RESET_BCM6345=y CONFIG_SOC_BMIPS_BCM63268=y

Am 07.05.2017 um 20:28 schrieb Álvaro Fernández Rojas:
BCM6328 SoCs have power domain controllers which supports enabling and disabling power for the different peripherals.
Álvaro Fernández Rojas (4): dm: power: domain: add BCM6328 power domain driver mips: bmips: add bcm6328-power-domain driver support for BCM6328 mips: bmips: add bcm6328-power-domain driver support for BCM63268 mips: bmips: enable bcm6328-power-domain driver for BCM6328 and BCM63268 boards
arch/mips/dts/brcm,bcm63268.dtsi | 7 ++ arch/mips/dts/brcm,bcm6328.dtsi | 7 ++ configs/comtrend_ar5387un_ram_defconfig | 2 + configs/comtrend_vr3032u_ram_defconfig | 2 + drivers/power/domain/Kconfig | 7 ++ drivers/power/domain/Makefile | 1 + drivers/power/domain/bcm6328-power-domain.c | 83 ++++++++++++++++++++++ .../power-domain/bcm63268-power-domain.h | 25 +++++++ .../power-domain/bcm6328-power-domain.h | 21 ++++++ 9 files changed, 155 insertions(+) create mode 100644 drivers/power/domain/bcm6328-power-domain.c create mode 100644 include/dt-bindings/power-domain/bcm63268-power-domain.h create mode 100644 include/dt-bindings/power-domain/bcm6328-power-domain.h
series applied to u-boot-mips/next, thanks
participants (2)
-
Daniel Schwierzeck
-
Álvaro Fernández Rojas