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