Mark Brown | 9fe5817 | 2008-12-31 12:52:44 +0000 | [diff] [blame] | 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> |