blob: 45b5debc5d3f3981b6ca2d1a87ef6b3ab0eb162c [file] [log] [blame]
Paul Walmsleyd459bfe2008-08-19 11:08:43 +03001/*
Paul Walmsley5b74c672009-02-03 02:10:03 -07002 * arch/arm/plat-omap/include/mach/clockdomain.h
Paul Walmsleyd459bfe2008-08-19 11:08:43 +03003 *
4 * OMAP2/3 clockdomain framework functions
5 *
6 * Copyright (C) 2008 Texas Instruments, Inc.
Paul Walmsley55ed9692010-01-26 20:12:59 -07007 * Copyright (C) 2008-2009 Nokia Corporation
Paul Walmsleyd459bfe2008-08-19 11:08:43 +03008 *
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
Tony Lindgrence491cf2009-10-20 09:40:47 -070019#include <plat/powerdomain.h>
20#include <plat/clock.h>
21#include <plat/cpu.h>
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030022
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/*
Paul Walmsley55ed9692010-01-26 20:12:59 -070044 * struct clkdm_autodep - a clockdomain that should have wkdeps
45 * and sleepdeps added when a clockdomain should stay active in hwsup mode;
46 * and conversely, removed when the clockdomain should be allowed to go
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030047 * inactive in hwsup mode.
48 */
Paul Walmsley55ed9692010-01-26 20:12:59 -070049struct clkdm_autodep {
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030050
Paul Walmsley5b74c672009-02-03 02:10:03 -070051 union {
Paul Walmsley55ed9692010-01-26 20:12:59 -070052 /* Name of the clockdomain to add a wkdep/sleepdep on */
Paul Walmsley5b74c672009-02-03 02:10:03 -070053 const char *name;
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030054
Paul Walmsley55ed9692010-01-26 20:12:59 -070055 /* Clockdomain pointer (looked up at clkdm_init() time) */
56 struct clockdomain *ptr;
57 } clkdm;
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030058
59 /* OMAP chip types that this clockdomain dep is valid on */
60 const struct omap_chip_id omap_chip;
61
62};
63
Paul Walmsley55ed9692010-01-26 20:12:59 -070064/* Encodes dependencies between clockdomains - statically defined */
65struct clkdm_dep {
66
67 /* Clockdomain name */
68 const char *clkdm_name;
69
70 /* Clockdomain pointer - resolved by the clockdomain code */
71 struct clockdomain *clkdm;
72
Paul Walmsley369d5612010-01-26 20:13:01 -070073 /* Number of wakeup dependencies causing this clkdm to wake */
74 atomic_t wkdep_usecount;
75
76 /* Number of sleep dependencies that could prevent clkdm from idle */
77 atomic_t sleepdep_usecount;
78
Paul Walmsley55ed9692010-01-26 20:12:59 -070079 /* Flags to mark OMAP chip restrictions, etc. */
80 const struct omap_chip_id omap_chip;
81
82};
83
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030084struct clockdomain {
85
86 /* Clockdomain name */
87 const char *name;
88
Paul Walmsley5b74c672009-02-03 02:10:03 -070089 union {
90 /* Powerdomain enclosing this clockdomain */
91 const char *name;
92
93 /* Powerdomain pointer assigned at clkdm_register() */
94 struct powerdomain *ptr;
95 } pwrdm;
Paul Walmsleyd459bfe2008-08-19 11:08:43 +030096
Abhijit Pagare84c0c392010-01-26 20:12:53 -070097 /* CLKSTCTRL reg for the given clock domain*/
98 void __iomem *clkstctrl_reg;
99
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300100 /* CLKTRCTRL/AUTOSTATE field mask in CM_CLKSTCTRL reg */
101 const u16 clktrctrl_mask;
102
103 /* Clockdomain capability flags */
104 const u8 flags;
105
Paul Walmsley55ed9692010-01-26 20:12:59 -0700106 /* Bit shift of this clockdomain's PM_WKDEP/CM_SLEEPDEP bit */
107 const u8 dep_bit;
108
109 /* Clockdomains that can be told to wake this powerdomain up */
110 struct clkdm_dep *wkdep_srcs;
111
112 /* Clockdomains that can be told to keep this clkdm from inactivity */
113 struct clkdm_dep *sleepdep_srcs;
114
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300115 /* OMAP chip types that this clockdomain is valid on */
116 const struct omap_chip_id omap_chip;
117
118 /* Usecount tracking */
119 atomic_t usecount;
120
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300121 struct list_head node;
122
123};
124
Paul Walmsley55ed9692010-01-26 20:12:59 -0700125void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps);
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300126struct clockdomain *clkdm_lookup(const char *name);
127
Peter 'p2' De Schrijvera23456e2008-10-15 18:13:47 +0300128int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
129 void *user);
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300130struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm);
131
Paul Walmsley55ed9692010-01-26 20:12:59 -0700132int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
133int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
134int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
Paul Walmsley369d5612010-01-26 20:13:01 -0700135int clkdm_clear_all_wkdeps(struct clockdomain *clkdm);
Paul Walmsley55ed9692010-01-26 20:12:59 -0700136int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
137int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
138int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
Paul Walmsley369d5612010-01-26 20:13:01 -0700139int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm);
Paul Walmsley55ed9692010-01-26 20:12:59 -0700140
Paul Walmsleyd459bfe2008-08-19 11:08:43 +0300141void omap2_clkdm_allow_idle(struct clockdomain *clkdm);
142void omap2_clkdm_deny_idle(struct clockdomain *clkdm);
143
144int omap2_clkdm_wakeup(struct clockdomain *clkdm);
145int omap2_clkdm_sleep(struct clockdomain *clkdm);
146
147int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk);
148int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk);
149
150#endif