1 /* 2 * OMAP2420 clockdomains 3 * 4 * Copyright (C) 2008-2011 Texas Instruments, Inc. 5 * Copyright (C) 2008-2010 Nokia Corporation 6 * 7 * Paul Walmsley, Jouni Högander 8 * 9 * This file contains clockdomains and clockdomain wakeup dependencies 10 * for OMAP2420 chips. Some notes: 11 * 12 * A useful validation rule for struct clockdomain: Any clockdomain 13 * referenced by a wkdep_srcs must have a dep_bit assigned. So 14 * wkdep_srcs are really just software-controllable dependencies. 15 * Non-software-controllable dependencies do exist, but they are not 16 * encoded below (yet). 17 * 18 * 24xx does not support programmable sleep dependencies (SLEEPDEP) 19 * 20 * The overly-specific dep_bit names are due to a bit name collision 21 * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift 22 * value are the same for all powerdomains: 2 23 * 24 * XXX should dep_bit be a mask, so we can test to see if it is 0 as a 25 * sanity check? 26 * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE 27 */ 28 29 /* 30 * To-Do List 31 * -> Port the Sleep/Wakeup dependencies for the domains 32 * from the Power domain framework 33 */ 34 35 #include <linux/kernel.h> 36 #include <linux/io.h> 37 38 #include "clockdomain.h" 39 #include "prm2xxx_3xxx.h" 40 #include "cm2xxx_3xxx.h" 41 #include "cm-regbits-24xx.h" 42 #include "prm-regbits-24xx.h" 43 44 /* 45 * Clockdomain dependencies for wkdeps 46 * 47 * XXX Hardware dependencies (e.g., dependencies that cannot be 48 * changed in software) are not included here yet, but should be. 49 */ 50 51 /* Wakeup dependency source arrays */ 52 53 /* 2420-specific possible wakeup dependencies */ 54 55 /* 2420 PM_WKDEP_MPU: CORE, DSP, WKUP */ 56 static struct clkdm_dep mpu_2420_wkdeps[] = { 57 { .clkdm_name = "core_l3_clkdm" }, 58 { .clkdm_name = "core_l4_clkdm" }, 59 { .clkdm_name = "dsp_clkdm" }, 60 { .clkdm_name = "wkup_clkdm" }, 61 { NULL }, 62 }; 63 64 /* 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP */ 65 static struct clkdm_dep core_2420_wkdeps[] = { 66 { .clkdm_name = "dsp_clkdm" }, 67 { .clkdm_name = "gfx_clkdm" }, 68 { .clkdm_name = "mpu_clkdm" }, 69 { .clkdm_name = "wkup_clkdm" }, 70 { NULL }, 71 }; 72 73 /* 74 * 2420-only clockdomains 75 */ 76 77 static struct clockdomain mpu_2420_clkdm = { 78 .name = "mpu_clkdm", 79 .pwrdm = { .name = "mpu_pwrdm" }, 80 .flags = CLKDM_CAN_HWSUP, 81 .wkdep_srcs = mpu_2420_wkdeps, 82 .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 83 }; 84 85 static struct clockdomain iva1_2420_clkdm = { 86 .name = "iva1_clkdm", 87 .pwrdm = { .name = "dsp_pwrdm" }, 88 .flags = CLKDM_CAN_HWSUP_SWSUP, 89 .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT, 90 .wkdep_srcs = dsp_24xx_wkdeps, 91 .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK, 92 }; 93 94 static struct clockdomain dsp_2420_clkdm = { 95 .name = "dsp_clkdm", 96 .pwrdm = { .name = "dsp_pwrdm" }, 97 .flags = CLKDM_CAN_HWSUP_SWSUP, 98 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK, 99 }; 100 101 static struct clockdomain gfx_2420_clkdm = { 102 .name = "gfx_clkdm", 103 .pwrdm = { .name = "gfx_pwrdm" }, 104 .flags = CLKDM_CAN_HWSUP_SWSUP, 105 .wkdep_srcs = gfx_24xx_wkdeps, 106 .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK, 107 }; 108 109 static struct clockdomain core_l3_2420_clkdm = { 110 .name = "core_l3_clkdm", 111 .pwrdm = { .name = "core_pwrdm" }, 112 .flags = CLKDM_CAN_HWSUP, 113 .wkdep_srcs = core_2420_wkdeps, 114 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK, 115 }; 116 117 static struct clockdomain core_l4_2420_clkdm = { 118 .name = "core_l4_clkdm", 119 .pwrdm = { .name = "core_pwrdm" }, 120 .flags = CLKDM_CAN_HWSUP, 121 .wkdep_srcs = core_2420_wkdeps, 122 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK, 123 }; 124 125 static struct clockdomain dss_2420_clkdm = { 126 .name = "dss_clkdm", 127 .pwrdm = { .name = "core_pwrdm" }, 128 .flags = CLKDM_CAN_HWSUP, 129 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK, 130 }; 131 132 static struct clockdomain *clockdomains_omap242x[] __initdata = { 133 &wkup_common_clkdm, 134 &mpu_2420_clkdm, 135 &iva1_2420_clkdm, 136 &dsp_2420_clkdm, 137 &gfx_2420_clkdm, 138 &core_l3_2420_clkdm, 139 &core_l4_2420_clkdm, 140 &dss_2420_clkdm, 141 NULL, 142 }; 143 144 void __init omap242x_clockdomains_init(void) 145 { 146 if (!cpu_is_omap242x()) 147 return; 148 149 clkdm_register_platform_funcs(&omap2_clkdm_operations); 150 clkdm_register_clkdms(clockdomains_omap242x); 151 clkdm_complete_init(); 152 } 153