Path: blob/master/arch/arm/mach-omap2/clockdomains2430_data.c
26292 views
// SPDX-License-Identifier: GPL-2.01/*2* OMAP2xxx clockdomains3*4* Copyright (C) 2008-2009 Texas Instruments, Inc.5* Copyright (C) 2008-2010 Nokia Corporation6*7* Paul Walmsley, Jouni Högander8*9* This file contains clockdomains and clockdomain wakeup dependencies10* for OMAP2xxx chips. Some notes:11*12* A useful validation rule for struct clockdomain: Any clockdomain13* referenced by a wkdep_srcs must have a dep_bit assigned. So14* wkdep_srcs are really just software-controllable dependencies.15* Non-software-controllable dependencies do exist, but they are not16* encoded below (yet).17*18* 24xx does not support programmable sleep dependencies (SLEEPDEP)19*20* The overly-specific dep_bit names are due to a bit name collision21* with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift22* value are the same for all powerdomains: 223*24* XXX should dep_bit be a mask, so we can test to see if it is 0 as a25* sanity check?26* XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE27*/2829/*30* To-Do List31* -> Port the Sleep/Wakeup dependencies for the domains32* from the Power domain framework33*/3435#include <linux/kernel.h>36#include <linux/io.h>3738#include "soc.h"39#include "clockdomain.h"40#include "prm2xxx_3xxx.h"41#include "cm2xxx_3xxx.h"42#include "cm-regbits-24xx.h"43#include "prm-regbits-24xx.h"4445/*46* Clockdomain dependencies for wkdeps47*48* XXX Hardware dependencies (e.g., dependencies that cannot be49* changed in software) are not included here yet, but should be.50*/5152/* Wakeup dependency source arrays */5354/* 2430-specific possible wakeup dependencies */5556/* 2430 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP, MDM */57static struct clkdm_dep core_2430_wkdeps[] = {58{ .clkdm_name = "dsp_clkdm" },59{ .clkdm_name = "gfx_clkdm" },60{ .clkdm_name = "mpu_clkdm" },61{ .clkdm_name = "wkup_clkdm" },62{ .clkdm_name = "mdm_clkdm" },63{ NULL },64};6566/* 2430 PM_WKDEP_MPU: CORE, DSP, WKUP, MDM */67static struct clkdm_dep mpu_2430_wkdeps[] = {68{ .clkdm_name = "core_l3_clkdm" },69{ .clkdm_name = "core_l4_clkdm" },70{ .clkdm_name = "dsp_clkdm" },71{ .clkdm_name = "wkup_clkdm" },72{ .clkdm_name = "mdm_clkdm" },73{ NULL },74};7576/* 2430 PM_WKDEP_MDM: CORE, MPU, WKUP */77static struct clkdm_dep mdm_2430_wkdeps[] = {78{ .clkdm_name = "core_l3_clkdm" },79{ .clkdm_name = "core_l4_clkdm" },80{ .clkdm_name = "mpu_clkdm" },81{ .clkdm_name = "wkup_clkdm" },82{ NULL },83};8485/*86* 2430-only clockdomains87*/8889static struct clockdomain mpu_2430_clkdm = {90.name = "mpu_clkdm",91.pwrdm = { .name = "mpu_pwrdm" },92.flags = CLKDM_CAN_HWSUP_SWSUP,93.wkdep_srcs = mpu_2430_wkdeps,94.clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,95};9697/* Another case of bit name collisions between several registers: EN_MDM */98static struct clockdomain mdm_clkdm = {99.name = "mdm_clkdm",100.pwrdm = { .name = "mdm_pwrdm" },101.flags = CLKDM_CAN_HWSUP_SWSUP,102.dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,103.wkdep_srcs = mdm_2430_wkdeps,104.clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,105};106107static struct clockdomain dsp_2430_clkdm = {108.name = "dsp_clkdm",109.pwrdm = { .name = "dsp_pwrdm" },110.flags = CLKDM_CAN_HWSUP_SWSUP,111.dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,112.wkdep_srcs = dsp_24xx_wkdeps,113.clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,114};115116static struct clockdomain gfx_2430_clkdm = {117.name = "gfx_clkdm",118.pwrdm = { .name = "gfx_pwrdm" },119.flags = CLKDM_CAN_HWSUP_SWSUP,120.wkdep_srcs = gfx_24xx_wkdeps,121.clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,122};123124/*125* XXX add usecounting for clkdm dependencies, otherwise the presence126* of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm127* could cause trouble128*/129static struct clockdomain core_l3_2430_clkdm = {130.name = "core_l3_clkdm",131.pwrdm = { .name = "core_pwrdm" },132.flags = CLKDM_CAN_HWSUP,133.dep_bit = OMAP24XX_EN_CORE_SHIFT,134.wkdep_srcs = core_2430_wkdeps,135.clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,136};137138/*139* XXX add usecounting for clkdm dependencies, otherwise the presence140* of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm141* could cause trouble142*/143static struct clockdomain core_l4_2430_clkdm = {144.name = "core_l4_clkdm",145.pwrdm = { .name = "core_pwrdm" },146.flags = CLKDM_CAN_HWSUP,147.dep_bit = OMAP24XX_EN_CORE_SHIFT,148.wkdep_srcs = core_2430_wkdeps,149.clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,150};151152static struct clockdomain dss_2430_clkdm = {153.name = "dss_clkdm",154.pwrdm = { .name = "core_pwrdm" },155.flags = CLKDM_CAN_HWSUP,156.clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,157};158159static struct clockdomain *clockdomains_omap243x[] __initdata = {160&wkup_common_clkdm,161&mpu_2430_clkdm,162&mdm_clkdm,163&dsp_2430_clkdm,164&gfx_2430_clkdm,165&core_l3_2430_clkdm,166&core_l4_2430_clkdm,167&dss_2430_clkdm,168NULL,169};170171void __init omap243x_clockdomains_init(void)172{173if (!cpu_is_omap243x())174return;175176clkdm_register_platform_funcs(&omap2_clkdm_operations);177clkdm_register_clkdms(clockdomains_omap243x);178clkdm_complete_init();179}180181182183