1a5ffef6aSPaul Walmsley /* 2a5ffef6aSPaul Walmsley * OMAP3xxx clockdomains 3a5ffef6aSPaul Walmsley * 4a5ffef6aSPaul Walmsley * Copyright (C) 2008-2011 Texas Instruments, Inc. 5a5ffef6aSPaul Walmsley * Copyright (C) 2008-2010 Nokia Corporation 6a5ffef6aSPaul Walmsley * 7a5ffef6aSPaul Walmsley * Paul Walmsley, Jouni Högander 8a5ffef6aSPaul Walmsley * 9a5ffef6aSPaul Walmsley * This file contains clockdomains and clockdomain wakeup/sleep 10a5ffef6aSPaul Walmsley * dependencies for the OMAP3xxx chips. Some notes: 11a5ffef6aSPaul Walmsley * 12a5ffef6aSPaul Walmsley * A useful validation rule for struct clockdomain: Any clockdomain 13a5ffef6aSPaul Walmsley * referenced by a wkdep_srcs or sleepdep_srcs array must have a 14a5ffef6aSPaul Walmsley * dep_bit assigned. So wkdep_srcs/sleepdep_srcs are really just 15a5ffef6aSPaul Walmsley * software-controllable dependencies. Non-software-controllable 16a5ffef6aSPaul Walmsley * dependencies do exist, but they are not encoded below (yet). 17a5ffef6aSPaul Walmsley * 18a5ffef6aSPaul Walmsley * The overly-specific dep_bit names are due to a bit name collision 19a5ffef6aSPaul Walmsley * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift 20a5ffef6aSPaul Walmsley * value are the same for all powerdomains: 2 21a5ffef6aSPaul Walmsley * 22a5ffef6aSPaul Walmsley * XXX should dep_bit be a mask, so we can test to see if it is 0 as a 23a5ffef6aSPaul Walmsley * sanity check? 24a5ffef6aSPaul Walmsley * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE 25a5ffef6aSPaul Walmsley */ 26a5ffef6aSPaul Walmsley 27a5ffef6aSPaul Walmsley /* 28a5ffef6aSPaul Walmsley * To-Do List 29a5ffef6aSPaul Walmsley * -> Port the Sleep/Wakeup dependencies for the domains 30a5ffef6aSPaul Walmsley * from the Power domain framework 31a5ffef6aSPaul Walmsley */ 32a5ffef6aSPaul Walmsley 33a5ffef6aSPaul Walmsley #include <linux/kernel.h> 34a5ffef6aSPaul Walmsley #include <linux/io.h> 35a5ffef6aSPaul Walmsley 36a5ffef6aSPaul Walmsley #include "clockdomain.h" 37a5ffef6aSPaul Walmsley #include "prm2xxx_3xxx.h" 38a5ffef6aSPaul Walmsley #include "cm2xxx_3xxx.h" 39a5ffef6aSPaul Walmsley #include "cm-regbits-34xx.h" 40a5ffef6aSPaul Walmsley #include "prm-regbits-34xx.h" 41a5ffef6aSPaul Walmsley 42a5ffef6aSPaul Walmsley /* 43a5ffef6aSPaul Walmsley * Clockdomain dependencies for wkdeps/sleepdeps 44a5ffef6aSPaul Walmsley * 45a5ffef6aSPaul Walmsley * XXX Hardware dependencies (e.g., dependencies that cannot be 46a5ffef6aSPaul Walmsley * changed in software) are not included here yet, but should be. 47a5ffef6aSPaul Walmsley */ 48a5ffef6aSPaul Walmsley 49a5ffef6aSPaul Walmsley /* OMAP3-specific possible dependencies */ 50a5ffef6aSPaul Walmsley 51a5ffef6aSPaul Walmsley /* 52a5ffef6aSPaul Walmsley * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE 53a5ffef6aSPaul Walmsley * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE 54a5ffef6aSPaul Walmsley */ 55a5ffef6aSPaul Walmsley static struct clkdm_dep gfx_sgx_3xxx_wkdeps[] = { 5648a6884fSMark A. Greer { .clkdm_name = "iva2_clkdm" }, 5748a6884fSMark A. Greer { .clkdm_name = "mpu_clkdm" }, 5848a6884fSMark A. Greer { .clkdm_name = "wkup_clkdm" }, 59a5ffef6aSPaul Walmsley { NULL }, 60a5ffef6aSPaul Walmsley }; 61a5ffef6aSPaul Walmsley 6216e5e2c4SMark A. Greer static struct clkdm_dep gfx_sgx_am35x_wkdeps[] = { 6316e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 6416e5e2c4SMark A. Greer { .clkdm_name = "wkup_clkdm" }, 6516e5e2c4SMark A. Greer { NULL }, 6616e5e2c4SMark A. Greer }; 6716e5e2c4SMark A. Greer 68a5ffef6aSPaul Walmsley /* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */ 69a5ffef6aSPaul Walmsley static struct clkdm_dep per_wkdeps[] = { 70a5ffef6aSPaul Walmsley { .clkdm_name = "core_l3_clkdm" }, 71a5ffef6aSPaul Walmsley { .clkdm_name = "core_l4_clkdm" }, 72a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 73a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 74a5ffef6aSPaul Walmsley { .clkdm_name = "wkup_clkdm" }, 75a5ffef6aSPaul Walmsley { NULL }, 76a5ffef6aSPaul Walmsley }; 77a5ffef6aSPaul Walmsley 7816e5e2c4SMark A. Greer static struct clkdm_dep per_am35x_wkdeps[] = { 7916e5e2c4SMark A. Greer { .clkdm_name = "core_l3_clkdm" }, 8016e5e2c4SMark A. Greer { .clkdm_name = "core_l4_clkdm" }, 8116e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 8216e5e2c4SMark A. Greer { .clkdm_name = "wkup_clkdm" }, 8316e5e2c4SMark A. Greer { NULL }, 8416e5e2c4SMark A. Greer }; 8516e5e2c4SMark A. Greer 86a5ffef6aSPaul Walmsley /* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */ 87a5ffef6aSPaul Walmsley static struct clkdm_dep usbhost_wkdeps[] = { 88a5ffef6aSPaul Walmsley { .clkdm_name = "core_l3_clkdm" }, 89a5ffef6aSPaul Walmsley { .clkdm_name = "core_l4_clkdm" }, 90a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 91a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 92a5ffef6aSPaul Walmsley { .clkdm_name = "wkup_clkdm" }, 93a5ffef6aSPaul Walmsley { NULL }, 94a5ffef6aSPaul Walmsley }; 95a5ffef6aSPaul Walmsley 9616e5e2c4SMark A. Greer static struct clkdm_dep usbhost_am35x_wkdeps[] = { 9716e5e2c4SMark A. Greer { .clkdm_name = "core_l3_clkdm" }, 9816e5e2c4SMark A. Greer { .clkdm_name = "core_l4_clkdm" }, 9916e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 10016e5e2c4SMark A. Greer { .clkdm_name = "wkup_clkdm" }, 10116e5e2c4SMark A. Greer { NULL }, 10216e5e2c4SMark A. Greer }; 10316e5e2c4SMark A. Greer 104a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */ 105a5ffef6aSPaul Walmsley static struct clkdm_dep mpu_3xxx_wkdeps[] = { 106a5ffef6aSPaul Walmsley { .clkdm_name = "core_l3_clkdm" }, 107a5ffef6aSPaul Walmsley { .clkdm_name = "core_l4_clkdm" }, 108a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 109a5ffef6aSPaul Walmsley { .clkdm_name = "dss_clkdm" }, 110a5ffef6aSPaul Walmsley { .clkdm_name = "per_clkdm" }, 111a5ffef6aSPaul Walmsley { NULL }, 112a5ffef6aSPaul Walmsley }; 113a5ffef6aSPaul Walmsley 11416e5e2c4SMark A. Greer static struct clkdm_dep mpu_am35x_wkdeps[] = { 11516e5e2c4SMark A. Greer { .clkdm_name = "core_l3_clkdm" }, 11616e5e2c4SMark A. Greer { .clkdm_name = "core_l4_clkdm" }, 11716e5e2c4SMark A. Greer { .clkdm_name = "dss_clkdm" }, 11816e5e2c4SMark A. Greer { .clkdm_name = "per_clkdm" }, 11916e5e2c4SMark A. Greer { NULL }, 12016e5e2c4SMark A. Greer }; 12116e5e2c4SMark A. Greer 122a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */ 123a5ffef6aSPaul Walmsley static struct clkdm_dep iva2_wkdeps[] = { 124a5ffef6aSPaul Walmsley { .clkdm_name = "core_l3_clkdm" }, 125a5ffef6aSPaul Walmsley { .clkdm_name = "core_l4_clkdm" }, 126a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 127a5ffef6aSPaul Walmsley { .clkdm_name = "wkup_clkdm" }, 128a5ffef6aSPaul Walmsley { .clkdm_name = "dss_clkdm" }, 129a5ffef6aSPaul Walmsley { .clkdm_name = "per_clkdm" }, 130a5ffef6aSPaul Walmsley { NULL }, 131a5ffef6aSPaul Walmsley }; 132a5ffef6aSPaul Walmsley 133a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */ 134a5ffef6aSPaul Walmsley static struct clkdm_dep cam_wkdeps[] = { 135a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 136a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 137a5ffef6aSPaul Walmsley { .clkdm_name = "wkup_clkdm" }, 138a5ffef6aSPaul Walmsley { NULL }, 139a5ffef6aSPaul Walmsley }; 140a5ffef6aSPaul Walmsley 141a5ffef6aSPaul Walmsley /* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */ 142a5ffef6aSPaul Walmsley static struct clkdm_dep dss_wkdeps[] = { 143a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 144a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 145a5ffef6aSPaul Walmsley { .clkdm_name = "wkup_clkdm" }, 146a5ffef6aSPaul Walmsley { NULL }, 147a5ffef6aSPaul Walmsley }; 148a5ffef6aSPaul Walmsley 14916e5e2c4SMark A. Greer static struct clkdm_dep dss_am35x_wkdeps[] = { 15016e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 15116e5e2c4SMark A. Greer { .clkdm_name = "wkup_clkdm" }, 15216e5e2c4SMark A. Greer { NULL }, 15316e5e2c4SMark A. Greer }; 15416e5e2c4SMark A. Greer 155a5ffef6aSPaul Walmsley /* 3430: PM_WKDEP_NEON: MPU */ 156a5ffef6aSPaul Walmsley static struct clkdm_dep neon_wkdeps[] = { 157a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 158a5ffef6aSPaul Walmsley { NULL }, 159a5ffef6aSPaul Walmsley }; 160a5ffef6aSPaul Walmsley 161a5ffef6aSPaul Walmsley /* Sleep dependency source arrays for OMAP3-specific clkdms */ 162a5ffef6aSPaul Walmsley 163a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_DSS: MPU, IVA */ 164a5ffef6aSPaul Walmsley static struct clkdm_dep dss_sleepdeps[] = { 165a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 166a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 167a5ffef6aSPaul Walmsley { NULL }, 168a5ffef6aSPaul Walmsley }; 169a5ffef6aSPaul Walmsley 17016e5e2c4SMark A. Greer static struct clkdm_dep dss_am35x_sleepdeps[] = { 17116e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 17216e5e2c4SMark A. Greer { NULL }, 17316e5e2c4SMark A. Greer }; 17416e5e2c4SMark A. Greer 175a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_PER: MPU, IVA */ 176a5ffef6aSPaul Walmsley static struct clkdm_dep per_sleepdeps[] = { 177a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 178a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 179a5ffef6aSPaul Walmsley { NULL }, 180a5ffef6aSPaul Walmsley }; 181a5ffef6aSPaul Walmsley 18216e5e2c4SMark A. Greer static struct clkdm_dep per_am35x_sleepdeps[] = { 18316e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 18416e5e2c4SMark A. Greer { NULL }, 18516e5e2c4SMark A. Greer }; 18616e5e2c4SMark A. Greer 187a5ffef6aSPaul Walmsley /* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */ 188a5ffef6aSPaul Walmsley static struct clkdm_dep usbhost_sleepdeps[] = { 189a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 190a5ffef6aSPaul Walmsley { .clkdm_name = "iva2_clkdm" }, 191a5ffef6aSPaul Walmsley { NULL }, 192a5ffef6aSPaul Walmsley }; 193a5ffef6aSPaul Walmsley 19416e5e2c4SMark A. Greer static struct clkdm_dep usbhost_am35x_sleepdeps[] = { 19516e5e2c4SMark A. Greer { .clkdm_name = "mpu_clkdm" }, 19616e5e2c4SMark A. Greer { NULL }, 19716e5e2c4SMark A. Greer }; 19816e5e2c4SMark A. Greer 199a5ffef6aSPaul Walmsley /* 3430: CM_SLEEPDEP_CAM: MPU */ 200a5ffef6aSPaul Walmsley static struct clkdm_dep cam_sleepdeps[] = { 201a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 202a5ffef6aSPaul Walmsley { NULL }, 203a5ffef6aSPaul Walmsley }; 204a5ffef6aSPaul Walmsley 205a5ffef6aSPaul Walmsley /* 206a5ffef6aSPaul Walmsley * 3430ES1: CM_SLEEPDEP_GFX: MPU 207a5ffef6aSPaul Walmsley * 3430ES2: CM_SLEEPDEP_SGX: MPU 208a5ffef6aSPaul Walmsley * These can share data since they will never be present simultaneously 209a5ffef6aSPaul Walmsley * on the same device. 210a5ffef6aSPaul Walmsley */ 211a5ffef6aSPaul Walmsley static struct clkdm_dep gfx_sgx_sleepdeps[] = { 212a5ffef6aSPaul Walmsley { .clkdm_name = "mpu_clkdm" }, 213a5ffef6aSPaul Walmsley { NULL }, 214a5ffef6aSPaul Walmsley }; 215a5ffef6aSPaul Walmsley 216a5ffef6aSPaul Walmsley /* 217a5ffef6aSPaul Walmsley * OMAP3 clockdomains 218a5ffef6aSPaul Walmsley */ 219a5ffef6aSPaul Walmsley 220a5ffef6aSPaul Walmsley static struct clockdomain mpu_3xxx_clkdm = { 221a5ffef6aSPaul Walmsley .name = "mpu_clkdm", 222a5ffef6aSPaul Walmsley .pwrdm = { .name = "mpu_pwrdm" }, 223a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP, 224a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_EN_MPU_SHIFT, 225a5ffef6aSPaul Walmsley .wkdep_srcs = mpu_3xxx_wkdeps, 226a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK, 227a5ffef6aSPaul Walmsley }; 228a5ffef6aSPaul Walmsley 22916e5e2c4SMark A. Greer static struct clockdomain mpu_am35x_clkdm = { 23016e5e2c4SMark A. Greer .name = "mpu_clkdm", 23116e5e2c4SMark A. Greer .pwrdm = { .name = "mpu_pwrdm" }, 23216e5e2c4SMark A. Greer .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP, 23316e5e2c4SMark A. Greer .dep_bit = OMAP3430_EN_MPU_SHIFT, 23416e5e2c4SMark A. Greer .wkdep_srcs = mpu_am35x_wkdeps, 23516e5e2c4SMark A. Greer .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK, 23616e5e2c4SMark A. Greer }; 23716e5e2c4SMark A. Greer 238a5ffef6aSPaul Walmsley static struct clockdomain neon_clkdm = { 239a5ffef6aSPaul Walmsley .name = "neon_clkdm", 240a5ffef6aSPaul Walmsley .pwrdm = { .name = "neon_pwrdm" }, 241a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 242a5ffef6aSPaul Walmsley .wkdep_srcs = neon_wkdeps, 243a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK, 244a5ffef6aSPaul Walmsley }; 245a5ffef6aSPaul Walmsley 246a5ffef6aSPaul Walmsley static struct clockdomain iva2_clkdm = { 247a5ffef6aSPaul Walmsley .name = "iva2_clkdm", 248a5ffef6aSPaul Walmsley .pwrdm = { .name = "iva2_pwrdm" }, 249a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 250a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT, 251a5ffef6aSPaul Walmsley .wkdep_srcs = iva2_wkdeps, 252a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK, 253a5ffef6aSPaul Walmsley }; 254a5ffef6aSPaul Walmsley 255a5ffef6aSPaul Walmsley static struct clockdomain gfx_3430es1_clkdm = { 256a5ffef6aSPaul Walmsley .name = "gfx_clkdm", 257a5ffef6aSPaul Walmsley .pwrdm = { .name = "gfx_pwrdm" }, 258a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 259a5ffef6aSPaul Walmsley .wkdep_srcs = gfx_sgx_3xxx_wkdeps, 260a5ffef6aSPaul Walmsley .sleepdep_srcs = gfx_sgx_sleepdeps, 261a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK, 262a5ffef6aSPaul Walmsley }; 263a5ffef6aSPaul Walmsley 264a5ffef6aSPaul Walmsley static struct clockdomain sgx_clkdm = { 265a5ffef6aSPaul Walmsley .name = "sgx_clkdm", 266a5ffef6aSPaul Walmsley .pwrdm = { .name = "sgx_pwrdm" }, 267a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 268a5ffef6aSPaul Walmsley .wkdep_srcs = gfx_sgx_3xxx_wkdeps, 269a5ffef6aSPaul Walmsley .sleepdep_srcs = gfx_sgx_sleepdeps, 270a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK, 271a5ffef6aSPaul Walmsley }; 272a5ffef6aSPaul Walmsley 27316e5e2c4SMark A. Greer static struct clockdomain sgx_am35x_clkdm = { 27416e5e2c4SMark A. Greer .name = "sgx_clkdm", 27516e5e2c4SMark A. Greer .pwrdm = { .name = "sgx_pwrdm" }, 27616e5e2c4SMark A. Greer .flags = CLKDM_CAN_HWSUP_SWSUP, 27716e5e2c4SMark A. Greer .wkdep_srcs = gfx_sgx_am35x_wkdeps, 27816e5e2c4SMark A. Greer .sleepdep_srcs = gfx_sgx_sleepdeps, 27916e5e2c4SMark A. Greer .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK, 28016e5e2c4SMark A. Greer }; 28116e5e2c4SMark A. Greer 282a5ffef6aSPaul Walmsley /* 283a5ffef6aSPaul Walmsley * The die-to-die clockdomain was documented in the 34xx ES1 TRM, but 284a5ffef6aSPaul Walmsley * then that information was removed from the 34xx ES2+ TRM. It is 285a5ffef6aSPaul Walmsley * unclear whether the core is still there, but the clockdomain logic 286a5ffef6aSPaul Walmsley * is there, and must be programmed to an appropriate state if the 287a5ffef6aSPaul Walmsley * CORE clockdomain is to become inactive. 288a5ffef6aSPaul Walmsley */ 289a5ffef6aSPaul Walmsley static struct clockdomain d2d_clkdm = { 290a5ffef6aSPaul Walmsley .name = "d2d_clkdm", 291a5ffef6aSPaul Walmsley .pwrdm = { .name = "core_pwrdm" }, 292a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 293a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK, 294a5ffef6aSPaul Walmsley }; 295a5ffef6aSPaul Walmsley 296a5ffef6aSPaul Walmsley /* 297a5ffef6aSPaul Walmsley * XXX add usecounting for clkdm dependencies, otherwise the presence 298a5ffef6aSPaul Walmsley * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm 299a5ffef6aSPaul Walmsley * could cause trouble 300a5ffef6aSPaul Walmsley */ 301a5ffef6aSPaul Walmsley static struct clockdomain core_l3_3xxx_clkdm = { 302a5ffef6aSPaul Walmsley .name = "core_l3_clkdm", 303a5ffef6aSPaul Walmsley .pwrdm = { .name = "core_pwrdm" }, 304a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP, 305a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_EN_CORE_SHIFT, 306a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK, 307a5ffef6aSPaul Walmsley }; 308a5ffef6aSPaul Walmsley 309a5ffef6aSPaul Walmsley /* 310a5ffef6aSPaul Walmsley * XXX add usecounting for clkdm dependencies, otherwise the presence 311a5ffef6aSPaul Walmsley * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm 312a5ffef6aSPaul Walmsley * could cause trouble 313a5ffef6aSPaul Walmsley */ 314a5ffef6aSPaul Walmsley static struct clockdomain core_l4_3xxx_clkdm = { 315a5ffef6aSPaul Walmsley .name = "core_l4_clkdm", 316a5ffef6aSPaul Walmsley .pwrdm = { .name = "core_pwrdm" }, 317a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP, 318a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_EN_CORE_SHIFT, 319a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK, 320a5ffef6aSPaul Walmsley }; 321a5ffef6aSPaul Walmsley 322a5ffef6aSPaul Walmsley /* Another case of bit name collisions between several registers: EN_DSS */ 323a5ffef6aSPaul Walmsley static struct clockdomain dss_3xxx_clkdm = { 324a5ffef6aSPaul Walmsley .name = "dss_clkdm", 325a5ffef6aSPaul Walmsley .pwrdm = { .name = "dss_pwrdm" }, 326a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 327a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT, 328a5ffef6aSPaul Walmsley .wkdep_srcs = dss_wkdeps, 329a5ffef6aSPaul Walmsley .sleepdep_srcs = dss_sleepdeps, 330a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK, 331a5ffef6aSPaul Walmsley }; 332a5ffef6aSPaul Walmsley 33316e5e2c4SMark A. Greer static struct clockdomain dss_am35x_clkdm = { 33416e5e2c4SMark A. Greer .name = "dss_clkdm", 33516e5e2c4SMark A. Greer .pwrdm = { .name = "dss_pwrdm" }, 33616e5e2c4SMark A. Greer .flags = CLKDM_CAN_HWSUP_SWSUP, 33716e5e2c4SMark A. Greer .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT, 33816e5e2c4SMark A. Greer .wkdep_srcs = dss_am35x_wkdeps, 33916e5e2c4SMark A. Greer .sleepdep_srcs = dss_am35x_sleepdeps, 34016e5e2c4SMark A. Greer .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK, 34116e5e2c4SMark A. Greer }; 34216e5e2c4SMark A. Greer 343a5ffef6aSPaul Walmsley static struct clockdomain cam_clkdm = { 344a5ffef6aSPaul Walmsley .name = "cam_clkdm", 345a5ffef6aSPaul Walmsley .pwrdm = { .name = "cam_pwrdm" }, 346a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 347a5ffef6aSPaul Walmsley .wkdep_srcs = cam_wkdeps, 348a5ffef6aSPaul Walmsley .sleepdep_srcs = cam_sleepdeps, 349a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK, 350a5ffef6aSPaul Walmsley }; 351a5ffef6aSPaul Walmsley 352a5ffef6aSPaul Walmsley static struct clockdomain usbhost_clkdm = { 353a5ffef6aSPaul Walmsley .name = "usbhost_clkdm", 354a5ffef6aSPaul Walmsley .pwrdm = { .name = "usbhost_pwrdm" }, 355a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 356a5ffef6aSPaul Walmsley .wkdep_srcs = usbhost_wkdeps, 357a5ffef6aSPaul Walmsley .sleepdep_srcs = usbhost_sleepdeps, 358a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK, 359a5ffef6aSPaul Walmsley }; 360a5ffef6aSPaul Walmsley 36116e5e2c4SMark A. Greer static struct clockdomain usbhost_am35x_clkdm = { 36216e5e2c4SMark A. Greer .name = "usbhost_clkdm", 36316e5e2c4SMark A. Greer .pwrdm = { .name = "core_pwrdm" }, 36416e5e2c4SMark A. Greer .flags = CLKDM_CAN_HWSUP_SWSUP, 36516e5e2c4SMark A. Greer .wkdep_srcs = usbhost_am35x_wkdeps, 36616e5e2c4SMark A. Greer .sleepdep_srcs = usbhost_am35x_sleepdeps, 36716e5e2c4SMark A. Greer .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK, 36816e5e2c4SMark A. Greer }; 36916e5e2c4SMark A. Greer 370a5ffef6aSPaul Walmsley static struct clockdomain per_clkdm = { 371a5ffef6aSPaul Walmsley .name = "per_clkdm", 372a5ffef6aSPaul Walmsley .pwrdm = { .name = "per_pwrdm" }, 373a5ffef6aSPaul Walmsley .flags = CLKDM_CAN_HWSUP_SWSUP, 374a5ffef6aSPaul Walmsley .dep_bit = OMAP3430_EN_PER_SHIFT, 375a5ffef6aSPaul Walmsley .wkdep_srcs = per_wkdeps, 376a5ffef6aSPaul Walmsley .sleepdep_srcs = per_sleepdeps, 377a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK, 378a5ffef6aSPaul Walmsley }; 379a5ffef6aSPaul Walmsley 38016e5e2c4SMark A. Greer static struct clockdomain per_am35x_clkdm = { 38116e5e2c4SMark A. Greer .name = "per_clkdm", 38216e5e2c4SMark A. Greer .pwrdm = { .name = "per_pwrdm" }, 38316e5e2c4SMark A. Greer .flags = CLKDM_CAN_HWSUP_SWSUP, 38416e5e2c4SMark A. Greer .dep_bit = OMAP3430_EN_PER_SHIFT, 38516e5e2c4SMark A. Greer .wkdep_srcs = per_am35x_wkdeps, 38616e5e2c4SMark A. Greer .sleepdep_srcs = per_am35x_sleepdeps, 38716e5e2c4SMark A. Greer .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK, 38816e5e2c4SMark A. Greer }; 38916e5e2c4SMark A. Greer 390a5ffef6aSPaul Walmsley /* 391a5ffef6aSPaul Walmsley * Disable hw supervised mode for emu_clkdm, because emu_pwrdm is 392a5ffef6aSPaul Walmsley * switched of even if sdti is in use 393a5ffef6aSPaul Walmsley */ 394a5ffef6aSPaul Walmsley static struct clockdomain emu_clkdm = { 395a5ffef6aSPaul Walmsley .name = "emu_clkdm", 396a5ffef6aSPaul Walmsley .pwrdm = { .name = "emu_pwrdm" }, 397a5ffef6aSPaul Walmsley .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP, 398a5ffef6aSPaul Walmsley .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK, 399a5ffef6aSPaul Walmsley }; 400a5ffef6aSPaul Walmsley 401a5ffef6aSPaul Walmsley static struct clockdomain dpll1_clkdm = { 402a5ffef6aSPaul Walmsley .name = "dpll1_clkdm", 403a5ffef6aSPaul Walmsley .pwrdm = { .name = "dpll1_pwrdm" }, 404a5ffef6aSPaul Walmsley }; 405a5ffef6aSPaul Walmsley 406a5ffef6aSPaul Walmsley static struct clockdomain dpll2_clkdm = { 407a5ffef6aSPaul Walmsley .name = "dpll2_clkdm", 408a5ffef6aSPaul Walmsley .pwrdm = { .name = "dpll2_pwrdm" }, 409a5ffef6aSPaul Walmsley }; 410a5ffef6aSPaul Walmsley 411a5ffef6aSPaul Walmsley static struct clockdomain dpll3_clkdm = { 412a5ffef6aSPaul Walmsley .name = "dpll3_clkdm", 413a5ffef6aSPaul Walmsley .pwrdm = { .name = "dpll3_pwrdm" }, 414a5ffef6aSPaul Walmsley }; 415a5ffef6aSPaul Walmsley 416a5ffef6aSPaul Walmsley static struct clockdomain dpll4_clkdm = { 417a5ffef6aSPaul Walmsley .name = "dpll4_clkdm", 418a5ffef6aSPaul Walmsley .pwrdm = { .name = "dpll4_pwrdm" }, 419a5ffef6aSPaul Walmsley }; 420a5ffef6aSPaul Walmsley 421a5ffef6aSPaul Walmsley static struct clockdomain dpll5_clkdm = { 422a5ffef6aSPaul Walmsley .name = "dpll5_clkdm", 423a5ffef6aSPaul Walmsley .pwrdm = { .name = "dpll5_pwrdm" }, 424a5ffef6aSPaul Walmsley }; 425a5ffef6aSPaul Walmsley 426a5ffef6aSPaul Walmsley /* 427a5ffef6aSPaul Walmsley * Clockdomain hwsup dependencies 428a5ffef6aSPaul Walmsley */ 429a5ffef6aSPaul Walmsley 430a5ffef6aSPaul Walmsley static struct clkdm_autodep clkdm_autodeps[] = { 431a5ffef6aSPaul Walmsley { 432a5ffef6aSPaul Walmsley .clkdm = { .name = "mpu_clkdm" }, 433a5ffef6aSPaul Walmsley }, 434a5ffef6aSPaul Walmsley { 435a5ffef6aSPaul Walmsley .clkdm = { .name = "iva2_clkdm" }, 436a5ffef6aSPaul Walmsley }, 437a5ffef6aSPaul Walmsley { 438a5ffef6aSPaul Walmsley .clkdm = { .name = NULL }, 439a5ffef6aSPaul Walmsley } 440a5ffef6aSPaul Walmsley }; 441a5ffef6aSPaul Walmsley 44216e5e2c4SMark A. Greer static struct clkdm_autodep clkdm_am35x_autodeps[] = { 44316e5e2c4SMark A. Greer { 44416e5e2c4SMark A. Greer .clkdm = { .name = "mpu_clkdm" }, 44516e5e2c4SMark A. Greer }, 44616e5e2c4SMark A. Greer { 44716e5e2c4SMark A. Greer .clkdm = { .name = NULL }, 44816e5e2c4SMark A. Greer } 44916e5e2c4SMark A. Greer }; 45016e5e2c4SMark A. Greer 451a5ffef6aSPaul Walmsley /* 452a5ffef6aSPaul Walmsley * 453a5ffef6aSPaul Walmsley */ 454a5ffef6aSPaul Walmsley 45516e5e2c4SMark A. Greer static struct clockdomain *clockdomains_common[] __initdata = { 456a5ffef6aSPaul Walmsley &wkup_common_clkdm, 457a5ffef6aSPaul Walmsley &cm_common_clkdm, 458a5ffef6aSPaul Walmsley &prm_common_clkdm, 459a5ffef6aSPaul Walmsley &neon_clkdm, 460a5ffef6aSPaul Walmsley &core_l3_3xxx_clkdm, 461a5ffef6aSPaul Walmsley &core_l4_3xxx_clkdm, 46216e5e2c4SMark A. Greer &emu_clkdm, 46316e5e2c4SMark A. Greer &dpll1_clkdm, 46416e5e2c4SMark A. Greer &dpll3_clkdm, 46516e5e2c4SMark A. Greer &dpll4_clkdm, 46616e5e2c4SMark A. Greer NULL 46716e5e2c4SMark A. Greer }; 46816e5e2c4SMark A. Greer 46916e5e2c4SMark A. Greer static struct clockdomain *clockdomains_omap3430[] __initdata = { 47016e5e2c4SMark A. Greer &mpu_3xxx_clkdm, 47116e5e2c4SMark A. Greer &iva2_clkdm, 47216e5e2c4SMark A. Greer &d2d_clkdm, 473a5ffef6aSPaul Walmsley &dss_3xxx_clkdm, 474a5ffef6aSPaul Walmsley &cam_clkdm, 475a5ffef6aSPaul Walmsley &per_clkdm, 476a5ffef6aSPaul Walmsley &dpll2_clkdm, 477a5ffef6aSPaul Walmsley NULL 478a5ffef6aSPaul Walmsley }; 479a5ffef6aSPaul Walmsley 480a5ffef6aSPaul Walmsley static struct clockdomain *clockdomains_omap3430es1[] __initdata = { 481a5ffef6aSPaul Walmsley &gfx_3430es1_clkdm, 482a5ffef6aSPaul Walmsley NULL, 483a5ffef6aSPaul Walmsley }; 484a5ffef6aSPaul Walmsley 485a5ffef6aSPaul Walmsley static struct clockdomain *clockdomains_omap3430es2plus[] __initdata = { 486a5ffef6aSPaul Walmsley &sgx_clkdm, 487a5ffef6aSPaul Walmsley &dpll5_clkdm, 488a5ffef6aSPaul Walmsley &usbhost_clkdm, 489a5ffef6aSPaul Walmsley NULL, 490a5ffef6aSPaul Walmsley }; 491a5ffef6aSPaul Walmsley 49216e5e2c4SMark A. Greer static struct clockdomain *clockdomains_am35x[] __initdata = { 49316e5e2c4SMark A. Greer &mpu_am35x_clkdm, 49416e5e2c4SMark A. Greer &sgx_am35x_clkdm, 49516e5e2c4SMark A. Greer &dss_am35x_clkdm, 49616e5e2c4SMark A. Greer &per_am35x_clkdm, 49716e5e2c4SMark A. Greer &usbhost_am35x_clkdm, 49816e5e2c4SMark A. Greer &dpll5_clkdm, 49916e5e2c4SMark A. Greer NULL 50016e5e2c4SMark A. Greer }; 50116e5e2c4SMark A. Greer 502a5ffef6aSPaul Walmsley void __init omap3xxx_clockdomains_init(void) 503a5ffef6aSPaul Walmsley { 504a5ffef6aSPaul Walmsley struct clockdomain **sc; 50516e5e2c4SMark A. Greer unsigned int rev; 506a5ffef6aSPaul Walmsley 507a5ffef6aSPaul Walmsley if (!cpu_is_omap34xx()) 508a5ffef6aSPaul Walmsley return; 509a5ffef6aSPaul Walmsley 510a5ffef6aSPaul Walmsley clkdm_register_platform_funcs(&omap3_clkdm_operations); 51116e5e2c4SMark A. Greer clkdm_register_clkdms(clockdomains_common); 512a5ffef6aSPaul Walmsley 51316e5e2c4SMark A. Greer rev = omap_rev(); 51416e5e2c4SMark A. Greer 51516e5e2c4SMark A. Greer if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) { 51616e5e2c4SMark A. Greer clkdm_register_clkdms(clockdomains_am35x); 51716e5e2c4SMark A. Greer clkdm_register_autodeps(clkdm_am35x_autodeps); 51816e5e2c4SMark A. Greer } else { 51916e5e2c4SMark A. Greer clkdm_register_clkdms(clockdomains_omap3430); 52016e5e2c4SMark A. Greer 52116e5e2c4SMark A. Greer sc = (rev == OMAP3430_REV_ES1_0) ? 52216e5e2c4SMark A. Greer clockdomains_omap3430es1 : clockdomains_omap3430es2plus; 523a5ffef6aSPaul Walmsley 524a5ffef6aSPaul Walmsley clkdm_register_clkdms(sc); 525a5ffef6aSPaul Walmsley clkdm_register_autodeps(clkdm_autodeps); 52616e5e2c4SMark A. Greer } 52716e5e2c4SMark A. Greer 528a5ffef6aSPaul Walmsley clkdm_complete_init(); 529a5ffef6aSPaul Walmsley } 530