Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
prminst44xx.c
Go to the documentation of this file.
1 /*
2  * OMAP4 PRM instance functions
3  *
4  * Copyright (C) 2009 Nokia Corporation
5  * Copyright (C) 2011 Texas Instruments, Inc.
6  * Paul Walmsley
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License version 2 as
10  * published by the Free Software Foundation.
11  */
12 
13 #include <linux/kernel.h>
14 #include <linux/types.h>
15 #include <linux/errno.h>
16 #include <linux/err.h>
17 #include <linux/io.h>
18 
19 #include "iomap.h"
20 #include "common.h"
21 #include "prcm-common.h"
22 #include "prm44xx.h"
23 #include "prminst44xx.h"
24 #include "prm-regbits-44xx.h"
25 #include "prcm44xx.h"
26 #include "prcm_mpu44xx.h"
27 
28 static void __iomem *_prm_bases[OMAP4_MAX_PRCM_PARTITIONS];
29 
37 {
38  _prm_bases[OMAP4430_PRM_PARTITION] = prm_base;
40 }
41 
42 /* Read a register in a PRM instance */
44 {
47  !_prm_bases[part]);
48  return __raw_readl(_prm_bases[part] + inst + idx);
49 }
50 
51 /* Write into a register in a PRM instance */
53 {
56  !_prm_bases[part]);
57  __raw_writel(val, _prm_bases[part] + inst + idx);
58 }
59 
60 /* Read-modify-write a register in PRM. Caller must lock */
62  u16 idx)
63 {
64  u32 v;
65 
66  v = omap4_prminst_read_inst_reg(part, inst, idx);
67  v &= ~mask;
68  v |= bits;
69  omap4_prminst_write_inst_reg(v, part, inst, idx);
70 
71  return v;
72 }
73 
74 /*
75  * Address offset (in bytes) between the reset control and the reset
76  * status registers: 4 bytes on OMAP4
77  */
78 #define OMAP4_RST_CTRL_ST_OFFSET 4
79 
91  u16 rstctrl_offs)
92 {
93  u32 v;
94 
95  v = omap4_prminst_read_inst_reg(part, inst, rstctrl_offs);
96  v &= 1 << shift;
97  v >>= shift;
98 
99  return v;
100 }
101 
115  u16 rstctrl_offs)
116 {
117  u32 mask = 1 << shift;
118 
119  omap4_prminst_rmw_inst_reg_bits(mask, mask, part, inst, rstctrl_offs);
120 
121  return 0;
122 }
123 
140  u16 rstctrl_offs)
141 {
142  int c;
143  u32 mask = 1 << shift;
144  u16 rstst_offs = rstctrl_offs + OMAP4_RST_CTRL_ST_OFFSET;
145 
146  /* Check the current status to avoid de-asserting the line twice */
147  if (omap4_prminst_is_hardreset_asserted(shift, part, inst,
148  rstctrl_offs) == 0)
149  return -EEXIST;
150 
151  /* Clear the reset status by writing 1 to the status bit */
152  omap4_prminst_rmw_inst_reg_bits(0xffffffff, mask, part, inst,
153  rstst_offs);
154  /* de-assert the reset control line */
155  omap4_prminst_rmw_inst_reg_bits(mask, 0, part, inst, rstctrl_offs);
156  /* wait the status to be set */
157  omap_test_timeout(omap4_prminst_is_hardreset_asserted(shift, part, inst,
158  rstst_offs),
160 
161  return (c == MAX_MODULE_HARDRESET_WAIT) ? -EBUSY : 0;
162 }
163 
164 
166 {
167  u32 v;
168 
176 
177  /* OCP barrier */
181 }