x86, 386 removal: Remove support for IRQ 13 FPU error reporting
[sfrench/cifs-2.6.git] / arch / arm / mach-omap2 / clockdomain33xx.c
1 /*
2  * AM33XX clockdomain control
3  *
4  * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/
5  * Vaibhav Hiremath <hvaibhav@ti.com>
6  *
7  * Derived from mach-omap2/clockdomain44xx.c written by Rajendra Nayak
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License as
11  * published by the Free Software Foundation version 2.
12  *
13  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
14  * kind, whether express or implied; without even the implied warranty
15  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  */
18
19 #include <linux/kernel.h>
20
21 #include "clockdomain.h"
22 #include "cm33xx.h"
23
24
25 static int am33xx_clkdm_sleep(struct clockdomain *clkdm)
26 {
27         am33xx_cm_clkdm_force_sleep(clkdm->cm_inst, clkdm->clkdm_offs);
28         return 0;
29 }
30
31 static int am33xx_clkdm_wakeup(struct clockdomain *clkdm)
32 {
33         am33xx_cm_clkdm_force_wakeup(clkdm->cm_inst, clkdm->clkdm_offs);
34         return 0;
35 }
36
37 static void am33xx_clkdm_allow_idle(struct clockdomain *clkdm)
38 {
39         am33xx_cm_clkdm_enable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
40 }
41
42 static void am33xx_clkdm_deny_idle(struct clockdomain *clkdm)
43 {
44         am33xx_cm_clkdm_disable_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
45 }
46
47 static int am33xx_clkdm_clk_enable(struct clockdomain *clkdm)
48 {
49         if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
50                 return am33xx_clkdm_wakeup(clkdm);
51
52         return 0;
53 }
54
55 static int am33xx_clkdm_clk_disable(struct clockdomain *clkdm)
56 {
57         bool hwsup = false;
58
59         hwsup = am33xx_cm_is_clkdm_in_hwsup(clkdm->cm_inst, clkdm->clkdm_offs);
60
61         if (!hwsup && (clkdm->flags & CLKDM_CAN_FORCE_SLEEP))
62                 am33xx_clkdm_sleep(clkdm);
63
64         return 0;
65 }
66
67 struct clkdm_ops am33xx_clkdm_operations = {
68         .clkdm_sleep            = am33xx_clkdm_sleep,
69         .clkdm_wakeup           = am33xx_clkdm_wakeup,
70         .clkdm_allow_idle       = am33xx_clkdm_allow_idle,
71         .clkdm_deny_idle        = am33xx_clkdm_deny_idle,
72         .clkdm_clk_enable       = am33xx_clkdm_clk_enable,
73         .clkdm_clk_disable      = am33xx_clkdm_clk_disable,
74 };