|  | <?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 | 
|  | regulator 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 defining the connections the machine interface | 
|  | also provides constraints defining 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> |