| 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> | 
| Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 270 | 	 As well as defining the connections the machine interface | 
 | 271 | 	 also provides constraints defining the operations that | 
| Mark Brown | 9fe5817 | 2008-12-31 12:52:44 +0000 | [diff] [blame] | 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> |