18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * OMAP2xxx clockdomains 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2008-2009 Texas Instruments, Inc. 68c2ecf20Sopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Paul Walmsley, Jouni Högander 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * This file contains clockdomains and clockdomain wakeup dependencies 118c2ecf20Sopenharmony_ci * for OMAP2xxx chips. Some notes: 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * A useful validation rule for struct clockdomain: Any clockdomain 148c2ecf20Sopenharmony_ci * referenced by a wkdep_srcs must have a dep_bit assigned. So 158c2ecf20Sopenharmony_ci * wkdep_srcs are really just software-controllable dependencies. 168c2ecf20Sopenharmony_ci * Non-software-controllable dependencies do exist, but they are not 178c2ecf20Sopenharmony_ci * encoded below (yet). 188c2ecf20Sopenharmony_ci * 198c2ecf20Sopenharmony_ci * 24xx does not support programmable sleep dependencies (SLEEPDEP) 208c2ecf20Sopenharmony_ci * 218c2ecf20Sopenharmony_ci * The overly-specific dep_bit names are due to a bit name collision 228c2ecf20Sopenharmony_ci * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift 238c2ecf20Sopenharmony_ci * value are the same for all powerdomains: 2 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * XXX should dep_bit be a mask, so we can test to see if it is 0 as a 268c2ecf20Sopenharmony_ci * sanity check? 278c2ecf20Sopenharmony_ci * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE 288c2ecf20Sopenharmony_ci */ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* 318c2ecf20Sopenharmony_ci * To-Do List 328c2ecf20Sopenharmony_ci * -> Port the Sleep/Wakeup dependencies for the domains 338c2ecf20Sopenharmony_ci * from the Power domain framework 348c2ecf20Sopenharmony_ci */ 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include <linux/kernel.h> 378c2ecf20Sopenharmony_ci#include <linux/io.h> 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#include "soc.h" 408c2ecf20Sopenharmony_ci#include "clockdomain.h" 418c2ecf20Sopenharmony_ci#include "prm2xxx_3xxx.h" 428c2ecf20Sopenharmony_ci#include "cm2xxx_3xxx.h" 438c2ecf20Sopenharmony_ci#include "cm-regbits-24xx.h" 448c2ecf20Sopenharmony_ci#include "prm-regbits-24xx.h" 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci/* 478c2ecf20Sopenharmony_ci * Clockdomain dependencies for wkdeps 488c2ecf20Sopenharmony_ci * 498c2ecf20Sopenharmony_ci * XXX Hardware dependencies (e.g., dependencies that cannot be 508c2ecf20Sopenharmony_ci * changed in software) are not included here yet, but should be. 518c2ecf20Sopenharmony_ci */ 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* Wakeup dependency source arrays */ 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/* 2430-specific possible wakeup dependencies */ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci/* 2430 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP, MDM */ 588c2ecf20Sopenharmony_cistatic struct clkdm_dep core_2430_wkdeps[] = { 598c2ecf20Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 608c2ecf20Sopenharmony_ci { .clkdm_name = "gfx_clkdm" }, 618c2ecf20Sopenharmony_ci { .clkdm_name = "mpu_clkdm" }, 628c2ecf20Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 638c2ecf20Sopenharmony_ci { .clkdm_name = "mdm_clkdm" }, 648c2ecf20Sopenharmony_ci { NULL }, 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* 2430 PM_WKDEP_MPU: CORE, DSP, WKUP, MDM */ 688c2ecf20Sopenharmony_cistatic struct clkdm_dep mpu_2430_wkdeps[] = { 698c2ecf20Sopenharmony_ci { .clkdm_name = "core_l3_clkdm" }, 708c2ecf20Sopenharmony_ci { .clkdm_name = "core_l4_clkdm" }, 718c2ecf20Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 728c2ecf20Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 738c2ecf20Sopenharmony_ci { .clkdm_name = "mdm_clkdm" }, 748c2ecf20Sopenharmony_ci { NULL }, 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci/* 2430 PM_WKDEP_MDM: CORE, MPU, WKUP */ 788c2ecf20Sopenharmony_cistatic struct clkdm_dep mdm_2430_wkdeps[] = { 798c2ecf20Sopenharmony_ci { .clkdm_name = "core_l3_clkdm" }, 808c2ecf20Sopenharmony_ci { .clkdm_name = "core_l4_clkdm" }, 818c2ecf20Sopenharmony_ci { .clkdm_name = "mpu_clkdm" }, 828c2ecf20Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 838c2ecf20Sopenharmony_ci { NULL }, 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci/* 878c2ecf20Sopenharmony_ci * 2430-only clockdomains 888c2ecf20Sopenharmony_ci */ 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cistatic struct clockdomain mpu_2430_clkdm = { 918c2ecf20Sopenharmony_ci .name = "mpu_clkdm", 928c2ecf20Sopenharmony_ci .pwrdm = { .name = "mpu_pwrdm" }, 938c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 948c2ecf20Sopenharmony_ci .wkdep_srcs = mpu_2430_wkdeps, 958c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 968c2ecf20Sopenharmony_ci}; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci/* Another case of bit name collisions between several registers: EN_MDM */ 998c2ecf20Sopenharmony_cistatic struct clockdomain mdm_clkdm = { 1008c2ecf20Sopenharmony_ci .name = "mdm_clkdm", 1018c2ecf20Sopenharmony_ci .pwrdm = { .name = "mdm_pwrdm" }, 1028c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 1038c2ecf20Sopenharmony_ci .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT, 1048c2ecf20Sopenharmony_ci .wkdep_srcs = mdm_2430_wkdeps, 1058c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK, 1068c2ecf20Sopenharmony_ci}; 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_cistatic struct clockdomain dsp_2430_clkdm = { 1098c2ecf20Sopenharmony_ci .name = "dsp_clkdm", 1108c2ecf20Sopenharmony_ci .pwrdm = { .name = "dsp_pwrdm" }, 1118c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 1128c2ecf20Sopenharmony_ci .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT, 1138c2ecf20Sopenharmony_ci .wkdep_srcs = dsp_24xx_wkdeps, 1148c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK, 1158c2ecf20Sopenharmony_ci}; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistatic struct clockdomain gfx_2430_clkdm = { 1188c2ecf20Sopenharmony_ci .name = "gfx_clkdm", 1198c2ecf20Sopenharmony_ci .pwrdm = { .name = "gfx_pwrdm" }, 1208c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 1218c2ecf20Sopenharmony_ci .wkdep_srcs = gfx_24xx_wkdeps, 1228c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK, 1238c2ecf20Sopenharmony_ci}; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci/* 1268c2ecf20Sopenharmony_ci * XXX add usecounting for clkdm dependencies, otherwise the presence 1278c2ecf20Sopenharmony_ci * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm 1288c2ecf20Sopenharmony_ci * could cause trouble 1298c2ecf20Sopenharmony_ci */ 1308c2ecf20Sopenharmony_cistatic struct clockdomain core_l3_2430_clkdm = { 1318c2ecf20Sopenharmony_ci .name = "core_l3_clkdm", 1328c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1338c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1348c2ecf20Sopenharmony_ci .dep_bit = OMAP24XX_EN_CORE_SHIFT, 1358c2ecf20Sopenharmony_ci .wkdep_srcs = core_2430_wkdeps, 1368c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK, 1378c2ecf20Sopenharmony_ci}; 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ci/* 1408c2ecf20Sopenharmony_ci * XXX add usecounting for clkdm dependencies, otherwise the presence 1418c2ecf20Sopenharmony_ci * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm 1428c2ecf20Sopenharmony_ci * could cause trouble 1438c2ecf20Sopenharmony_ci */ 1448c2ecf20Sopenharmony_cistatic struct clockdomain core_l4_2430_clkdm = { 1458c2ecf20Sopenharmony_ci .name = "core_l4_clkdm", 1468c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1478c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1488c2ecf20Sopenharmony_ci .dep_bit = OMAP24XX_EN_CORE_SHIFT, 1498c2ecf20Sopenharmony_ci .wkdep_srcs = core_2430_wkdeps, 1508c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK, 1518c2ecf20Sopenharmony_ci}; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_cistatic struct clockdomain dss_2430_clkdm = { 1548c2ecf20Sopenharmony_ci .name = "dss_clkdm", 1558c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1568c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1578c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK, 1588c2ecf20Sopenharmony_ci}; 1598c2ecf20Sopenharmony_ci 1608c2ecf20Sopenharmony_cistatic struct clockdomain *clockdomains_omap243x[] __initdata = { 1618c2ecf20Sopenharmony_ci &wkup_common_clkdm, 1628c2ecf20Sopenharmony_ci &mpu_2430_clkdm, 1638c2ecf20Sopenharmony_ci &mdm_clkdm, 1648c2ecf20Sopenharmony_ci &dsp_2430_clkdm, 1658c2ecf20Sopenharmony_ci &gfx_2430_clkdm, 1668c2ecf20Sopenharmony_ci &core_l3_2430_clkdm, 1678c2ecf20Sopenharmony_ci &core_l4_2430_clkdm, 1688c2ecf20Sopenharmony_ci &dss_2430_clkdm, 1698c2ecf20Sopenharmony_ci NULL, 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_civoid __init omap243x_clockdomains_init(void) 1738c2ecf20Sopenharmony_ci{ 1748c2ecf20Sopenharmony_ci if (!cpu_is_omap243x()) 1758c2ecf20Sopenharmony_ci return; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_ci clkdm_register_platform_funcs(&omap2_clkdm_operations); 1788c2ecf20Sopenharmony_ci clkdm_register_clkdms(clockdomains_omap243x); 1798c2ecf20Sopenharmony_ci clkdm_complete_init(); 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci 182