diff options
-rw-r--r-- | Documentation/ABI/testing/sysfs-class-regulator | 136 | ||||
-rw-r--r-- | Documentation/DocBook/Makefile | 2 | ||||
-rw-r--r-- | Documentation/DocBook/regulator.tmpl | 304 | ||||
-rw-r--r-- | drivers/Makefile | 4 | ||||
-rw-r--r-- | drivers/regulator/core.c | 474 | ||||
-rw-r--r-- | drivers/regulator/da903x.c | 12 | ||||
-rw-r--r-- | include/linux/regulator/consumer.h | 8 | ||||
-rw-r--r-- | include/linux/regulator/driver.h | 37 | ||||
-rw-r--r-- | include/linux/regulator/machine.h | 41 |
9 files changed, 746 insertions, 272 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-regulator b/Documentation/ABI/testing/sysfs-class-regulator index 3731f6f29bcb..873ef1fc1569 100644 --- a/Documentation/ABI/testing/sysfs-class-regulator +++ b/Documentation/ABI/testing/sysfs-class-regulator | |||
@@ -3,8 +3,9 @@ Date: April 2008 | |||
3 | KernelVersion: 2.6.26 | 3 | KernelVersion: 2.6.26 |
4 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 4 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
5 | Description: | 5 | Description: |
6 | Each regulator directory will contain a field called | 6 | Some regulator directories will contain a field called |
7 | state. This holds the regulator output state. | 7 | state. This reports the regulator enable status, for |
8 | regulators which can report that value. | ||
8 | 9 | ||
9 | This will be one of the following strings: | 10 | This will be one of the following strings: |
10 | 11 | ||
@@ -18,7 +19,8 @@ Description: | |||
18 | 'disabled' means the regulator output is OFF and is not | 19 | 'disabled' means the regulator output is OFF and is not |
19 | supplying power to the system.. | 20 | supplying power to the system.. |
20 | 21 | ||
21 | 'unknown' means software cannot determine the state. | 22 | 'unknown' means software cannot determine the state, or |
23 | the reported state is invalid. | ||
22 | 24 | ||
23 | NOTE: this field can be used in conjunction with microvolts | 25 | NOTE: this field can be used in conjunction with microvolts |
24 | and microamps to determine regulator output levels. | 26 | and microamps to determine regulator output levels. |
@@ -53,9 +55,10 @@ Date: April 2008 | |||
53 | KernelVersion: 2.6.26 | 55 | KernelVersion: 2.6.26 |
54 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 56 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
55 | Description: | 57 | Description: |
56 | Each regulator directory will contain a field called | 58 | Some regulator directories will contain a field called |
57 | microvolts. This holds the regulator output voltage setting | 59 | microvolts. This holds the regulator output voltage setting |
58 | measured in microvolts (i.e. E-6 Volts). | 60 | measured in microvolts (i.e. E-6 Volts), for regulators |
61 | which can report that voltage. | ||
59 | 62 | ||
60 | NOTE: This value should not be used to determine the regulator | 63 | NOTE: This value should not be used to determine the regulator |
61 | output voltage level as this value is the same regardless of | 64 | output voltage level as this value is the same regardless of |
@@ -67,9 +70,10 @@ Date: April 2008 | |||
67 | KernelVersion: 2.6.26 | 70 | KernelVersion: 2.6.26 |
68 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 71 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
69 | Description: | 72 | Description: |
70 | Each regulator directory will contain a field called | 73 | Some regulator directories will contain a field called |
71 | microamps. This holds the regulator output current limit | 74 | microamps. This holds the regulator output current limit |
72 | setting measured in microamps (i.e. E-6 Amps). | 75 | setting measured in microamps (i.e. E-6 Amps), for regulators |
76 | which can report that current. | ||
73 | 77 | ||
74 | NOTE: This value should not be used to determine the regulator | 78 | NOTE: This value should not be used to determine the regulator |
75 | output current level as this value is the same regardless of | 79 | output current level as this value is the same regardless of |
@@ -81,8 +85,9 @@ Date: April 2008 | |||
81 | KernelVersion: 2.6.26 | 85 | KernelVersion: 2.6.26 |
82 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 86 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
83 | Description: | 87 | Description: |
84 | Each regulator directory will contain a field called | 88 | Some regulator directories will contain a field called |
85 | opmode. This holds the regulator operating mode setting. | 89 | opmode. This holds the current regulator operating mode, |
90 | for regulators which can report it. | ||
86 | 91 | ||
87 | The opmode value can be one of the following strings: | 92 | The opmode value can be one of the following strings: |
88 | 93 | ||
@@ -92,7 +97,7 @@ Description: | |||
92 | 'standby' | 97 | 'standby' |
93 | 'unknown' | 98 | 'unknown' |
94 | 99 | ||
95 | The modes are described in include/linux/regulator/regulator.h | 100 | The modes are described in include/linux/regulator/consumer.h |
96 | 101 | ||
97 | NOTE: This value should not be used to determine the regulator | 102 | NOTE: This value should not be used to determine the regulator |
98 | output operating mode as this value is the same regardless of | 103 | output operating mode as this value is the same regardless of |
@@ -104,9 +109,10 @@ Date: April 2008 | |||
104 | KernelVersion: 2.6.26 | 109 | KernelVersion: 2.6.26 |
105 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 110 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
106 | Description: | 111 | Description: |
107 | Each regulator directory will contain a field called | 112 | Some regulator directories will contain a field called |
108 | min_microvolts. This holds the minimum safe working regulator | 113 | min_microvolts. This holds the minimum safe working regulator |
109 | output voltage setting for this domain measured in microvolts. | 114 | output voltage setting for this domain measured in microvolts, |
115 | for regulators which support voltage constraints. | ||
110 | 116 | ||
111 | NOTE: this will return the string 'constraint not defined' if | 117 | NOTE: this will return the string 'constraint not defined' if |
112 | the power domain has no min microvolts constraint defined by | 118 | the power domain has no min microvolts constraint defined by |
@@ -118,9 +124,10 @@ Date: April 2008 | |||
118 | KernelVersion: 2.6.26 | 124 | KernelVersion: 2.6.26 |
119 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 125 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
120 | Description: | 126 | Description: |
121 | Each regulator directory will contain a field called | 127 | Some regulator directories will contain a field called |
122 | max_microvolts. This holds the maximum safe working regulator | 128 | max_microvolts. This holds the maximum safe working regulator |
123 | output voltage setting for this domain measured in microvolts. | 129 | output voltage setting for this domain measured in microvolts, |
130 | for regulators which support voltage constraints. | ||
124 | 131 | ||
125 | NOTE: this will return the string 'constraint not defined' if | 132 | NOTE: this will return the string 'constraint not defined' if |
126 | the power domain has no max microvolts constraint defined by | 133 | the power domain has no max microvolts constraint defined by |
@@ -132,10 +139,10 @@ Date: April 2008 | |||
132 | KernelVersion: 2.6.26 | 139 | KernelVersion: 2.6.26 |
133 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 140 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
134 | Description: | 141 | Description: |
135 | Each regulator directory will contain a field called | 142 | Some regulator directories will contain a field called |
136 | min_microamps. This holds the minimum safe working regulator | 143 | min_microamps. This holds the minimum safe working regulator |
137 | output current limit setting for this domain measured in | 144 | output current limit setting for this domain measured in |
138 | microamps. | 145 | microamps, for regulators which support current constraints. |
139 | 146 | ||
140 | NOTE: this will return the string 'constraint not defined' if | 147 | NOTE: this will return the string 'constraint not defined' if |
141 | the power domain has no min microamps constraint defined by | 148 | the power domain has no min microamps constraint defined by |
@@ -147,10 +154,10 @@ Date: April 2008 | |||
147 | KernelVersion: 2.6.26 | 154 | KernelVersion: 2.6.26 |
148 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 155 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
149 | Description: | 156 | Description: |
150 | Each regulator directory will contain a field called | 157 | Some regulator directories will contain a field called |
151 | max_microamps. This holds the maximum safe working regulator | 158 | max_microamps. This holds the maximum safe working regulator |
152 | output current limit setting for this domain measured in | 159 | output current limit setting for this domain measured in |
153 | microamps. | 160 | microamps, for regulators which support current constraints. |
154 | 161 | ||
155 | NOTE: this will return the string 'constraint not defined' if | 162 | NOTE: this will return the string 'constraint not defined' if |
156 | the power domain has no max microamps constraint defined by | 163 | the power domain has no max microamps constraint defined by |
@@ -185,7 +192,7 @@ Date: April 2008 | |||
185 | KernelVersion: 2.6.26 | 192 | KernelVersion: 2.6.26 |
186 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 193 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
187 | Description: | 194 | Description: |
188 | Each regulator directory will contain a field called | 195 | Some regulator directories will contain a field called |
189 | requested_microamps. This holds the total requested load | 196 | requested_microamps. This holds the total requested load |
190 | current in microamps for this regulator from all its consumer | 197 | current in microamps for this regulator from all its consumer |
191 | devices. | 198 | devices. |
@@ -204,125 +211,102 @@ Date: May 2008 | |||
204 | KernelVersion: 2.6.26 | 211 | KernelVersion: 2.6.26 |
205 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 212 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
206 | Description: | 213 | Description: |
207 | Each regulator directory will contain a field called | 214 | Some regulator directories will contain a field called |
208 | suspend_mem_microvolts. This holds the regulator output | 215 | suspend_mem_microvolts. This holds the regulator output |
209 | voltage setting for this domain measured in microvolts when | 216 | voltage setting for this domain measured in microvolts when |
210 | the system is suspended to memory. | 217 | the system is suspended to memory, for voltage regulators |
211 | 218 | implementing suspend voltage configuration constraints. | |
212 | NOTE: this will return the string 'not defined' if | ||
213 | the power domain has no suspend to memory voltage defined by | ||
214 | platform code. | ||
215 | 219 | ||
216 | What: /sys/class/regulator/.../suspend_disk_microvolts | 220 | What: /sys/class/regulator/.../suspend_disk_microvolts |
217 | Date: May 2008 | 221 | Date: May 2008 |
218 | KernelVersion: 2.6.26 | 222 | KernelVersion: 2.6.26 |
219 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 223 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
220 | Description: | 224 | Description: |
221 | Each regulator directory will contain a field called | 225 | Some regulator directories will contain a field called |
222 | suspend_disk_microvolts. This holds the regulator output | 226 | suspend_disk_microvolts. This holds the regulator output |
223 | voltage setting for this domain measured in microvolts when | 227 | voltage setting for this domain measured in microvolts when |
224 | the system is suspended to disk. | 228 | the system is suspended to disk, for voltage regulators |
225 | 229 | implementing suspend voltage configuration constraints. | |
226 | NOTE: this will return the string 'not defined' if | ||
227 | the power domain has no suspend to disk voltage defined by | ||
228 | platform code. | ||
229 | 230 | ||
230 | What: /sys/class/regulator/.../suspend_standby_microvolts | 231 | What: /sys/class/regulator/.../suspend_standby_microvolts |
231 | Date: May 2008 | 232 | Date: May 2008 |
232 | KernelVersion: 2.6.26 | 233 | KernelVersion: 2.6.26 |
233 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 234 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
234 | Description: | 235 | Description: |
235 | Each regulator directory will contain a field called | 236 | Some regulator directories will contain a field called |
236 | suspend_standby_microvolts. This holds the regulator output | 237 | suspend_standby_microvolts. This holds the regulator output |
237 | voltage setting for this domain measured in microvolts when | 238 | voltage setting for this domain measured in microvolts when |
238 | the system is suspended to standby. | 239 | the system is suspended to standby, for voltage regulators |
239 | 240 | implementing suspend voltage configuration constraints. | |
240 | NOTE: this will return the string 'not defined' if | ||
241 | the power domain has no suspend to standby voltage defined by | ||
242 | platform code. | ||
243 | 241 | ||
244 | What: /sys/class/regulator/.../suspend_mem_mode | 242 | What: /sys/class/regulator/.../suspend_mem_mode |
245 | Date: May 2008 | 243 | Date: May 2008 |
246 | KernelVersion: 2.6.26 | 244 | KernelVersion: 2.6.26 |
247 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 245 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
248 | Description: | 246 | Description: |
249 | Each regulator directory will contain a field called | 247 | Some regulator directories will contain a field called |
250 | suspend_mem_mode. This holds the regulator operating mode | 248 | suspend_mem_mode. This holds the regulator operating mode |
251 | setting for this domain when the system is suspended to | 249 | setting for this domain when the system is suspended to |
252 | memory. | 250 | memory, for regulators implementing suspend mode |
253 | 251 | configuration constraints. | |
254 | NOTE: this will return the string 'not defined' if | ||
255 | the power domain has no suspend to memory mode defined by | ||
256 | platform code. | ||
257 | 252 | ||
258 | What: /sys/class/regulator/.../suspend_disk_mode | 253 | What: /sys/class/regulator/.../suspend_disk_mode |
259 | Date: May 2008 | 254 | Date: May 2008 |
260 | KernelVersion: 2.6.26 | 255 | KernelVersion: 2.6.26 |
261 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 256 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
262 | Description: | 257 | Description: |
263 | Each regulator directory will contain a field called | 258 | Some regulator directories will contain a field called |
264 | suspend_disk_mode. This holds the regulator operating mode | 259 | suspend_disk_mode. This holds the regulator operating mode |
265 | setting for this domain when the system is suspended to disk. | 260 | setting for this domain when the system is suspended to disk, |
266 | 261 | for regulators implementing suspend mode configuration | |
267 | NOTE: this will return the string 'not defined' if | 262 | constraints. |
268 | the power domain has no suspend to disk mode defined by | ||
269 | platform code. | ||
270 | 263 | ||
271 | What: /sys/class/regulator/.../suspend_standby_mode | 264 | What: /sys/class/regulator/.../suspend_standby_mode |
272 | Date: May 2008 | 265 | Date: May 2008 |
273 | KernelVersion: 2.6.26 | 266 | KernelVersion: 2.6.26 |
274 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 267 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
275 | Description: | 268 | Description: |
276 | Each regulator directory will contain a field called | 269 | Some regulator directories will contain a field called |
277 | suspend_standby_mode. This holds the regulator operating mode | 270 | suspend_standby_mode. This holds the regulator operating mode |
278 | setting for this domain when the system is suspended to | 271 | setting for this domain when the system is suspended to |
279 | standby. | 272 | standby, for regulators implementing suspend mode |
280 | 273 | configuration constraints. | |
281 | NOTE: this will return the string 'not defined' if | ||
282 | the power domain has no suspend to standby mode defined by | ||
283 | platform code. | ||
284 | 274 | ||
285 | What: /sys/class/regulator/.../suspend_mem_state | 275 | What: /sys/class/regulator/.../suspend_mem_state |
286 | Date: May 2008 | 276 | Date: May 2008 |
287 | KernelVersion: 2.6.26 | 277 | KernelVersion: 2.6.26 |
288 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 278 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
289 | Description: | 279 | Description: |
290 | Each regulator directory will contain a field called | 280 | Some regulator directories will contain a field called |
291 | suspend_mem_state. This holds the regulator operating state | 281 | suspend_mem_state. This holds the regulator operating state |
292 | when suspended to memory. | 282 | when suspended to memory, for regulators implementing suspend |
293 | 283 | configuration constraints. | |
294 | This will be one of the following strings: | ||
295 | 284 | ||
296 | 'enabled' | 285 | This will be one of the same strings reported by |
297 | 'disabled' | 286 | the "state" attribute. |
298 | 'not defined' | ||
299 | 287 | ||
300 | What: /sys/class/regulator/.../suspend_disk_state | 288 | What: /sys/class/regulator/.../suspend_disk_state |
301 | Date: May 2008 | 289 | Date: May 2008 |
302 | KernelVersion: 2.6.26 | 290 | KernelVersion: 2.6.26 |
303 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 291 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
304 | Description: | 292 | Description: |
305 | Each regulator directory will contain a field called | 293 | Some regulator directories will contain a field called |
306 | suspend_disk_state. This holds the regulator operating state | 294 | suspend_disk_state. This holds the regulator operating state |
307 | when suspended to disk. | 295 | when suspended to disk, for regulators implementing |
308 | 296 | suspend configuration constraints. | |
309 | This will be one of the following strings: | ||
310 | 297 | ||
311 | 'enabled' | 298 | This will be one of the same strings reported by |
312 | 'disabled' | 299 | the "state" attribute. |
313 | 'not defined' | ||
314 | 300 | ||
315 | What: /sys/class/regulator/.../suspend_standby_state | 301 | What: /sys/class/regulator/.../suspend_standby_state |
316 | Date: May 2008 | 302 | Date: May 2008 |
317 | KernelVersion: 2.6.26 | 303 | KernelVersion: 2.6.26 |
318 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> | 304 | Contact: Liam Girdwood <lrg@slimlogic.co.uk> |
319 | Description: | 305 | Description: |
320 | Each regulator directory will contain a field called | 306 | Some regulator directories will contain a field called |
321 | suspend_standby_state. This holds the regulator operating | 307 | suspend_standby_state. This holds the regulator operating |
322 | state when suspended to standby. | 308 | state when suspended to standby, for regulators implementing |
323 | 309 | suspend configuration constraints. | |
324 | This will be one of the following strings: | ||
325 | 310 | ||
326 | 'enabled' | 311 | This will be one of the same strings reported by |
327 | 'disabled' | 312 | the "state" attribute. |
328 | 'not defined' | ||
diff --git a/Documentation/DocBook/Makefile b/Documentation/DocBook/Makefile index 0a08126d3094..dc3154e49279 100644 --- a/Documentation/DocBook/Makefile +++ b/Documentation/DocBook/Makefile | |||
@@ -12,7 +12,7 @@ DOCBOOKS := z8530book.xml mcabook.xml \ | |||
12 | kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \ | 12 | kernel-api.xml filesystems.xml lsm.xml usb.xml kgdb.xml \ |
13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ | 13 | gadget.xml libata.xml mtdnand.xml librs.xml rapidio.xml \ |
14 | genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ | 14 | genericirq.xml s390-drivers.xml uio-howto.xml scsi.xml \ |
15 | mac80211.xml debugobjects.xml sh.xml | 15 | mac80211.xml debugobjects.xml sh.xml regulator.xml |
16 | 16 | ||
17 | ### | 17 | ### |
18 | # The build process is as follows (targets): | 18 | # The build process is as follows (targets): |
diff --git a/Documentation/DocBook/regulator.tmpl b/Documentation/DocBook/regulator.tmpl new file mode 100644 index 000000000000..53f4f8d3b810 --- /dev/null +++ b/Documentation/DocBook/regulator.tmpl | |||
@@ -0,0 +1,304 @@ | |||
1 | <?xml version="1.0" encoding="UTF-8"?> | ||
2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | ||
3 | "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | ||
4 | |||
5 | <book id="regulator-api"> | ||
6 | <bookinfo> | ||
7 | <title>Voltage and current regulator API</title> | ||
8 | |||
9 | <authorgroup> | ||
10 | <author> | ||
11 | <firstname>Liam</firstname> | ||
12 | <surname>Girdwood</surname> | ||
13 | <affiliation> | ||
14 | <address> | ||
15 | <email>lrg@slimlogic.co.uk</email> | ||
16 | </address> | ||
17 | </affiliation> | ||
18 | </author> | ||
19 | <author> | ||
20 | <firstname>Mark</firstname> | ||
21 | <surname>Brown</surname> | ||
22 | <affiliation> | ||
23 | <orgname>Wolfson Microelectronics</orgname> | ||
24 | <address> | ||
25 | <email>broonie@opensource.wolfsonmicro.com</email> | ||
26 | </address> | ||
27 | </affiliation> | ||
28 | </author> | ||
29 | </authorgroup> | ||
30 | |||
31 | <copyright> | ||
32 | <year>2007-2008</year> | ||
33 | <holder>Wolfson Microelectronics</holder> | ||
34 | </copyright> | ||
35 | <copyright> | ||
36 | <year>2008</year> | ||
37 | <holder>Liam Girdwood</holder> | ||
38 | </copyright> | ||
39 | |||
40 | <legalnotice> | ||
41 | <para> | ||
42 | This documentation is free software; you can redistribute | ||
43 | it and/or modify it under the terms of the GNU General Public | ||
44 | License version 2 as published by the Free Software Foundation. | ||
45 | </para> | ||
46 | |||
47 | <para> | ||
48 | This program is distributed in the hope that it will be | ||
49 | useful, but WITHOUT ANY WARRANTY; without even the implied | ||
50 | warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
51 | See the GNU General Public License for more details. | ||
52 | </para> | ||
53 | |||
54 | <para> | ||
55 | You should have received a copy of the GNU General Public | ||
56 | License along with this program; if not, write to the Free | ||
57 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | ||
58 | MA 02111-1307 USA | ||
59 | </para> | ||
60 | |||
61 | <para> | ||
62 | For more details see the file COPYING in the source | ||
63 | distribution of Linux. | ||
64 | </para> | ||
65 | </legalnotice> | ||
66 | </bookinfo> | ||
67 | |||
68 | <toc></toc> | ||
69 | |||
70 | <chapter id="intro"> | ||
71 | <title>Introduction</title> | ||
72 | <para> | ||
73 | This framework is designed to provide a standard kernel | ||
74 | interface to control voltage and current regulators. | ||
75 | </para> | ||
76 | <para> | ||
77 | The intention is to allow systems to dynamically control | ||
78 | regulator power output in order to save power and prolong | ||
79 | battery life. This applies to both voltage regulators (where | ||
80 | voltage output is controllable) and current sinks (where current | ||
81 | limit is controllable). | ||
82 | </para> | ||
83 | <para> | ||
84 | Note that additional (and currently more complete) documentation | ||
85 | is available in the Linux kernel source under | ||
86 | <filename>Documentation/power/regulator</filename>. | ||
87 | </para> | ||
88 | |||
89 | <sect1 id="glossary"> | ||
90 | <title>Glossary</title> | ||
91 | <para> | ||
92 | The regulator API uses a number of terms which may not be | ||
93 | familiar: | ||
94 | </para> | ||
95 | <glossary> | ||
96 | |||
97 | <glossentry> | ||
98 | <glossterm>Regulator</glossterm> | ||
99 | <glossdef> | ||
100 | <para> | ||
101 | Electronic device that supplies power to other devices. Most | ||
102 | regulators can enable and disable their output and some can also | ||
103 | control their output voltage or current. | ||
104 | </para> | ||
105 | </glossdef> | ||
106 | </glossentry> | ||
107 | |||
108 | <glossentry> | ||
109 | <glossterm>Consumer</glossterm> | ||
110 | <glossdef> | ||
111 | <para> | ||
112 | Electronic device which consumes power provided by a regulator. | ||
113 | These may either be static, requiring only a fixed supply, or | ||
114 | dynamic, requiring active management of the regulator at | ||
115 | runtime. | ||
116 | </para> | ||
117 | </glossdef> | ||
118 | </glossentry> | ||
119 | |||
120 | <glossentry> | ||
121 | <glossterm>Power Domain</glossterm> | ||
122 | <glossdef> | ||
123 | <para> | ||
124 | The electronic circuit supplied by a given regulator, including | ||
125 | the regulator and all consumer devices. The configuration of | ||
126 | the regulator is shared between all the components in the | ||
127 | circuit. | ||
128 | </para> | ||
129 | </glossdef> | ||
130 | </glossentry> | ||
131 | |||
132 | <glossentry> | ||
133 | <glossterm>Power Management Integrated Circuit</glossterm> | ||
134 | <acronym>PMIC</acronym> | ||
135 | <glossdef> | ||
136 | <para> | ||
137 | An IC which contains numerous regulators and often also other | ||
138 | subsystems. In an embedded system the primary PMIC is often | ||
139 | equivalent to a combination of the PSU and southbridge in a | ||
140 | desktop system. | ||
141 | </para> | ||
142 | </glossdef> | ||
143 | </glossentry> | ||
144 | </glossary> | ||
145 | </sect1> | ||
146 | </chapter> | ||
147 | |||
148 | <chapter id="consumer"> | ||
149 | <title>Consumer driver interface</title> | ||
150 | <para> | ||
151 | This offers a similar API to the kernel clock framework. | ||
152 | Consumer drivers use <link | ||
153 | linkend='API-regulator-get'>get</link> and <link | ||
154 | linkend='API-regulator-put'>put</link> operations to acquire and | ||
155 | release regulators. Functions are | ||
156 | provided to <link linkend='API-regulator-enable'>enable</link> | ||
157 | and <link linkend='API-regulator-disable'>disable</link> the | ||
158 | reguator and to get and set the runtime parameters of the | ||
159 | regulator. | ||
160 | </para> | ||
161 | <para> | ||
162 | When requesting regulators consumers use symbolic names for their | ||
163 | supplies, such as "Vcc", which are mapped into actual regulator | ||
164 | devices by the machine interface. | ||
165 | </para> | ||
166 | <para> | ||
167 | A stub version of this API is provided when the regulator | ||
168 | framework is not in use in order to minimise the need to use | ||
169 | ifdefs. | ||
170 | </para> | ||
171 | |||
172 | <sect1 id="consumer-enable"> | ||
173 | <title>Enabling and disabling</title> | ||
174 | <para> | ||
175 | The regulator API provides reference counted enabling and | ||
176 | disabling of regulators. Consumer devices use the <function><link | ||
177 | linkend='API-regulator-enable'>regulator_enable</link></function> | ||
178 | and <function><link | ||
179 | linkend='API-regulator-disable'>regulator_disable</link> | ||
180 | </function> functions to enable and disable regulators. Calls | ||
181 | to the two functions must be balanced. | ||
182 | </para> | ||
183 | <para> | ||
184 | Note that since multiple consumers may be using a regulator and | ||
185 | machine constraints may not allow the regulator to be disabled | ||
186 | there is no guarantee that calling | ||
187 | <function>regulator_disable</function> will actually cause the | ||
188 | supply provided by the regulator to be disabled. Consumer | ||
189 | drivers should assume that the regulator may be enabled at all | ||
190 | times. | ||
191 | </para> | ||
192 | </sect1> | ||
193 | |||
194 | <sect1 id="consumer-config"> | ||
195 | <title>Configuration</title> | ||
196 | <para> | ||
197 | Some consumer devices may need to be able to dynamically | ||
198 | configure their supplies. For example, MMC drivers may need to | ||
199 | select the correct operating voltage for their cards. This may | ||
200 | be done while the regulator is enabled or disabled. | ||
201 | </para> | ||
202 | <para> | ||
203 | The <function><link | ||
204 | linkend='API-regulator-set-voltage'>regulator_set_voltage</link> | ||
205 | </function> and <function><link | ||
206 | linkend='API-regulator-set-current-limit' | ||
207 | >regulator_set_current_limit</link> | ||
208 | </function> functions provide the primary interface for this. | ||
209 | Both take ranges of voltages and currents, supporting drivers | ||
210 | that do not require a specific value (eg, CPU frequency scaling | ||
211 | normally permits the CPU to use a wider range of supply | ||
212 | voltages at lower frequencies but does not require that the | ||
213 | supply voltage be lowered). Where an exact value is required | ||
214 | both minimum and maximum values should be identical. | ||
215 | </para> | ||
216 | </sect1> | ||
217 | |||
218 | <sect1 id="consumer-callback"> | ||
219 | <title>Callbacks</title> | ||
220 | <para> | ||
221 | Callbacks may also be <link | ||
222 | linkend='API-regulator-register-notifier'>registered</link> | ||
223 | for events such as regulation failures. | ||
224 | </para> | ||
225 | </sect1> | ||
226 | </chapter> | ||
227 | |||
228 | <chapter id="driver"> | ||
229 | <title>Regulator driver interface</title> | ||
230 | <para> | ||
231 | Drivers for regulator chips <link | ||
232 | linkend='API-regulator-register'>register</link> the regulators | ||
233 | with the regulator core, providing operations structures to the | ||
234 | core. A <link | ||
235 | linkend='API-regulator-notifier-call-chain'>notifier</link> interface | ||
236 | allows error conditions to be reported to the core. | ||
237 | </para> | ||
238 | <para> | ||
239 | Registration should be triggered by explicit setup done by the | ||
240 | platform, supplying a <link | ||
241 | linkend='API-struct-regulator-init-data'>struct | ||
242 | regulator_init_data</link> for the regulator containing | ||
243 | <link linkend='machine-constraint'>constraint</link> and | ||
244 | <link linkend='machine-supply'>supply</link> information. | ||
245 | </para> | ||
246 | </chapter> | ||
247 | |||
248 | <chapter id="machine"> | ||
249 | <title>Machine interface</title> | ||
250 | <para> | ||
251 | This interface provides a way to define how regulators are | ||
252 | connected to consumers on a given system and what the valid | ||
253 | operating parameters are for the system. | ||
254 | </para> | ||
255 | |||
256 | <sect1 id="machine-supply"> | ||
257 | <title>Supplies</title> | ||
258 | <para> | ||
259 | Regulator supplies are specified using <link | ||
260 | linkend='API-struct-regulator-consumer-supply'>struct | ||
261 | regulator_consumer_supply</link>. This is done at | ||
262 | <link linkend='driver'>driver registration | ||
263 | time</link> as part of the machine constraints. | ||
264 | </para> | ||
265 | </sect1> | ||
266 | |||
267 | <sect1 id="machine-constraint"> | ||
268 | <title>Constraints</title> | ||
269 | <para> | ||
270 | As well as definining the connections the machine interface | ||
271 | also provides constraints definining the operations that | ||
272 | clients are allowed to perform and the parameters that may be | ||
273 | set. This is required since generally regulator devices will | ||
274 | offer more flexibility than it is safe to use on a given | ||
275 | system, for example supporting higher supply voltages than the | ||
276 | consumers are rated for. | ||
277 | </para> | ||
278 | <para> | ||
279 | This is done at <link linkend='driver'>driver | ||
280 | registration time</link> by providing a <link | ||
281 | linkend='API-struct-regulation-constraints'>struct | ||
282 | regulation_constraints</link>. | ||
283 | </para> | ||
284 | <para> | ||
285 | The constraints may also specify an initial configuration for the | ||
286 | regulator in the constraints, which is particularly useful for | ||
287 | use with static consumers. | ||
288 | </para> | ||
289 | </sect1> | ||
290 | </chapter> | ||
291 | |||
292 | <chapter id="api"> | ||
293 | <title>API reference</title> | ||
294 | <para> | ||
295 | Due to limitations of the kernel documentation framework and the | ||
296 | existing layout of the source code the entire regulator API is | ||
297 | documented here. | ||
298 | </para> | ||
299 | !Iinclude/linux/regulator/consumer.h | ||
300 | !Iinclude/linux/regulator/machine.h | ||
301 | !Iinclude/linux/regulator/driver.h | ||
302 | !Edrivers/regulator/core.c | ||
303 | </chapter> | ||
304 | </book> | ||
diff --git a/drivers/Makefile b/drivers/Makefile index e121b66ef082..6326f4dbbdab 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
@@ -18,6 +18,9 @@ obj-$(CONFIG_ARM_AMBA) += amba/ | |||
18 | 18 | ||
19 | obj-$(CONFIG_XEN) += xen/ | 19 | obj-$(CONFIG_XEN) += xen/ |
20 | 20 | ||
21 | # regulators early, since some subsystems rely on them to initialize | ||
22 | obj-$(CONFIG_REGULATOR) += regulator/ | ||
23 | |||
21 | # char/ comes before serial/ etc so that the VT console is the boot-time | 24 | # char/ comes before serial/ etc so that the VT console is the boot-time |
22 | # default. | 25 | # default. |
23 | obj-y += char/ | 26 | obj-y += char/ |
@@ -101,5 +104,4 @@ obj-$(CONFIG_PPC_PS3) += ps3/ | |||
101 | obj-$(CONFIG_OF) += of/ | 104 | obj-$(CONFIG_OF) += of/ |
102 | obj-$(CONFIG_SSB) += ssb/ | 105 | obj-$(CONFIG_SSB) += ssb/ |
103 | obj-$(CONFIG_VIRTIO) += virtio/ | 106 | obj-$(CONFIG_VIRTIO) += virtio/ |
104 | obj-$(CONFIG_REGULATOR) += regulator/ | ||
105 | obj-$(CONFIG_STAGING) += staging/ | 107 | obj-$(CONFIG_STAGING) += staging/ |
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 02a774424e8d..f511a406fcaa 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -29,7 +29,7 @@ static DEFINE_MUTEX(regulator_list_mutex); | |||
29 | static LIST_HEAD(regulator_list); | 29 | static LIST_HEAD(regulator_list); |
30 | static LIST_HEAD(regulator_map_list); | 30 | static LIST_HEAD(regulator_map_list); |
31 | 31 | ||
32 | /** | 32 | /* |
33 | * struct regulator_dev | 33 | * struct regulator_dev |
34 | * | 34 | * |
35 | * Voltage / Current regulator class device. One for each regulator. | 35 | * Voltage / Current regulator class device. One for each regulator. |
@@ -56,7 +56,7 @@ struct regulator_dev { | |||
56 | void *reg_data; /* regulator_dev data */ | 56 | void *reg_data; /* regulator_dev data */ |
57 | }; | 57 | }; |
58 | 58 | ||
59 | /** | 59 | /* |
60 | * struct regulator_map | 60 | * struct regulator_map |
61 | * | 61 | * |
62 | * Used to provide symbolic supply names to devices. | 62 | * Used to provide symbolic supply names to devices. |
@@ -79,7 +79,7 @@ struct regulator { | |||
79 | int uA_load; | 79 | int uA_load; |
80 | int min_uV; | 80 | int min_uV; |
81 | int max_uV; | 81 | int max_uV; |
82 | int enabled; /* client has called enabled */ | 82 | int enabled; /* count of client enables */ |
83 | char *supply_name; | 83 | char *supply_name; |
84 | struct device_attribute dev_attr; | 84 | struct device_attribute dev_attr; |
85 | struct regulator_dev *rdev; | 85 | struct regulator_dev *rdev; |
@@ -174,6 +174,16 @@ static int regulator_check_current_limit(struct regulator_dev *rdev, | |||
174 | /* operating mode constraint check */ | 174 | /* operating mode constraint check */ |
175 | static int regulator_check_mode(struct regulator_dev *rdev, int mode) | 175 | static int regulator_check_mode(struct regulator_dev *rdev, int mode) |
176 | { | 176 | { |
177 | switch (mode) { | ||
178 | case REGULATOR_MODE_FAST: | ||
179 | case REGULATOR_MODE_NORMAL: | ||
180 | case REGULATOR_MODE_IDLE: | ||
181 | case REGULATOR_MODE_STANDBY: | ||
182 | break; | ||
183 | default: | ||
184 | return -EINVAL; | ||
185 | } | ||
186 | |||
177 | if (!rdev->constraints) { | 187 | if (!rdev->constraints) { |
178 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, | 188 | printk(KERN_ERR "%s: no constraints for %s\n", __func__, |
179 | rdev->desc->name); | 189 | rdev->desc->name); |
@@ -232,6 +242,7 @@ static ssize_t regulator_uV_show(struct device *dev, | |||
232 | 242 | ||
233 | return ret; | 243 | return ret; |
234 | } | 244 | } |
245 | static DEVICE_ATTR(microvolts, 0444, regulator_uV_show, NULL); | ||
235 | 246 | ||
236 | static ssize_t regulator_uA_show(struct device *dev, | 247 | static ssize_t regulator_uA_show(struct device *dev, |
237 | struct device_attribute *attr, char *buf) | 248 | struct device_attribute *attr, char *buf) |
@@ -240,6 +251,7 @@ static ssize_t regulator_uA_show(struct device *dev, | |||
240 | 251 | ||
241 | return sprintf(buf, "%d\n", _regulator_get_current_limit(rdev)); | 252 | return sprintf(buf, "%d\n", _regulator_get_current_limit(rdev)); |
242 | } | 253 | } |
254 | static DEVICE_ATTR(microamps, 0444, regulator_uA_show, NULL); | ||
243 | 255 | ||
244 | static ssize_t regulator_name_show(struct device *dev, | 256 | static ssize_t regulator_name_show(struct device *dev, |
245 | struct device_attribute *attr, char *buf) | 257 | struct device_attribute *attr, char *buf) |
@@ -257,12 +269,8 @@ static ssize_t regulator_name_show(struct device *dev, | |||
257 | return sprintf(buf, "%s\n", name); | 269 | return sprintf(buf, "%s\n", name); |
258 | } | 270 | } |
259 | 271 | ||
260 | static ssize_t regulator_opmode_show(struct device *dev, | 272 | static ssize_t regulator_print_opmode(char *buf, int mode) |
261 | struct device_attribute *attr, char *buf) | ||
262 | { | 273 | { |
263 | struct regulator_dev *rdev = dev_get_drvdata(dev); | ||
264 | int mode = _regulator_get_mode(rdev); | ||
265 | |||
266 | switch (mode) { | 274 | switch (mode) { |
267 | case REGULATOR_MODE_FAST: | 275 | case REGULATOR_MODE_FAST: |
268 | return sprintf(buf, "fast\n"); | 276 | return sprintf(buf, "fast\n"); |
@@ -276,12 +284,17 @@ static ssize_t regulator_opmode_show(struct device *dev, | |||
276 | return sprintf(buf, "unknown\n"); | 284 | return sprintf(buf, "unknown\n"); |
277 | } | 285 | } |
278 | 286 | ||
279 | static ssize_t regulator_state_show(struct device *dev, | 287 | static ssize_t regulator_opmode_show(struct device *dev, |
280 | struct device_attribute *attr, char *buf) | 288 | struct device_attribute *attr, char *buf) |
281 | { | 289 | { |
282 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 290 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
283 | int state = _regulator_is_enabled(rdev); | ||
284 | 291 | ||
292 | return regulator_print_opmode(buf, _regulator_get_mode(rdev)); | ||
293 | } | ||
294 | static DEVICE_ATTR(opmode, 0444, regulator_opmode_show, NULL); | ||
295 | |||
296 | static ssize_t regulator_print_state(char *buf, int state) | ||
297 | { | ||
285 | if (state > 0) | 298 | if (state > 0) |
286 | return sprintf(buf, "enabled\n"); | 299 | return sprintf(buf, "enabled\n"); |
287 | else if (state == 0) | 300 | else if (state == 0) |
@@ -290,6 +303,15 @@ static ssize_t regulator_state_show(struct device *dev, | |||
290 | return sprintf(buf, "unknown\n"); | 303 | return sprintf(buf, "unknown\n"); |
291 | } | 304 | } |
292 | 305 | ||
306 | static ssize_t regulator_state_show(struct device *dev, | ||
307 | struct device_attribute *attr, char *buf) | ||
308 | { | ||
309 | struct regulator_dev *rdev = dev_get_drvdata(dev); | ||
310 | |||
311 | return regulator_print_state(buf, _regulator_is_enabled(rdev)); | ||
312 | } | ||
313 | static DEVICE_ATTR(state, 0444, regulator_state_show, NULL); | ||
314 | |||
293 | static ssize_t regulator_min_uA_show(struct device *dev, | 315 | static ssize_t regulator_min_uA_show(struct device *dev, |
294 | struct device_attribute *attr, char *buf) | 316 | struct device_attribute *attr, char *buf) |
295 | { | 317 | { |
@@ -300,6 +322,7 @@ static ssize_t regulator_min_uA_show(struct device *dev, | |||
300 | 322 | ||
301 | return sprintf(buf, "%d\n", rdev->constraints->min_uA); | 323 | return sprintf(buf, "%d\n", rdev->constraints->min_uA); |
302 | } | 324 | } |
325 | static DEVICE_ATTR(min_microamps, 0444, regulator_min_uA_show, NULL); | ||
303 | 326 | ||
304 | static ssize_t regulator_max_uA_show(struct device *dev, | 327 | static ssize_t regulator_max_uA_show(struct device *dev, |
305 | struct device_attribute *attr, char *buf) | 328 | struct device_attribute *attr, char *buf) |
@@ -311,6 +334,7 @@ static ssize_t regulator_max_uA_show(struct device *dev, | |||
311 | 334 | ||
312 | return sprintf(buf, "%d\n", rdev->constraints->max_uA); | 335 | return sprintf(buf, "%d\n", rdev->constraints->max_uA); |
313 | } | 336 | } |
337 | static DEVICE_ATTR(max_microamps, 0444, regulator_max_uA_show, NULL); | ||
314 | 338 | ||
315 | static ssize_t regulator_min_uV_show(struct device *dev, | 339 | static ssize_t regulator_min_uV_show(struct device *dev, |
316 | struct device_attribute *attr, char *buf) | 340 | struct device_attribute *attr, char *buf) |
@@ -322,6 +346,7 @@ static ssize_t regulator_min_uV_show(struct device *dev, | |||
322 | 346 | ||
323 | return sprintf(buf, "%d\n", rdev->constraints->min_uV); | 347 | return sprintf(buf, "%d\n", rdev->constraints->min_uV); |
324 | } | 348 | } |
349 | static DEVICE_ATTR(min_microvolts, 0444, regulator_min_uV_show, NULL); | ||
325 | 350 | ||
326 | static ssize_t regulator_max_uV_show(struct device *dev, | 351 | static ssize_t regulator_max_uV_show(struct device *dev, |
327 | struct device_attribute *attr, char *buf) | 352 | struct device_attribute *attr, char *buf) |
@@ -333,6 +358,7 @@ static ssize_t regulator_max_uV_show(struct device *dev, | |||
333 | 358 | ||
334 | return sprintf(buf, "%d\n", rdev->constraints->max_uV); | 359 | return sprintf(buf, "%d\n", rdev->constraints->max_uV); |
335 | } | 360 | } |
361 | static DEVICE_ATTR(max_microvolts, 0444, regulator_max_uV_show, NULL); | ||
336 | 362 | ||
337 | static ssize_t regulator_total_uA_show(struct device *dev, | 363 | static ssize_t regulator_total_uA_show(struct device *dev, |
338 | struct device_attribute *attr, char *buf) | 364 | struct device_attribute *attr, char *buf) |
@@ -347,6 +373,7 @@ static ssize_t regulator_total_uA_show(struct device *dev, | |||
347 | mutex_unlock(&rdev->mutex); | 373 | mutex_unlock(&rdev->mutex); |
348 | return sprintf(buf, "%d\n", uA); | 374 | return sprintf(buf, "%d\n", uA); |
349 | } | 375 | } |
376 | static DEVICE_ATTR(requested_microamps, 0444, regulator_total_uA_show, NULL); | ||
350 | 377 | ||
351 | static ssize_t regulator_num_users_show(struct device *dev, | 378 | static ssize_t regulator_num_users_show(struct device *dev, |
352 | struct device_attribute *attr, char *buf) | 379 | struct device_attribute *attr, char *buf) |
@@ -374,153 +401,106 @@ static ssize_t regulator_suspend_mem_uV_show(struct device *dev, | |||
374 | { | 401 | { |
375 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 402 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
376 | 403 | ||
377 | if (!rdev->constraints) | ||
378 | return sprintf(buf, "not defined\n"); | ||
379 | return sprintf(buf, "%d\n", rdev->constraints->state_mem.uV); | 404 | return sprintf(buf, "%d\n", rdev->constraints->state_mem.uV); |
380 | } | 405 | } |
406 | static DEVICE_ATTR(suspend_mem_microvolts, 0444, | ||
407 | regulator_suspend_mem_uV_show, NULL); | ||
381 | 408 | ||
382 | static ssize_t regulator_suspend_disk_uV_show(struct device *dev, | 409 | static ssize_t regulator_suspend_disk_uV_show(struct device *dev, |
383 | struct device_attribute *attr, char *buf) | 410 | struct device_attribute *attr, char *buf) |
384 | { | 411 | { |
385 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 412 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
386 | 413 | ||
387 | if (!rdev->constraints) | ||
388 | return sprintf(buf, "not defined\n"); | ||
389 | return sprintf(buf, "%d\n", rdev->constraints->state_disk.uV); | 414 | return sprintf(buf, "%d\n", rdev->constraints->state_disk.uV); |
390 | } | 415 | } |
416 | static DEVICE_ATTR(suspend_disk_microvolts, 0444, | ||
417 | regulator_suspend_disk_uV_show, NULL); | ||
391 | 418 | ||
392 | static ssize_t regulator_suspend_standby_uV_show(struct device *dev, | 419 | static ssize_t regulator_suspend_standby_uV_show(struct device *dev, |
393 | struct device_attribute *attr, char *buf) | 420 | struct device_attribute *attr, char *buf) |
394 | { | 421 | { |
395 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 422 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
396 | 423 | ||
397 | if (!rdev->constraints) | ||
398 | return sprintf(buf, "not defined\n"); | ||
399 | return sprintf(buf, "%d\n", rdev->constraints->state_standby.uV); | 424 | return sprintf(buf, "%d\n", rdev->constraints->state_standby.uV); |
400 | } | 425 | } |
401 | 426 | static DEVICE_ATTR(suspend_standby_microvolts, 0444, | |
402 | static ssize_t suspend_opmode_show(struct regulator_dev *rdev, | 427 | regulator_suspend_standby_uV_show, NULL); |
403 | unsigned int mode, char *buf) | ||
404 | { | ||
405 | switch (mode) { | ||
406 | case REGULATOR_MODE_FAST: | ||
407 | return sprintf(buf, "fast\n"); | ||
408 | case REGULATOR_MODE_NORMAL: | ||
409 | return sprintf(buf, "normal\n"); | ||
410 | case REGULATOR_MODE_IDLE: | ||
411 | return sprintf(buf, "idle\n"); | ||
412 | case REGULATOR_MODE_STANDBY: | ||
413 | return sprintf(buf, "standby\n"); | ||
414 | } | ||
415 | return sprintf(buf, "unknown\n"); | ||
416 | } | ||
417 | 428 | ||
418 | static ssize_t regulator_suspend_mem_mode_show(struct device *dev, | 429 | static ssize_t regulator_suspend_mem_mode_show(struct device *dev, |
419 | struct device_attribute *attr, char *buf) | 430 | struct device_attribute *attr, char *buf) |
420 | { | 431 | { |
421 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 432 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
422 | 433 | ||
423 | if (!rdev->constraints) | 434 | return regulator_print_opmode(buf, |
424 | return sprintf(buf, "not defined\n"); | 435 | rdev->constraints->state_mem.mode); |
425 | return suspend_opmode_show(rdev, | ||
426 | rdev->constraints->state_mem.mode, buf); | ||
427 | } | 436 | } |
437 | static DEVICE_ATTR(suspend_mem_mode, 0444, | ||
438 | regulator_suspend_mem_mode_show, NULL); | ||
428 | 439 | ||
429 | static ssize_t regulator_suspend_disk_mode_show(struct device *dev, | 440 | static ssize_t regulator_suspend_disk_mode_show(struct device *dev, |
430 | struct device_attribute *attr, char *buf) | 441 | struct device_attribute *attr, char *buf) |
431 | { | 442 | { |
432 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 443 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
433 | 444 | ||
434 | if (!rdev->constraints) | 445 | return regulator_print_opmode(buf, |
435 | return sprintf(buf, "not defined\n"); | 446 | rdev->constraints->state_disk.mode); |
436 | return suspend_opmode_show(rdev, | ||
437 | rdev->constraints->state_disk.mode, buf); | ||
438 | } | 447 | } |
448 | static DEVICE_ATTR(suspend_disk_mode, 0444, | ||
449 | regulator_suspend_disk_mode_show, NULL); | ||
439 | 450 | ||
440 | static ssize_t regulator_suspend_standby_mode_show(struct device *dev, | 451 | static ssize_t regulator_suspend_standby_mode_show(struct device *dev, |
441 | struct device_attribute *attr, char *buf) | 452 | struct device_attribute *attr, char *buf) |
442 | { | 453 | { |
443 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 454 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
444 | 455 | ||
445 | if (!rdev->constraints) | 456 | return regulator_print_opmode(buf, |
446 | return sprintf(buf, "not defined\n"); | 457 | rdev->constraints->state_standby.mode); |
447 | return suspend_opmode_show(rdev, | ||
448 | rdev->constraints->state_standby.mode, buf); | ||
449 | } | 458 | } |
459 | static DEVICE_ATTR(suspend_standby_mode, 0444, | ||
460 | regulator_suspend_standby_mode_show, NULL); | ||
450 | 461 | ||
451 | static ssize_t regulator_suspend_mem_state_show(struct device *dev, | 462 | static ssize_t regulator_suspend_mem_state_show(struct device *dev, |
452 | struct device_attribute *attr, char *buf) | 463 | struct device_attribute *attr, char *buf) |
453 | { | 464 | { |
454 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 465 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
455 | 466 | ||
456 | if (!rdev->constraints) | 467 | return regulator_print_state(buf, |
457 | return sprintf(buf, "not defined\n"); | 468 | rdev->constraints->state_mem.enabled); |
458 | |||
459 | if (rdev->constraints->state_mem.enabled) | ||
460 | return sprintf(buf, "enabled\n"); | ||
461 | else | ||
462 | return sprintf(buf, "disabled\n"); | ||
463 | } | 469 | } |
470 | static DEVICE_ATTR(suspend_mem_state, 0444, | ||
471 | regulator_suspend_mem_state_show, NULL); | ||
464 | 472 | ||
465 | static ssize_t regulator_suspend_disk_state_show(struct device *dev, | 473 | static ssize_t regulator_suspend_disk_state_show(struct device *dev, |
466 | struct device_attribute *attr, char *buf) | 474 | struct device_attribute *attr, char *buf) |
467 | { | 475 | { |
468 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 476 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
469 | 477 | ||
470 | if (!rdev->constraints) | 478 | return regulator_print_state(buf, |
471 | return sprintf(buf, "not defined\n"); | 479 | rdev->constraints->state_disk.enabled); |
472 | |||
473 | if (rdev->constraints->state_disk.enabled) | ||
474 | return sprintf(buf, "enabled\n"); | ||
475 | else | ||
476 | return sprintf(buf, "disabled\n"); | ||
477 | } | 480 | } |
481 | static DEVICE_ATTR(suspend_disk_state, 0444, | ||
482 | regulator_suspend_disk_state_show, NULL); | ||
478 | 483 | ||
479 | static ssize_t regulator_suspend_standby_state_show(struct device *dev, | 484 | static ssize_t regulator_suspend_standby_state_show(struct device *dev, |
480 | struct device_attribute *attr, char *buf) | 485 | struct device_attribute *attr, char *buf) |
481 | { | 486 | { |
482 | struct regulator_dev *rdev = dev_get_drvdata(dev); | 487 | struct regulator_dev *rdev = dev_get_drvdata(dev); |
483 | 488 | ||
484 | if (!rdev->constraints) | 489 | return regulator_print_state(buf, |
485 | return sprintf(buf, "not defined\n"); | 490 | rdev->constraints->state_standby.enabled); |
486 | |||
487 | if (rdev->constraints->state_standby.enabled) | ||
488 | return sprintf(buf, "enabled\n"); | ||
489 | else | ||
490 | return sprintf(buf, "disabled\n"); | ||
491 | } | 491 | } |
492 | static DEVICE_ATTR(suspend_standby_state, 0444, | ||
493 | regulator_suspend_standby_state_show, NULL); | ||
492 | 494 | ||
495 | |||
496 | /* | ||
497 | * These are the only attributes are present for all regulators. | ||
498 | * Other attributes are a function of regulator functionality. | ||
499 | */ | ||
493 | static struct device_attribute regulator_dev_attrs[] = { | 500 | static struct device_attribute regulator_dev_attrs[] = { |
494 | __ATTR(name, 0444, regulator_name_show, NULL), | 501 | __ATTR(name, 0444, regulator_name_show, NULL), |
495 | __ATTR(microvolts, 0444, regulator_uV_show, NULL), | ||
496 | __ATTR(microamps, 0444, regulator_uA_show, NULL), | ||
497 | __ATTR(opmode, 0444, regulator_opmode_show, NULL), | ||
498 | __ATTR(state, 0444, regulator_state_show, NULL), | ||
499 | __ATTR(min_microvolts, 0444, regulator_min_uV_show, NULL), | ||
500 | __ATTR(min_microamps, 0444, regulator_min_uA_show, NULL), | ||
501 | __ATTR(max_microvolts, 0444, regulator_max_uV_show, NULL), | ||
502 | __ATTR(max_microamps, 0444, regulator_max_uA_show, NULL), | ||
503 | __ATTR(requested_microamps, 0444, regulator_total_uA_show, NULL), | ||
504 | __ATTR(num_users, 0444, regulator_num_users_show, NULL), | 502 | __ATTR(num_users, 0444, regulator_num_users_show, NULL), |
505 | __ATTR(type, 0444, regulator_type_show, NULL), | 503 | __ATTR(type, 0444, regulator_type_show, NULL), |
506 | __ATTR(suspend_mem_microvolts, 0444, | ||
507 | regulator_suspend_mem_uV_show, NULL), | ||
508 | __ATTR(suspend_disk_microvolts, 0444, | ||
509 | regulator_suspend_disk_uV_show, NULL), | ||
510 | __ATTR(suspend_standby_microvolts, 0444, | ||
511 | regulator_suspend_standby_uV_show, NULL), | ||
512 | __ATTR(suspend_mem_mode, 0444, | ||
513 | regulator_suspend_mem_mode_show, NULL), | ||
514 | __ATTR(suspend_disk_mode, 0444, | ||
515 | regulator_suspend_disk_mode_show, NULL), | ||
516 | __ATTR(suspend_standby_mode, 0444, | ||
517 | regulator_suspend_standby_mode_show, NULL), | ||
518 | __ATTR(suspend_mem_state, 0444, | ||
519 | regulator_suspend_mem_state_show, NULL), | ||
520 | __ATTR(suspend_disk_state, 0444, | ||
521 | regulator_suspend_disk_state_show, NULL), | ||
522 | __ATTR(suspend_standby_state, 0444, | ||
523 | regulator_suspend_standby_state_show, NULL), | ||
524 | __ATTR_NULL, | 504 | __ATTR_NULL, |
525 | }; | 505 | }; |
526 | 506 | ||
@@ -675,7 +655,8 @@ static void print_constraints(struct regulator_dev *rdev) | |||
675 | 655 | ||
676 | /** | 656 | /** |
677 | * set_machine_constraints - sets regulator constraints | 657 | * set_machine_constraints - sets regulator constraints |
678 | * @regulator: regulator source | 658 | * @rdev: regulator source |
659 | * @constraints: constraints to apply | ||
679 | * | 660 | * |
680 | * Allows platform initialisation code to define and constrain | 661 | * Allows platform initialisation code to define and constrain |
681 | * regulator circuits e.g. valid voltage/current ranges, etc. NOTE: | 662 | * regulator circuits e.g. valid voltage/current ranges, etc. NOTE: |
@@ -750,8 +731,8 @@ out: | |||
750 | 731 | ||
751 | /** | 732 | /** |
752 | * set_supply - set regulator supply regulator | 733 | * set_supply - set regulator supply regulator |
753 | * @regulator: regulator name | 734 | * @rdev: regulator name |
754 | * @supply: supply regulator name | 735 | * @supply_rdev: supply regulator name |
755 | * | 736 | * |
756 | * Called by platform initialisation code to set the supply regulator for this | 737 | * Called by platform initialisation code to set the supply regulator for this |
757 | * regulator. This ensures that a regulators supply will also be enabled by the | 738 | * regulator. This ensures that a regulators supply will also be enabled by the |
@@ -778,9 +759,9 @@ out: | |||
778 | 759 | ||
779 | /** | 760 | /** |
780 | * set_consumer_device_supply: Bind a regulator to a symbolic supply | 761 | * set_consumer_device_supply: Bind a regulator to a symbolic supply |
781 | * @regulator: regulator source | 762 | * @rdev: regulator source |
782 | * @dev: device the supply applies to | 763 | * @consumer_dev: device the supply applies to |
783 | * @supply: symbolic name for supply | 764 | * @supply: symbolic name for supply |
784 | * | 765 | * |
785 | * Allows platform initialisation code to map physical regulator | 766 | * Allows platform initialisation code to map physical regulator |
786 | * sources to symbolic names for supplies for use by devices. Devices | 767 | * sources to symbolic names for supplies for use by devices. Devices |
@@ -795,6 +776,20 @@ static int set_consumer_device_supply(struct regulator_dev *rdev, | |||
795 | if (supply == NULL) | 776 | if (supply == NULL) |
796 | return -EINVAL; | 777 | return -EINVAL; |
797 | 778 | ||
779 | list_for_each_entry(node, ®ulator_map_list, list) { | ||
780 | if (consumer_dev != node->dev) | ||
781 | continue; | ||
782 | if (strcmp(node->supply, supply) != 0) | ||
783 | continue; | ||
784 | |||
785 | dev_dbg(consumer_dev, "%s/%s is '%s' supply; fail %s/%s\n", | ||
786 | dev_name(&node->regulator->dev), | ||
787 | node->regulator->desc->name, | ||
788 | supply, | ||
789 | dev_name(&rdev->dev), rdev->desc->name); | ||
790 | return -EBUSY; | ||
791 | } | ||
792 | |||
798 | node = kmalloc(sizeof(struct regulator_map), GFP_KERNEL); | 793 | node = kmalloc(sizeof(struct regulator_map), GFP_KERNEL); |
799 | if (node == NULL) | 794 | if (node == NULL) |
800 | return -ENOMEM; | 795 | return -ENOMEM; |
@@ -963,16 +958,13 @@ void regulator_put(struct regulator *regulator) | |||
963 | if (regulator == NULL || IS_ERR(regulator)) | 958 | if (regulator == NULL || IS_ERR(regulator)) |
964 | return; | 959 | return; |
965 | 960 | ||
966 | if (regulator->enabled) { | ||
967 | printk(KERN_WARNING "Releasing supply %s while enabled\n", | ||
968 | regulator->supply_name); | ||
969 | WARN_ON(regulator->enabled); | ||
970 | regulator_disable(regulator); | ||
971 | } | ||
972 | |||
973 | mutex_lock(®ulator_list_mutex); | 961 | mutex_lock(®ulator_list_mutex); |
974 | rdev = regulator->rdev; | 962 | rdev = regulator->rdev; |
975 | 963 | ||
964 | if (WARN(regulator->enabled, "Releasing supply %s while enabled\n", | ||
965 | regulator->supply_name)) | ||
966 | _regulator_disable(rdev); | ||
967 | |||
976 | /* remove any sysfs entries */ | 968 | /* remove any sysfs entries */ |
977 | if (regulator->dev) { | 969 | if (regulator->dev) { |
978 | sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); | 970 | sysfs_remove_link(&rdev->dev.kobj, regulator->supply_name); |
@@ -1034,29 +1026,26 @@ static int _regulator_enable(struct regulator_dev *rdev) | |||
1034 | * regulator_enable - enable regulator output | 1026 | * regulator_enable - enable regulator output |
1035 | * @regulator: regulator source | 1027 | * @regulator: regulator source |
1036 | * | 1028 | * |
1037 | * Enable the regulator output at the predefined voltage or current value. | 1029 | * Request that the regulator be enabled with the regulator output at |
1030 | * the predefined voltage or current value. Calls to regulator_enable() | ||
1031 | * must be balanced with calls to regulator_disable(). | ||
1032 | * | ||
1038 | * NOTE: the output value can be set by other drivers, boot loader or may be | 1033 | * NOTE: the output value can be set by other drivers, boot loader or may be |
1039 | * hardwired in the regulator. | 1034 | * hardwired in the regulator. |
1040 | * NOTE: calls to regulator_enable() must be balanced with calls to | ||
1041 | * regulator_disable(). | ||
1042 | */ | 1035 | */ |
1043 | int regulator_enable(struct regulator *regulator) | 1036 | int regulator_enable(struct regulator *regulator) |
1044 | { | 1037 | { |
1045 | int ret; | 1038 | struct regulator_dev *rdev = regulator->rdev; |
1046 | 1039 | int ret = 0; | |
1047 | if (regulator->enabled) { | ||
1048 | printk(KERN_CRIT "Regulator %s already enabled\n", | ||
1049 | regulator->supply_name); | ||
1050 | WARN_ON(regulator->enabled); | ||
1051 | return 0; | ||
1052 | } | ||
1053 | 1040 | ||
1054 | mutex_lock(®ulator->rdev->mutex); | 1041 | mutex_lock(&rdev->mutex); |
1055 | regulator->enabled = 1; | 1042 | if (regulator->enabled == 0) |
1056 | ret = _regulator_enable(regulator->rdev); | 1043 | ret = _regulator_enable(rdev); |
1057 | if (ret != 0) | 1044 | else if (regulator->enabled < 0) |
1058 | regulator->enabled = 0; | 1045 | ret = -EIO; |
1059 | mutex_unlock(®ulator->rdev->mutex); | 1046 | if (ret == 0) |
1047 | regulator->enabled++; | ||
1048 | mutex_unlock(&rdev->mutex); | ||
1060 | return ret; | 1049 | return ret; |
1061 | } | 1050 | } |
1062 | EXPORT_SYMBOL_GPL(regulator_enable); | 1051 | EXPORT_SYMBOL_GPL(regulator_enable); |
@@ -1100,27 +1089,31 @@ static int _regulator_disable(struct regulator_dev *rdev) | |||
1100 | * regulator_disable - disable regulator output | 1089 | * regulator_disable - disable regulator output |
1101 | * @regulator: regulator source | 1090 | * @regulator: regulator source |
1102 | * | 1091 | * |
1103 | * Disable the regulator output voltage or current. | 1092 | * Disable the regulator output voltage or current. Calls to |
1104 | * NOTE: this will only disable the regulator output if no other consumer | 1093 | * regulator_enable() must be balanced with calls to |
1105 | * devices have it enabled. | ||
1106 | * NOTE: calls to regulator_enable() must be balanced with calls to | ||
1107 | * regulator_disable(). | 1094 | * regulator_disable(). |
1095 | * | ||
1096 | * NOTE: this will only disable the regulator output if no other consumer | ||
1097 | * devices have it enabled, the regulator device supports disabling and | ||
1098 | * machine constraints permit this operation. | ||
1108 | */ | 1099 | */ |
1109 | int regulator_disable(struct regulator *regulator) | 1100 | int regulator_disable(struct regulator *regulator) |
1110 | { | 1101 | { |
1111 | int ret; | 1102 | struct regulator_dev *rdev = regulator->rdev; |
1112 | 1103 | int ret = 0; | |
1113 | if (!regulator->enabled) { | ||
1114 | printk(KERN_ERR "%s: not in use by this consumer\n", | ||
1115 | __func__); | ||
1116 | return 0; | ||
1117 | } | ||
1118 | 1104 | ||
1119 | mutex_lock(®ulator->rdev->mutex); | 1105 | mutex_lock(&rdev->mutex); |
1120 | regulator->enabled = 0; | 1106 | if (regulator->enabled == 1) { |
1121 | regulator->uA_load = 0; | 1107 | ret = _regulator_disable(rdev); |
1122 | ret = _regulator_disable(regulator->rdev); | 1108 | if (ret == 0) |
1123 | mutex_unlock(®ulator->rdev->mutex); | 1109 | regulator->uA_load = 0; |
1110 | } else if (WARN(regulator->enabled <= 0, | ||
1111 | "unbalanced disables for supply %s\n", | ||
1112 | regulator->supply_name)) | ||
1113 | ret = -EIO; | ||
1114 | if (ret == 0) | ||
1115 | regulator->enabled--; | ||
1116 | mutex_unlock(&rdev->mutex); | ||
1124 | return ret; | 1117 | return ret; |
1125 | } | 1118 | } |
1126 | EXPORT_SYMBOL_GPL(regulator_disable); | 1119 | EXPORT_SYMBOL_GPL(regulator_disable); |
@@ -1196,7 +1189,13 @@ out: | |||
1196 | * regulator_is_enabled - is the regulator output enabled | 1189 | * regulator_is_enabled - is the regulator output enabled |
1197 | * @regulator: regulator source | 1190 | * @regulator: regulator source |
1198 | * | 1191 | * |
1199 | * Returns zero for disabled otherwise return number of enable requests. | 1192 | * Returns positive if the regulator driver backing the source/client |
1193 | * has requested that the device be enabled, zero if it hasn't, else a | ||
1194 | * negative errno code. | ||
1195 | * | ||
1196 | * Note that the device backing this regulator handle can have multiple | ||
1197 | * users, so it might be enabled even if regulator_enable() was never | ||
1198 | * called for this particular source. | ||
1200 | */ | 1199 | */ |
1201 | int regulator_is_enabled(struct regulator *regulator) | 1200 | int regulator_is_enabled(struct regulator *regulator) |
1202 | { | 1201 | { |
@@ -1219,7 +1218,7 @@ EXPORT_SYMBOL_GPL(regulator_is_enabled); | |||
1219 | * | 1218 | * |
1220 | * NOTE: If the regulator is shared between several devices then the lowest | 1219 | * NOTE: If the regulator is shared between several devices then the lowest |
1221 | * request voltage that meets the system constraints will be used. | 1220 | * request voltage that meets the system constraints will be used. |
1222 | * NOTE: Regulator system constraints must be set for this regulator before | 1221 | * Regulator system constraints must be set for this regulator before |
1223 | * calling this function otherwise this call will fail. | 1222 | * calling this function otherwise this call will fail. |
1224 | */ | 1223 | */ |
1225 | int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV) | 1224 | int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV) |
@@ -1493,7 +1492,8 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
1493 | mode = rdev->desc->ops->get_optimum_mode(rdev, | 1492 | mode = rdev->desc->ops->get_optimum_mode(rdev, |
1494 | input_uV, output_uV, | 1493 | input_uV, output_uV, |
1495 | total_uA_load); | 1494 | total_uA_load); |
1496 | if (ret <= 0) { | 1495 | ret = regulator_check_mode(rdev, mode); |
1496 | if (ret < 0) { | ||
1497 | printk(KERN_ERR "%s: failed to get optimum mode for %s @" | 1497 | printk(KERN_ERR "%s: failed to get optimum mode for %s @" |
1498 | " %d uA %d -> %d uV\n", __func__, rdev->desc->name, | 1498 | " %d uA %d -> %d uV\n", __func__, rdev->desc->name, |
1499 | total_uA_load, input_uV, output_uV); | 1499 | total_uA_load, input_uV, output_uV); |
@@ -1501,7 +1501,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) | |||
1501 | } | 1501 | } |
1502 | 1502 | ||
1503 | ret = rdev->desc->ops->set_mode(rdev, mode); | 1503 | ret = rdev->desc->ops->set_mode(rdev, mode); |
1504 | if (ret <= 0) { | 1504 | if (ret < 0) { |
1505 | printk(KERN_ERR "%s: failed to set optimum mode %x for %s\n", | 1505 | printk(KERN_ERR "%s: failed to set optimum mode %x for %s\n", |
1506 | __func__, mode, rdev->desc->name); | 1506 | __func__, mode, rdev->desc->name); |
1507 | goto out; | 1507 | goto out; |
@@ -1516,7 +1516,7 @@ EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); | |||
1516 | /** | 1516 | /** |
1517 | * regulator_register_notifier - register regulator event notifier | 1517 | * regulator_register_notifier - register regulator event notifier |
1518 | * @regulator: regulator source | 1518 | * @regulator: regulator source |
1519 | * @notifier_block: notifier block | 1519 | * @nb: notifier block |
1520 | * | 1520 | * |
1521 | * Register notifier block to receive regulator events. | 1521 | * Register notifier block to receive regulator events. |
1522 | */ | 1522 | */ |
@@ -1531,7 +1531,7 @@ EXPORT_SYMBOL_GPL(regulator_register_notifier); | |||
1531 | /** | 1531 | /** |
1532 | * regulator_unregister_notifier - unregister regulator event notifier | 1532 | * regulator_unregister_notifier - unregister regulator event notifier |
1533 | * @regulator: regulator source | 1533 | * @regulator: regulator source |
1534 | * @notifier_block: notifier block | 1534 | * @nb: notifier block |
1535 | * | 1535 | * |
1536 | * Unregister regulator event notifier block. | 1536 | * Unregister regulator event notifier block. |
1537 | */ | 1537 | */ |
@@ -1697,9 +1697,9 @@ EXPORT_SYMBOL_GPL(regulator_bulk_free); | |||
1697 | 1697 | ||
1698 | /** | 1698 | /** |
1699 | * regulator_notifier_call_chain - call regulator event notifier | 1699 | * regulator_notifier_call_chain - call regulator event notifier |
1700 | * @regulator: regulator source | 1700 | * @rdev: regulator source |
1701 | * @event: notifier block | 1701 | * @event: notifier block |
1702 | * @data: | 1702 | * @data: callback-specific data. |
1703 | * | 1703 | * |
1704 | * Called by regulator drivers to notify clients a regulator event has | 1704 | * Called by regulator drivers to notify clients a regulator event has |
1705 | * occurred. We also notify regulator clients downstream. | 1705 | * occurred. We also notify regulator clients downstream. |
@@ -1713,10 +1713,122 @@ int regulator_notifier_call_chain(struct regulator_dev *rdev, | |||
1713 | } | 1713 | } |
1714 | EXPORT_SYMBOL_GPL(regulator_notifier_call_chain); | 1714 | EXPORT_SYMBOL_GPL(regulator_notifier_call_chain); |
1715 | 1715 | ||
1716 | /* | ||
1717 | * To avoid cluttering sysfs (and memory) with useless state, only | ||
1718 | * create attributes that can be meaningfully displayed. | ||
1719 | */ | ||
1720 | static int add_regulator_attributes(struct regulator_dev *rdev) | ||
1721 | { | ||
1722 | struct device *dev = &rdev->dev; | ||
1723 | struct regulator_ops *ops = rdev->desc->ops; | ||
1724 | int status = 0; | ||
1725 | |||
1726 | /* some attributes need specific methods to be displayed */ | ||
1727 | if (ops->get_voltage) { | ||
1728 | status = device_create_file(dev, &dev_attr_microvolts); | ||
1729 | if (status < 0) | ||
1730 | return status; | ||
1731 | } | ||
1732 | if (ops->get_current_limit) { | ||
1733 | status = device_create_file(dev, &dev_attr_microamps); | ||
1734 | if (status < 0) | ||
1735 | return status; | ||
1736 | } | ||
1737 | if (ops->get_mode) { | ||
1738 | status = device_create_file(dev, &dev_attr_opmode); | ||
1739 | if (status < 0) | ||
1740 | return status; | ||
1741 | } | ||
1742 | if (ops->is_enabled) { | ||
1743 | status = device_create_file(dev, &dev_attr_state); | ||
1744 | if (status < 0) | ||
1745 | return status; | ||
1746 | } | ||
1747 | |||
1748 | /* some attributes are type-specific */ | ||
1749 | if (rdev->desc->type == REGULATOR_CURRENT) { | ||
1750 | status = device_create_file(dev, &dev_attr_requested_microamps); | ||
1751 | if (status < 0) | ||
1752 | return status; | ||
1753 | } | ||
1754 | |||
1755 | /* all the other attributes exist to support constraints; | ||
1756 | * don't show them if there are no constraints, or if the | ||
1757 | * relevant supporting methods are missing. | ||
1758 | */ | ||
1759 | if (!rdev->constraints) | ||
1760 | return status; | ||
1761 | |||
1762 | /* constraints need specific supporting methods */ | ||
1763 | if (ops->set_voltage) { | ||
1764 | status = device_create_file(dev, &dev_attr_min_microvolts); | ||
1765 | if (status < 0) | ||
1766 | return status; | ||
1767 | status = device_create_file(dev, &dev_attr_max_microvolts); | ||
1768 | if (status < 0) | ||
1769 | return status; | ||
1770 | } | ||
1771 | if (ops->set_current_limit) { | ||
1772 | status = device_create_file(dev, &dev_attr_min_microamps); | ||
1773 | if (status < 0) | ||
1774 | return status; | ||
1775 | status = device_create_file(dev, &dev_attr_max_microamps); | ||
1776 | if (status < 0) | ||
1777 | return status; | ||
1778 | } | ||
1779 | |||
1780 | /* suspend mode constraints need multiple supporting methods */ | ||
1781 | if (!(ops->set_suspend_enable && ops->set_suspend_disable)) | ||
1782 | return status; | ||
1783 | |||
1784 | status = device_create_file(dev, &dev_attr_suspend_standby_state); | ||
1785 | if (status < 0) | ||
1786 | return status; | ||
1787 | status = device_create_file(dev, &dev_attr_suspend_mem_state); | ||
1788 | if (status < 0) | ||
1789 | return status; | ||
1790 | status = device_create_file(dev, &dev_attr_suspend_disk_state); | ||
1791 | if (status < 0) | ||
1792 | return status; | ||
1793 | |||
1794 | if (ops->set_suspend_voltage) { | ||
1795 | status = device_create_file(dev, | ||
1796 | &dev_attr_suspend_standby_microvolts); | ||
1797 | if (status < 0) | ||
1798 | return status; | ||
1799 | status = device_create_file(dev, | ||
1800 | &dev_attr_suspend_mem_microvolts); | ||
1801 | if (status < 0) | ||
1802 | return status; | ||
1803 | status = device_create_file(dev, | ||
1804 | &dev_attr_suspend_disk_microvolts); | ||
1805 | if (status < 0) | ||
1806 | return status; | ||
1807 | } | ||
1808 | |||
1809 | if (ops->set_suspend_mode) { | ||
1810 | status = device_create_file(dev, | ||
1811 | &dev_attr_suspend_standby_mode); | ||
1812 | if (status < 0) | ||
1813 | return status; | ||
1814 | status = device_create_file(dev, | ||
1815 | &dev_attr_suspend_mem_mode); | ||
1816 | if (status < 0) | ||
1817 | return status; | ||
1818 | status = device_create_file(dev, | ||
1819 | &dev_attr_suspend_disk_mode); | ||
1820 | if (status < 0) | ||
1821 | return status; | ||
1822 | } | ||
1823 | |||
1824 | return status; | ||
1825 | } | ||
1826 | |||
1716 | /** | 1827 | /** |
1717 | * regulator_register - register regulator | 1828 | * regulator_register - register regulator |
1718 | * @regulator: regulator source | 1829 | * @regulator_desc: regulator to register |
1719 | * @reg_data: private regulator data | 1830 | * @dev: struct device for the regulator |
1831 | * @driver_data: private regulator data | ||
1720 | * | 1832 | * |
1721 | * Called by regulator drivers to register a regulator. | 1833 | * Called by regulator drivers to register a regulator. |
1722 | * Returns 0 on success. | 1834 | * Returns 0 on success. |
@@ -1761,45 +1873,37 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | |||
1761 | /* preform any regulator specific init */ | 1873 | /* preform any regulator specific init */ |
1762 | if (init_data->regulator_init) { | 1874 | if (init_data->regulator_init) { |
1763 | ret = init_data->regulator_init(rdev->reg_data); | 1875 | ret = init_data->regulator_init(rdev->reg_data); |
1764 | if (ret < 0) { | 1876 | if (ret < 0) |
1765 | kfree(rdev); | 1877 | goto clean; |
1766 | rdev = ERR_PTR(ret); | ||
1767 | goto out; | ||
1768 | } | ||
1769 | } | ||
1770 | |||
1771 | /* set regulator constraints */ | ||
1772 | ret = set_machine_constraints(rdev, &init_data->constraints); | ||
1773 | if (ret < 0) { | ||
1774 | kfree(rdev); | ||
1775 | rdev = ERR_PTR(ret); | ||
1776 | goto out; | ||
1777 | } | 1878 | } |
1778 | 1879 | ||
1779 | /* register with sysfs */ | 1880 | /* register with sysfs */ |
1780 | rdev->dev.class = ®ulator_class; | 1881 | rdev->dev.class = ®ulator_class; |
1781 | rdev->dev.parent = dev; | 1882 | rdev->dev.parent = dev; |
1782 | snprintf(rdev->dev.bus_id, sizeof(rdev->dev.bus_id), | 1883 | dev_set_name(&rdev->dev, "regulator.%d", |
1783 | "regulator.%d", atomic_inc_return(®ulator_no) - 1); | 1884 | atomic_inc_return(®ulator_no) - 1); |
1784 | ret = device_register(&rdev->dev); | 1885 | ret = device_register(&rdev->dev); |
1785 | if (ret != 0) { | 1886 | if (ret != 0) |
1786 | kfree(rdev); | 1887 | goto clean; |
1787 | rdev = ERR_PTR(ret); | ||
1788 | goto out; | ||
1789 | } | ||
1790 | 1888 | ||
1791 | dev_set_drvdata(&rdev->dev, rdev); | 1889 | dev_set_drvdata(&rdev->dev, rdev); |
1792 | 1890 | ||
1891 | /* set regulator constraints */ | ||
1892 | ret = set_machine_constraints(rdev, &init_data->constraints); | ||
1893 | if (ret < 0) | ||
1894 | goto scrub; | ||
1895 | |||
1896 | /* add attributes supported by this regulator */ | ||
1897 | ret = add_regulator_attributes(rdev); | ||
1898 | if (ret < 0) | ||
1899 | goto scrub; | ||
1900 | |||
1793 | /* set supply regulator if it exists */ | 1901 | /* set supply regulator if it exists */ |
1794 | if (init_data->supply_regulator_dev) { | 1902 | if (init_data->supply_regulator_dev) { |
1795 | ret = set_supply(rdev, | 1903 | ret = set_supply(rdev, |
1796 | dev_get_drvdata(init_data->supply_regulator_dev)); | 1904 | dev_get_drvdata(init_data->supply_regulator_dev)); |
1797 | if (ret < 0) { | 1905 | if (ret < 0) |
1798 | device_unregister(&rdev->dev); | 1906 | goto scrub; |
1799 | kfree(rdev); | ||
1800 | rdev = ERR_PTR(ret); | ||
1801 | goto out; | ||
1802 | } | ||
1803 | } | 1907 | } |
1804 | 1908 | ||
1805 | /* add consumers devices */ | 1909 | /* add consumers devices */ |
@@ -1811,10 +1915,7 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | |||
1811 | for (--i; i >= 0; i--) | 1915 | for (--i; i >= 0; i--) |
1812 | unset_consumer_device_supply(rdev, | 1916 | unset_consumer_device_supply(rdev, |
1813 | init_data->consumer_supplies[i].dev); | 1917 | init_data->consumer_supplies[i].dev); |
1814 | device_unregister(&rdev->dev); | 1918 | goto scrub; |
1815 | kfree(rdev); | ||
1816 | rdev = ERR_PTR(ret); | ||
1817 | goto out; | ||
1818 | } | 1919 | } |
1819 | } | 1920 | } |
1820 | 1921 | ||
@@ -1822,12 +1923,19 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | |||
1822 | out: | 1923 | out: |
1823 | mutex_unlock(®ulator_list_mutex); | 1924 | mutex_unlock(®ulator_list_mutex); |
1824 | return rdev; | 1925 | return rdev; |
1926 | |||
1927 | scrub: | ||
1928 | device_unregister(&rdev->dev); | ||
1929 | clean: | ||
1930 | kfree(rdev); | ||
1931 | rdev = ERR_PTR(ret); | ||
1932 | goto out; | ||
1825 | } | 1933 | } |
1826 | EXPORT_SYMBOL_GPL(regulator_register); | 1934 | EXPORT_SYMBOL_GPL(regulator_register); |
1827 | 1935 | ||
1828 | /** | 1936 | /** |
1829 | * regulator_unregister - unregister regulator | 1937 | * regulator_unregister - unregister regulator |
1830 | * @regulator: regulator source | 1938 | * @rdev: regulator to unregister |
1831 | * | 1939 | * |
1832 | * Called by regulator drivers to unregister a regulator. | 1940 | * Called by regulator drivers to unregister a regulator. |
1833 | */ | 1941 | */ |
@@ -1846,7 +1954,7 @@ void regulator_unregister(struct regulator_dev *rdev) | |||
1846 | EXPORT_SYMBOL_GPL(regulator_unregister); | 1954 | EXPORT_SYMBOL_GPL(regulator_unregister); |
1847 | 1955 | ||
1848 | /** | 1956 | /** |
1849 | * regulator_suspend_prepare: prepare regulators for system wide suspend | 1957 | * regulator_suspend_prepare - prepare regulators for system wide suspend |
1850 | * @state: system suspend state | 1958 | * @state: system suspend state |
1851 | * | 1959 | * |
1852 | * Configure each regulator with it's suspend operating parameters for state. | 1960 | * Configure each regulator with it's suspend operating parameters for state. |
@@ -1882,7 +1990,7 @@ EXPORT_SYMBOL_GPL(regulator_suspend_prepare); | |||
1882 | 1990 | ||
1883 | /** | 1991 | /** |
1884 | * rdev_get_drvdata - get rdev regulator driver data | 1992 | * rdev_get_drvdata - get rdev regulator driver data |
1885 | * @regulator: regulator | 1993 | * @rdev: regulator |
1886 | * | 1994 | * |
1887 | * Get rdev regulator driver private data. This call can be used in the | 1995 | * Get rdev regulator driver private data. This call can be used in the |
1888 | * regulator driver context. | 1996 | * regulator driver context. |
@@ -1919,7 +2027,7 @@ EXPORT_SYMBOL_GPL(regulator_set_drvdata); | |||
1919 | 2027 | ||
1920 | /** | 2028 | /** |
1921 | * regulator_get_id - get regulator ID | 2029 | * regulator_get_id - get regulator ID |
1922 | * @regulator: regulator | 2030 | * @rdev: regulator |
1923 | */ | 2031 | */ |
1924 | int rdev_get_id(struct regulator_dev *rdev) | 2032 | int rdev_get_id(struct regulator_dev *rdev) |
1925 | { | 2033 | { |
diff --git a/drivers/regulator/da903x.c b/drivers/regulator/da903x.c index 773b29cec8be..fe77730a7edb 100644 --- a/drivers/regulator/da903x.c +++ b/drivers/regulator/da903x.c | |||
@@ -102,7 +102,7 @@ static int da903x_set_ldo_voltage(struct regulator_dev *rdev, | |||
102 | uint8_t val, mask; | 102 | uint8_t val, mask; |
103 | 103 | ||
104 | if (check_range(info, min_uV, max_uV)) { | 104 | if (check_range(info, min_uV, max_uV)) { |
105 | pr_err("invalid voltage range (%d, %d) uV", min_uV, max_uV); | 105 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); |
106 | return -EINVAL; | 106 | return -EINVAL; |
107 | } | 107 | } |
108 | 108 | ||
@@ -159,7 +159,7 @@ static int da903x_is_enabled(struct regulator_dev *rdev) | |||
159 | if (ret) | 159 | if (ret) |
160 | return ret; | 160 | return ret; |
161 | 161 | ||
162 | return reg_val & (1 << info->enable_bit); | 162 | return !!(reg_val & (1 << info->enable_bit)); |
163 | } | 163 | } |
164 | 164 | ||
165 | /* DA9030 specific operations */ | 165 | /* DA9030 specific operations */ |
@@ -172,7 +172,7 @@ static int da9030_set_ldo1_15_voltage(struct regulator_dev *rdev, | |||
172 | int ret; | 172 | int ret; |
173 | 173 | ||
174 | if (check_range(info, min_uV, max_uV)) { | 174 | if (check_range(info, min_uV, max_uV)) { |
175 | pr_err("invalid voltage range (%d, %d) uV", min_uV, max_uV); | 175 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); |
176 | return -EINVAL; | 176 | return -EINVAL; |
177 | } | 177 | } |
178 | 178 | ||
@@ -199,7 +199,7 @@ static int da9030_set_ldo14_voltage(struct regulator_dev *rdev, | |||
199 | int thresh; | 199 | int thresh; |
200 | 200 | ||
201 | if (check_range(info, min_uV, max_uV)) { | 201 | if (check_range(info, min_uV, max_uV)) { |
202 | pr_err("invalid voltage range (%d, %d) uV", min_uV, max_uV); | 202 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); |
203 | return -EINVAL; | 203 | return -EINVAL; |
204 | } | 204 | } |
205 | 205 | ||
@@ -248,7 +248,7 @@ static int da9034_set_dvc_voltage(struct regulator_dev *rdev, | |||
248 | int ret; | 248 | int ret; |
249 | 249 | ||
250 | if (check_range(info, min_uV, max_uV)) { | 250 | if (check_range(info, min_uV, max_uV)) { |
251 | pr_err("invalid voltage range (%d, %d) uV", min_uV, max_uV); | 251 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); |
252 | return -EINVAL; | 252 | return -EINVAL; |
253 | } | 253 | } |
254 | 254 | ||
@@ -273,7 +273,7 @@ static int da9034_set_ldo12_voltage(struct regulator_dev *rdev, | |||
273 | uint8_t val, mask; | 273 | uint8_t val, mask; |
274 | 274 | ||
275 | if (check_range(info, min_uV, max_uV)) { | 275 | if (check_range(info, min_uV, max_uV)) { |
276 | pr_err("invalid voltage range (%d, %d) uV", min_uV, max_uV); | 276 | pr_err("invalid voltage range (%d, %d) uV\n", min_uV, max_uV); |
277 | return -EINVAL; | 277 | return -EINVAL; |
278 | } | 278 | } |
279 | 279 | ||
diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h index afdc4558bb94..801bf77ff4e2 100644 --- a/include/linux/regulator/consumer.h +++ b/include/linux/regulator/consumer.h | |||
@@ -104,10 +104,10 @@ struct regulator; | |||
104 | /** | 104 | /** |
105 | * struct regulator_bulk_data - Data used for bulk regulator operations. | 105 | * struct regulator_bulk_data - Data used for bulk regulator operations. |
106 | * | 106 | * |
107 | * @supply The name of the supply. Initialised by the user before | 107 | * @supply: The name of the supply. Initialised by the user before |
108 | * using the bulk regulator APIs. | 108 | * using the bulk regulator APIs. |
109 | * @consumer The regulator consumer for the supply. This will be managed | 109 | * @consumer: The regulator consumer for the supply. This will be managed |
110 | * by the bulk API. | 110 | * by the bulk API. |
111 | * | 111 | * |
112 | * The regulator APIs provide a series of regulator_bulk_() API calls as | 112 | * The regulator APIs provide a series of regulator_bulk_() API calls as |
113 | * a convenience to consumers which require multiple supplies. This | 113 | * a convenience to consumers which require multiple supplies. This |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index e37d80561985..2dae05705f13 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -24,7 +24,33 @@ struct regulator_init_data; | |||
24 | /** | 24 | /** |
25 | * struct regulator_ops - regulator operations. | 25 | * struct regulator_ops - regulator operations. |
26 | * | 26 | * |
27 | * This struct describes regulator operations. | 27 | * This struct describes regulator operations which can be implemented by |
28 | * regulator chip drivers. | ||
29 | * | ||
30 | * @enable: Enable the regulator. | ||
31 | * @disable: Disable the regulator. | ||
32 | * @is_enabled: Return 1 if the regulator is enabled, 0 otherwise. | ||
33 | * | ||
34 | * @set_voltage: Set the voltage for the regulator within the range specified. | ||
35 | * The driver should select the voltage closest to min_uV. | ||
36 | * @get_voltage: Return the currently configured voltage for the regulator. | ||
37 | * | ||
38 | * @set_current_limit: Configure a limit for a current-limited regulator. | ||
39 | * @get_current_limit: Get the limit for a current-limited regulator. | ||
40 | * | ||
41 | * @set_mode: Set the operating mode for the regulator. | ||
42 | * @get_mode: Get the current operating mode for the regulator. | ||
43 | * @get_optimum_mode: Get the most efficient operating mode for the regulator | ||
44 | * when running with the specified parameters. | ||
45 | * | ||
46 | * @set_suspend_voltage: Set the voltage for the regulator when the system | ||
47 | * is suspended. | ||
48 | * @set_suspend_enable: Mark the regulator as enabled when the system is | ||
49 | * suspended. | ||
50 | * @set_suspend_disable: Mark the regulator as disabled when the system is | ||
51 | * suspended. | ||
52 | * @set_suspend_mode: Set the operating mode for the regulator when the | ||
53 | * system is suspended. | ||
28 | */ | 54 | */ |
29 | struct regulator_ops { | 55 | struct regulator_ops { |
30 | 56 | ||
@@ -75,6 +101,15 @@ enum regulator_type { | |||
75 | /** | 101 | /** |
76 | * struct regulator_desc - Regulator descriptor | 102 | * struct regulator_desc - Regulator descriptor |
77 | * | 103 | * |
104 | * Each regulator registered with the core is described with a structure of | ||
105 | * this type. | ||
106 | * | ||
107 | * @name: Identifying name for the regulator. | ||
108 | * @id: Numerical identifier for the regulator. | ||
109 | * @ops: Regulator operations table. | ||
110 | * @irq: Interrupt number for the regulator. | ||
111 | * @type: Indicates if the regulator is a voltage or current regulator. | ||
112 | * @owner: Module providing the regulator, used for refcounting. | ||
78 | */ | 113 | */ |
79 | struct regulator_desc { | 114 | struct regulator_desc { |
80 | const char *name; | 115 | const char *name; |
diff --git a/include/linux/regulator/machine.h b/include/linux/regulator/machine.h index c6d69331a81e..3794773b23d2 100644 --- a/include/linux/regulator/machine.h +++ b/include/linux/regulator/machine.h | |||
@@ -44,6 +44,10 @@ struct regulator; | |||
44 | * struct regulator_state - regulator state during low power syatem states | 44 | * struct regulator_state - regulator state during low power syatem states |
45 | * | 45 | * |
46 | * This describes a regulators state during a system wide low power state. | 46 | * This describes a regulators state during a system wide low power state. |
47 | * | ||
48 | * @uV: Operating voltage during suspend. | ||
49 | * @mode: Operating mode during suspend. | ||
50 | * @enabled: Enabled during suspend. | ||
47 | */ | 51 | */ |
48 | struct regulator_state { | 52 | struct regulator_state { |
49 | int uV; /* suspend voltage */ | 53 | int uV; /* suspend voltage */ |
@@ -55,6 +59,30 @@ struct regulator_state { | |||
55 | * struct regulation_constraints - regulator operating constraints. | 59 | * struct regulation_constraints - regulator operating constraints. |
56 | * | 60 | * |
57 | * This struct describes regulator and board/machine specific constraints. | 61 | * This struct describes regulator and board/machine specific constraints. |
62 | * | ||
63 | * @name: Descriptive name for the constraints, used for display purposes. | ||
64 | * | ||
65 | * @min_uV: Smallest voltage consumers may set. | ||
66 | * @max_uV: Largest voltage consumers may set. | ||
67 | * | ||
68 | * @min_uA: Smallest consumers consumers may set. | ||
69 | * @max_uA: Largest current consumers may set. | ||
70 | * | ||
71 | * @valid_modes_mask: Mask of modes which may be configured by consumers. | ||
72 | * @valid_ops_mask: Operations which may be performed by consumers. | ||
73 | * | ||
74 | * @always_on: Set if the regulator should never be disabled. | ||
75 | * @boot_on: Set if the regulator is enabled when the system is initially | ||
76 | * started. | ||
77 | * @apply_uV: Apply the voltage constraint when initialising. | ||
78 | * | ||
79 | * @input_uV: Input voltage for regulator when supplied by another regulator. | ||
80 | * | ||
81 | * @state_disk: State for regulator when system is suspended in disk mode. | ||
82 | * @state_mem: State for regulator when system is suspended in mem mode. | ||
83 | * @state_standby: State for regulator when system is suspended in standby | ||
84 | * mode. | ||
85 | * @initial_state: Suspend state to set by default. | ||
58 | */ | 86 | */ |
59 | struct regulation_constraints { | 87 | struct regulation_constraints { |
60 | 88 | ||
@@ -93,6 +121,9 @@ struct regulation_constraints { | |||
93 | * struct regulator_consumer_supply - supply -> device mapping | 121 | * struct regulator_consumer_supply - supply -> device mapping |
94 | * | 122 | * |
95 | * This maps a supply name to a device. | 123 | * This maps a supply name to a device. |
124 | * | ||
125 | * @dev: Device structure for the consumer. | ||
126 | * @supply: Name for the supply. | ||
96 | */ | 127 | */ |
97 | struct regulator_consumer_supply { | 128 | struct regulator_consumer_supply { |
98 | struct device *dev; /* consumer */ | 129 | struct device *dev; /* consumer */ |
@@ -103,6 +134,16 @@ struct regulator_consumer_supply { | |||
103 | * struct regulator_init_data - regulator platform initialisation data. | 134 | * struct regulator_init_data - regulator platform initialisation data. |
104 | * | 135 | * |
105 | * Initialisation constraints, our supply and consumers supplies. | 136 | * Initialisation constraints, our supply and consumers supplies. |
137 | * | ||
138 | * @supply_regulator_dev: Parent regulator (if any). | ||
139 | * | ||
140 | * @constraints: Constraints. These must be specified for the regulator to | ||
141 | * be usable. | ||
142 | * @num_consumer_supplies: Number of consumer device supplies. | ||
143 | * @consumer_supplies: Consumer device supply configuration. | ||
144 | * | ||
145 | * @regulator_init: Callback invoked when the regulator has been registered. | ||
146 | * @driver_data: Data passed to regulator_init. | ||
106 | */ | 147 | */ |
107 | struct regulator_init_data { | 148 | struct regulator_init_data { |
108 | struct device *supply_regulator_dev; /* or NULL for LINE */ | 149 | struct device *supply_regulator_dev; /* or NULL for LINE */ |