| Regulator Machine Driver Interface |
| =================================== |
| |
| The regulator machine driver interface is intended for board/machine specific |
| initialisation code to configure the regulator subsystem. Typical things that |
| machine drivers would do are :- |
| |
| 1. Regulator -> Device mapping. |
| 2. Regulator supply configuration. |
| 3. Power Domain constraint setting. |
| |
| |
| |
| 1. Regulator -> device mapping |
| ============================== |
| Consider the following machine :- |
| |
| Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V] |
| | |
| +-> [Consumer B @ 3.3V] |
| |
| The drivers for consumers A & B must be mapped to the correct regulator in |
| order to control their power supply. This mapping can be achieved in machine |
| initialisation code by calling :- |
| |
| int regulator_set_device_supply(const char *regulator, struct device *dev, |
| const char *supply); |
| |
| and is shown with the following code :- |
| |
| regulator_set_device_supply("Regulator-1", devB, "Vcc"); |
| regulator_set_device_supply("Regulator-2", devA, "Vcc"); |
| |
| This maps Regulator-1 to the 'Vcc' supply for Consumer B and maps Regulator-2 |
| to the 'Vcc' supply for Consumer A. |
| |
| |
| 2. Regulator supply configuration. |
| ================================== |
| Consider the following machine (again) :- |
| |
| Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V] |
| | |
| +-> [Consumer B @ 3.3V] |
| |
| Regulator-1 supplies power to Regulator-2. This relationship must be registered |
| with the core so that Regulator-1 is also enabled when Consumer A enables it's |
| supply (Regulator-2). |
| |
| This relationship can be register with the core via :- |
| |
| int regulator_set_supply(const char *regulator, const char *regulator_supply); |
| |
| In this example we would use the following code :- |
| |
| regulator_set_supply("Regulator-2", "Regulator-1"); |
| |
| Relationships can be queried by calling :- |
| |
| const char *regulator_get_supply(const char *regulator); |
| |
| |
| 3. Power Domain constraint setting. |
| =================================== |
| Each power domain within a system has physical constraints on voltage and |
| current. This must be defined in software so that the power domain is always |
| operated within specifications. |
| |
| Consider the following machine (again) :- |
| |
| Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V] |
| | |
| +-> [Consumer B @ 3.3V] |
| |
| This gives us two regulators and two power domains: |
| |
| Domain 1: Regulator-2, Consumer B. |
| Domain 2: Consumer A. |
| |
| Constraints can be registered by calling :- |
| |
| int regulator_set_platform_constraints(const char *regulator, |
| struct regulation_constraints *constraints); |
| |
| The example is defined as follows :- |
| |
| struct regulation_constraints domain_1 = { |
| .min_uV = 3300000, |
| .max_uV = 3300000, |
| .valid_modes_mask = REGULATOR_MODE_NORMAL, |
| }; |
| |
| struct regulation_constraints domain_2 = { |
| .min_uV = 1800000, |
| .max_uV = 2000000, |
| .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE, |
| .valid_modes_mask = REGULATOR_MODE_NORMAL, |
| }; |
| |
| regulator_set_platform_constraints("Regulator-1", &domain_1); |
| regulator_set_platform_constraints("Regulator-2", &domain_2); |