1/* 2 * arch/arm/plat-omap/include/mach/clockdomain.h 3 * 4 * OMAP2/3 clockdomain framework functions 5 * 6 * Copyright (C) 2008 Texas Instruments, Inc. 7 * Copyright (C) 2008-2009 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 <plat/powerdomain.h> 20#include <plat/clock.h> 21#include <plat/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_autodep - clkdm deps to add when entering/exiting hwsup mode 45 * @clkdm: clockdomain to add wkdep+sleepdep on - set name member only 46 * @omap_chip: OMAP chip types that this autodep is valid on 47 * 48 * A clockdomain that should have wkdeps and sleepdeps added when a 49 * clockdomain should stay active in hwsup mode; and conversely, 50 * removed when the clockdomain should be allowed to go inactive in 51 * hwsup mode. 52 * 53 * Autodeps are deprecated and should be removed after 54 * omap_hwmod-based fine-grained module idle control is added. 55 */ 56struct clkdm_autodep { 57 union { 58 const char *name; 59 struct clockdomain *ptr; 60 } clkdm; 61 const struct omap_chip_id omap_chip; 62}; 63 64struct clkdm_dep { 65 const char *clkdm_name; 66 struct clockdomain *clkdm; 67 atomic_t wkdep_usecount; 68 atomic_t sleepdep_usecount; 69 const struct omap_chip_id omap_chip; 70}; 71 72/** 73 * struct clockdomain - OMAP clockdomain 74 * @name: clockdomain name 75 * @pwrdm: powerdomain containing this clockdomain 76 * @clktrctrl_reg: CLKSTCTRL reg for the given clock domain 77 * @clktrctrl_mask: CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg 78 * @flags: Clockdomain capability flags 79 * @dep_bit: Bit shift of this clockdomain's PM_WKDEP/CM_SLEEPDEP bit 80 * @wkdep_srcs: Clockdomains that can be told to wake this powerdomain up 81 * @sleepdep_srcs: Clockdomains that can be told to keep this clkdm from inact 82 * @omap_chip: OMAP chip types that this clockdomain is valid on 83 * @usecount: Usecount tracking 84 * @node: list_head to link all clockdomains together 85 */ 86struct clockdomain { 87 const char *name; 88 union { 89 const char *name; 90 struct powerdomain *ptr; 91 } pwrdm; 92 void __iomem *clkstctrl_reg; 93 const u16 clktrctrl_mask; 94 const u8 flags; 95 const u8 dep_bit; 96 struct clkdm_dep *wkdep_srcs; 97 struct clkdm_dep *sleepdep_srcs; 98 const struct omap_chip_id omap_chip; 99 atomic_t usecount; 100 struct list_head node; 101}; 102 103void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps); 104struct clockdomain *clkdm_lookup(const char *name); 105 106int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user), 107 void *user); 108struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm); 109 110int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 111int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 112int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 113int clkdm_clear_all_wkdeps(struct clockdomain *clkdm); 114int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 115int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 116int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); 117int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); 118 119void omap2_clkdm_allow_idle(struct clockdomain *clkdm); 120void omap2_clkdm_deny_idle(struct clockdomain *clkdm); 121 122int omap2_clkdm_wakeup(struct clockdomain *clkdm); 123int omap2_clkdm_sleep(struct clockdomain *clkdm); 124 125int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); 126int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk); 127 128#endif 129