|
@@ -0,0 +1,101 @@
|
|
|
|
+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);
|