18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * OMAP2420 clockdomains 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2008-2011 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 OMAP2420 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/* 2420-specific possible wakeup dependencies */ 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci/* 2420 PM_WKDEP_MPU: CORE, DSP, WKUP */ 588c2ecf20Sopenharmony_cistatic struct clkdm_dep mpu_2420_wkdeps[] = { 598c2ecf20Sopenharmony_ci { .clkdm_name = "core_l3_clkdm" }, 608c2ecf20Sopenharmony_ci { .clkdm_name = "core_l4_clkdm" }, 618c2ecf20Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 628c2ecf20Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 638c2ecf20Sopenharmony_ci { NULL }, 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/* 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP */ 678c2ecf20Sopenharmony_cistatic struct clkdm_dep core_2420_wkdeps[] = { 688c2ecf20Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 698c2ecf20Sopenharmony_ci { .clkdm_name = "gfx_clkdm" }, 708c2ecf20Sopenharmony_ci { .clkdm_name = "mpu_clkdm" }, 718c2ecf20Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 728c2ecf20Sopenharmony_ci { NULL }, 738c2ecf20Sopenharmony_ci}; 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci/* 768c2ecf20Sopenharmony_ci * 2420-only clockdomains 778c2ecf20Sopenharmony_ci */ 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistatic struct clockdomain mpu_2420_clkdm = { 808c2ecf20Sopenharmony_ci .name = "mpu_clkdm", 818c2ecf20Sopenharmony_ci .pwrdm = { .name = "mpu_pwrdm" }, 828c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 838c2ecf20Sopenharmony_ci .wkdep_srcs = mpu_2420_wkdeps, 848c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 858c2ecf20Sopenharmony_ci}; 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_cistatic struct clockdomain iva1_2420_clkdm = { 888c2ecf20Sopenharmony_ci .name = "iva1_clkdm", 898c2ecf20Sopenharmony_ci .pwrdm = { .name = "dsp_pwrdm" }, 908c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 918c2ecf20Sopenharmony_ci .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT, 928c2ecf20Sopenharmony_ci .wkdep_srcs = dsp_24xx_wkdeps, 938c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK, 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistatic struct clockdomain dsp_2420_clkdm = { 978c2ecf20Sopenharmony_ci .name = "dsp_clkdm", 988c2ecf20Sopenharmony_ci .pwrdm = { .name = "dsp_pwrdm" }, 998c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 1008c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK, 1018c2ecf20Sopenharmony_ci}; 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_cistatic struct clockdomain gfx_2420_clkdm = { 1048c2ecf20Sopenharmony_ci .name = "gfx_clkdm", 1058c2ecf20Sopenharmony_ci .pwrdm = { .name = "gfx_pwrdm" }, 1068c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 1078c2ecf20Sopenharmony_ci .wkdep_srcs = gfx_24xx_wkdeps, 1088c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK, 1098c2ecf20Sopenharmony_ci}; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cistatic struct clockdomain core_l3_2420_clkdm = { 1128c2ecf20Sopenharmony_ci .name = "core_l3_clkdm", 1138c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1148c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1158c2ecf20Sopenharmony_ci .wkdep_srcs = core_2420_wkdeps, 1168c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK, 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistatic struct clockdomain core_l4_2420_clkdm = { 1208c2ecf20Sopenharmony_ci .name = "core_l4_clkdm", 1218c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1228c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1238c2ecf20Sopenharmony_ci .wkdep_srcs = core_2420_wkdeps, 1248c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK, 1258c2ecf20Sopenharmony_ci}; 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_cistatic struct clockdomain dss_2420_clkdm = { 1288c2ecf20Sopenharmony_ci .name = "dss_clkdm", 1298c2ecf20Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 1308c2ecf20Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 1318c2ecf20Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK, 1328c2ecf20Sopenharmony_ci}; 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_cistatic struct clockdomain *clockdomains_omap242x[] __initdata = { 1358c2ecf20Sopenharmony_ci &wkup_common_clkdm, 1368c2ecf20Sopenharmony_ci &mpu_2420_clkdm, 1378c2ecf20Sopenharmony_ci &iva1_2420_clkdm, 1388c2ecf20Sopenharmony_ci &dsp_2420_clkdm, 1398c2ecf20Sopenharmony_ci &gfx_2420_clkdm, 1408c2ecf20Sopenharmony_ci &core_l3_2420_clkdm, 1418c2ecf20Sopenharmony_ci &core_l4_2420_clkdm, 1428c2ecf20Sopenharmony_ci &dss_2420_clkdm, 1438c2ecf20Sopenharmony_ci NULL, 1448c2ecf20Sopenharmony_ci}; 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_civoid __init omap242x_clockdomains_init(void) 1478c2ecf20Sopenharmony_ci{ 1488c2ecf20Sopenharmony_ci if (!cpu_is_omap242x()) 1498c2ecf20Sopenharmony_ci return; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci clkdm_register_platform_funcs(&omap2_clkdm_operations); 1528c2ecf20Sopenharmony_ci clkdm_register_clkdms(clockdomains_omap242x); 1538c2ecf20Sopenharmony_ci clkdm_complete_init(); 1548c2ecf20Sopenharmony_ci} 155