// SPDX-License-Identifier: GPL-2.0-only /* * AM43xx Power domains framework * * Copyright (C) 2013 Texas Instruments, Inc. */ #include <linux/kernel.h> #include <linux/init.h> #include "powerdomain.h" #include "prcm-common.h" #include "prcm44xx.h" #include "prcm43xx.h" static struct powerdomain gfx_43xx_pwrdm = { .name = "gfx_pwrdm", .voltdm = { .name = "core" }, .prcm_offs = AM43XX_PRM_GFX_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_OFF_ON, .banks = 1, .pwrsts_mem_on = { [0] = PWRSTS_ON, /* gfx_mem */ }, .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, }; static struct powerdomain mpu_43xx_pwrdm = { .name = "mpu_pwrdm", .voltdm = { .name = "mpu" }, .prcm_offs = AM43XX_PRM_MPU_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_OFF_RET_ON, .pwrsts_logic_ret = PWRSTS_OFF_RET, .banks = 3, .pwrsts_mem_ret = { [0] = PWRSTS_OFF_RET, /* mpu_l1 */ [1] = PWRSTS_OFF_RET, /* mpu_l2 */ [2] = PWRSTS_OFF_RET, /* mpu_ram */ }, .pwrsts_mem_on = { [0] = PWRSTS_ON, /* mpu_l1 */ [1] = PWRSTS_ON, /* mpu_l2 */ [2] = PWRSTS_ON, /* mpu_ram */ }, .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, }; static struct powerdomain rtc_43xx_pwrdm = { .name = "rtc_pwrdm", .voltdm = { .name = "rtc" }, .prcm_offs = AM43XX_PRM_RTC_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_ON, }; static struct powerdomain wkup_43xx_pwrdm = { .name = "wkup_pwrdm", .voltdm = { .name = "core" }, .prcm_offs = AM43XX_PRM_WKUP_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_ON, .banks = 1, .pwrsts_mem_on = { [0] = PWRSTS_ON, /* debugss_mem */ }, }; static struct powerdomain tamper_43xx_pwrdm = { .name = "tamper_pwrdm", .voltdm = { .name = "tamper" }, .prcm_offs = AM43XX_PRM_TAMPER_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_ON, }; static struct powerdomain cefuse_43xx_pwrdm = { .name = "cefuse_pwrdm", .voltdm = { .name = "core" }, .prcm_offs = AM43XX_PRM_CEFUSE_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_OFF_ON, .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, }; static struct powerdomain per_43xx_pwrdm = { .name = "per_pwrdm", .voltdm = { .name = "core" }, .prcm_offs = AM43XX_PRM_PER_INST, .prcm_partition = AM43XX_PRM_PARTITION, .pwrsts = PWRSTS_OFF_RET_ON, .pwrsts_logic_ret = PWRSTS_OFF_RET, .banks = 4, .pwrsts_mem_ret = { [0] = PWRSTS_OFF_RET, /* icss_mem */ [1] = PWRSTS_OFF_RET, /* per_mem */ [2] = PWRSTS_OFF_RET, /* ram1_mem */ [3] = PWRSTS_OFF_RET, /* ram2_mem */ }, .pwrsts_mem_on = { [0] = PWRSTS_ON, /* icss_mem */ [1] = PWRSTS_ON, /* per_mem */ [2] = PWRSTS_ON, /* ram1_mem */ [3] = PWRSTS_ON, /* ram2_mem */ }, .flags = PWRDM_HAS_LOWPOWERSTATECHANGE, }; static struct powerdomain *powerdomains_am43xx[] __initdata = { &gfx_43xx_pwrdm, &mpu_43xx_pwrdm, &rtc_43xx_pwrdm, &wkup_43xx_pwrdm, &tamper_43xx_pwrdm, &cefuse_43xx_pwrdm, &per_43xx_pwrdm, NULL }; static int am43xx_check_vcvp(void) { return 0; } void __init am43xx_powerdomains_init(void) { omap4_pwrdm_operations.pwrdm_has_voltdm = am43xx_check_vcvp; pwrdm_register_platform_funcs(&omap4_pwrdm_operations); pwrdm_register_pwrdms(powerdomains_am43xx); pwrdm_complete_init(); }