| <?xml version="1.0" encoding="UTF-8"?> | |
| <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" | |
| "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []> | |
| <book id="regulator-api"> | |
| <bookinfo> | |
| <title>Voltage and current regulator API</title> | |
| <authorgroup> | |
| <author> | |
| <firstname>Liam</firstname> | |
| <surname>Girdwood</surname> | |
| <affiliation> | |
| <address> | |
| <email>lrg@slimlogic.co.uk</email> | |
| </address> | |
| </affiliation> | |
| </author> | |
| <author> | |
| <firstname>Mark</firstname> | |
| <surname>Brown</surname> | |
| <affiliation> | |
| <orgname>Wolfson Microelectronics</orgname> | |
| <address> | |
| <email>broonie@opensource.wolfsonmicro.com</email> | |
| </address> | |
| </affiliation> | |
| </author> | |
| </authorgroup> | |
| <copyright> | |
| <year>2007-2008</year> | |
| <holder>Wolfson Microelectronics</holder> | |
| </copyright> | |
| <copyright> | |
| <year>2008</year> | |
| <holder>Liam Girdwood</holder> | |
| </copyright> | |
| <legalnotice> | |
| <para> | |
| This documentation is free software; you can redistribute | |
| it and/or modify it under the terms of the GNU General Public | |
| License version 2 as published by the Free Software Foundation. | |
| </para> | |
| <para> | |
| This program is distributed in the hope that it will be | |
| useful, but WITHOUT ANY WARRANTY; without even the implied | |
| warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | |
| See the GNU General Public License for more details. | |
| </para> | |
| <para> | |
| You should have received a copy of the GNU General Public | |
| License along with this program; if not, write to the Free | |
| Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
| MA 02111-1307 USA | |
| </para> | |
| <para> | |
| For more details see the file COPYING in the source | |
| distribution of Linux. | |
| </para> | |
| </legalnotice> | |
| </bookinfo> | |
| <toc></toc> | |
| <chapter id="intro"> | |
| <title>Introduction</title> | |
| <para> | |
| This framework is designed to provide a standard kernel | |
| interface to control voltage and current regulators. | |
| </para> | |
| <para> | |
| The intention is to allow systems to dynamically control | |
| regulator power output in order to save power and prolong | |
| battery life. This applies to both voltage regulators (where | |
| voltage output is controllable) and current sinks (where current | |
| limit is controllable). | |
| </para> | |
| <para> | |
| Note that additional (and currently more complete) documentation | |
| is available in the Linux kernel source under | |
| <filename>Documentation/power/regulator</filename>. | |
| </para> | |
| <sect1 id="glossary"> | |
| <title>Glossary</title> | |
| <para> | |
| The regulator API uses a number of terms which may not be | |
| familiar: | |
| </para> | |
| <glossary> | |
| <glossentry> | |
| <glossterm>Regulator</glossterm> | |
| <glossdef> | |
| <para> | |
| Electronic device that supplies power to other devices. Most | |
| regulators can enable and disable their output and some can also | |
| control their output voltage or current. | |
| </para> | |
| </glossdef> | |
| </glossentry> | |
| <glossentry> | |
| <glossterm>Consumer</glossterm> | |
| <glossdef> | |
| <para> | |
| Electronic device which consumes power provided by a regulator. | |
| These may either be static, requiring only a fixed supply, or | |
| dynamic, requiring active management of the regulator at | |
| runtime. | |
| </para> | |
| </glossdef> | |
| </glossentry> | |
| <glossentry> | |
| <glossterm>Power Domain</glossterm> | |
| <glossdef> | |
| <para> | |
| The electronic circuit supplied by a given regulator, including | |
| the regulator and all consumer devices. The configuration of | |
| the regulator is shared between all the components in the | |
| circuit. | |
| </para> | |
| </glossdef> | |
| </glossentry> | |
| <glossentry> | |
| <glossterm>Power Management Integrated Circuit</glossterm> | |
| <acronym>PMIC</acronym> | |
| <glossdef> | |
| <para> | |
| An IC which contains numerous regulators and often also other | |
| subsystems. In an embedded system the primary PMIC is often | |
| equivalent to a combination of the PSU and southbridge in a | |
| desktop system. | |
| </para> | |
| </glossdef> | |
| </glossentry> | |
| </glossary> | |
| </sect1> | |
| </chapter> | |
| <chapter id="consumer"> | |
| <title>Consumer driver interface</title> | |
| <para> | |
| This offers a similar API to the kernel clock framework. | |
| Consumer drivers use <link | |
| linkend='API-regulator-get'>get</link> and <link | |
| linkend='API-regulator-put'>put</link> operations to acquire and | |
| release regulators. Functions are | |
| provided to <link linkend='API-regulator-enable'>enable</link> | |
| and <link linkend='API-regulator-disable'>disable</link> the | |
| reguator and to get and set the runtime parameters of the | |
| regulator. | |
| </para> | |
| <para> | |
| When requesting regulators consumers use symbolic names for their | |
| supplies, such as "Vcc", which are mapped into actual regulator | |
| devices by the machine interface. | |
| </para> | |
| <para> | |
| A stub version of this API is provided when the regulator | |
| framework is not in use in order to minimise the need to use | |
| ifdefs. | |
| </para> | |
| <sect1 id="consumer-enable"> | |
| <title>Enabling and disabling</title> | |
| <para> | |
| The regulator API provides reference counted enabling and | |
| disabling of regulators. Consumer devices use the <function><link | |
| linkend='API-regulator-enable'>regulator_enable</link></function> | |
| and <function><link | |
| linkend='API-regulator-disable'>regulator_disable</link> | |
| </function> functions to enable and disable regulators. Calls | |
| to the two functions must be balanced. | |
| </para> | |
| <para> | |
| Note that since multiple consumers may be using a regulator and | |
| machine constraints may not allow the regulator to be disabled | |
| there is no guarantee that calling | |
| <function>regulator_disable</function> will actually cause the | |
| supply provided by the regulator to be disabled. Consumer | |
| drivers should assume that the regulator may be enabled at all | |
| times. | |
| </para> | |
| </sect1> | |
| <sect1 id="consumer-config"> | |
| <title>Configuration</title> | |
| <para> | |
| Some consumer devices may need to be able to dynamically | |
| configure their supplies. For example, MMC drivers may need to | |
| select the correct operating voltage for their cards. This may | |
| be done while the regulator is enabled or disabled. | |
| </para> | |
| <para> | |
| The <function><link | |
| linkend='API-regulator-set-voltage'>regulator_set_voltage</link> | |
| </function> and <function><link | |
| linkend='API-regulator-set-current-limit' | |
| >regulator_set_current_limit</link> | |
| </function> functions provide the primary interface for this. | |
| Both take ranges of voltages and currents, supporting drivers | |
| that do not require a specific value (eg, CPU frequency scaling | |
| normally permits the CPU to use a wider range of supply | |
| voltages at lower frequencies but does not require that the | |
| supply voltage be lowered). Where an exact value is required | |
| both minimum and maximum values should be identical. | |
| </para> | |
| </sect1> | |
| <sect1 id="consumer-callback"> | |
| <title>Callbacks</title> | |
| <para> | |
| Callbacks may also be <link | |
| linkend='API-regulator-register-notifier'>registered</link> | |
| for events such as regulation failures. | |
| </para> | |
| </sect1> | |
| </chapter> | |
| <chapter id="driver"> | |
| <title>Regulator driver interface</title> | |
| <para> | |
| Drivers for regulator chips <link | |
| linkend='API-regulator-register'>register</link> the regulators | |
| with the regulator core, providing operations structures to the | |
| core. A <link | |
| linkend='API-regulator-notifier-call-chain'>notifier</link> interface | |
| allows error conditions to be reported to the core. | |
| </para> | |
| <para> | |
| Registration should be triggered by explicit setup done by the | |
| platform, supplying a <link | |
| linkend='API-struct-regulator-init-data'>struct | |
| regulator_init_data</link> for the regulator containing | |
| <link linkend='machine-constraint'>constraint</link> and | |
| <link linkend='machine-supply'>supply</link> information. | |
| </para> | |
| </chapter> | |
| <chapter id="machine"> | |
| <title>Machine interface</title> | |
| <para> | |
| This interface provides a way to define how regulators are | |
| connected to consumers on a given system and what the valid | |
| operating parameters are for the system. | |
| </para> | |
| <sect1 id="machine-supply"> | |
| <title>Supplies</title> | |
| <para> | |
| Regulator supplies are specified using <link | |
| linkend='API-struct-regulator-consumer-supply'>struct | |
| regulator_consumer_supply</link>. This is done at | |
| <link linkend='driver'>driver registration | |
| time</link> as part of the machine constraints. | |
| </para> | |
| </sect1> | |
| <sect1 id="machine-constraint"> | |
| <title>Constraints</title> | |
| <para> | |
| As well as definining the connections the machine interface | |
| also provides constraints definining the operations that | |
| clients are allowed to perform and the parameters that may be | |
| set. This is required since generally regulator devices will | |
| offer more flexibility than it is safe to use on a given | |
| system, for example supporting higher supply voltages than the | |
| consumers are rated for. | |
| </para> | |
| <para> | |
| This is done at <link linkend='driver'>driver | |
| registration time</link> by providing a <link | |
| linkend='API-struct-regulation-constraints'>struct | |
| regulation_constraints</link>. | |
| </para> | |
| <para> | |
| The constraints may also specify an initial configuration for the | |
| regulator in the constraints, which is particularly useful for | |
| use with static consumers. | |
| </para> | |
| </sect1> | |
| </chapter> | |
| <chapter id="api"> | |
| <title>API reference</title> | |
| <para> | |
| Due to limitations of the kernel documentation framework and the | |
| existing layout of the source code the entire regulator API is | |
| documented here. | |
| </para> | |
| !Iinclude/linux/regulator/consumer.h | |
| !Iinclude/linux/regulator/machine.h | |
| !Iinclude/linux/regulator/driver.h | |
| !Edrivers/regulator/core.c | |
| </chapter> | |
| </book> |