| .. Copyright 2007-2008 Wolfson Microelectronics |
| |
| .. 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. |
| |
| ================================= |
| Voltage and current regulator API |
| ================================= |
| |
| :Author: Liam Girdwood |
| :Author: Mark Brown |
| |
| Introduction |
| ============ |
| |
| This framework is designed to provide a standard kernel interface to |
| control voltage and current regulators. |
| |
| 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). |
| |
| Note that additional (and currently more complete) documentation is |
| available in the Linux kernel source under |
| ``Documentation/power/regulator``. |
| |
| Glossary |
| -------- |
| |
| The regulator API uses a number of terms which may not be familiar: |
| |
| Regulator |
| |
| 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. |
| |
| Consumer |
| |
| 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. |
| |
| Power Domain |
| |
| 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. |
| |
| Power Management Integrated Circuit (PMIC) |
| |
| 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. |
| |
| Consumer driver interface |
| ========================= |
| |
| This offers a similar API to the kernel clock framework. Consumer |
| drivers use `get <#API-regulator-get>`__ and |
| `put <#API-regulator-put>`__ operations to acquire and release |
| regulators. Functions are provided to `enable <#API-regulator-enable>`__ |
| and `disable <#API-regulator-disable>`__ the regulator and to get and |
| set the runtime parameters of the regulator. |
| |
| When requesting regulators consumers use symbolic names for their |
| supplies, such as "Vcc", which are mapped into actual regulator devices |
| by the machine interface. |
| |
| 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. |
| |
| Enabling and disabling |
| ---------------------- |
| |
| The regulator API provides reference counted enabling and disabling of |
| regulators. Consumer devices use the :c:func:`regulator_enable()` and |
| :c:func:`regulator_disable()` functions to enable and disable |
| regulators. Calls to the two functions must be balanced. |
| |
| 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 :c:func:`regulator_disable()` 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. |
| |
| Configuration |
| ------------- |
| |
| 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. |
| |
| The :c:func:`regulator_set_voltage()` and |
| :c:func:`regulator_set_current_limit()` 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. |
| |
| Callbacks |
| --------- |
| |
| Callbacks may also be registered for events such as regulation failures. |
| |
| Regulator driver interface |
| ========================== |
| |
| Drivers for regulator chips register the regulators with the regulator |
| core, providing operations structures to the core. A notifier interface |
| allows error conditions to be reported to the core. |
| |
| Registration should be triggered by explicit setup done by the platform, |
| supplying a struct :c:type:`regulator_init_data` for the regulator |
| containing constraint and supply information. |
| |
| Machine interface |
| ================= |
| |
| 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. |
| |
| Supplies |
| -------- |
| |
| Regulator supplies are specified using struct |
| :c:type:`regulator_consumer_supply`. This is done at driver registration |
| time as part of the machine constraints. |
| |
| Constraints |
| ----------- |
| |
| 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. |
| |
| This is done at driver registration time` by providing a |
| struct :c:type:`regulation_constraints`. |
| |
| The constraints may also specify an initial configuration for the |
| regulator in the constraints, which is particularly useful for use with |
| static consumers. |
| |
| API reference |
| ============= |
| |
| Due to limitations of the kernel documentation framework and the |
| existing layout of the source code the entire regulator API is |
| documented here. |
| |
| .. kernel-doc:: include/linux/regulator/consumer.h |
| :internal: |
| |
| .. kernel-doc:: include/linux/regulator/machine.h |
| :internal: |
| |
| .. kernel-doc:: include/linux/regulator/driver.h |
| :internal: |
| |
| .. kernel-doc:: drivers/regulator/core.c |
| :export: |