996790acebc9d63a6b05ec4ecbec7671b5607a51
[pandora-kernel.git] / arch / arm / mach-omap2 / powerdomain44xx.c
1 /*
2  * OMAP4 powerdomain control
3  *
4  * Copyright (C) 2009-2010 Texas Instruments, Inc.
5  * Copyright (C) 2007-2009 Nokia Corporation
6  *
7  * Derived from mach-omap2/powerdomain.c written by Paul Walmsley
8  * Rajendra Nayak <rnayak@ti.com>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2 as
12  * published by the Free Software Foundation.
13  */
14
15 #include <linux/io.h>
16 #include <linux/errno.h>
17 #include <linux/delay.h>
18 #include <plat/powerdomain.h>
19 #include <plat/prcm.h>
20 #include "prm.h"
21 #include "prm-regbits-44xx.h"
22 #include "powerdomains.h"
23
24 static int omap4_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
25 {
26         prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
27                                 (pwrst << OMAP_POWERSTATE_SHIFT),
28                                 pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
29         return 0;
30 }
31
32 static int omap4_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
33 {
34         return prm_read_mod_bits_shift(pwrdm->prcm_offs,
35                                 OMAP4_PM_PWSTCTRL, OMAP_POWERSTATE_MASK);
36 }
37
38 static int omap4_pwrdm_read_pwrst(struct powerdomain *pwrdm)
39 {
40         return prm_read_mod_bits_shift(pwrdm->prcm_offs,
41                                 OMAP4_PM_PWSTST, OMAP_POWERSTATEST_MASK);
42 }
43
44 static int omap4_pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
45 {
46         return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
47                                 OMAP4430_LASTPOWERSTATEENTERED_MASK);
48 }
49
50 static int omap4_pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
51 {
52         u32 v;
53
54         v = pwrst << __ffs(OMAP4430_LOGICRETSTATE_MASK);
55         prm_rmw_mod_reg_bits(OMAP4430_LOGICRETSTATE_MASK, v,
56                                 pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL);
57
58         return 0;
59 }
60
61 static int omap4_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
62 {
63         return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTST,
64                                 OMAP4430_LOGICSTATEST_MASK);
65 }
66
67 static int omap4_pwrdm_read_logic_retst(struct powerdomain *pwrdm)
68 {
69         return prm_read_mod_bits_shift(pwrdm->prcm_offs, OMAP4_PM_PWSTCTRL,
70                                 OMAP4430_LOGICRETSTATE_MASK);
71 }
72
73 struct pwrdm_ops omap4_pwrdm_operations = {
74         .pwrdm_set_next_pwrst   = omap4_pwrdm_set_next_pwrst,
75         .pwrdm_read_next_pwrst  = omap4_pwrdm_read_next_pwrst,
76         .pwrdm_read_pwrst       = omap4_pwrdm_read_pwrst,
77         .pwrdm_read_prev_pwrst  = omap4_pwrdm_read_prev_pwrst,
78         .pwrdm_set_logic_retst  = omap4_pwrdm_set_logic_retst,
79         .pwrdm_read_logic_pwrst = omap4_pwrdm_read_logic_pwrst,
80         .pwrdm_read_logic_retst = omap4_pwrdm_read_logic_retst,
81 };