305 lines
		
	
	
	
		
			9.8 KiB
			
		
	
	
	
		
			Cheetah
		
	
	
	
	
	
		
		
			
		
	
	
			305 lines
		
	
	
	
		
			9.8 KiB
			
		
	
	
	
		
			Cheetah
		
	
	
	
	
	
|   | <?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>
 |