mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 05:36:43 +07:00
c3035a232e
The mechanism used for connecting regulators together when one regulator supplies another wasn't clear as the names being used weren't really tied together well. Reported-by: Philip Rakity <prakity@marvell.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
101 lines
3.0 KiB
Plaintext
101 lines
3.0 KiB
Plaintext
Regulator Machine Driver Interface
|
|
===================================
|
|
|
|
The regulator machine driver interface is intended for board/machine specific
|
|
initialisation code to configure the regulator subsystem.
|
|
|
|
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 creating a struct regulator_consumer_supply for
|
|
each regulator.
|
|
|
|
struct regulator_consumer_supply {
|
|
const char *dev_name; /* consumer dev_name() */
|
|
const char *supply; /* consumer supply - e.g. "vcc" */
|
|
};
|
|
|
|
e.g. for the machine above
|
|
|
|
static struct regulator_consumer_supply regulator1_consumers[] = {
|
|
{
|
|
.dev_name = "dev_name(consumer B)",
|
|
.supply = "Vcc",
|
|
},};
|
|
|
|
static struct regulator_consumer_supply regulator2_consumers[] = {
|
|
{
|
|
.dev = "dev_name(consumer A"),
|
|
.supply = "Vcc",
|
|
},};
|
|
|
|
This maps Regulator-1 to the 'Vcc' supply for Consumer B and maps Regulator-2
|
|
to the 'Vcc' supply for Consumer A.
|
|
|
|
Constraints can now be registered by defining a struct regulator_init_data
|
|
for each regulator power domain. This structure also maps the consumers
|
|
to their supply regulator :-
|
|
|
|
static struct regulator_init_data regulator1_data = {
|
|
.constraints = {
|
|
.name = "Regulator-1",
|
|
.min_uV = 3300000,
|
|
.max_uV = 3300000,
|
|
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(regulator1_consumers),
|
|
.consumer_supplies = regulator1_consumers,
|
|
};
|
|
|
|
The name field should be set to something that is usefully descriptive
|
|
for the board for configuration of supplies for other regulators and
|
|
for use in logging and other diagnostic output. Normally the name
|
|
used for the supply rail in the schematic is a good choice. If no
|
|
name is provided then the subsystem will choose one.
|
|
|
|
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 its
|
|
supply (Regulator-2). The supply regulator is set by the supply_regulator
|
|
field below and co:-
|
|
|
|
static struct regulator_init_data regulator2_data = {
|
|
.supply_regulator = "Regulator-1",
|
|
.constraints = {
|
|
.min_uV = 1800000,
|
|
.max_uV = 2000000,
|
|
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
|
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
|
},
|
|
.num_consumer_supplies = ARRAY_SIZE(regulator2_consumers),
|
|
.consumer_supplies = regulator2_consumers,
|
|
};
|
|
|
|
Finally the regulator devices must be registered in the usual manner.
|
|
|
|
static struct platform_device regulator_devices[] = {
|
|
{
|
|
.name = "regulator",
|
|
.id = DCDC_1,
|
|
.dev = {
|
|
.platform_data = ®ulator1_data,
|
|
},
|
|
},
|
|
{
|
|
.name = "regulator",
|
|
.id = DCDC_2,
|
|
.dev = {
|
|
.platform_data = ®ulator2_data,
|
|
},
|
|
},
|
|
};
|
|
/* register regulator 1 device */
|
|
platform_device_register(®ulator_devices[0]);
|
|
|
|
/* register regulator 2 device */
|
|
platform_device_register(®ulator_devices[1]);
|