Merge branch 'fix/hda' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
[linux-2.6] / Documentation / power / regulator / machine.txt
1 Regulator Machine Driver Interface
2 ===================================
3
4 The regulator machine driver interface is intended for board/machine specific
5 initialisation code to configure the regulator subsystem.
6
7 Consider the following machine :-
8
9   Regulator-1 -+-> Regulator-2 --> [Consumer A @ 1.8 - 2.0V]
10                |
11                +-> [Consumer B @ 3.3V]
12
13 The drivers for consumers A & B must be mapped to the correct regulator in
14 order to control their power supply. This mapping can be achieved in machine
15 initialisation code by creating a struct regulator_consumer_supply for
16 each regulator.
17
18 struct regulator_consumer_supply {
19         struct device *dev;     /* consumer */
20         const char *supply;     /* consumer supply - e.g. "vcc" */
21 };
22
23 e.g. for the machine above
24
25 static struct regulator_consumer_supply regulator1_consumers[] = {
26 {
27         .dev    = &platform_consumerB_device.dev,
28         .supply = "Vcc",
29 },};
30
31 static struct regulator_consumer_supply regulator2_consumers[] = {
32 {
33         .dev    = &platform_consumerA_device.dev,
34         .supply = "Vcc",
35 },};
36
37 This maps Regulator-1 to the 'Vcc' supply for Consumer B and maps Regulator-2
38 to the 'Vcc' supply for Consumer A.
39
40 Constraints can now be registered by defining a struct regulator_init_data
41 for each regulator power domain. This structure also maps the consumers
42 to their supply regulator :-
43
44 static 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 };
53
54 Regulator-1 supplies power to Regulator-2. This relationship must be registered
55 with the core so that Regulator-1 is also enabled when Consumer A enables it's
56 supply (Regulator-2). The supply regulator is set by the supply_regulator_dev
57 field below:-
58
59 static 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,
69 };
70
71 Finally the regulator devices must be registered in the usual manner.
72
73 static 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 */
90 platform_device_register(&wm8350_regulator_devices[0]);
91
92 /* register regulator 2 device */
93 platform_device_register(&wm8350_regulator_devices[1]);