第一部分 regulator系统的总体概览
彩色框代表最终的regulator抽象,它的前一级表示regulator的载体(可以是PMIC、CPU、等等)。
a)CPU通过I2C controller,连接一个降压控制器(TI tps51632),该控制器输出名称为“vdd-cpu”的电压,就称作vdd-cpu regulator
b)CPU通过I2C controller,连接一个前端电源管理芯片(TI tps65090),该芯片除了具备充电管理功能外,内置了多个regulator,例如dcdc1、dcdc2等等。
c)CPU通过I2C controller,连接另一个电源管理芯片(TI tps65913), 该芯片具有两个功能:GPIO输出和PMIC。PMIC内置了多个regulator,如vddio-ddr、vdd-core等等。(由是观之, 电源管理芯片也是挂在i2c上的)
d)CPU内部也集成了一些regulator,如vdd_ac_bat等等。
regulator是虚拟出的设备,是supply,可用consumer上的受电引脚表示(比如vdd),而consumer则是消耗此supply的设备(比如"lcd")。
regulator系统分为machine部分,supply部分和consumer部分。machine部分主要描述了单板的constraints和consumer_supply的对应关系
第一部分 machine部分的描述(DTS形式)
1)tps51632 下有个regulator
2: i2c@7000d000 {
3: status = "okay";
4: clock-frequency = <400000>;
6: tps51632@43 {
7: compatible = "ti,tps51632";
8: reg = <0x43>;
9: regulator-name = "vdd-cpu";
10: regulator-min-microvolt = <500000>;
11: regulator-max-microvolt = <1520000>;
12: regulator-boot-on;
13: regulator-always-on;
14: };
16: }
tps51632下面以“regulator-”为前缀的字段,是regulator特有的字段。
kernel在初始化时,只会为二级node(即“/”下面的节点,本文的例子是“i2c@7000d000”)创建platform设备,至于三级node(这里的“tps51632@43”),则由其bus(i2c)创建。
2)tps65090
tps65090包含charger和regulator,我们看看其DTS怎么写的:
i2c@7000d000 {
2: status = "okay";
3: ...
4:
5: tps65090@48 {
6: compatible = "ti,tps65090";
7: reg = <0x48>;
9:
10: charger: charger {
11: compatible = "ti,tps65090-charger";
12: ti,enable-low-current-chrg;
13: };
14:
15: regulators { // 两个regulator引脚
16: tps65090_dcdc1_reg: dcdc1 {
17: regulator-name = "vdd-sys-5v0";
18: regulator-always-on;
19: regulator-boot-on;
20: };
21:
22: tps65090_dcdc2_reg: dcdc2 {
23: regulator-name = "vdd-sys-3v3";
24: regulator-always-on;
25: regulator-boot-on;
26: };
28: }
29: }
30: }
驱动处理部分代码“drivers/mfd/tps65090.c”、“drivers/power/tps65090-charger.c”和“drivers/regulator/tps65090-regulator.c”,这里面还涉及了MFD(multi-function device,多功能设备)。
虽然这里的regulators没有compatible字段,也会创建相应的 device(具体可参考“drivers/mfd/tps65090.c”)
再来看regulators中子node----regulator,由于数量比较多,就没必要创建 device了。(引脚没必要创建platform_device)
第二部分 regulator的注册
注册主要传入2个参数,regulator_desc 和 regulator_config, regulator_des