blob: bbc674311ae39972d3031f8685768b05ca1c9a75 [file] [log] [blame] [edit]
/*
* OMAP4 PRCM Debugging
*
* Copyright (C) 2011 Google, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/io.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include "prcm-debug.h"
#include "prm-regbits-44xx.h"
#include "prcm44xx.h"
#include "prm44xx.h"
#include "prminst44xx.h"
#include "cm44xx.h"
#include "cm1_44xx.h"
#include "cm2_44xx.h"
#include "cm-regbits-44xx.h"
#include "cminst44xx.h"
#include "prcm_mpu44xx.h"
#include "powerdomain.h"
/* DPLLs */
struct d_dpll_info {
char *name;
void *idlestreg;
struct d_dpll_derived *derived[];
};
struct d_dpll_derived {
char *name;
void *gatereg;
u32 gatemask;
};
static struct d_dpll_derived derived_dpll_per_m2 = {
.name = "DPLL_PER_M2",
.gatereg = OMAP4430_CM_DIV_M2_DPLL_PER,
.gatemask = 0xa00,
};
static struct d_dpll_derived derived_dpll_per_m3 = {
.name = "DPLL_PER_M3",
.gatereg = OMAP4430_CM_DIV_M3_DPLL_PER,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_per_m4 = {
.name = "DPLL_PER_M4",
.gatereg = OMAP4430_CM_DIV_M4_DPLL_PER,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_per_m5 = {
.name = "DPLL_PER_M5",
.gatereg = OMAP4430_CM_DIV_M5_DPLL_PER,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_per_m6 = {
.name = "DPLL_PER_M6",
.gatereg = OMAP4430_CM_DIV_M6_DPLL_PER,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_per_m7 = {
.name = "DPLL_PER_M7",
.gatereg = OMAP4430_CM_DIV_M7_DPLL_PER,
.gatemask = 0x200,
};
static struct d_dpll_info dpll_per = {
.name = "DPLL_PER",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_PER,
.derived = {&derived_dpll_per_m2, &derived_dpll_per_m3,
&derived_dpll_per_m4, &derived_dpll_per_m5,
&derived_dpll_per_m6, &derived_dpll_per_m7,
NULL},
};
static struct d_dpll_derived derived_dpll_core_m2 = {
.name = "DPLL_CORE_M2",
.gatereg = OMAP4430_CM_DIV_M2_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_core_m3 = {
.name = "DPLL_CORE_M3",
.gatereg = OMAP4430_CM_DIV_M3_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_core_m4 = {
.name = "DPLL_CORE_M4",
.gatereg = OMAP4430_CM_DIV_M4_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_core_m5 = {
.name = "DPLL_CORE_M5",
.gatereg = OMAP4430_CM_DIV_M5_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_core_m6 = {
.name = "DPLL_CORE_M6",
.gatereg = OMAP4430_CM_DIV_M6_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_derived derived_dpll_core_m7 = {
.name = "DPLL_CORE_M7",
.gatereg = OMAP4430_CM_DIV_M7_DPLL_CORE,
.gatemask = 0x200,
};
static struct d_dpll_info dpll_core = {
.name = "DPLL_CORE",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_CORE,
.derived = {&derived_dpll_core_m2, &derived_dpll_core_m3,
&derived_dpll_core_m4, &derived_dpll_core_m5,
&derived_dpll_core_m6, &derived_dpll_core_m7,
NULL},
};
static struct d_dpll_info dpll_abe = {
.name = "DPLL_ABE",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_ABE,
.derived = {/* &derived_dpll_abe_m2, &derived_dpll_abe_m3,
&derived_dpll_abe_m4, &derived_dpll_abe_m5,
&derived_dpll_abe_m6, &derived_dpll_abe_m7,
*/ NULL},
};
static struct d_dpll_info dpll_mpu = {
.name = "DPLL_MPU",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_MPU,
.derived = {/* &derived_dpll_mpu_m2, */ NULL},
};
static struct d_dpll_info dpll_iva = {
.name = "DPLL_IVA",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_IVA,
.derived = {/* &derived_dpll_iva_m4, &derived_dpll_iva_m5, */ NULL},
};
static struct d_dpll_info dpll_usb = {
.name = "DPLL_USB",
.idlestreg = OMAP4430_CM_IDLEST_DPLL_USB,
.derived = {/* &derived_dpll_usb_m2, */ NULL},
};
/* Other internal generators */
struct d_intgen_info {
char *name;
void *gatereg;
u32 gatemask;
};
static struct d_intgen_info intgen_cm1_abe = {
.name = "CM1_ABE",
.gatereg = OMAP4430_CM_CLKSEL_ABE,
.gatemask = 0x500,
};
/* Modules */
#define MOD_MASTER (1 << 0)
#define MOD_SLAVE (1 << 1)
#define MOD_MODE (1 << 2)
struct d_mod_info {
char *name;
void *clkctrl;
int flags;
int optclk;
};
static struct d_mod_info mod_debug = {
.name = "DEBUG",
.clkctrl = OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_bandgap = {
.name = "BANDGAP",
.clkctrl = OMAP4430_CM_WKUP_BANDGAP_CLKCTRL,
.flags = 0,
.optclk = 0x100,
};
static struct d_mod_info mod_gpio1 = {
.name = "GPIO1",
.clkctrl = OMAP4430_CM_WKUP_GPIO1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_keyboard = {
.name = "KEYBOARD",
.clkctrl = OMAP4430_CM_WKUP_KEYBOARD_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sar_ram = {
.name = "SAR_RAM",
.clkctrl = OMAP4430_CM_WKUP_SARRAM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_32ktimer = {
.name = "32KTIMER",
.clkctrl = OMAP4430_CM_WKUP_SYNCTIMER_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer1 = {
.name = "GPTIMER1",
.clkctrl = OMAP4430_CM_WKUP_TIMER1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_wdtimer2 = {
.name = "WDTIMER2",
.clkctrl = OMAP4430_CM_WKUP_WDT2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l4_wkup = {
.name = "L4_WKUP",
.clkctrl = OMAP4430_CM_WKUP_L4WKUP_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sr_core = {
.name = "SR_CORE",
.clkctrl = OMAP4430_CM_ALWON_SR_CORE_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sr_iva = {
.name = "SR_IVA",
.clkctrl = OMAP4430_CM_ALWON_SR_IVA_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sr_mpu = {
.name = "SR_MPU",
.clkctrl = OMAP4430_CM_ALWON_SR_MPU_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_fdif = {
.name = "FACE DETECT",
.clkctrl = OMAP4430_CM_CAM_FDIF_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER| MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_iss = {
.name = "ISS",
.clkctrl = OMAP4430_CM_CAM_ISS_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER| MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_spinlock = {
.name = "SPINLOCK",
.clkctrl = OMAP4430_CM_L4CFG_HW_SEM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l4_cfg_interconnect = {
.name = "L4_CFG interconnect",
.clkctrl = OMAP4430_CM_L4CFG_L4_CFG_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mailbox = {
.name = "MAILBOX",
.clkctrl = OMAP4430_CM_L4CFG_MAILBOX_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sar_rom = {
.name = "SAR_ROM",
.clkctrl = OMAP4430_CM_L4CFG_SAR_ROM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_dmm = {
.name = "DMM",
.clkctrl = OMAP4430_CM_MEMIF_DMM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_emif_1 = {
.name = "EMIF_1",
.clkctrl = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_emif_2 = {
.name = "EMIF_2",
.clkctrl = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_emif_fw = {
.name = "EMIF_FW",
.clkctrl = OMAP4430_CM_MEMIF_EMIF_FW_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_dll = {
.name = "DLL",
.clkctrl = OMAP4430_CM_MEMIF_DLL_CLKCTRL,
.flags = 0,
.optclk = 0x100,
};
static struct d_mod_info mod_cortexm3 = {
.name = "CORTEXM3",
.clkctrl = OMAP4430_CM_DUCATI_DUCATI_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gpmc = {
.name = "GPMC",
.clkctrl = OMAP4430_CM_L3_2_GPMC_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l3_2_interconnect = {
.name = "L3_2 interconnect",
.clkctrl = OMAP4430_CM_L3_2_L3_2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_ocmc_ram = {
.name = "OCMC_RAM",
.clkctrl = OMAP4430_CM_L3_2_OCMC_RAM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l3_3_interconnect = {
.name = "L3_3 interconnect",
.clkctrl = OMAP4430_CM_L3INSTR_L3_3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l3_instr_interconnect = {
.name = "L3_INSTR interconnect",
.clkctrl = OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_wp1 = {
.name = "WP1",
.clkctrl = OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l3_1_interconnect = {
.name = "L3_1 interconnect",
.clkctrl = OMAP4430_CM_L3_1_L3_1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_c2c = {
.name = "C2C",
.clkctrl = OMAP4430_CM_D2D_SAD2D_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_c2c_fw = {
.name = "C2C_FW",
.clkctrl = OMAP4430_CM_D2D_SAD2D_FW_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sdma = {
.name = "sDMA",
.clkctrl = OMAP4430_CM_SDMA_SDMA_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_dss = {
.name = "DSS",
.clkctrl = OMAP4430_CM_DSS_DSS_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0xf00,
};
static struct d_mod_info mod_sgx = {
.name = "SGX",
.clkctrl = OMAP4430_CM_GFX_GFX_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsi = {
.name = "HSI",
.clkctrl = OMAP4430_CM_L3INIT_HSI_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsmmc1 = {
.name = "HSMMC1",
.clkctrl = OMAP4430_CM_L3INIT_MMC1_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsmmc2 = {
.name = "HSMMC2",
.clkctrl = OMAP4430_CM_L3INIT_MMC2_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_usbphy = {
.name = "USBPHY",
.clkctrl = OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_fsusb = {
.name = "FSUSB",
.clkctrl = OMAP4430_CM_L3INIT_USB_HOST_FS_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsusbhost = {
.name = "HSUSBHOST",
.clkctrl = OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0xff00,
};
static struct d_mod_info mod_hsusbotg = {
.name = "HSUSBOTG",
.clkctrl = OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_usbtll = {
.name = "USBTLL",
.clkctrl = OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x300,
};
static struct d_mod_info mod_gptimer10 = {
.name = "GPTIMER10",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer11 = {
.name = "GPTIMER11",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer2 = {
.name = "GPTIMER2",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer3 = {
.name = "GPTIMER3",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer4 = {
.name = "GPTIMER4",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer9 = {
.name = "GPTIMER9",
.clkctrl = OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_elm = {
.name = "ELM",
.clkctrl = OMAP4430_CM_L4PER_ELM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gpio2 = {
.name = "GPIO2",
.clkctrl = OMAP4430_CM_L4PER_GPIO2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_gpio3 = {
.name = "GPIO3",
.clkctrl = OMAP4430_CM_L4PER_GPIO3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_gpio4 = {
.name = "GPIO4",
.clkctrl = OMAP4430_CM_L4PER_GPIO4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_gpio5 = {
.name = "GPIO5",
.clkctrl = OMAP4430_CM_L4PER_GPIO5_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_gpio6 = {
.name = "GPIO6",
.clkctrl = OMAP4430_CM_L4PER_GPIO6_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x100,
};
static struct d_mod_info mod_hdq = {
.name = "HDQ",
.clkctrl = OMAP4430_CM_L4PER_HDQ1W_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_i2c1 = {
.name = "I2C1",
.clkctrl = OMAP4430_CM_L4PER_I2C1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_i2c2 = {
.name = "I2C2",
.clkctrl = OMAP4430_CM_L4PER_I2C2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_i2c3 = {
.name = "I2C3",
.clkctrl = OMAP4430_CM_L4PER_I2C3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_i2c4 = {
.name = "I2C4",
.clkctrl = OMAP4430_CM_L4PER_I2C4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l4_per_interconnect = {
.name = "L4_PER interconnect",
.clkctrl = OMAP4430_CM_L4PER_L4PER_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcbsp4 = {
.name = "MCBSP4",
.clkctrl = OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcspi1 = {
.name = "MCSPI1",
.clkctrl = OMAP4430_CM_L4PER_MCSPI1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcspi2 = {
.name = "MCSPI2",
.clkctrl = OMAP4430_CM_L4PER_MCSPI2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcspi3 = {
.name = "MCSPI3",
.clkctrl = OMAP4430_CM_L4PER_MCSPI3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcspi4 = {
.name = "MCSPI4",
.clkctrl = OMAP4430_CM_L4PER_MCSPI4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsmmc3 = {
.name = "HSMMC3",
.clkctrl = OMAP4430_CM_L4PER_MMCSD3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsmmc4 = {
.name = "HSMMC4",
.clkctrl = OMAP4430_CM_L4PER_MMCSD4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_hsmmc5 = {
.name = "HSMMC5",
.clkctrl = OMAP4430_CM_L4PER_MMCSD5_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_slimbus2 = {
.name = "SLIMBUS2",
.clkctrl = OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x700,
};
static struct d_mod_info mod_uart1 = {
.name = "UART1",
.clkctrl = OMAP4430_CM_L4PER_UART1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_uart2 = {
.name = "UART2",
.clkctrl = OMAP4430_CM_L4PER_UART2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_uart3 = {
.name = "UART3",
.clkctrl = OMAP4430_CM_L4PER_UART3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_uart4 = {
.name = "UART4",
.clkctrl = OMAP4430_CM_L4PER_UART4_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_audio_engine = {
.name = "AUDIO ENGINE",
.clkctrl = OMAP4430_CM1_ABE_AESS_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_dmic = {
.name = "DMIC",
.clkctrl = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_l4_abe_interconnect = {
.name = "L4_ABE interconnect",
.clkctrl = OMAP4430_CM1_ABE_L4ABE_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcasp1 = {
.name = "MCASP1",
.clkctrl = OMAP4430_CM1_ABE_MCASP_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcbsp1 = {
.name = "MCBSP1",
.clkctrl = OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcbsp2 = {
.name = "MCBSP2",
.clkctrl = OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcbsp3 = {
.name = "MCBSP3",
.clkctrl = OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_mcpdm = {
.name = "MCPDM",
.clkctrl = OMAP4430_CM1_ABE_PDM_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_slimbus1 = {
.name = "SLIMBUS1",
.clkctrl = OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0xf00,
};
static struct d_mod_info mod_gptimer5 = {
.name = "GPTIMER5",
.clkctrl = OMAP4430_CM1_ABE_TIMER5_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer6 = {
.name = "GPTIMER6",
.clkctrl = OMAP4430_CM1_ABE_TIMER6_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer7 = {
.name = "GPTIMER7",
.clkctrl = OMAP4430_CM1_ABE_TIMER7_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_gptimer8 = {
.name = "GPTIMER8",
.clkctrl = OMAP4430_CM1_ABE_TIMER8_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_wdtimer3 = {
.name = "WDTIMER3",
.clkctrl = OMAP4430_CM1_ABE_WDT3_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_ivahd = {
.name = "IVAHD",
.clkctrl = OMAP4430_CM_IVAHD_IVAHD_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sl2 = {
.name = "SL2",
.clkctrl = OMAP4430_CM_IVAHD_SL2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_dsp = {
.name = "DSP",
.clkctrl = OMAP4430_CM_TESLA_TESLA_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_cortexa9 = {
.name = "CORTEXA9",
.clkctrl = OMAP4430_CM_MPU_MPU_CLKCTRL,
.flags = MOD_MODE | MOD_MASTER | MOD_SLAVE,
.optclk = 0x0,
};
/* L4SEC modules not in TRM, below based on Linux code */
static struct d_mod_info mod_aes1 = {
.name = "AES1",
.clkctrl = OMAP4430_CM_L4SEC_AES1_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_aes2 = {
.name = "AES2",
.clkctrl = OMAP4430_CM_L4SEC_AES2_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_des3des = {
.name = "DES3DES",
.clkctrl = OMAP4430_CM_L4SEC_DES3DES_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_pkaeip29 = {
.name = "PKAEIP29",
.clkctrl = OMAP4430_CM_L4SEC_PKAEIP29_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_rng = {
.name = "RNG",
.clkctrl = OMAP4430_CM_L4SEC_RNG_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_sha2md51 = {
.name = "SHA2MD51",
.clkctrl = OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
static struct d_mod_info mod_cryptodma = {
.name = "CRYPTODMA",
.clkctrl = OMAP4430_CM_L4SEC_CRYPTODMA_CLKCTRL,
.flags = MOD_MODE | MOD_SLAVE,
.optclk = 0x0,
};
/* Clock domains */
struct d_clkd_info {
char *name;
const u8 prcm_partition;
const s16 cm_inst;
const u16 clkdm_offs;
int activity;
struct d_dpll_info *dplls[20];
struct d_intgen_info *intgens[20];
struct d_mod_info *mods[];
};
static struct d_clkd_info cd_emu = {
.name = "CD_EMU",
.prcm_partition = OMAP4430_PRM_PARTITION,
.cm_inst = OMAP4430_PRM_EMU_CM_INST,
.clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS,
.activity = 0x300,
.mods = {&mod_debug, NULL},
.intgens = {NULL},
// TBD: TRM mentions: CM1_EMU
};
static struct d_clkd_info cd_wkup = {
.name = "CD_WKUP",
.prcm_partition = OMAP4430_PRM_PARTITION,
.cm_inst = OMAP4430_PRM_WKUP_CM_INST,
.clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS,
.activity = 0x1b00,
.mods = {&mod_bandgap, &mod_gpio1, &mod_keyboard, &mod_sar_ram,
&mod_32ktimer, &mod_gptimer1, &mod_wdtimer2,
&mod_l4_wkup, NULL},
.intgens = {NULL},
// TBD: TRM mentions: SYSCTRL_PADCONF_WKUP, SYSCTRL_GENERAL_WKUP, PRM,
// SCRM
};
static struct d_clkd_info cd_l4_alwon_core = {
.name = "CD_L4_ALWON_CORE",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_ALWAYS_ON_INST,
.clkdm_offs = OMAP4430_CM2_ALWAYS_ON_ALWON_CDOFFS,
.activity = 0xf00,
.mods = {&mod_sr_core, &mod_sr_iva, &mod_sr_mpu, NULL},
.dplls = {&dpll_per, &dpll_core, &dpll_abe, NULL},
.intgens = {NULL},
// TBD: TRM mentions: CM1, CORTEXM3_WKUPGEN, SDMA_WKUPGEN, SPINNER
};
static struct d_clkd_info cd_cam = {
.name = "CD_CAM",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CAM_INST,
.clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS,
.activity = 0x700,
.mods = {&mod_fdif, &mod_iss, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_l4_cfg = {
.name = "CD_L4_CFG",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_L4CFG_CDOFFS,
.activity = 0x100,
.mods = {&mod_spinlock, &mod_l4_cfg_interconnect, &mod_mailbox,
&mod_sar_rom, NULL},
.intgens = {NULL},
// TBD: TRM mentions: SYSCTRL_PADCONF_CORE, SYSCTRL_GENERAL_CORE
};
static struct d_clkd_info cd_emif = {
.name = "CD_EMIF",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_MEMIF_CDOFFS,
.activity = 0x700,
.mods = {&mod_dmm, &mod_emif_1, &mod_emif_2, &mod_emif_fw,
&mod_dll, NULL},
.intgens = {NULL},
// TBD: TRM mentions: DDRPHY
};
static struct d_clkd_info cd_cortexm3 = {
.name = "CD_CORTEXM3",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_DUCATI_CDOFFS,
.activity = 0x100,
.mods = {&mod_cortexm3, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_l3_2 = {
.name = "CD_L3_2",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_L3_2_CDOFFS,
.activity = 0x100,
.mods = {&mod_gpmc, &mod_l3_2_interconnect, &mod_ocmc_ram, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_l3_instr = {
.name = "CD_L3_INSTR",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_L3INSTR_CDOFFS,
.activity = 0x100,
.mods = {&mod_l3_3_interconnect, &mod_l3_instr_interconnect,
&mod_wp1, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_l3_1 = {
.name = "CD_L3_1",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_L3_1_CDOFFS,
.activity = 0x100,
.mods = {&mod_l3_1_interconnect, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_c2c = {
.name = "CD_C2C",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_D2D_CDOFFS,
.activity = 0x700,
.mods = {&mod_c2c, &mod_c2c_fw, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_dma = {
.name = "CD_DMA",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_CORE_INST,
.clkdm_offs = OMAP4430_CM2_CORE_SDMA_CDOFFS,
.activity = 0x100,
.mods = {&mod_sdma, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_dss = {
.name = "CD_DSS",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_DSS_INST,
.clkdm_offs = OMAP4430_CM2_DSS_DSS_CDOFFS,
.activity = 0xf00,
.mods = {&mod_dss, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_sgx = {
.name = "CD_SGX",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_GFX_INST,
.clkdm_offs = OMAP4430_CM2_GFX_GFX_CDOFFS,
.activity = 0x300,
.mods = {&mod_sgx, NULL},
};
static struct d_clkd_info cd_l3_init = {
.name = "CD_L3_INIT",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_L3INIT_INST,
.clkdm_offs = OMAP4430_CM2_L3INIT_L3INIT_CDOFFS,
.activity = 0x3ef7f300,
.mods = {&mod_hsi, &mod_hsmmc1, &mod_hsmmc2, &mod_usbphy,
&mod_fsusb, &mod_hsusbhost, &mod_hsusbotg, &mod_usbtll,
NULL},
.dplls = {&dpll_usb, NULL},
.intgens = {NULL},
// TBD: TRM mentions: CM1_USB
};
static struct d_clkd_info cd_l4_per = {
.name = "CD_L4_PER",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_L4PER_INST,
.clkdm_offs = OMAP4430_CM2_L4PER_L4PER_CDOFFS,
.activity = 0x24fff00,
.mods = {&mod_gptimer10, &mod_gptimer11, &mod_gptimer2,
&mod_gptimer3, &mod_gptimer4, &mod_gptimer9, &mod_elm,
&mod_gpio2, &mod_gpio3, &mod_gpio4, &mod_gpio5, &mod_gpio6,
&mod_hdq, &mod_i2c1, &mod_i2c2, &mod_i2c3, &mod_i2c4,
&mod_l4_per_interconnect, &mod_mcbsp4, &mod_mcspi1,
&mod_mcspi2, &mod_mcspi3, &mod_mcspi4, &mod_hsmmc3,
&mod_hsmmc4, &mod_hsmmc5, &mod_slimbus2, &mod_uart1,
&mod_uart2, &mod_uart3, &mod_uart4, NULL},
// TBD: Linux refs: I2C5
.intgens = {NULL},
};
static struct d_clkd_info cd_abe = {
.name = "CD_ABE",
.prcm_partition = OMAP4430_CM1_PARTITION,
.cm_inst = OMAP4430_CM1_ABE_INST,
.clkdm_offs = OMAP4430_CM1_ABE_ABE_CDOFFS,
.activity = 0x3400,
.mods = {&mod_audio_engine, &mod_dmic, &mod_l4_abe_interconnect,
&mod_mcasp1, &mod_mcbsp1, &mod_mcbsp2, &mod_mcbsp3,
&mod_mcpdm, &mod_slimbus1, &mod_gptimer5, &mod_gptimer6,
&mod_gptimer7, &mod_gptimer8, &mod_wdtimer3, NULL},
.intgens = {&intgen_cm1_abe, NULL},
};
static struct d_clkd_info cd_ivahd = {
.name = "CD_IVAHD",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_IVAHD_INST,
.clkdm_offs = OMAP4430_CM2_IVAHD_IVAHD_CDOFFS,
.activity = 0x100,
.mods = {&mod_ivahd, &mod_sl2, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_dsp = {
.name = "CD_DSP",
.prcm_partition = OMAP4430_CM1_PARTITION,
.cm_inst = OMAP4430_CM1_TESLA_INST,
.clkdm_offs = OMAP4430_CM1_TESLA_TESLA_CDOFFS,
.activity = 0x100,
.mods = {&mod_dsp, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_pd_alwon_mpu_fake = {
.name = "N/A (clock generator)",
.prcm_partition = -1,
.cm_inst = -1,
.clkdm_offs = -1,
.activity = 0x0,
.mods = {NULL},
.dplls = {&dpll_mpu, NULL},
.intgens = {NULL},
// TBD: TRM mentions: CORTEXA9_MPU_INTC
};
static struct d_clkd_info cd_pd_alwon_dsp_fake = {
.name = "N/A (clock generator)",
.prcm_partition = -1,
.cm_inst = -1,
.clkdm_offs = -1,
.activity = 0x0,
.mods = {NULL},
.dplls = {&dpll_iva, NULL},
.intgens = {NULL},
// TBD: TRM mentions: DSP_WKUPGEN
};
static struct d_clkd_info cd_cortexa9 = {
.name = "CD_CORTEXA9",
.prcm_partition = OMAP4430_CM1_PARTITION,
.cm_inst = OMAP4430_CM1_MPU_INST,
.clkdm_offs = OMAP4430_CM1_MPU_MPU_CDOFFS,
.activity = 0x100,
.mods = {&mod_cortexa9, NULL},
.intgens = {NULL},
};
static struct d_clkd_info cd_l4sec = {
.name = "CD_L4SEC",
.prcm_partition = OMAP4430_CM2_PARTITION,
.cm_inst = OMAP4430_CM2_L4PER_INST,
.clkdm_offs = OMAP4430_CM2_L4PER_L4SEC_CDOFFS,
.activity = 0x300,
.mods = {&mod_aes1, &mod_aes2, &mod_des3des, &mod_pkaeip29, &mod_rng,
&mod_sha2md51, &mod_cryptodma, NULL},
.intgens = {NULL},
};
#if 0 /* Don't appear to be valid */
/* CD_MPU0 and MPU1 not in TRM, below based on Linux code. */
static struct d_clkd_info cd_mpu0 = {
.name = "CD_MPU0",
.prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
.cm_inst = OMAP4430_PRCM_MPU_CPU0_INST,
.clkdm_offs = OMAP4430_PRCM_MPU_CPU0_CPU0_CDOFFS,
.activity = 0x0,
.mods = {NULL},
.intgens = {NULL}, // TBD: No docs
};
static struct d_clkd_info cd_mpu1 = {
.name = "CD_MPU1",
.prcm_partition = OMAP4430_PRCM_MPU_PARTITION,
.cm_inst = OMAP4430_PRCM_MPU_CPU1_INST,
.clkdm_offs = OMAP4430_PRCM_MPU_CPU1_CPU1_CDOFFS,
.activity = 0x0,
.mods = {NULL},
.intgens = {NULL}, // TBD: No docs
};
#endif
/* Power domains */
struct d_pwrd_info {
char *name;
long prminst;
int pwrst;
struct d_clkd_info *cds[];
};
static struct d_pwrd_info pd_emu = {
.name = "PD_EMU",
.prminst = OMAP4430_PRM_EMU_INST,
.pwrst = OMAP4_PM_EMU_PWRSTST_OFFSET,
.cds = {&cd_emu, NULL},
};
static struct d_pwrd_info pd_wkup = {
.name = "PD_WKUP",
.prminst = OMAP4430_PRM_WKUP_INST,
.pwrst = -1,
.cds = {&cd_wkup, NULL},
};
static struct d_pwrd_info pd_alwon_core = {
.name = "PD_ALWON_CORE",
.prminst = OMAP4430_PRM_ALWAYS_ON_INST,
.pwrst = -1,
.cds = {&cd_l4_alwon_core, NULL},
};
static struct d_pwrd_info pd_cam = {
.name = "PD_CAM",
.prminst = OMAP4430_PRM_CAM_INST,
.pwrst = OMAP4_PM_CAM_PWRSTST_OFFSET,
.cds = {&cd_cam, NULL},
};
static struct d_pwrd_info pd_core = {
.name = "PD_CORE",
.prminst = OMAP4430_PRM_CORE_INST,
.pwrst = OMAP4_PM_CORE_PWRSTST_OFFSET,
.cds = {&cd_l4_cfg, &cd_emif, &cd_cortexm3, &cd_l3_2, &cd_l3_instr,
&cd_l3_1, &cd_c2c, &cd_dma, NULL},
// TBD: TRM mentions: CM2
};
static struct d_pwrd_info pd_dss = {
.name = "PD_DSS",
.prminst = OMAP4430_PRM_DSS_INST,
.pwrst = OMAP4_PM_DSS_PWRSTST_OFFSET,
.cds = {&cd_dss, NULL},
};
static struct d_pwrd_info pd_sgx = {
.name = "PD_SGX",
.prminst = OMAP4430_PRM_GFX_INST,
.pwrst = OMAP4_PM_GFX_PWRSTST_OFFSET,
.cds = {&cd_sgx, NULL},
};
static struct d_pwrd_info pd_l3_init = {
.name = "PD_L3_INIT",
.prminst = OMAP4430_PRM_L3INIT_INST,
.pwrst = OMAP4_PM_L3INIT_PWRSTST_OFFSET,
.cds = {&cd_l3_init, NULL},
};
static struct d_pwrd_info pd_l4_per = {
.name = "PD_L4_PER",
.prminst = OMAP4430_PRM_L4PER_INST,
.pwrst = OMAP4_PM_L4PER_PWRSTST_OFFSET,
.cds = {&cd_l4_per, &cd_l4sec, NULL},
};
static struct d_pwrd_info pd_std_efuse = {
.name = "PD_STD_EFUSE",
.prminst = -1,
.pwrst = -1,
.cds = {NULL},
};
static struct d_pwrd_info pd_alwon_dsp = {
.name = "PD_ALWON_DSP",
.prminst = -1,
.pwrst = -1,
.cds = {&cd_pd_alwon_dsp_fake, NULL},
};
static struct d_pwrd_info pd_audio = {
.name = "PD_AUDIO",
.prminst = OMAP4430_PRM_ABE_INST,
.pwrst = OMAP4_PM_ABE_PWRSTST_OFFSET,
.cds = {&cd_abe, NULL},
};
static struct d_pwrd_info pd_ivahd = {
.name = "PD_IVAHD",
.prminst = OMAP4430_PRM_IVAHD_INST,
.pwrst = OMAP4_PM_IVAHD_PWRSTST_OFFSET,
.cds = {&cd_ivahd, NULL},
};
static struct d_pwrd_info pd_dsp = {
.name = "PD_DSP",
.prminst = OMAP4430_PRM_TESLA_INST,
.pwrst = OMAP4_PM_TESLA_PWRSTST_OFFSET,
.cds = {&cd_dsp, NULL},
};
static struct d_pwrd_info pd_alwon_mpu = {
.name = "PD_ALWON_MPU",
.prminst = -1,
.pwrst = -1,
.cds = {&cd_pd_alwon_mpu_fake, NULL},
};
static struct d_pwrd_info pd_mpu = {
.name = "PD_MPU",
.prminst = OMAP4430_PRM_MPU_INST,
.pwrst = OMAP4_PM_MPU_PWRSTST_OFFSET,
.cds = {&cd_cortexa9, NULL},
};
#if 0 /* Do not seem to be valid */
/* CPU0 and CPU1 power domains not in TRM, below based on Linux code */
static struct d_pwrd_info pd_cpu0 = {
.name = "PD_CPU0",
.prminst = OMAP4430_PRCM_MPU_CPU0_INST,
.pwrst = OMAP4_PM_CPU0_PWRSTST_OFFSET,
.cds = {&cd_mpu0, NULL},
};
static struct d_pwrd_info pd_cpu1 = {
.name = "PD_CPU1",
.prminst = OMAP4430_PRCM_MPU_CPU1_INST,
.pwrst = OMAP4_PM_CPU1_PWRSTST_OFFSET,
.cds = {&cd_mpu1, NULL},
};
#endif
/* Voltage domains to power domains */
static struct d_pwrd_info *ldo_wakeup_pds[] =
{&pd_emu, &pd_wkup, NULL};
static struct d_pwrd_info *vdd_core_pds[] =
{&pd_alwon_core, &pd_cam, &pd_core, &pd_dss, &pd_sgx, &pd_l3_init, &pd_l4_per,
&pd_std_efuse, NULL};
static struct d_pwrd_info *vdd_iva_pds[] =
{&pd_alwon_dsp, &pd_audio, &pd_ivahd, &pd_dsp, NULL};
static struct d_pwrd_info *vdd_mpu_pds[] =
{&pd_alwon_mpu, &pd_mpu, /* &pd_cpu0, &pd_cpu1, */ NULL};
/* Voltage domains */
#define N_VDDS 4
struct d_vdd_info {
char *name;
int auto_ctrl_shift;
int auto_ctrl_mask;
struct d_pwrd_info **pds;
};
static struct d_vdd_info d_vdd[N_VDDS] = {
{
.name = "LDO_WAKEUP",
.auto_ctrl_shift = -1,
.auto_ctrl_mask = -1,
.pds = ldo_wakeup_pds,
},
{
.name = "VDD_CORE_L",
.auto_ctrl_shift = OMAP4430_AUTO_CTRL_VDD_CORE_L_SHIFT,
.auto_ctrl_mask = OMAP4430_AUTO_CTRL_VDD_CORE_L_MASK,
.pds = vdd_core_pds,
},
{
.name = "VDD_IVA_L",
.auto_ctrl_shift = OMAP4430_AUTO_CTRL_VDD_IVA_L_SHIFT,
.auto_ctrl_mask = OMAP4430_AUTO_CTRL_VDD_IVA_L_MASK,
.pds = vdd_iva_pds,
},
{
.name = "VDD_MPU_L",
.auto_ctrl_shift = OMAP4430_AUTO_CTRL_VDD_MPU_L_SHIFT,
.auto_ctrl_mask = OMAP4430_AUTO_CTRL_VDD_MPU_L_MASK,
.pds = vdd_mpu_pds,
},
};
/* Display strings */
static char *vddauto_s[] = {"disabled", "SLEEP", "RET", "reserved"};
static char *pwrstate_s[] = {"OFF", "RET", "INACTIVE", "ON"};
static char *logic_s[] = {"OFF", "ON"};
static char *cmtrctrl_s[] = {"NOSLEEP", "SW_SLEEP", "SW_WKUP", "HW_AUTO"};
static char *modmode_s[] = {"DISABLED", "AUTO", "ENABLED", "3"};
static char *modstbyst_s[] = {"ON", "STBY"};
static char *modidlest_s[] = {"ON", "TRANSITION", "IDLE", "DISABLED"};
#if 0
#define DEP_S_MAX 19
static char *dep_s[DEP_S_MAX] = {"MPU_M3", "DSP", "IVAHD", "ABE", "MEMIF",
"L3_1", "L3_2", "L3INIT", "DSS", "ISS",
"GFX", "SDMA", "L4CFG", "L4PER", "L4SEC",
"L4WKUP", "ALWON_CORE", "STD_EFUSE",
"D2D"};
#endif
#define d_pr(sf, fmt, args...) \
{ \
if (sf) \
seq_printf(sf, fmt , ## args); \
else \
pr_info(fmt , ## args); \
}
#define d_pr_ctd(sf, fmt, args...) \
{ \
if (sf) \
seq_printf(sf, fmt , ## args); \
else \
pr_cont(fmt , ## args); \
}
static void prcmdebug_dump_dpll(struct seq_file *sf,
struct d_dpll_info *dpll,
int flags)
{
u32 idlest = __raw_readl(dpll->idlestreg);
u32 st_bypass = idlest & OMAP4430_ST_MN_BYPASS_MASK;
u32 st_dpll_clk = idlest & OMAP4430_ST_DPLL_CLK_MASK;
struct d_dpll_derived **derived;
if (flags & (PRCMDEBUG_LASTSLEEP | PRCMDEBUG_ON) && !st_dpll_clk)
return;
d_pr(sf, " %s status=%s\n", dpll->name,
st_dpll_clk ? "locked" : st_bypass ? "bypass" : "stopped");
derived = dpll->derived;
while (*derived) {
u32 enabled = __raw_readl((*derived)->gatereg) &
(*derived)->gatemask;
if (!(flags & (PRCMDEBUG_LASTSLEEP | PRCMDEBUG_ON)) ||
enabled)
d_pr(sf, " %s enabled=0x%x\n",
(*derived)->name, enabled);
derived++;
}
}
static void prcmdebug_dump_intgen(struct seq_file *sf,
struct d_intgen_info *intgen,
int flags)
{
u32 enabled = __raw_readl(intgen->gatereg) & intgen->gatemask;
if (flags & (PRCMDEBUG_LASTSLEEP | PRCMDEBUG_ON) && !enabled)
return;
d_pr(sf, " %s enabled=0x%x\n", intgen->name, enabled);
}
static void prcmdebug_dump_mod(struct seq_file *sf, struct d_mod_info *mod,
int flags)
{
u32 clkctrl = __raw_readl(mod->clkctrl);
u32 stbyst = (clkctrl & OMAP4430_STBYST_MASK) >> OMAP4430_STBYST_SHIFT;
u32 idlest = (clkctrl & OMAP4430_IDLEST_MASK) >> OMAP4430_IDLEST_SHIFT;
u32 optclk = clkctrl & mod->optclk;
if (flags & (PRCMDEBUG_LASTSLEEP | PRCMDEBUG_ON) &&
(!(mod->flags & MOD_MASTER) || stbyst == 1) &&
(!(mod->flags & MOD_SLAVE) || idlest == 2 || idlest == 3) &&
!optclk)
return;
if (flags & PRCMDEBUG_LASTSLEEP &&
(mod->flags & MOD_MODE &&
((clkctrl & OMAP4430_MODULEMODE_MASK) >>
OMAP4430_MODULEMODE_SHIFT) == 1 /* AUTO */) &&
(!(mod->flags & MOD_SLAVE) || idlest == 0) /* ON */ &&
!optclk)
return;
d_pr(sf, " %s", mod->name);
if (mod->flags & MOD_MODE)
d_pr_ctd(sf, " mode=%s",
modmode_s[(clkctrl & OMAP4430_MODULEMODE_MASK) >>
OMAP4430_MODULEMODE_SHIFT]);
if (mod->flags & MOD_MASTER)
d_pr_ctd(sf, " stbyst=%s",
modstbyst_s[stbyst]);
if (mod->flags & MOD_SLAVE)
d_pr_ctd(sf, " idlest=%s",
modidlest_s[idlest]);
if (optclk)
d_pr_ctd(sf, " optclk=0x%x", optclk);
d_pr_ctd(sf, "\n");
}
static void prcmdebug_dump_real_cd(struct seq_file *sf, struct d_clkd_info *cd,
int flags)
{
u32 clktrctrl =
omap4_cminst_read_inst_reg(cd->prcm_partition, cd->cm_inst,
cd->clkdm_offs + OMAP4_CM_CLKSTCTRL);
u32 mode = (clktrctrl & OMAP4430_CLKTRCTRL_MASK) >>
OMAP4430_CLKTRCTRL_SHIFT;
u32 activity = clktrctrl & cd->activity;
#if 0
u32 staticdep =
omap4_cminst_read_inst_reg(cd->prcm_partition, cd->cm_inst,
cd->clkdm_offs + OMAP4_CM_STATICDEP);
u32 dynamicdep =
omap4_cminst_read_inst_reg(cd->prcm_partition, cd->cm_inst,
cd->clkdm_offs +
OMAP4_CM_STATICDEP + 4) & 0xffffff;
int i;
#endif
if (flags & PRCMDEBUG_LASTSLEEP && mode == 3 /* HW_AUTO */)
return;
d_pr(sf, " %s mode=%s", cd->name, cmtrctrl_s[mode]);
d_pr_ctd(sf, " activity=0x%x", activity);
#if 0
if (staticdep) {
d_pr_ctd(sf, " static:");
for (i = 0; i < DEP_S_MAX; i++)
if (staticdep & (1 << i))
d_pr_ctd(sf, " %s", dep_s[i]);
}
#endif
#if 0
if (dynamicdep)
d_pr_ctd(sf, " dynamicdep=0x%x", dynamicdep);
#endif
d_pr_ctd(sf, "\n");
}
static void prcmdebug_dump_cd(struct seq_file *sf, struct d_clkd_info *cd,
int flags)
{
struct d_mod_info **mod;
struct d_intgen_info **intgen;
struct d_dpll_info **dpll;
if (cd->cm_inst != -1) {
prcmdebug_dump_real_cd(sf, cd, flags);
} else if (!(flags & PRCMDEBUG_LASTSLEEP)) {
d_pr(sf, " %s\n", cd->name);
}
mod = cd->mods;
while (*mod) {
prcmdebug_dump_mod(sf, *mod, flags);
mod++;
}
dpll = cd->dplls;
while (*dpll) {
prcmdebug_dump_dpll(sf, *dpll, flags);
dpll++;
}
intgen = cd->intgens;
while (*intgen) {
prcmdebug_dump_intgen(sf, *intgen, flags);
intgen++;
}
}
static void prcmdebug_dump_pd(struct seq_file *sf, struct d_pwrd_info *pd,
int flags)
{
u32 pwrstst, currst, prevst;
struct d_clkd_info **cd;
if (pd->pwrst != -1 && pd->prminst != -1) {
pwrstst = omap4_prm_read_inst_reg(pd->prminst, pd->pwrst);
currst = (pwrstst & OMAP4430_POWERSTATEST_MASK) >>
OMAP4430_POWERSTATEST_SHIFT;
prevst = (pwrstst & OMAP4430_LASTPOWERSTATEENTERED_MASK) >>
OMAP4430_LASTPOWERSTATEENTERED_SHIFT;
if (flags & PRCMDEBUG_LASTSLEEP &&
(prevst == PWRDM_POWER_OFF || prevst == PWRDM_POWER_RET))
return;
if (flags & PRCMDEBUG_ON &&
(currst == PWRDM_POWER_OFF || currst == PWRDM_POWER_RET))
return;
d_pr(sf, " %s curr=%s prev=%s logic=%s\n", pd->name,
pwrstate_s[currst],
pwrstate_s[prevst],
logic_s[(pwrstst & OMAP4430_LOGICSTATEST_MASK) >>
OMAP4430_LOGICSTATEST_SHIFT]);
} else {
if (flags & PRCMDEBUG_LASTSLEEP)
return;
d_pr(sf, " %s\n", pd->name);
}
cd = pd->cds;
while (*cd) {
prcmdebug_dump_cd(sf, *cd, flags);
cd++;
}
}
static int _prcmdebug_dump(struct seq_file *sf, int flags)
{
int i;
u32 prm_voltctrl =
omap4_prm_read_inst_reg(OMAP4430_PRM_DEVICE_INST,
OMAP4_PRM_VOLTCTRL_OFFSET);
struct d_pwrd_info **pd;
for (i = 0; i < N_VDDS; i++) {
if (!(flags & PRCMDEBUG_LASTSLEEP)) {
d_pr(sf, "%s",
d_vdd[i].name);
if (d_vdd[i].auto_ctrl_shift != -1) {
int auto_ctrl =
(prm_voltctrl &
d_vdd[i].auto_ctrl_mask) >>
d_vdd[i].auto_ctrl_shift;
d_pr_ctd(sf, " auto=%s\n",
vddauto_s[auto_ctrl]);
} else {
d_pr_ctd(sf, " (no auto)\n");
}
}
pd = d_vdd[i].pds;
while (*pd) {
prcmdebug_dump_pd(sf, *pd, flags);
pd++;
}
}
return 0;
}
void prcmdebug_dump(int flags)
{
_prcmdebug_dump(NULL, flags);
}
static int prcmdebug_all_dump(struct seq_file *sf, void *private)
{
_prcmdebug_dump(sf, 0);
return 0;
}
static int prcmdebug_all_open(struct inode *inode, struct file *file)
{
return single_open(file, prcmdebug_all_dump, NULL);
}
static struct file_operations prcmdebug_all_fops = {
.open = prcmdebug_all_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int prcmdebug_on_dump(struct seq_file *sf, void *private)
{
_prcmdebug_dump(sf, PRCMDEBUG_ON);
return 0;
}
static int prcmdebug_on_open(struct inode *inode, struct file *file)
{
return single_open(file, prcmdebug_on_dump, NULL);
}
static struct file_operations prcmdebug_on_fops = {
.open = prcmdebug_on_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static int __init prcmdebug_init(void)
{
if (IS_ERR_OR_NULL(debugfs_create_file("prcm", S_IRUGO, NULL, NULL,
&prcmdebug_all_fops)))
pr_err("%s: failed to create prcm file\n", __func__);
if (IS_ERR_OR_NULL(debugfs_create_file("prcm-on", S_IRUGO, NULL, NULL,
&prcmdebug_on_fops)))
pr_err("%s: failed to create prcm-on file\n", __func__);
return 0;
}
arch_initcall(prcmdebug_init);