blob: 63728fed620b7bacea9cdbb80b659a2105ed4173 [file] [log] [blame]
Liam Girdwoode7d0fe32008-04-30 17:22:50 +01001Regulator Machine Driver Interface
2===================================
3
4The regulator machine driver interface is intended for board/machine specific
Liam Girdwooda5766f12008-10-10 13:22:20 +01005initialisation code to configure the regulator subsystem.
Liam Girdwoode7d0fe32008-04-30 17:22:50 +01006
Liam Girdwoode7d0fe32008-04-30 17:22:50 +01007Consider the following machine :-
8
9 Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V]
10 |
11 +-> [Consumer B @ 3.3V]
12
13The drivers for consumers A & B must be mapped to the correct regulator in
14order to control their power supply. This mapping can be achieved in machine
Liam Girdwooda5766f12008-10-10 13:22:20 +010015initialisation code by creating a struct regulator_consumer_supply for
16each regulator.
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010017
Liam Girdwooda5766f12008-10-10 13:22:20 +010018struct regulator_consumer_supply {
19 struct device *dev; /* consumer */
20 const char *supply; /* consumer supply - e.g. "vcc" */
21};
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010022
Liam Girdwooda5766f12008-10-10 13:22:20 +010023e.g. for the machine above
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010024
Liam Girdwooda5766f12008-10-10 13:22:20 +010025static struct regulator_consumer_supply regulator1_consumers[] = {
26{
27 .dev = &platform_consumerB_device.dev,
28 .supply = "Vcc",
29},};
30
31static struct regulator_consumer_supply regulator2_consumers[] = {
32{
33 .dev = &platform_consumerA_device.dev,
34 .supply = "Vcc",
35},};
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010036
37This maps Regulator-1 to the 'Vcc' supply for Consumer B and maps Regulator-2
38to the 'Vcc' supply for Consumer A.
39
Liam Girdwooda5766f12008-10-10 13:22:20 +010040Constraints can now be registered by defining a struct regulator_init_data
41for each regulator power domain. This structure also maps the consumers
42to their supply regulator :-
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010043
Liam Girdwooda5766f12008-10-10 13:22:20 +010044static struct regulator_init_data regulator1_data = {
45 .constraints = {
46 .min_uV = 3300000,
47 .max_uV = 3300000,
48 .valid_modes_mask = REGULATOR_MODE_NORMAL,
49 },
50 .num_consumer_supplies = ARRAY_SIZE(regulator1_consumers),
51 .consumer_supplies = regulator1_consumers,
52};
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010053
54Regulator-1 supplies power to Regulator-2. This relationship must be registered
55with the core so that Regulator-1 is also enabled when Consumer A enables it's
Liam Girdwooda5766f12008-10-10 13:22:20 +010056supply (Regulator-2). The supply regulator is set by the supply_regulator_dev
57field below:-
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010058
Liam Girdwooda5766f12008-10-10 13:22:20 +010059static struct regulator_init_data regulator2_data = {
60 .supply_regulator_dev = &platform_regulator1_device.dev,
61 .constraints = {
62 .min_uV = 1800000,
63 .max_uV = 2000000,
64 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
65 .valid_modes_mask = REGULATOR_MODE_NORMAL,
66 },
67 .num_consumer_supplies = ARRAY_SIZE(regulator2_consumers),
68 .consumer_supplies = regulator2_consumers,
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010069};
70
Liam Girdwooda5766f12008-10-10 13:22:20 +010071Finally the regulator devices must be registered in the usual manner.
Liam Girdwoode7d0fe32008-04-30 17:22:50 +010072
Liam Girdwooda5766f12008-10-10 13:22:20 +010073static struct platform_device regulator_devices[] = {
74{
75 .name = "regulator",
76 .id = DCDC_1,
77 .dev = {
78 .platform_data = &regulator1_data,
79 },
80},
81{
82 .name = "regulator",
83 .id = DCDC_2,
84 .dev = {
85 .platform_data = &regulator2_data,
86 },
87},
88};
89/* register regulator 1 device */
Wolfram Sang2e7e65c2009-09-18 22:44:43 +020090platform_device_register(&regulator_devices[0]);
Liam Girdwooda5766f12008-10-10 13:22:20 +010091
92/* register regulator 2 device */
Wolfram Sang2e7e65c2009-09-18 22:44:43 +020093platform_device_register(&regulator_devices[1]);