Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
prm33xx.c
Go to the documentation of this file.
1 /*
2  * AM33XX PRM functions
3  *
4  * Copyright (C) 2011-2012 Texas Instruments Incorporated - http://www.ti.com/
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation version 2.
9  *
10  * This program is distributed "as is" WITHOUT ANY WARRANTY of any
11  * kind, whether express or implied; without even the implied warranty
12  * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  */
15 
16 #include <linux/kernel.h>
17 #include <linux/types.h>
18 #include <linux/errno.h>
19 #include <linux/err.h>
20 #include <linux/io.h>
21 
22 #include <plat/common.h>
23 
24 #include "common.h"
25 #include "prm33xx.h"
26 #include "prm-regbits-33xx.h"
27 
28 /* Read a register in a PRM instance */
30 {
31  return __raw_readl(prm_base + inst + idx);
32 }
33 
34 /* Write into a register in a PRM instance */
36 {
37  __raw_writel(val, prm_base + inst + idx);
38 }
39 
40 /* Read-modify-write a register in PRM. Caller must lock */
42 {
43  u32 v;
44 
45  v = am33xx_prm_read_reg(inst, idx);
46  v &= ~mask;
47  v |= bits;
48  am33xx_prm_write_reg(v, inst, idx);
49 
50  return v;
51 }
52 
64 int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, u16 rstctrl_offs)
65 {
66  u32 v;
67 
68  v = am33xx_prm_read_reg(inst, rstctrl_offs);
69  v &= 1 << shift;
70  v >>= shift;
71 
72  return v;
73 }
74 
88 int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs)
89 {
90  u32 mask = 1 << shift;
91 
92  am33xx_prm_rmw_reg_bits(mask, mask, inst, rstctrl_offs);
93 
94  return 0;
95 }
96 
115  u16 rstctrl_offs, u16 rstst_offs)
116 {
117  int c;
118  u32 mask = 1 << shift;
119 
120  /* Check the current status to avoid de-asserting the line twice */
121  if (am33xx_prm_is_hardreset_asserted(shift, inst, rstctrl_offs) == 0)
122  return -EEXIST;
123 
124  /* Clear the reset status by writing 1 to the status bit */
125  am33xx_prm_rmw_reg_bits(0xffffffff, mask, inst, rstst_offs);
126  /* de-assert the reset control line */
127  am33xx_prm_rmw_reg_bits(mask, 0, inst, rstctrl_offs);
128  /* wait the status to be set */
129 
130  omap_test_timeout(am33xx_prm_is_hardreset_asserted(shift, inst,
131  rstst_offs),
133 
134  return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0;
135 }