aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2/prcm-debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/prcm-debug.c')
-rw-r--r--arch/arm/mach-omap2/prcm-debug.c1688
1 files changed, 1688 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/prcm-debug.c b/arch/arm/mach-omap2/prcm-debug.c
new file mode 100644
index 0000000..bbc6743
--- /dev/null
+++ b/arch/arm/mach-omap2/prcm-debug.c
@@ -0,0 +1,1688 @@
+/*
+ * 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);