1 /* 2 * OMAP4 Clock domains framework 3 * 4 * Copyright (C) 2009-2011 Texas Instruments, Inc. 5 * Copyright (C) 2009-2011 Nokia Corporation 6 * 7 * Abhijit Pagare (abhijitpagare@ti.com) 8 * Benoit Cousson (b-cousson@ti.com) 9 * Paul Walmsley (paul@pwsan.com) 10 * 11 * This file is automatically generated from the OMAP hardware databases. 12 * We respectfully ask that any modifications to this file be coordinated 13 * with the public linux-omap@vger.kernel.org mailing list and the 14 * authors above to ensure that the autogeneration scripts are kept 15 * up-to-date with the file contents. 16 * 17 * This program is free software; you can redistribute it and/or modify 18 * it under the terms of the GNU General Public License version 2 as 19 * published by the Free Software Foundation. 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/io.h> 24 25 #include "clockdomain.h" 26 #include "cm1_44xx.h" 27 #include "cm2_44xx.h" 28 29 #include "cm-regbits-44xx.h" 30 #include "prm44xx.h" 31 #include "prcm44xx.h" 32 #include "prcm_mpu44xx.h" 33 34 /* Static Dependencies for OMAP4 Clock Domains */ 35 36 static struct clkdm_dep d2d_wkup_sleep_deps[] = { 37 { .clkdm_name = "abe_clkdm" }, 38 { .clkdm_name = "ivahd_clkdm" }, 39 { .clkdm_name = "l3_1_clkdm" }, 40 { .clkdm_name = "l3_2_clkdm" }, 41 { .clkdm_name = "l3_emif_clkdm" }, 42 { .clkdm_name = "l3_init_clkdm" }, 43 { .clkdm_name = "l4_cfg_clkdm" }, 44 { .clkdm_name = "l4_per_clkdm" }, 45 { NULL }, 46 }; 47 48 static struct clkdm_dep ducati_wkup_sleep_deps[] = { 49 { .clkdm_name = "abe_clkdm" }, 50 { .clkdm_name = "ivahd_clkdm" }, 51 { .clkdm_name = "l3_1_clkdm" }, 52 { .clkdm_name = "l3_2_clkdm" }, 53 { .clkdm_name = "l3_dss_clkdm" }, 54 { .clkdm_name = "l3_emif_clkdm" }, 55 { .clkdm_name = "l3_gfx_clkdm" }, 56 { .clkdm_name = "l3_init_clkdm" }, 57 { .clkdm_name = "l4_cfg_clkdm" }, 58 { .clkdm_name = "l4_per_clkdm" }, 59 { .clkdm_name = "l4_secure_clkdm" }, 60 { .clkdm_name = "l4_wkup_clkdm" }, 61 { .clkdm_name = "tesla_clkdm" }, 62 { NULL }, 63 }; 64 65 static struct clkdm_dep iss_wkup_sleep_deps[] = { 66 { .clkdm_name = "ivahd_clkdm" }, 67 { .clkdm_name = "l3_1_clkdm" }, 68 { .clkdm_name = "l3_emif_clkdm" }, 69 { NULL }, 70 }; 71 72 static struct clkdm_dep ivahd_wkup_sleep_deps[] = { 73 { .clkdm_name = "l3_1_clkdm" }, 74 { .clkdm_name = "l3_emif_clkdm" }, 75 { NULL }, 76 }; 77 78 static struct clkdm_dep l3_dma_wkup_sleep_deps[] = { 79 { .clkdm_name = "abe_clkdm" }, 80 { .clkdm_name = "ducati_clkdm" }, 81 { .clkdm_name = "ivahd_clkdm" }, 82 { .clkdm_name = "l3_1_clkdm" }, 83 { .clkdm_name = "l3_dss_clkdm" }, 84 { .clkdm_name = "l3_emif_clkdm" }, 85 { .clkdm_name = "l3_init_clkdm" }, 86 { .clkdm_name = "l4_cfg_clkdm" }, 87 { .clkdm_name = "l4_per_clkdm" }, 88 { .clkdm_name = "l4_secure_clkdm" }, 89 { .clkdm_name = "l4_wkup_clkdm" }, 90 { NULL }, 91 }; 92 93 static struct clkdm_dep l3_dss_wkup_sleep_deps[] = { 94 { .clkdm_name = "ivahd_clkdm" }, 95 { .clkdm_name = "l3_2_clkdm" }, 96 { .clkdm_name = "l3_emif_clkdm" }, 97 { NULL }, 98 }; 99 100 static struct clkdm_dep l3_gfx_wkup_sleep_deps[] = { 101 { .clkdm_name = "ivahd_clkdm" }, 102 { .clkdm_name = "l3_1_clkdm" }, 103 { .clkdm_name = "l3_emif_clkdm" }, 104 { NULL }, 105 }; 106 107 static struct clkdm_dep l3_init_wkup_sleep_deps[] = { 108 { .clkdm_name = "abe_clkdm" }, 109 { .clkdm_name = "ivahd_clkdm" }, 110 { .clkdm_name = "l3_emif_clkdm" }, 111 { .clkdm_name = "l4_cfg_clkdm" }, 112 { .clkdm_name = "l4_per_clkdm" }, 113 { .clkdm_name = "l4_secure_clkdm" }, 114 { .clkdm_name = "l4_wkup_clkdm" }, 115 { NULL }, 116 }; 117 118 static struct clkdm_dep l4_secure_wkup_sleep_deps[] = { 119 { .clkdm_name = "l3_1_clkdm" }, 120 { .clkdm_name = "l3_emif_clkdm" }, 121 { .clkdm_name = "l4_per_clkdm" }, 122 { NULL }, 123 }; 124 125 static struct clkdm_dep mpu_wkup_sleep_deps[] = { 126 { .clkdm_name = "abe_clkdm" }, 127 { .clkdm_name = "ducati_clkdm" }, 128 { .clkdm_name = "ivahd_clkdm" }, 129 { .clkdm_name = "l3_1_clkdm" }, 130 { .clkdm_name = "l3_2_clkdm" }, 131 { .clkdm_name = "l3_dss_clkdm" }, 132 { .clkdm_name = "l3_emif_clkdm" }, 133 { .clkdm_name = "l3_gfx_clkdm" }, 134 { .clkdm_name = "l3_init_clkdm" }, 135 { .clkdm_name = "l4_cfg_clkdm" }, 136 { .clkdm_name = "l4_per_clkdm" }, 137 { .clkdm_name = "l4_secure_clkdm" }, 138 { .clkdm_name = "l4_wkup_clkdm" }, 139 { .clkdm_name = "tesla_clkdm" }, 140 { NULL }, 141 }; 142 143 static struct clkdm_dep tesla_wkup_sleep_deps[] = { 144 { .clkdm_name = "abe_clkdm" }, 145 { .clkdm_name = "ivahd_clkdm" }, 146 { .clkdm_name = "l3_1_clkdm" }, 147 { .clkdm_name = "l3_2_clkdm" }, 148 { .clkdm_name = "l3_emif_clkdm" }, 149 { .clkdm_name = "l3_init_clkdm" }, 150 { .clkdm_name = "l4_cfg_clkdm" }, 151 { .clkdm_name = "l4_per_clkdm" }, 152 { .clkdm_name = "l4_wkup_clkdm" }, 153 { NULL }, 154 }; 155 156 static struct clockdomain l4_cefuse_44xx_clkdm = { 157 .name = "l4_cefuse_clkdm", 158 .pwrdm = { .name = "cefuse_pwrdm" }, 159 .prcm_partition = OMAP4430_CM2_PARTITION, 160 .cm_inst = OMAP4430_CM2_CEFUSE_INST, 161 .clkdm_offs = OMAP4430_CM2_CEFUSE_CEFUSE_CDOFFS, 162 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 163 }; 164 165 static struct clockdomain l4_cfg_44xx_clkdm = { 166 .name = "l4_cfg_clkdm", 167 .pwrdm = { .name = "core_pwrdm" }, 168 .prcm_partition = OMAP4430_CM2_PARTITION, 169 .cm_inst = OMAP4430_CM2_CORE_INST, 170 .clkdm_offs = OMAP4430_CM2_CORE_L4CFG_CDOFFS, 171 .dep_bit = OMAP4430_L4CFG_STATDEP_SHIFT, 172 .flags = CLKDM_CAN_HWSUP, 173 }; 174 175 static struct clockdomain tesla_44xx_clkdm = { 176 .name = "tesla_clkdm", 177 .pwrdm = { .name = "tesla_pwrdm" }, 178 .prcm_partition = OMAP4430_CM1_PARTITION, 179 .cm_inst = OMAP4430_CM1_TESLA_INST, 180 .clkdm_offs = OMAP4430_CM1_TESLA_TESLA_CDOFFS, 181 .dep_bit = OMAP4430_TESLA_STATDEP_SHIFT, 182 .wkdep_srcs = tesla_wkup_sleep_deps, 183 .sleepdep_srcs = tesla_wkup_sleep_deps, 184 .flags = CLKDM_CAN_HWSUP_SWSUP, 185 }; 186 187 static struct clockdomain l3_gfx_44xx_clkdm = { 188 .name = "l3_gfx_clkdm", 189 .pwrdm = { .name = "gfx_pwrdm" }, 190 .prcm_partition = OMAP4430_CM2_PARTITION, 191 .cm_inst = OMAP4430_CM2_GFX_INST, 192 .clkdm_offs = OMAP4430_CM2_GFX_GFX_CDOFFS, 193 .dep_bit = OMAP4430_GFX_STATDEP_SHIFT, 194 .wkdep_srcs = l3_gfx_wkup_sleep_deps, 195 .sleepdep_srcs = l3_gfx_wkup_sleep_deps, 196 .flags = CLKDM_CAN_HWSUP_SWSUP, 197 }; 198 199 static struct clockdomain ivahd_44xx_clkdm = { 200 .name = "ivahd_clkdm", 201 .pwrdm = { .name = "ivahd_pwrdm" }, 202 .prcm_partition = OMAP4430_CM2_PARTITION, 203 .cm_inst = OMAP4430_CM2_IVAHD_INST, 204 .clkdm_offs = OMAP4430_CM2_IVAHD_IVAHD_CDOFFS, 205 .dep_bit = OMAP4430_IVAHD_STATDEP_SHIFT, 206 .wkdep_srcs = ivahd_wkup_sleep_deps, 207 .sleepdep_srcs = ivahd_wkup_sleep_deps, 208 .flags = CLKDM_CAN_HWSUP_SWSUP, 209 }; 210 211 static struct clockdomain l4_secure_44xx_clkdm = { 212 .name = "l4_secure_clkdm", 213 .pwrdm = { .name = "l4per_pwrdm" }, 214 .prcm_partition = OMAP4430_CM2_PARTITION, 215 .cm_inst = OMAP4430_CM2_L4PER_INST, 216 .clkdm_offs = OMAP4430_CM2_L4PER_L4SEC_CDOFFS, 217 .dep_bit = OMAP4430_L4SEC_STATDEP_SHIFT, 218 .wkdep_srcs = l4_secure_wkup_sleep_deps, 219 .sleepdep_srcs = l4_secure_wkup_sleep_deps, 220 .flags = CLKDM_CAN_HWSUP_SWSUP, 221 }; 222 223 static struct clockdomain l4_per_44xx_clkdm = { 224 .name = "l4_per_clkdm", 225 .pwrdm = { .name = "l4per_pwrdm" }, 226 .prcm_partition = OMAP4430_CM2_PARTITION, 227 .cm_inst = OMAP4430_CM2_L4PER_INST, 228 .clkdm_offs = OMAP4430_CM2_L4PER_L4PER_CDOFFS, 229 .dep_bit = OMAP4430_L4PER_STATDEP_SHIFT, 230 .flags = CLKDM_CAN_HWSUP_SWSUP, 231 }; 232 233 static struct clockdomain abe_44xx_clkdm = { 234 .name = "abe_clkdm", 235 .pwrdm = { .name = "abe_pwrdm" }, 236 .prcm_partition = OMAP4430_CM1_PARTITION, 237 .cm_inst = OMAP4430_CM1_ABE_INST, 238 .clkdm_offs = OMAP4430_CM1_ABE_ABE_CDOFFS, 239 .dep_bit = OMAP4430_ABE_STATDEP_SHIFT, 240 .flags = CLKDM_CAN_HWSUP_SWSUP, 241 }; 242 243 static struct clockdomain l3_instr_44xx_clkdm = { 244 .name = "l3_instr_clkdm", 245 .pwrdm = { .name = "core_pwrdm" }, 246 .prcm_partition = OMAP4430_CM2_PARTITION, 247 .cm_inst = OMAP4430_CM2_CORE_INST, 248 .clkdm_offs = OMAP4430_CM2_CORE_L3INSTR_CDOFFS, 249 }; 250 251 static struct clockdomain l3_init_44xx_clkdm = { 252 .name = "l3_init_clkdm", 253 .pwrdm = { .name = "l3init_pwrdm" }, 254 .prcm_partition = OMAP4430_CM2_PARTITION, 255 .cm_inst = OMAP4430_CM2_L3INIT_INST, 256 .clkdm_offs = OMAP4430_CM2_L3INIT_L3INIT_CDOFFS, 257 .dep_bit = OMAP4430_L3INIT_STATDEP_SHIFT, 258 .wkdep_srcs = l3_init_wkup_sleep_deps, 259 .sleepdep_srcs = l3_init_wkup_sleep_deps, 260 .flags = CLKDM_CAN_HWSUP_SWSUP, 261 }; 262 263 static struct clockdomain d2d_44xx_clkdm = { 264 .name = "d2d_clkdm", 265 .pwrdm = { .name = "core_pwrdm" }, 266 .prcm_partition = OMAP4430_CM2_PARTITION, 267 .cm_inst = OMAP4430_CM2_CORE_INST, 268 .clkdm_offs = OMAP4430_CM2_CORE_D2D_CDOFFS, 269 .wkdep_srcs = d2d_wkup_sleep_deps, 270 .sleepdep_srcs = d2d_wkup_sleep_deps, 271 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 272 }; 273 274 static struct clockdomain mpu0_44xx_clkdm = { 275 .name = "mpu0_clkdm", 276 .pwrdm = { .name = "cpu0_pwrdm" }, 277 .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, 278 .cm_inst = OMAP4430_PRCM_MPU_CPU0_INST, 279 .clkdm_offs = OMAP4430_PRCM_MPU_CPU0_CPU0_CDOFFS, 280 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 281 }; 282 283 static struct clockdomain mpu1_44xx_clkdm = { 284 .name = "mpu1_clkdm", 285 .pwrdm = { .name = "cpu1_pwrdm" }, 286 .prcm_partition = OMAP4430_PRCM_MPU_PARTITION, 287 .cm_inst = OMAP4430_PRCM_MPU_CPU1_INST, 288 .clkdm_offs = OMAP4430_PRCM_MPU_CPU1_CPU1_CDOFFS, 289 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 290 }; 291 292 static struct clockdomain l3_emif_44xx_clkdm = { 293 .name = "l3_emif_clkdm", 294 .pwrdm = { .name = "core_pwrdm" }, 295 .prcm_partition = OMAP4430_CM2_PARTITION, 296 .cm_inst = OMAP4430_CM2_CORE_INST, 297 .clkdm_offs = OMAP4430_CM2_CORE_MEMIF_CDOFFS, 298 .dep_bit = OMAP4430_MEMIF_STATDEP_SHIFT, 299 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 300 }; 301 302 static struct clockdomain l4_ao_44xx_clkdm = { 303 .name = "l4_ao_clkdm", 304 .pwrdm = { .name = "always_on_core_pwrdm" }, 305 .prcm_partition = OMAP4430_CM2_PARTITION, 306 .cm_inst = OMAP4430_CM2_ALWAYS_ON_INST, 307 .clkdm_offs = OMAP4430_CM2_ALWAYS_ON_ALWON_CDOFFS, 308 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 309 }; 310 311 static struct clockdomain ducati_44xx_clkdm = { 312 .name = "ducati_clkdm", 313 .pwrdm = { .name = "core_pwrdm" }, 314 .prcm_partition = OMAP4430_CM2_PARTITION, 315 .cm_inst = OMAP4430_CM2_CORE_INST, 316 .clkdm_offs = OMAP4430_CM2_CORE_DUCATI_CDOFFS, 317 .dep_bit = OMAP4430_DUCATI_STATDEP_SHIFT, 318 .wkdep_srcs = ducati_wkup_sleep_deps, 319 .sleepdep_srcs = ducati_wkup_sleep_deps, 320 .flags = CLKDM_CAN_HWSUP_SWSUP, 321 }; 322 323 static struct clockdomain mpu_44xx_clkdm = { 324 .name = "mpuss_clkdm", 325 .pwrdm = { .name = "mpu_pwrdm" }, 326 .prcm_partition = OMAP4430_CM1_PARTITION, 327 .cm_inst = OMAP4430_CM1_MPU_INST, 328 .clkdm_offs = OMAP4430_CM1_MPU_MPU_CDOFFS, 329 .wkdep_srcs = mpu_wkup_sleep_deps, 330 .sleepdep_srcs = mpu_wkup_sleep_deps, 331 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 332 }; 333 334 static struct clockdomain l3_2_44xx_clkdm = { 335 .name = "l3_2_clkdm", 336 .pwrdm = { .name = "core_pwrdm" }, 337 .prcm_partition = OMAP4430_CM2_PARTITION, 338 .cm_inst = OMAP4430_CM2_CORE_INST, 339 .clkdm_offs = OMAP4430_CM2_CORE_L3_2_CDOFFS, 340 .dep_bit = OMAP4430_L3_2_STATDEP_SHIFT, 341 .flags = CLKDM_CAN_HWSUP, 342 }; 343 344 static struct clockdomain l3_1_44xx_clkdm = { 345 .name = "l3_1_clkdm", 346 .pwrdm = { .name = "core_pwrdm" }, 347 .prcm_partition = OMAP4430_CM2_PARTITION, 348 .cm_inst = OMAP4430_CM2_CORE_INST, 349 .clkdm_offs = OMAP4430_CM2_CORE_L3_1_CDOFFS, 350 .dep_bit = OMAP4430_L3_1_STATDEP_SHIFT, 351 .flags = CLKDM_CAN_HWSUP, 352 }; 353 354 static struct clockdomain iss_44xx_clkdm = { 355 .name = "iss_clkdm", 356 .pwrdm = { .name = "cam_pwrdm" }, 357 .prcm_partition = OMAP4430_CM2_PARTITION, 358 .cm_inst = OMAP4430_CM2_CAM_INST, 359 .clkdm_offs = OMAP4430_CM2_CAM_CAM_CDOFFS, 360 .wkdep_srcs = iss_wkup_sleep_deps, 361 .sleepdep_srcs = iss_wkup_sleep_deps, 362 .flags = CLKDM_CAN_SWSUP, 363 }; 364 365 static struct clockdomain l3_dss_44xx_clkdm = { 366 .name = "l3_dss_clkdm", 367 .pwrdm = { .name = "dss_pwrdm" }, 368 .prcm_partition = OMAP4430_CM2_PARTITION, 369 .cm_inst = OMAP4430_CM2_DSS_INST, 370 .clkdm_offs = OMAP4430_CM2_DSS_DSS_CDOFFS, 371 .dep_bit = OMAP4430_DSS_STATDEP_SHIFT, 372 .wkdep_srcs = l3_dss_wkup_sleep_deps, 373 .sleepdep_srcs = l3_dss_wkup_sleep_deps, 374 .flags = CLKDM_CAN_HWSUP_SWSUP, 375 }; 376 377 static struct clockdomain l4_wkup_44xx_clkdm = { 378 .name = "l4_wkup_clkdm", 379 .pwrdm = { .name = "wkup_pwrdm" }, 380 .prcm_partition = OMAP4430_PRM_PARTITION, 381 .cm_inst = OMAP4430_PRM_WKUP_CM_INST, 382 .clkdm_offs = OMAP4430_PRM_WKUP_CM_WKUP_CDOFFS, 383 .dep_bit = OMAP4430_L4WKUP_STATDEP_SHIFT, 384 .flags = CLKDM_CAN_HWSUP | CLKDM_ACTIVE_WITH_MPU, 385 }; 386 387 static struct clockdomain emu_sys_44xx_clkdm = { 388 .name = "emu_sys_clkdm", 389 .pwrdm = { .name = "emu_pwrdm" }, 390 .prcm_partition = OMAP4430_PRM_PARTITION, 391 .cm_inst = OMAP4430_PRM_EMU_CM_INST, 392 .clkdm_offs = OMAP4430_PRM_EMU_CM_EMU_CDOFFS, 393 .flags = (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_FORCE_WAKEUP | 394 CLKDM_MISSING_IDLE_REPORTING), 395 }; 396 397 static struct clockdomain l3_dma_44xx_clkdm = { 398 .name = "l3_dma_clkdm", 399 .pwrdm = { .name = "core_pwrdm" }, 400 .prcm_partition = OMAP4430_CM2_PARTITION, 401 .cm_inst = OMAP4430_CM2_CORE_INST, 402 .clkdm_offs = OMAP4430_CM2_CORE_SDMA_CDOFFS, 403 .wkdep_srcs = l3_dma_wkup_sleep_deps, 404 .sleepdep_srcs = l3_dma_wkup_sleep_deps, 405 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP, 406 }; 407 408 /* As clockdomains are added or removed above, this list must also be changed */ 409 static struct clockdomain *clockdomains_omap44xx[] __initdata = { 410 &l4_cefuse_44xx_clkdm, 411 &l4_cfg_44xx_clkdm, 412 &tesla_44xx_clkdm, 413 &l3_gfx_44xx_clkdm, 414 &ivahd_44xx_clkdm, 415 &l4_secure_44xx_clkdm, 416 &l4_per_44xx_clkdm, 417 &abe_44xx_clkdm, 418 &l3_instr_44xx_clkdm, 419 &l3_init_44xx_clkdm, 420 &d2d_44xx_clkdm, 421 &mpu0_44xx_clkdm, 422 &mpu1_44xx_clkdm, 423 &l3_emif_44xx_clkdm, 424 &l4_ao_44xx_clkdm, 425 &ducati_44xx_clkdm, 426 &mpu_44xx_clkdm, 427 &l3_2_44xx_clkdm, 428 &l3_1_44xx_clkdm, 429 &iss_44xx_clkdm, 430 &l3_dss_44xx_clkdm, 431 &l4_wkup_44xx_clkdm, 432 &emu_sys_44xx_clkdm, 433 &l3_dma_44xx_clkdm, 434 NULL 435 }; 436 437 438 void __init omap44xx_clockdomains_init(void) 439 { 440 clkdm_register_platform_funcs(&omap4_clkdm_operations); 441 clkdm_register_clkdms(clockdomains_omap44xx); 442 clkdm_complete_init(); 443 } 444