1 /* 2 * linux/include/asm-arm/arch-omap/clockdomain.h 3 * 4 * OMAP2/3 clockdomain framework functions 5 * 6 * Copyright (C) 2008 Texas Instruments, Inc. 7 * Copyright (C) 2008 Nokia Corporation 8 * 9 * Written by Paul Walmsley 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of the GNU General Public License version 2 as 13 * published by the Free Software Foundation. 14 */ 15 16 #ifndef __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H 17 #define __ASM_ARM_ARCH_OMAP_CLOCKDOMAIN_H 18 19 #include <mach/powerdomain.h> 20 #include <mach/clock.h> 21 #include <mach/cpu.h> 22 23 /* Clockdomain capability flags */ 24 #define CLKDM_CAN_FORCE_SLEEP (1 << 0) 25 #define CLKDM_CAN_FORCE_WAKEUP (1 << 1) 26 #define CLKDM_CAN_ENABLE_AUTO (1 << 2) 27 #define CLKDM_CAN_DISABLE_AUTO (1 << 3) 28 29 #define CLKDM_CAN_HWSUP (CLKDM_CAN_ENABLE_AUTO | CLKDM_CAN_DISABLE_AUTO) 30 #define CLKDM_CAN_SWSUP (CLKDM_CAN_FORCE_SLEEP | CLKDM_CAN_FORCE_WAKEUP) 31 #define CLKDM_CAN_HWSUP_SWSUP (CLKDM_CAN_SWSUP | CLKDM_CAN_HWSUP) 32 33 /* OMAP24XX CM_CLKSTCTRL_*.AUTOSTATE_* register bit values */ 34 #define OMAP24XX_CLKSTCTRL_DISABLE_AUTO 0x0 35 #define OMAP24XX_CLKSTCTRL_ENABLE_AUTO 0x1 36 37 /* OMAP3XXX CM_CLKSTCTRL_*.CLKTRCTRL_* register bit values */ 38 #define OMAP34XX_CLKSTCTRL_DISABLE_AUTO 0x0 39 #define OMAP34XX_CLKSTCTRL_FORCE_SLEEP 0x1 40 #define OMAP34XX_CLKSTCTRL_FORCE_WAKEUP 0x2 41 #define OMAP34XX_CLKSTCTRL_ENABLE_AUTO 0x3 42 43 /* 44 * struct clkdm_pwrdm_autodep - a powerdomain that should have wkdeps 45 * and sleepdeps added when a powerdomain should stay active in hwsup mode; 46 * and conversely, removed when the powerdomain should be allowed to go 47 * inactive in hwsup mode. 48 */ 49 struct clkdm_pwrdm_autodep { 50 51 /* Name of the powerdomain to add a wkdep/sleepdep on */ 52 const char *pwrdm_name; 53 54 /* Powerdomain pointer (looked up at clkdm_init() time) */ 55 struct powerdomain *pwrdm; 56 57 /* OMAP chip types that this clockdomain dep is valid on */ 58 const struct omap_chip_id omap_chip; 59 60 }; 61 62 struct clockdomain { 63 64 /* Clockdomain name */ 65 const char *name; 66 67 /* Powerdomain enclosing this clockdomain */ 68 const char *pwrdm_name; 69 70 /* CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg */ 71 const u16 clktrctrl_mask; 72 73 /* Clockdomain capability flags */ 74 const u8 flags; 75 76 /* OMAP chip types that this clockdomain is valid on */ 77 const struct omap_chip_id omap_chip; 78 79 /* Usecount tracking */ 80 atomic_t usecount; 81 82 /* Powerdomain pointer assigned at clkdm_register() */ 83 struct powerdomain *pwrdm; 84 85 struct list_head node; 86 87 }; 88 89 void clkdm_init(struct clockdomain **clkdms, struct clkdm_pwrdm_autodep *autodeps); 90 int clkdm_register(struct clockdomain *clkdm); 91 int clkdm_unregister(struct clockdomain *clkdm); 92 struct clockdomain *clkdm_lookup(const char *name); 93 94 int clkdm_for_each(int (*fn)(struct clockdomain *clkdm)); 95 struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm); 96 97 void omap2_clkdm_allow_idle(struct clockdomain *clkdm); 98 void omap2_clkdm_deny_idle(struct clockdomain *clkdm); 99 100 int omap2_clkdm_wakeup(struct clockdomain *clkdm); 101 int omap2_clkdm_sleep(struct clockdomain *clkdm); 102 103 int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); 104 int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); 105 106 #endif 107