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);