162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * OMAP2420 clockdomains 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2008-2011 Texas Instruments, Inc. 662306a36Sopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Paul Walmsley, Jouni Högander 962306a36Sopenharmony_ci * 1062306a36Sopenharmony_ci * This file contains clockdomains and clockdomain wakeup dependencies 1162306a36Sopenharmony_ci * for OMAP2420 chips. Some notes: 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * A useful validation rule for struct clockdomain: Any clockdomain 1462306a36Sopenharmony_ci * referenced by a wkdep_srcs must have a dep_bit assigned. So 1562306a36Sopenharmony_ci * wkdep_srcs are really just software-controllable dependencies. 1662306a36Sopenharmony_ci * Non-software-controllable dependencies do exist, but they are not 1762306a36Sopenharmony_ci * encoded below (yet). 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * 24xx does not support programmable sleep dependencies (SLEEPDEP) 2062306a36Sopenharmony_ci * 2162306a36Sopenharmony_ci * The overly-specific dep_bit names are due to a bit name collision 2262306a36Sopenharmony_ci * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift 2362306a36Sopenharmony_ci * value are the same for all powerdomains: 2 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * XXX should dep_bit be a mask, so we can test to see if it is 0 as a 2662306a36Sopenharmony_ci * sanity check? 2762306a36Sopenharmony_ci * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci/* 3162306a36Sopenharmony_ci * To-Do List 3262306a36Sopenharmony_ci * -> Port the Sleep/Wakeup dependencies for the domains 3362306a36Sopenharmony_ci * from the Power domain framework 3462306a36Sopenharmony_ci */ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#include <linux/kernel.h> 3762306a36Sopenharmony_ci#include <linux/io.h> 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#include "soc.h" 4062306a36Sopenharmony_ci#include "clockdomain.h" 4162306a36Sopenharmony_ci#include "prm2xxx_3xxx.h" 4262306a36Sopenharmony_ci#include "cm2xxx_3xxx.h" 4362306a36Sopenharmony_ci#include "cm-regbits-24xx.h" 4462306a36Sopenharmony_ci#include "prm-regbits-24xx.h" 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * Clockdomain dependencies for wkdeps 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci * XXX Hardware dependencies (e.g., dependencies that cannot be 5062306a36Sopenharmony_ci * changed in software) are not included here yet, but should be. 5162306a36Sopenharmony_ci */ 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* Wakeup dependency source arrays */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* 2420-specific possible wakeup dependencies */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* 2420 PM_WKDEP_MPU: CORE, DSP, WKUP */ 5862306a36Sopenharmony_cistatic struct clkdm_dep mpu_2420_wkdeps[] = { 5962306a36Sopenharmony_ci { .clkdm_name = "core_l3_clkdm" }, 6062306a36Sopenharmony_ci { .clkdm_name = "core_l4_clkdm" }, 6162306a36Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 6262306a36Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 6362306a36Sopenharmony_ci { NULL }, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP */ 6762306a36Sopenharmony_cistatic struct clkdm_dep core_2420_wkdeps[] = { 6862306a36Sopenharmony_ci { .clkdm_name = "dsp_clkdm" }, 6962306a36Sopenharmony_ci { .clkdm_name = "gfx_clkdm" }, 7062306a36Sopenharmony_ci { .clkdm_name = "mpu_clkdm" }, 7162306a36Sopenharmony_ci { .clkdm_name = "wkup_clkdm" }, 7262306a36Sopenharmony_ci { NULL }, 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* 7662306a36Sopenharmony_ci * 2420-only clockdomains 7762306a36Sopenharmony_ci */ 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic struct clockdomain mpu_2420_clkdm = { 8062306a36Sopenharmony_ci .name = "mpu_clkdm", 8162306a36Sopenharmony_ci .pwrdm = { .name = "mpu_pwrdm" }, 8262306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 8362306a36Sopenharmony_ci .wkdep_srcs = mpu_2420_wkdeps, 8462306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic struct clockdomain iva1_2420_clkdm = { 8862306a36Sopenharmony_ci .name = "iva1_clkdm", 8962306a36Sopenharmony_ci .pwrdm = { .name = "dsp_pwrdm" }, 9062306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 9162306a36Sopenharmony_ci .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT, 9262306a36Sopenharmony_ci .wkdep_srcs = dsp_24xx_wkdeps, 9362306a36Sopenharmony_ci .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK, 9462306a36Sopenharmony_ci}; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cistatic struct clockdomain dsp_2420_clkdm = { 9762306a36Sopenharmony_ci .name = "dsp_clkdm", 9862306a36Sopenharmony_ci .pwrdm = { .name = "dsp_pwrdm" }, 9962306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 10062306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK, 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic struct clockdomain gfx_2420_clkdm = { 10462306a36Sopenharmony_ci .name = "gfx_clkdm", 10562306a36Sopenharmony_ci .pwrdm = { .name = "gfx_pwrdm" }, 10662306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP_SWSUP, 10762306a36Sopenharmony_ci .wkdep_srcs = gfx_24xx_wkdeps, 10862306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK, 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic struct clockdomain core_l3_2420_clkdm = { 11262306a36Sopenharmony_ci .name = "core_l3_clkdm", 11362306a36Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 11462306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 11562306a36Sopenharmony_ci .wkdep_srcs = core_2420_wkdeps, 11662306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK, 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic struct clockdomain core_l4_2420_clkdm = { 12062306a36Sopenharmony_ci .name = "core_l4_clkdm", 12162306a36Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 12262306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 12362306a36Sopenharmony_ci .wkdep_srcs = core_2420_wkdeps, 12462306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cistatic struct clockdomain dss_2420_clkdm = { 12862306a36Sopenharmony_ci .name = "dss_clkdm", 12962306a36Sopenharmony_ci .pwrdm = { .name = "core_pwrdm" }, 13062306a36Sopenharmony_ci .flags = CLKDM_CAN_HWSUP, 13162306a36Sopenharmony_ci .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK, 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistatic struct clockdomain *clockdomains_omap242x[] __initdata = { 13562306a36Sopenharmony_ci &wkup_common_clkdm, 13662306a36Sopenharmony_ci &mpu_2420_clkdm, 13762306a36Sopenharmony_ci &iva1_2420_clkdm, 13862306a36Sopenharmony_ci &dsp_2420_clkdm, 13962306a36Sopenharmony_ci &gfx_2420_clkdm, 14062306a36Sopenharmony_ci &core_l3_2420_clkdm, 14162306a36Sopenharmony_ci &core_l4_2420_clkdm, 14262306a36Sopenharmony_ci &dss_2420_clkdm, 14362306a36Sopenharmony_ci NULL, 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_civoid __init omap242x_clockdomains_init(void) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci if (!cpu_is_omap242x()) 14962306a36Sopenharmony_ci return; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci clkdm_register_platform_funcs(&omap2_clkdm_operations); 15262306a36Sopenharmony_ci clkdm_register_clkdms(clockdomains_omap242x); 15362306a36Sopenharmony_ci clkdm_complete_init(); 15462306a36Sopenharmony_ci} 155