1ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/*
2ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * OMAP2xxx CM module functions
3ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley *
4ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * Copyright (C) 2009 Nokia Corporation
54bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * Copyright (C) 2008-2010, 2012 Texas Instruments, Inc.
6ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * Paul Walmsley
74bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley * Rajendra Nayak <rnayak@ti.com>
8ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley *
9ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * This program is free software; you can redistribute it and/or modify
10ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * it under the terms of the GNU General Public License version 2 as
11ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * published by the Free Software Foundation.
12ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
13ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
14ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/kernel.h>
15ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/types.h>
16ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/delay.h>
17ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/errno.h>
18ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/err.h>
19ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include <linux/io.h>
20ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
214bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley#include "prm2xxx.h"
22ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm.h"
23ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm2xxx.h"
24ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#include "cm-regbits-24xx.h"
254bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley#include "clockdomain.h"
26ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
27ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/* CM_AUTOIDLE_PLL.AUTO_* bit values for DPLLs */
28ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#define DPLL_AUTOIDLE_DISABLE				0x0
29ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#define OMAP2XXX_DPLL_AUTOIDLE_LOW_POWER_STOP		0x3
30ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
31ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/* CM_AUTOIDLE_PLL.AUTO_* bit values for APLLs (OMAP2xxx only) */
32ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#define OMAP2XXX_APLL_AUTOIDLE_DISABLE			0x0
33ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley#define OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP		0x3
34ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
35b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* CM_IDLEST_PLL bit value offset for APLLs (OMAP2xxx only) */
36b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley#define EN_APLL_LOCKED					3
37b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
38ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleystatic const u8 omap2xxx_cm_idlest_offs[] = {
39ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	CM_IDLEST1, CM_IDLEST2, OMAP2430_CM_IDLEST3, OMAP24XX_CM_IDLEST4
40ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley};
41ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
42ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/*
43ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley *
44ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
45ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
46ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleystatic void _write_clktrctrl(u8 c, s16 module, u32 mask)
47ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
48ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u32 v;
49ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
50ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v = omap2_cm_read_mod_reg(module, OMAP2_CM_CLKSTCTRL);
51ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v &= ~mask;
52ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v |= c << __ffs(mask);
53ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	omap2_cm_write_mod_reg(v, module, OMAP2_CM_CLKSTCTRL);
54ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
55ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
56ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleybool omap2xxx_cm_is_clkdm_in_hwsup(s16 module, u32 mask)
57ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
58ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u32 v;
59ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
60ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v = omap2_cm_read_mod_reg(module, OMAP2_CM_CLKSTCTRL);
61ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v &= mask;
62ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v >>= __ffs(mask);
63ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
64ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	return (v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO) ? 1 : 0;
65ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
66ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
67ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_clkdm_enable_hwsup(s16 module, u32 mask)
68ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
69ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_write_clktrctrl(OMAP24XX_CLKSTCTRL_ENABLE_AUTO, module, mask);
70ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
71ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
72ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_clkdm_disable_hwsup(s16 module, u32 mask)
73ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
74ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_write_clktrctrl(OMAP24XX_CLKSTCTRL_DISABLE_AUTO, module, mask);
75ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
76ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
77ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/*
78ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * DPLL autoidle control
79ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
80ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
81ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleystatic void _omap2xxx_set_dpll_autoidle(u8 m)
82ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
83ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u32 v;
84ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
85ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE);
86ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v &= ~OMAP24XX_AUTO_DPLL_MASK;
87ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v |= m << OMAP24XX_AUTO_DPLL_SHIFT;
88ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	omap2_cm_write_mod_reg(v, PLL_MOD, CM_AUTOIDLE);
89ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
90ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
91ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_dpll_disable_autoidle(void)
92ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
93ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_dpll_autoidle(OMAP2XXX_DPLL_AUTOIDLE_LOW_POWER_STOP);
94ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
95ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
96ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_dpll_auto_low_power_stop(void)
97ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
98ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_dpll_autoidle(DPLL_AUTOIDLE_DISABLE);
99ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
100ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
101ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/*
102b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley * APLL control
103ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
104ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
105ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleystatic void _omap2xxx_set_apll_autoidle(u8 m, u32 mask)
106ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
107ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u32 v;
108ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
109ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v = omap2_cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE);
110ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v &= ~mask;
111ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	v |= m << __ffs(mask);
112ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	omap2_cm_write_mod_reg(v, PLL_MOD, CM_AUTOIDLE);
113ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
114ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
115ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_apll54_disable_autoidle(void)
116ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
117ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP,
118ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley				    OMAP24XX_AUTO_54M_MASK);
119ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
120ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
121ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_apll54_auto_low_power_stop(void)
122ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
123ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_DISABLE,
124ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley				    OMAP24XX_AUTO_54M_MASK);
125ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
126ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
127ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_apll96_disable_autoidle(void)
128ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
129ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_LOW_POWER_STOP,
130ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley				    OMAP24XX_AUTO_96M_MASK);
131ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
132ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
133ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyvoid omap2xxx_cm_set_apll96_auto_low_power_stop(void)
134ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
135ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	_omap2xxx_set_apll_autoidle(OMAP2XXX_APLL_AUTOIDLE_DISABLE,
136ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley				    OMAP24XX_AUTO_96M_MASK);
137ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
138ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
139b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Enable an APLL if off */
140b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleystatic int _omap2xxx_apll_enable(u8 enable_bit, u8 status_bit)
141b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
142b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	u32 v, m;
143b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
144b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	m = EN_APLL_LOCKED << enable_bit;
145b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
146b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
147b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	if (v & m)
148b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley		return 0;   /* apll already enabled */
149b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
150b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	v |= m;
151b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	omap2_cm_write_mod_reg(v, PLL_MOD, CM_CLKEN);
152b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
153b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	omap2xxx_cm_wait_module_ready(PLL_MOD, 1, status_bit);
154b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
155b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	/*
156b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	 * REVISIT: Should we return an error code if
157b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	 * omap2xxx_cm_wait_module_ready() fails?
158b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	 */
159b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	return 0;
160b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
161b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
162b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Stop APLL */
163b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleystatic void _omap2xxx_apll_disable(u8 enable_bit)
164b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
165b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	u32 v;
166b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
167b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
168b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	v &= ~(EN_APLL_LOCKED << enable_bit);
169b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	omap2_cm_write_mod_reg(v, PLL_MOD, CM_CLKEN);
170b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
171b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
172b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Enable an APLL if off */
173b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleyint omap2xxx_cm_apll54_enable(void)
174b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
175b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	return _omap2xxx_apll_enable(OMAP24XX_EN_54M_PLL_SHIFT,
176b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley				     OMAP24XX_ST_54M_APLL_SHIFT);
177b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
178b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
179b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Enable an APLL if off */
180b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleyint omap2xxx_cm_apll96_enable(void)
181b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
182b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	return _omap2xxx_apll_enable(OMAP24XX_EN_96M_PLL_SHIFT,
183b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley				     OMAP24XX_ST_96M_APLL_SHIFT);
184b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
185b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
186b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Stop APLL */
187b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleyvoid omap2xxx_cm_apll54_disable(void)
188b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
189b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	_omap2xxx_apll_disable(OMAP24XX_EN_54M_PLL_SHIFT);
190b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
191b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
192b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley/* Stop APLL */
193b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsleyvoid omap2xxx_cm_apll96_disable(void)
194b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley{
195b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley	_omap2xxx_apll_disable(OMAP24XX_EN_96M_PLL_SHIFT);
196b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley}
197b6ffa05091978c68e94d2802200f2aaa06a598d9Paul Walmsley
198c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley/**
199c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * omap2xxx_cm_split_idlest_reg - split CM_IDLEST reg addr into its components
200c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @idlest_reg: CM_IDLEST* virtual address
201c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @prcm_inst: pointer to an s16 to return the PRCM instance offset
202c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * @idlest_reg_id: pointer to a u8 to return the CM_IDLESTx register ID
203c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley *
204c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * XXX This function is only needed until absolute register addresses are
205c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley * removed from the OMAP struct clk records.
206c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley */
207c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleyint omap2xxx_cm_split_idlest_reg(void __iomem *idlest_reg, s16 *prcm_inst,
208c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley				 u8 *idlest_reg_id)
209c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{
210c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	unsigned long offs;
211c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	u8 idlest_offs;
212c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	int i;
213c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
214c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	if (idlest_reg < cm_base || idlest_reg > (cm_base + 0x0fff))
215c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley		return -EINVAL;
216c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
217c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	idlest_offs = (unsigned long)idlest_reg & 0xff;
218c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	for (i = 0; i < ARRAY_SIZE(omap2xxx_cm_idlest_offs); i++) {
219c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley		if (idlest_offs == omap2xxx_cm_idlest_offs[i]) {
220c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley			*idlest_reg_id = i + 1;
221c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley			break;
222c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley		}
223c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	}
224c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
225c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	if (i == ARRAY_SIZE(omap2xxx_cm_idlest_offs))
226c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley		return -EINVAL;
227c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
228c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	offs = idlest_reg - cm_base;
229c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	offs &= 0xff00;
230c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	*prcm_inst = offs;
231c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
232c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	return 0;
233c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley}
234c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
235ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/*
236ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley *
237ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
238ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
239ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley/**
240ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * omap2xxx_cm_wait_module_ready - wait for a module to leave idle or standby
241ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * @prcm_mod: PRCM module offset
242ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * @idlest_id: CM_IDLESTx register ID (i.e., x = 1, 2, 3)
243ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * @idlest_shift: shift of the bit in the CM_IDLEST* register to check
244ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley *
245ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * Wait for the PRCM to indicate that the module identified by
246ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * (@prcm_mod, @idlest_id, @idlest_shift) is clocked.  Return 0 upon
247ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley * success or -EBUSY if the module doesn't enable in time.
248ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley */
249ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsleyint omap2xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift)
250ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley{
251ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	int ena = 0, i = 0;
252ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u8 cm_idlest_reg;
253ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	u32 mask;
254ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
255ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	if (!idlest_id || (idlest_id > ARRAY_SIZE(omap2xxx_cm_idlest_offs)))
256ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley		return -EINVAL;
257ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
258ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	cm_idlest_reg = omap2xxx_cm_idlest_offs[idlest_id - 1];
259ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
260ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	mask = 1 << idlest_shift;
261ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	ena = mask;
262ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
263ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	omap_test_timeout(((omap2_cm_read_mod_reg(prcm_mod, cm_idlest_reg) &
264ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley			    mask) == ena), MAX_MODULE_READY_TIME, i);
265ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley
266ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley	return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
267ff4ae5d9319b86f940e410e92659c50f9879ff46Paul Walmsley}
2684bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2694bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley/* Clockdomain low-level functions */
2704bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2714bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic void omap2xxx_clkdm_allow_idle(struct clockdomain *clkdm)
2724bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{
2734bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
2744bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley				       clkdm->clktrctrl_mask);
2754bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley}
2764bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2774bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic void omap2xxx_clkdm_deny_idle(struct clockdomain *clkdm)
2784bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{
2794bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs,
2804bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley					clkdm->clktrctrl_mask);
2814bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley}
2824bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2834bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap2xxx_clkdm_clk_enable(struct clockdomain *clkdm)
2844bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{
2854bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	bool hwsup = false;
2864bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2874bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	if (!clkdm->clktrctrl_mask)
2884bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley		return 0;
2894bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2904bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
2914bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley					      clkdm->clktrctrl_mask);
292cc3af91b504ab1810311c78cce1bc2b7f52240eePaul Walmsley	if (!hwsup && clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
293cc3af91b504ab1810311c78cce1bc2b7f52240eePaul Walmsley		omap2xxx_clkdm_wakeup(clkdm);
2944bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2954bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	return 0;
2964bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley}
2974bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
2984bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystatic int omap2xxx_clkdm_clk_disable(struct clockdomain *clkdm)
2994bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley{
3004bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	bool hwsup = false;
3014bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
3024bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	if (!clkdm->clktrctrl_mask)
3034bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley		return 0;
3044bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
3054bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
3064bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley					      clkdm->clktrctrl_mask);
3074bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
308cc3af91b504ab1810311c78cce1bc2b7f52240eePaul Walmsley	if (!hwsup && clkdm->flags & CLKDM_CAN_FORCE_SLEEP)
309cc3af91b504ab1810311c78cce1bc2b7f52240eePaul Walmsley		omap2xxx_clkdm_sleep(clkdm);
3104bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
3114bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	return 0;
3124bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley}
3134bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley
3144bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsleystruct clkdm_ops omap2_clkdm_operations = {
3154bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_add_wkdep	= omap2_clkdm_add_wkdep,
3164bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_del_wkdep	= omap2_clkdm_del_wkdep,
3174bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_read_wkdep	= omap2_clkdm_read_wkdep,
3184bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_clear_all_wkdeps	= omap2_clkdm_clear_all_wkdeps,
3194bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_sleep		= omap2xxx_clkdm_sleep,
3204bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_wakeup		= omap2xxx_clkdm_wakeup,
3214bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_allow_idle	= omap2xxx_clkdm_allow_idle,
3224bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_deny_idle	= omap2xxx_clkdm_deny_idle,
3234bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_clk_enable	= omap2xxx_clkdm_clk_enable,
3244bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley	.clkdm_clk_disable	= omap2xxx_clkdm_clk_disable,
3254bd5259e53accda0fe295d3b25da348f4d5f4b09Paul Walmsley};
326c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
327cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristoint omap2xxx_cm_fclks_active(void)
328cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
329cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	u32 f1, f2;
330cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
331cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	f1 = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
332cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	f2 = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2);
333cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
334cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return (f1 | f2) ? 1 : 0;
335cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
336cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
337cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristoint omap2xxx_cm_mpu_retention_allowed(void)
338cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
339cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	u32 l;
340cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
341cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	/* Check for MMC, UART2, UART1, McSPI2, McSPI1 and DSS1. */
342cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	l = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
343cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	if (l & (OMAP2420_EN_MMC_MASK | OMAP24XX_EN_UART2_MASK |
344cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		 OMAP24XX_EN_UART1_MASK | OMAP24XX_EN_MCSPI2_MASK |
345cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		 OMAP24XX_EN_MCSPI1_MASK | OMAP24XX_EN_DSS1_MASK))
346cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		return 0;
347cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	/* Check for UART3. */
348cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	l = omap2_cm_read_mod_reg(CORE_MOD, OMAP24XX_CM_FCLKEN2);
349cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	if (l & OMAP24XX_EN_UART3_MASK)
350cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		return 0;
351cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
352cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return 1;
353cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
354cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
355cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristou32 omap2xxx_cm_get_core_clk_src(void)
356cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
357cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	u32 v;
358cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
359cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	v = omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
360cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	v &= OMAP24XX_CORE_CLK_SRC_MASK;
361cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
362cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return v;
363cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
364cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
365cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristou32 omap2xxx_cm_get_core_pll_config(void)
366cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
367cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
368cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
369cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
370cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristou32 omap2xxx_cm_get_pll_config(void)
371cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
372cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return omap2_cm_read_mod_reg(PLL_MOD, CM_CLKSEL1);
373cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
374cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
375cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristou32 omap2xxx_cm_get_pll_status(void)
376cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
377cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	return omap2_cm_read_mod_reg(PLL_MOD, CM_CLKEN);
378cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
379cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
380cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristovoid omap2xxx_cm_set_mod_dividers(u32 mpu, u32 dsp, u32 gfx, u32 core, u32 mdm)
381cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo{
382cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	u32 tmp;
383cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
384cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	omap2_cm_write_mod_reg(mpu, MPU_MOD, CM_CLKSEL);
385cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	omap2_cm_write_mod_reg(dsp, OMAP24XX_DSP_MOD, CM_CLKSEL);
386cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	omap2_cm_write_mod_reg(gfx, GFX_MOD, CM_CLKSEL);
387cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	tmp = omap2_cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) &
388cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		OMAP24XX_CLKSEL_DSS2_MASK;
389cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo	omap2_cm_write_mod_reg(core | tmp, CORE_MOD, CM_CLKSEL1);
3907af1363742e0e2752e90d5de2ddb9c48665fc567Tero Kristo	if (mdm)
391cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo		omap2_cm_write_mod_reg(mdm, OMAP2430_MDM_MOD, CM_CLKSEL);
392cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo}
393cd6e9db27728e8bcf98cb667996b121761f58121Tero Kristo
394c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley/*
395c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley *
396c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley */
397c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
398c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleystatic struct cm_ll_data omap2xxx_cm_ll_data = {
399c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	.split_idlest_reg	= &omap2xxx_cm_split_idlest_reg,
400c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	.wait_module_ready	= &omap2xxx_cm_wait_module_ready,
401c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley};
402c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
403c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleyint __init omap2xxx_cm_init(void)
404c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{
405c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley	return cm_register(&omap2xxx_cm_ll_data);
406c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley}
407c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley
408c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsleystatic void __exit omap2xxx_cm_exit(void)
409c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley{
4107af1363742e0e2752e90d5de2ddb9c48665fc567Tero Kristo	cm_unregister(&omap2xxx_cm_ll_data);
411c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley}
412c4ceedcb18cf7a06059482a3a1828b9aad9f78cfPaul Walmsley__exitcall(omap2xxx_cm_exit);
413