电压和电流调节器 API¶
- 作者:
Liam Girdwood
- 作者:
Mark Brown
简介¶
此框架旨在提供一个标准的内核接口来控制电压和电流调节器。
其目的是允许系统动态控制调节器功率输出,以节省功耗并延长电池寿命。这适用于电压调节器(电压输出可控)和电流吸收器(电流限制可控)。
请注意,在 Linux 内核源代码 Documentation/power/regulator
下提供了其他(且目前更完整的)文档。
词汇表¶
调节器 API 使用了一些可能不熟悉的术语
调节器
向其他设备供电的电子设备。大多数调节器可以启用和禁用其输出,有些还可以控制其输出电压或电流。
消费者
消耗调节器提供的电力的电子设备。这些设备可以是静态的,仅需要固定的电源,也可以是动态的,需要在运行时对调节器进行主动管理。
电源域
由给定调节器供电的电子电路,包括调节器和所有消费者设备。调节器的配置在电路中的所有组件之间共享。
电源管理集成电路 (PMIC)
一个包含多个调节器并且通常还包含其他子系统的 IC。在嵌入式系统中,主 PMIC 通常等效于台式系统中的 PSU 和南桥的组合。
消费者驱动程序接口¶
这提供了类似于内核时钟框架的 API。消费者驱动程序使用 get 和 put 操作来获取和释放调节器。提供了 enable 和 disable 调节器的函数,以及获取和设置调节器运行时参数的函数。
当请求调节器时,消费者使用其电源的符号名称,例如“Vcc”,这些名称由机器接口映射到实际的调节器设备。
当调节器框架不使用时,会提供此 API 的存根版本,以尽量减少使用 ifdefs 的需要。
启用和禁用¶
调节器 API 提供对调节器的引用计数启用和禁用。消费者设备使用 regulator_enable()
和 regulator_disable()
函数来启用和禁用调节器。对这两个函数的调用必须是平衡的。
请注意,由于多个消费者可能正在使用调节器,并且机器约束可能不允许禁用调节器,因此不能保证调用 regulator_disable()
实际上会导致禁用调节器提供的电源。消费者驱动程序应假定调节器可能始终处于启用状态。
配置¶
某些消费者设备可能需要能够动态配置其电源。例如,MMC 驱动程序可能需要为其卡选择正确的操作电压。这可以在调节器启用或禁用时完成。
regulator_set_voltage()
和 regulator_set_current_limit()
函数为此提供主要接口。两者都接受电压和电流范围,支持不需要特定值的驱动程序(例如,CPU 频率缩放通常允许 CPU 在较低频率下使用更广泛的电源电压范围,但不要求降低电源电压)。如果需要精确值,则最小值和最大值应相同。
回调¶
也可以为诸如调节失败之类的事件注册回调。
调节器驱动程序接口¶
调节器芯片的驱动程序向调节器核心注册调节器,向核心提供操作结构。通知器接口允许将错误情况报告给核心。
注册应由平台完成的显式设置触发,为调节器提供一个包含约束和电源信息的 struct regulator_init_data
。
机器接口¶
此接口提供了一种定义调节器如何在给定系统上连接到消费者以及系统的有效操作参数的方法。
电源¶
调节器电源使用 regulator_consumer_supply
结构指定。这在驱动程序注册时作为机器约束的一部分完成。
约束¶
除了定义连接外,机器接口还提供了定义允许客户端执行的操作和可以设置的参数的约束。这是必需的,因为通常调节器设备将提供比在给定系统上安全使用的更大的灵活性,例如支持高于消费者额定值的电源电压。
这是通过在驱动程序注册时提供一个 struct regulation_constraints
来完成的。
约束还可以指定调节器的初始配置,这对于与静态消费者一起使用特别有用。
API 参考¶
由于内核文档框架的限制以及源代码的现有布局,此处记录了整个调节器 API。
-
struct pre_voltage_change_data¶
与 PRE_VOLTAGE_CHANGE 事件一起发送的数据
定义:
struct pre_voltage_change_data {
unsigned long old_uV;
unsigned long min_uV;
unsigned long max_uV;
};
成员
old_uV
更改前的当前电压。
min_uV
我们将要更改到的最小电压。
max_uV
我们将要更改到的最大电压。
-
struct regulator_bulk_data¶
用于批量稳压器操作的数据。
定义:
struct regulator_bulk_data {
const char *supply;
struct regulator *consumer;
int init_load_uA;
};
成员
supply
电源的名称。在使用批量稳压器 API 之前由用户初始化。
consumer
电源的稳压器消费者。这将由批量 API 管理。
init_load_uA
在获取稳压器之后,将使用此负载调用
regulator_set_load()
。在使用批量稳压器 API 之前由用户初始化。
描述
稳压器 API 提供一系列 regulator_bulk_() API 调用,方便需要多个电源的消费者。此结构用于管理这些调用的数据。
-
struct regulator_state¶
低功耗系统状态期间的稳压器状态
定义:
struct regulator_state {
int uV;
int min_uV;
int max_uV;
unsigned int mode;
int enabled;
bool changeable;
};
成员
uV
挂起期间的默认工作电压,可以在 <min_uV, max_uV> 之间调整。
min_uV
可以设置最小挂起电压。
max_uV
可以设置最大挂起电压。
mode
挂起期间的工作模式。
enabled
挂起期间的操作。- DO_NOTHING_IN_SUSPEND - DISABLE_IN_SUSPEND - ENABLE_IN_SUSPEND
changeable
此状态是否可以在启用/禁用之间切换,
描述
这描述了在系统范围的低功耗状态期间稳压器的状态。必须为配置设置启用或禁用其中一个。
-
struct regulation_constraints¶
稳压器运行约束。
定义:
struct regulation_constraints {
const char *name;
int min_uV;
int max_uV;
int uV_offset;
int min_uA;
int max_uA;
int ilim_uA;
int system_load;
u32 *max_spread;
int max_uV_step;
unsigned int valid_modes_mask;
unsigned int valid_ops_mask;
int input_uV;
struct regulator_state state_disk;
struct regulator_state state_mem;
struct regulator_state state_standby;
struct notification_limit over_curr_limits;
struct notification_limit over_voltage_limits;
struct notification_limit under_voltage_limits;
struct notification_limit temp_limits;
suspend_state_t initial_state;
unsigned int initial_mode;
unsigned int ramp_delay;
unsigned int settling_time;
unsigned int settling_time_up;
unsigned int settling_time_down;
unsigned int enable_time;
unsigned int uv_less_critical_window_ms;
unsigned int active_discharge;
unsigned always_on:1;
unsigned boot_on:1;
unsigned apply_uV:1;
unsigned ramp_disable:1;
unsigned soft_start:1;
unsigned pull_down:1;
unsigned system_critical:1;
unsigned over_current_protection:1;
unsigned over_current_detection:1;
unsigned over_voltage_detection:1;
unsigned under_voltage_detection:1;
unsigned over_temp_detection:1;
};
成员
name
约束的描述性名称,用于显示目的。
min_uV
消费者可以设置的最小电压。
max_uV
消费者可以设置的最大电压。
uV_offset
从消费者施加到电压的偏移,以补偿电压下降。
min_uA
消费者可以设置的最小电流。
max_uA
消费者可以设置的最大电流。
ilim_uA
最大输入电流。
system_load
未被任何消费者请求捕获的负载。
max_spread
耦合稳压器之间的最大可能差值
max_uV_step
电压的最大可能阶跃变化
valid_modes_mask
消费者可以配置的模式的掩码。
valid_ops_mask
消费者可以执行的操作。
input_uV
当由另一个稳压器供电时,稳压器的输入电压。
state_disk
当系统在磁盘模式下挂起时,稳压器的状态。
state_mem
当系统在内存模式下挂起时,稳压器的状态。
state_standby
当系统在待机模式下挂起时,稳压器的状态。
over_curr_limits
作用于过电流的限制。
over_voltage_limits
作用于过电压的限制。
under_voltage_limits
作用于欠电压的限制。
temp_limits
作用于过温的限制。
initial_state
默认设置的挂起状态。
initial_mode
启动时设置的模式。
ramp_delay
电压变化后稳定下来的时间(单位:uV/us)
settling_time
电压变化为非线性时,电压变化后稳定下来的时间(单位:微秒)。
settling_time_up
电压增加为非线性时,电压增加后稳定下来的时间(单位:微秒)。
settling_time_down
电压减少为非线性时,电压减少后稳定下来的时间(单位:微秒)。
enable_time
导轨的开启时间(单位:微秒)
uv_less_critical_window_ms
指定在发生临界欠压 (UV) 事件后,系统可以安全执行不太重要的操作(例如,日志记录)的时间窗口(以毫秒为单位)。在此时间窗口之后,应执行更关键的操作(例如,防止硬件损坏)。
active_discharge
启用/禁用主动放电。枚举 regulator_active_discharge 值用于初始化。
always_on
如果稳压器永远不应禁用,则设置此项。
boot_on
如果稳压器在系统初始启动时已启用,则设置此项。如果硬件或引导加载程序未启用稳压器,则在应用约束时将启用它。
apply_uV
初始化时应用电压约束。
ramp_disable
在初始化或设置电压时禁用斜坡延迟。
soft_start
启用软启动,使电压缓慢上升。
pull_down
禁用稳压器时启用下拉。
system_critical
如果稳压器对于系统稳定或功能至关重要,则设置此项。
over_current_protection
在过流事件时自动禁用。
over_current_detection
配置过流限制。
over_voltage_detection
配置过压限制。
under_voltage_detection
配置欠压限制。
over_temp_detection
配置过温限制。
描述
此结构描述稳压器和电路板/机器特定的约束。
-
struct regulator_consumer_supply¶
电源 -> 设备映射
定义:
struct regulator_consumer_supply {
const char *dev_name;
const char *supply;
};
成员
dev_name
消费者的
dev_name()
的结果。supply
电源的名称。
描述
这会将电源名称映射到设备。使用 dev_name 可以支持延迟提供 struct device
的总线,例如 I2C。
-
struct regulator_init_data¶
稳压器平台初始化数据。
定义:
struct regulator_init_data {
const char *supply_regulator;
struct regulation_constraints constraints;
int num_consumer_supplies;
struct regulator_consumer_supply *consumer_supplies;
void *driver_data;
};
成员
supply_regulator
父稳压器。使用稳压器名称指定,该名称显示在 sysfs 的 name 字段中,可以使用约束字段 'name' 显式设置。
constraints
约束。必须为稳压器指定这些约束才能使用。
num_consumer_supplies
消费者设备电源的数量。
consumer_supplies
消费者设备电源配置。
driver_data
传递给 regulator_init 的数据。
描述
初始化约束、我们的电源和消费者电源。
-
struct regulator_ops¶
稳压器操作。
定义:
struct regulator_ops {
int (*list_voltage) (struct regulator_dev *, unsigned selector);
int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV, unsigned *selector);
int (*map_voltage)(struct regulator_dev *, int min_uV, int max_uV);
int (*set_voltage_sel) (struct regulator_dev *, unsigned selector);
int (*get_voltage) (struct regulator_dev *);
int (*get_voltage_sel) (struct regulator_dev *);
int (*set_current_limit) (struct regulator_dev *, int min_uA, int max_uA);
int (*get_current_limit) (struct regulator_dev *);
int (*set_input_current_limit) (struct regulator_dev *, int lim_uA);
int (*set_over_current_protection)(struct regulator_dev *, int lim_uA, int severity, bool enable);
int (*set_over_voltage_protection)(struct regulator_dev *, int lim_uV, int severity, bool enable);
int (*set_under_voltage_protection)(struct regulator_dev *, int lim_uV, int severity, bool enable);
int (*set_thermal_protection)(struct regulator_dev *, int lim, int severity, bool enable);
int (*set_active_discharge)(struct regulator_dev *, bool enable);
int (*enable) (struct regulator_dev *);
int (*disable) (struct regulator_dev *);
int (*is_enabled) (struct regulator_dev *);
int (*set_mode) (struct regulator_dev *, unsigned int mode);
unsigned int (*get_mode) (struct regulator_dev *);
int (*get_error_flags)(struct regulator_dev *, unsigned int *flags);
int (*enable_time) (struct regulator_dev *);
int (*set_ramp_delay) (struct regulator_dev *, int ramp_delay);
int (*set_voltage_time) (struct regulator_dev *, int old_uV, int new_uV);
int (*set_voltage_time_sel) (struct regulator_dev *,unsigned int old_selector, unsigned int new_selector);
int (*set_soft_start) (struct regulator_dev *);
int (*get_status)(struct regulator_dev *);
unsigned int (*get_optimum_mode) (struct regulator_dev *, int input_uV, int output_uV, int load_uA);
int (*set_load)(struct regulator_dev *, int load_uA);
int (*set_bypass)(struct regulator_dev *dev, bool enable);
int (*get_bypass)(struct regulator_dev *dev, bool *enable);
int (*set_suspend_voltage) (struct regulator_dev *, int uV);
int (*set_suspend_enable) (struct regulator_dev *);
int (*set_suspend_disable) (struct regulator_dev *);
int (*set_suspend_mode) (struct regulator_dev *, unsigned int mode);
int (*resume)(struct regulator_dev *rdev);
int (*set_pull_down) (struct regulator_dev *);
};
成员
list_voltage
返回支持的电压之一,单位为微伏;如果选择器指示此系统上不可用的电压,则返回零;或者返回负 errno。选择器的范围从零到小于 regulator_desc.n_voltages 的值。可以按任何顺序报告电压。
set_voltage
在指定范围内设置稳压器的电压。驱动程序应选择最接近 min_uV 的电压。
map_voltage
将电压转换为选择器
set_voltage_sel
使用指定选择器设置稳压器的电压。
get_voltage
返回稳压器的当前配置电压;如果稳压器在启动时无法读取且尚未设置,则返回 -ENOTRECOVERABLE。
get_voltage_sel
返回稳压器的当前配置电压选择器;如果稳压器在启动时无法读取且尚未设置,则返回 -ENOTRECOVERABLE。
set_current_limit
为限流稳压器配置限制。驱动程序应选择最接近 max_uA 的电流。
get_current_limit
获取限流稳压器的配置限制。
set_input_current_limit
配置输入限制。
set_over_current_protection
支持启用和设置过流情况检测的限制。可以为三个严重级别配置检测。
REGULATOR_SEVERITY_PROT 应自动关闭稳压器。
- REGULATOR_SEVERITY_ERR 应指示过流情况是
由不可恢复的错误导致,但硬件不执行自动关闭。
- REGULATOR_SEVERITY_WARN 应指示硬件
仍然认为没有损坏,但需要执行特定于电路板的恢复操作的情况。如果 lim_uA 为 0,则不应更改限制,而应仅根据请求启用/禁用检测。
set_over_voltage_protection
支持启用和设置过压情况检测的限制。可以为与过流保护相同的严重级别配置检测。单位为 uV。
set_under_voltage_protection
支持启用和设置欠压情况检测的限制。可以为与过流保护相同的严重级别配置检测。单位为 uV。
set_thermal_protection
支持启用和设置过温情况检测的限制。可以为与过流保护相同的严重级别配置检测。单位为开尔文度。
set_active_discharge
设置稳压器的主动放电启用/禁用。
enable
将稳压器配置为已启用。
disable
将稳压器配置为已禁用。
is_enabled
如果稳压器已启用,则返回 1,否则返回 0。也可能返回负 errno。
set_mode
设置稳压器的配置工作模式。
get_mode
获取稳压器的配置工作模式。
get_error_flags
获取稳压器的当前错误。
enable_time
稳压器电压输出电压在启用后稳定所需的时间,单位为微秒。
set_ramp_delay
设置稳压器的斜坡延迟。驱动程序应选择等于或小于(最接近)ramp_delay 的斜坡延迟。
set_voltage_time
稳压器电压输出电压在设置为新值后稳定所需的时间,单位为微秒。该函数接收来自和目标电压作为输入,它应该返回最坏的情况。
set_voltage_time_sel
稳压器电压输出电压在设置为新值后稳定所需的时间,单位为微秒。该函数接收来自和目标电压选择器作为输入,它应该返回最坏的情况。
set_soft_start
启用稳压器的软启动。
get_status
返回稳压器的实际(非配置)状态,作为 REGULATOR_STATUS 值(或负 errno)
get_optimum_mode
获取使用指定参数运行时稳压器的最高效工作模式。
set_load
设置稳压器的负载。
set_bypass
将稳压器设置为旁路模式。
get_bypass
获取稳压器的旁路模式状态。
set_suspend_voltage
设置系统挂起时稳压器的电压。
set_suspend_enable
标记稳压器在系统挂起时启用。
set_suspend_disable
标记稳压器在系统挂起时禁用。
set_suspend_mode
设置系统挂起时稳压器的工作模式。
resume
恢复挂起稳压器的运行。
set_pull_down
配置稳压器在禁用时下拉。
描述
此结构体描述了稳压器芯片驱动程序可以实现的稳压器操作。
-
struct regulator_desc¶
静态稳压器描述符
定义:
struct regulator_desc {
const char *name;
const char *supply_name;
const char *of_match;
bool of_match_full_name;
const char *regulators_node;
int (*of_parse_cb)(struct device_node *,const struct regulator_desc *, struct regulator_config *);
int (*init_cb)(struct regulator_dev *, struct regulator_config *);
int id;
unsigned int continuous_voltage_range:1;
unsigned n_voltages;
unsigned int n_current_limits;
const struct regulator_ops *ops;
int irq;
enum regulator_type type;
struct module *owner;
unsigned int min_uV;
unsigned int uV_step;
unsigned int linear_min_sel;
int fixed_uV;
unsigned int ramp_delay;
int min_dropout_uV;
const struct linear_range *linear_ranges;
const unsigned int *linear_range_selectors_bitfield;
int n_linear_ranges;
const unsigned int *volt_table;
const unsigned int *curr_table;
unsigned int vsel_range_reg;
unsigned int vsel_range_mask;
bool range_applied_by_vsel;
unsigned int vsel_reg;
unsigned int vsel_mask;
unsigned int vsel_step;
unsigned int csel_reg;
unsigned int csel_mask;
unsigned int apply_reg;
unsigned int apply_bit;
unsigned int enable_reg;
unsigned int enable_mask;
unsigned int enable_val;
unsigned int disable_val;
bool enable_is_inverted;
unsigned int bypass_reg;
unsigned int bypass_mask;
unsigned int bypass_val_on;
unsigned int bypass_val_off;
unsigned int active_discharge_on;
unsigned int active_discharge_off;
unsigned int active_discharge_mask;
unsigned int active_discharge_reg;
unsigned int soft_start_reg;
unsigned int soft_start_mask;
unsigned int soft_start_val_on;
unsigned int pull_down_reg;
unsigned int pull_down_mask;
unsigned int pull_down_val_on;
unsigned int ramp_reg;
unsigned int ramp_mask;
const unsigned int *ramp_delay_table;
unsigned int n_ramp_values;
unsigned int enable_time;
unsigned int off_on_delay;
unsigned int poll_enabled_time;
unsigned int (*of_map_mode)(unsigned int mode);
};
成员
name
稳压器的标识名称。
supply_name
标识稳压器电源
of_match
用于在 DT 中标识稳压器的名称。
of_match_full_name
一个标志,指示如果存在 of_match 字符串,则应将其与节点 full_name 进行匹配。
regulators_node
包含 DT 中稳压器定义的节点的名称。
of_parse_cb
可选的回调函数,仅当 of_match 存在时才调用。在 init_data 解析期间,将为从 DT 解析的每个稳压器调用此回调函数。传递给回调函数的 regulator_config 将是传递给 regulator_register 的配置的副本,仅对本次特定调用有效。回调函数可以自由更改配置,但不能将其存储以供以后使用。回调函数应在成功时返回 0,或在失败时返回负 ERRNO。
init_cb
解析 init_data 后调用的可选回调函数。允许稳压器执行运行时初始化(如果需要),例如同步稳压器和已解析的约束。回调函数应在成功时返回 0,或在失败时返回负 ERRNO。
id
稳压器的数值标识符。
continuous_voltage_range
指示稳压器是否可以在约束范围内设置任何电压。
n_voltages
可用于 ops.list_voltage() 的选择器数量。
n_current_limits
可用于电流限制的选择器数量
ops
稳压器操作表。
irq
稳压器的中断号。
type
指示稳压器是电压稳压器还是电流稳压器。
owner
提供稳压器的模块,用于引用计数。
min_uV
由最低选择器给出的电压(如果为线性映射)
uV_step
每个选择器电压的增加量(如果为线性映射)
linear_min_sel
开始线性映射的最小选择器
fixed_uV
轨道的固定电压。
ramp_delay
电压变化后稳定下来的时间(单位:uV/us)
min_dropout_uV
此稳压器可以处理的最小压降电压
linear_ranges
可能电压范围的常量表。
linear_range_selectors_bitfield
电压范围选择器的常量表,作为位域值。如果使用可选择的范围,则每个范围必须在此处具有相应的选择器。
n_linear_ranges
linear_ranges(和 linear_range_selectors_bitfield,如果使用)表中的条目数。
volt_table
电压映射表(如果为基于表的映射)
curr_table
电流限制映射表(如果为基于表的映射)
vsel_range_reg
当使用可选择的范围和
regulator_map_*_voltage_*_pickable
函数时,用于范围选择器的寄存器。vsel_range_mask
用于范围选择器的寄存器位域的掩码
range_applied_by_vsel
一个标志,指示对 vsel_range_reg 的更改仅在写入 vsel_reg 后才生效
vsel_reg
当使用
regulator_map_*_voltage_*
时,用于选择器的寄存器vsel_mask
用于选择器的寄存器位域的掩码
vsel_step
指定设置电压时选择器步进的分辨率。如果为 0,则不进行步进(直接设置请求的选择器),如果 >0,则稳压器 API 将在每次以指定步进值增大/减小选择器时,逐步升高/降低电压。
csel_reg
使用 regmap set_current_limit 时,用于电流限制选择器的寄存器
csel_mask
用于电流限制选择器的寄存器位域的掩码
apply_reg
当使用 regulator_set_voltage_sel_regmap 时,用于启动输出电压变化的寄存器
apply_bit
当使用 regulator_set_voltage_sel_regmap 时,用于启动输出电压变化的寄存器位域
enable_reg
当使用 regmap 启用/禁用操作时,用于控制的寄存器
enable_mask
当使用 regmap 启用/禁用操作时,用于控制的掩码
enable_val
当使用 regmap 启用/禁用操作时,用于控制的启用值
disable_val
当使用 regmap 启用/禁用操作时,用于控制的禁用值
enable_is_inverted
一个标志,指示当使用 regulator_enable_regmap 及相关 API 时,将 enable_mask 位设置为禁用。
bypass_reg
当使用 regmap set_bypass 时,用于控制的寄存器
bypass_mask
当使用 regmap set_bypass 时,用于控制的掩码
bypass_val_on
当使用 regmap set_bypass 时,用于控制的启用值
bypass_val_off
当使用 regmap set_bypass 时,用于控制的禁用值
active_discharge_on
当使用 regmap set_active_discharge 时,用于控制的禁用值
active_discharge_off
当使用 regmap set_active_discharge 时,用于控制的启用值
active_discharge_mask
当使用 regmap set_active_discharge 时,用于控制的掩码
active_discharge_reg
当使用 regmap set_active_discharge 时,用于控制的寄存器
soft_start_reg
当使用 regmap set_soft_start 时,用于控制的寄存器
soft_start_mask
当使用 regmap set_soft_start 时,用于控制的掩码
soft_start_val_on
当使用 regmap set_soft_start 时,用于控制的启用值
pull_down_reg
当使用 regmap set_pull_down 时,用于控制的寄存器
pull_down_mask
当使用 regmap set_pull_down 时,用于控制的掩码
pull_down_val_on
当使用 regmap set_pull_down 时,用于控制的启用值
ramp_reg
用于控制稳压器斜率的寄存器。
ramp_mask
斜率控制寄存器的位掩码。
ramp_delay_table
用于映射稳压器斜率值的表。值应以 V/S (uV/uS) 为单位给出。请参阅 regulator_set_ramp_delay_regmap()。
n_ramp_values
ramp_delay_table 中的元素数量。
enable_time
稳压器初始启用所需的时间(以 uS 为单位)。
off_on_delay
重新启用稳压器之前的保护时间(以 uS 为单位)
poll_enabled_time
在检查稳压器是否实际启用时使用的轮询间隔(以 uS 为单位)。最大值达到 enable_time。
of_map_mode
将 DeviceTree 中定义的硬件模式映射到标准模式
描述
核心中注册的每个稳压器都使用此类型的结构体和 struct regulator_config
进行描述。此结构体包含稳压器描述的非可变部分。
-
struct regulator_config¶
动态稳压器描述符
定义:
struct regulator_config {
struct device *dev;
const struct regulator_init_data *init_data;
void *driver_data;
struct device_node *of_node;
struct regmap *regmap;
struct gpio_desc *ena_gpiod;
};
成员
dev
稳压器的
struct device
init_data
平台提供的初始化数据,由驱动程序传递
driver_data
私有稳压器数据
of_node
用于解析设备树绑定的 OpenFirmware 节点(可以为 NULL)。
regmap
如果 dev_get_regmap() 不足,则用于核心 regmap 助手的 regmap。
ena_gpiod
控制稳压器启用的 GPIO。
描述
核心中注册的每个稳压器都使用此类型的结构体和 struct regulator_desc
进行描述。此结构体包含稳压器描述的运行时可变部分。
-
struct regulator_err_state¶
稳压器错误/通知状态
定义:
struct regulator_err_state {
struct regulator_dev *rdev;
unsigned long notifs;
unsigned long errors;
int possible_errs;
};
成员
rdev
指示状态的稳压器。
notifs
稳压器上发生的事件。
errors
稳压器上处于活动状态的错误。
possible_errs
可以发出信号的错误(通过给定的 IRQ)。
-
struct regulator_irq_data¶
稳压器错误/通知状态数据
定义:
struct regulator_irq_data {
struct regulator_err_state *states;
int num_states;
void *data;
long opaque;
};
成员
states
每个关联稳压器的状态结构体。
num_states
关联稳压器的数量。
data
在 regulator_irq_desc 处给出的驱动程序数据指针。
opaque
IC 驱动程序的值存储。核心不更新此值。IC 可能希望在 map_event 时在此处存储状态寄存器值,并在“renable”回调中比较内容,以查看是否已将新问题添加到状态。如果是这种情况,则可能需要返回 REGULATOR_ERROR_CLEARED 而不是 REGULATOR_ERROR_ON,以允许 IRQ 再次触发,并为新问题生成通知。
描述
此结构体传递给“map_event”和“renable”回调函数,以向核心报告稳压器状态。
-
struct regulator_irq_desc¶
基于 IRQ 事件的通知发送器。
定义:
struct regulator_irq_desc {
const char *name;
int fatal_cnt;
int reread_ms;
int irq_off_ms;
bool skip_off;
bool high_prio;
void *data;
int (*die)(struct regulator_irq_data *rid);
int (*map_event)(int irq, struct regulator_irq_data *rid, unsigned long *dev_mask);
int (*renable)(struct regulator_irq_data *rid);
};
成员
name
IRQ 的可见名称
fatal_cnt
如果此 IRQ 用于指示硬件损坏情况,则最好关闭稳压器或重启 SOC,如果错误处理重复失败。如果给定了 fatal_cnt,则当 IRQ 处理失败 fatal_cnt 次后会中止,并调用 die() 回调(如果已填充)。如果 die() 未填充,则会尝试关闭系统电源,以防止进一步损坏。
reread_ms
如果 IC 读取失败,在工作线程尝试重新读取状态之前等待的时间。如果未指定时间,则会立即重新读取。
irq_off_ms
对于在错误期间保持 IRQ 禁用的设备,IRQ 保持禁用的时间,之后会重新评估状态。如果未给出此值,则 IRQ 将保持启用,并且不会调用 renable。
skip_off
如果设置为 true,则 IRQ 处理程序会在执行其他操作之前尝试检查是否启用了任何关联的稳压器。如果没有启用稳压器且此项设置为 true,则会假定为虚假 IRQ 并返回 IRQ_NONE。
high_prio
指示应使用高优先级 WQ 的布尔值。
data
驱动程序私有数据指针,它将作为 regulator_irq_data 中的 renable、map_event 和 die 回调的参数传递。
die
保护回调。如果 IC 状态读取或恢复操作失败 fatal_cnt 次,则会调用此回调或关闭系统电源。此回调应实现最终保护尝试,例如禁用稳压器。如果保护成功,die() 可以返回 0。如果返回其他值,则核心会假定最终保护失败,并尝试执行电源关闭作为最后手段。
map_event
驱动程序回调,用于将 IRQ 状态映射到具有事件/错误的稳压器设备。注意:回调必须初始化所有 rdev 的错误和通知,这些 rdev 表示有活动事件,因为核心不清除映射数据。可以返回 REGULATOR_FAILED_RETRY 以指示从 IC 读取状态失败。如果此操作重复 fatal_cnt 次,则核心将调用 die() 回调或关闭系统电源作为最后手段来保护硬件。
renable
可选的回调,用于在重新启用 IRQ 之前检查状态(如果硬件支持)。如果实现此回调,则应清除错误标志,以便更新
regulator_get_error_flags()
获取的错误。如果未实现回调,则假定错误已清除,并且 IRQ 会重新启用。可以返回 REGULATOR_FAILED_RETRY 以指示从 IC 读取状态失败。如果此操作重复 ‘fatal_cnt’ 次,则核心将调用 die() 回调,如果 die() 未填充,则会尝试关闭系统电源作为最后手段来保护硬件。返回零表示硬件中的问题已解决,并且 IRQ 将重新启用。返回 REGULATOR_ERROR_ON 表示错误条件仍然有效,并保持 IRQ 禁用。请注意,返回 REGULATOR_ERROR_ON 不会重新触发评估哪些事件处于活动状态或重新发送通知。如果需要这样做,您可能希望返回零并允许 IRQ 重新触发,从而导致重新评估和重新发送事件。
描述
此结构用于注册稳压器 IRQ 通知助手。
参数
struct device *dev
稳压器“消费者”的设备
const char *id
电源名称或稳压器 ID。
描述
强烈建议使用通过 set_consumer_device_supply() 配置的电源名称。建议使用的电源名称应与数据表中用于电源和/或相关设备引脚的名称匹配。
返回
- 指向与稳压器对应的
struct regulator
的指针 生产者,或一个
ERR_PTR()
编码的负错误号。
参数
struct device *dev
稳压器“消费者”的设备
const char *id
电源名称或稳压器 ID。
描述
在持有此引用时,其他消费者将无法获得此稳压器,并且稳压器的使用计数将初始化以反映稳压器的当前状态。
这旨在供无法容忍稳压器共享使用的消费者使用,例如那些需要强制关闭稳压器以使其控制的硬件正常运行的消费者。
强烈建议使用通过 set_consumer_device_supply() 配置的电源名称。建议使用的电源名称应与数据表中用于电源和/或相关设备引脚的名称匹配。
返回
- 指向与稳压器对应的
struct regulator
的指针 生产者,或一个
ERR_PTR()
编码的负错误号。
参数
struct device *dev
稳压器“消费者”的设备
const char *id
电源名称或稳压器 ID。
描述
这旨在供那些在正常使用中某些电源可以断开连接的设备(例如某些 MMC 设备)的消费者使用。它可以允许稳压器核心为使用普通 regulator_get()
调用请求的其他电源提供存根电源,而不会中断可以处理不存在的电源的驱动程序的运行。
强烈建议使用通过 set_consumer_device_supply() 配置的电源名称。建议使用的电源名称应与数据表中用于电源和/或相关设备引脚的名称匹配。
返回
- 指向与稳压器对应的
struct regulator
的指针 生产者,或一个
ERR_PTR()
编码的负错误号。
参数
struct regulator *regulator
稳压器源
注意
驱动程序必须确保在此稳压器源上进行的所有 regulator_enable 调用都在调用此函数之前由 regulator_disable 调用进行平衡。
-
int regulator_register_supply_alias(struct device *dev, const char *id, struct device *alias_dev, const char *alias_id)¶
为电源查找提供设备别名
参数
struct device *dev
将作为稳压器“消费者”给出的设备
const char *id
电源名称或稳压器 ID
struct device *alias_dev
应用于查找电源的设备
const char *alias_id
应用于查找电源的电源名称或稳压器 ID
描述
对 dev 上 id 的所有查找都将改为对 alias_dev 上的 alias_id 进行。
返回
成功时返回 0,失败时返回负错误号。
参数
struct device *dev
将作为稳压器“消费者”给出的设备
const char *id
电源名称或稳压器 ID
描述
如果 dev 上存在 id 的查找别名,则删除该别名。
-
int regulator_bulk_register_supply_alias(struct device *dev, const char *const *id, struct device *alias_dev, const char *const *alias_id, int num_id)¶
注册多个别名
参数
struct device *dev
将作为稳压器“消费者”给出的设备
const char *const *id
电源名称或稳压器 ID 列表
struct device *alias_dev
应用于查找电源的设备
const char *const *alias_id
用于查找电源的电源名称或稳压器 ID 列表
int num_id
要注册的别名数量
描述
此辅助函数允许驱动程序在一个操作中注册多个电源别名。如果任何别名无法注册,则在返回调用者之前,将删除所有已注册的别名。
返回
成功时返回 0,失败时返回负错误号。
-
void regulator_bulk_unregister_supply_alias(struct device *dev, const char *const *id, int num_id)¶
取消注册多个别名
参数
struct device *dev
将作为稳压器“消费者”给出的设备
const char *const *id
电源名称或稳压器 ID 列表
int num_id
要取消注册的别名数量
描述
此辅助函数允许驱动程序在一个操作中取消注册多个电源别名。
参数
struct regulator *regulator
稳压器源
描述
请求启用稳压器,使其输出为预定义的电压或电流值。对 regulator_enable()
的调用必须与对 regulator_disable()
的调用相平衡。
注意
输出值可以由其他驱动程序、引导加载程序设置,也可以在稳压器中硬连线。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
描述
禁用稳压器输出电压或电流。对 regulator_enable()
的调用必须与对 regulator_disable()
的调用相平衡。
注意
仅当没有其他使用者设备启用稳压器、稳压器设备支持禁用且机器约束允许此操作时,才会禁用稳压器输出。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
描述
强制禁用稳压器输出电压或电流。
注意
即使其他使用者设备启用了稳压器,这也将禁用稳压器输出。当稳压器未禁用时,可能会发生设备损坏的情况(例如,温度过高)时,应使用此功能。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
int ms
直到禁用稳压器的毫秒数
描述
在延迟后对稳压器执行 regulator_disable()
。这适用于需要一些时间才能静止的设备。
注意
仅当没有其他使用者设备启用稳压器、稳压器设备支持禁用且机器约束允许此操作时,才会禁用稳压器输出。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
描述
请注意,支持此稳压器句柄的设备可以有多个用户,因此即使从未为此特定源调用 regulator_enable()
,也可能启用它。
返回
- 如果稳压器驱动程序支持源/客户端
已请求启用该设备,则为正数;如果未请求,则为零;否则为负错误号。
-
int regulator_count_voltages(struct regulator *regulator)¶
计数
regulator_list_voltage()
选择器
参数
struct regulator *regulator
稳压器源
返回
稳压器的选择器数量,或负错误号。
描述
选择器从零开始编号,通常对应于硬件寄存器中的位字段。
参数
struct regulator *regulator
稳压器源
unsigned selector
标识要列出的电压
上下文
可以睡眠
返回
- 可以传递到 regulator_set_voltage() 的 选择器 的电压,
如果 选择器 不能在此系统上使用,则为 0;如果失败,则为负错误号。
参数
struct regulator *regulator
稳压器源
返回
- 指向 稳压器 的
struct regmap
的指针,或 ERR_PTR() 如果 稳压器 不使用 regmap,则编码为 -
EOPNOTSUPP
。
-
int regulator_get_hardware_vsel_register(struct regulator *regulator, unsigned *vsel_reg, unsigned *vsel_mask)¶
获取硬件电压选择器寄存器
参数
struct regulator *regulator
稳压器源
unsigned *vsel_reg
电压选择器寄存器,输出参数
unsigned *vsel_mask
电压选择器位域的掩码,输出参数
描述
返回用于设置稳压器电压的硬件寄存器偏移和位掩码。当配置电压缩放硬件或固件时,这可能很有用,例如,这些硬件或固件可以在内核背后发出 I2C 请求。
成功时,输出参数 vsel_reg 和 vsel_mask 将被填充,并返回 0,否则返回一个负错误号。
返回
- 成功返回 0,如果稳压器不支持电压选择器,则返回 -
EOPNOTSUPP
。 电压选择器。
参数
struct regulator *regulator
稳压器源
unsigned selector
标识要列出的电压
描述
将选择器转换为可以直接写入稳压器寄存器的硬件特定电压选择器。电压寄存器的地址可以通过调用 regulator_get_hardware_vsel_register 来确定。
返回
- 成功返回 0,如果选择器超出支持的范围,则返回 -
EINVAL
,或者如果稳压器不支持电压选择器,则返回 -EOPNOTSUPP
。 范围。
参数
struct regulator *regulator
稳压器源
bool enable
true 为启用,false 为禁用
描述
请求以预定义的电压或电流值启用/禁用稳压器输出。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
返回
- 线性稳压器的 VSEL 值之间的电压步长,
如果稳压器不是线性稳压器,则返回 0。
参数
struct regulator *regulator
要检查的稳压器。
int min_uV
最小所需电压,单位为 uV。
int max_uV
最大所需电压,单位为 uV。
返回
- 如果支持电压范围,则返回 1,如果不支持,则返回 0,或者如果无法更改 regulator 的电压并且电压回读失败,则返回负错误号。
number if regulator’s voltage can’t be changed and voltage readback failed.
参数
struct regulator *regulator
稳压器源
int min_uV
最小所需电压,单位为 uV
int max_uV
最大可接受电压,单位为 uV
描述
将稳压器设置为所需的输出电压。这可以在任何稳压器状态下设置。IOW,稳压器可以禁用或启用。
如果稳压器已启用,则电压将立即更改为新值,否则如果稳压器已禁用,则稳压器在启用时将以新电压输出。
注意
如果稳压器在多个设备之间共享,则将使用满足系统约束的最低请求电压。必须为此稳压器设置稳压器系统约束,然后才能调用此函数,否则此调用将失败。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
int old_uV
起始电压,单位为微伏
int new_uV
目标电压,单位为微伏
描述
提供起始电压和结束电压,此函数尝试计算上升或下降到此新电压所需的微秒时间。
返回
以微秒为单位的斜坡时间,如果计算失败,则为负错误号。
-
int regulator_set_voltage_time_sel(struct regulator_dev *rdev, unsigned int old_selector, unsigned int new_selector)¶
获取上升/下降时间
参数
struct regulator_dev *rdev
稳压器源设备
unsigned int old_selector
起始电压的选择器
unsigned int new_selector
目标电压的选择器
描述
提供起始电压和目标电压选择器,此函数返回上升或下降到此新电压所需的微秒时间
在 regulation_constraints 中提供 ramp_delay 的驱动程序可以使用此操作作为其 set_voltage_time_sel() 操作。
返回
以微秒为单位的斜坡时间,如果计算失败,则为负错误号。
参数
struct regulator *regulator
稳压器源
描述
重新应用上次配置的电压。这旨在用于某些外部控制源与使用者合作导致配置的电压发生变化的情况。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
返回
当前稳压器电压,单位为 uV,失败时为负错误号。
注意
如果稳压器被禁用,它将返回电压值。此函数不应用于确定稳压器状态。
参数
struct regulator *regulator
稳压器源
int min_uA
最小支持电流,单位为 uA
int max_uA
最大支持电流,单位为 uA
描述
将当前电流输出设置为所需的输出电流。这可以在任何稳压器状态下设置。也就是说,稳压器可以禁用或启用。
如果稳压器已启用,则电流将立即更改为新值;否则,如果稳压器已禁用,则稳压器将在启用时以新电流输出。
注意
在调用此函数之前,必须为该稳压器设置稳压器系统约束,否则此调用将失败。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
返回
- 指定电流吸收器提供的电流,单位为 uA,
或失败时返回负错误号。
注意
如果稳压器被禁用,它将返回当前值。此函数不应用于确定稳压器状态。
参数
struct regulator *regulator
稳压器源
unsigned int mode
工作模式 - REGULATOR_MODE 常量之一
描述
设置稳压器工作模式以提高稳压器效率或改善稳压性能。
注意
在调用此函数之前,必须为该稳压器设置稳压器系统约束,否则此调用将失败。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
描述
获取当前稳压器工作模式。
返回
- 当前工作模式为
REGULATOR_MODE_*
值, 或失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
unsigned int *flags
用于存储错误标志的指针
描述
获取当前稳压器错误信息。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
int uA_load
负载电流
描述
通知稳压器核心新的设备负载。然后,DRMS(如果约束启用)会使用该负载来为新的稳压器负载设置最有效的稳压器工作模式。
当消费者设备更改操作状态并因此更改电源状态时,它们会通知其供电稳压器它们将需要的最大功率(可以从设备数据手册中的功耗表中获取)。可能影响功耗的操作状态更改示例包括:-
o 设备已打开/关闭。o 设备 I/O 即将开始或刚刚完成。o 设备在工作之间空闲。
此信息也通过 sysfs 导出到用户空间。
如果平台约束允许,DRMS 将汇总稳压器上的总请求负载,并更改为最有效的工作模式。
如果稳压器是始终开启的稳压器,则如果该消费者完全禁用,则仍将删除单个消费者的负载。
注意
当稳压器消费者请求禁用稳压器时,该消费者请求的任何负载都不再计入总请求负载。如果重新启用稳压器,则先前请求的负载将再次开始计数。
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
要配置的稳压器
bool enable
启用或禁用旁路模式
描述
如果稳压器的所有其他消费者也启用了旁路模式,并且机器约束允许,则允许稳压器进入旁路模式。旁路模式意味着稳压器只是将输入直接传递到输出,而没有稳压。
返回
- 成功时返回 0,或者如果无法更改旁路,则返回 0,或者
失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
struct notifier_block *nb
通知器块
描述
注册通知器块以接收稳压器事件。
返回
成功时返回 0,失败时返回负错误号。
-
int regulator_unregister_notifier(struct regulator *regulator, struct notifier_block *nb)¶
注销稳压器事件通知器
参数
struct regulator *regulator
稳压器源
struct notifier_block *nb
通知器块
描述
注销稳压器事件通知器块。
返回
成功时返回 0,失败时返回负错误号。
-
int regulator_bulk_get(struct device *dev, int num_consumers, struct regulator_bulk_data *consumers)¶
获取多个稳压器消费者
参数
struct device *dev
要提供的设备
int num_consumers
要注册的消费者数量
struct regulator_bulk_data *consumers
消费者的配置;客户端存储在此处。
描述
此辅助函数允许驱动程序在一个操作中获取多个稳压器消费者。如果无法获取任何稳压器,则将在返回调用方之前释放已分配的任何稳压器。
返回
成功时返回 0,失败时返回负错误号。
-
int regulator_bulk_enable(int num_consumers, struct regulator_bulk_data *consumers)¶
启用多个稳压器消费者
参数
int num_consumers
消费者数量
struct regulator_bulk_data *consumers
消费者数据;客户端存储在此处。
描述
此便捷 API 允许消费者在单个 API 调用中启用多个稳压器客户端。如果无法启用任何消费者,则在返回之前,将再次禁用已启用的任何其他消费者。
返回
成功时返回 0,失败时返回负错误号。
-
int regulator_bulk_disable(int num_consumers, struct regulator_bulk_data *consumers)¶
禁用多个稳压器消费者
参数
int num_consumers
消费者数量
struct regulator_bulk_data *consumers
消费者数据;客户端存储在此处。
描述
此便捷 API 允许消费者在单个 API 调用中禁用多个稳压器客户端。如果无法禁用任何消费者,则在返回之前,将再次启用已禁用的任何其他消费者。
返回
成功时返回 0,失败时返回负错误号。
-
int regulator_bulk_force_disable(int num_consumers, struct regulator_bulk_data *consumers)¶
强制禁用多个稳压器消费者
参数
int num_consumers
消费者数量
struct regulator_bulk_data *consumers
消费者数据;客户端存储在此处。
描述
此便捷 API 允许消费者在单个 API 调用中强制禁用多个稳压器客户端。
注意
当如果不禁用稳压器则可能会发生设备损坏时(例如,过温),应使用此方法。尽管对某些消费者的 regulator_force_disable 函数调用可能会返回错误号,但该函数会针对所有消费者调用。
返回
成功时返回 0,失败时返回负错误号。
-
void regulator_bulk_free(int num_consumers, struct regulator_bulk_data *consumers)¶
释放多个稳压器使用者
参数
int num_consumers
消费者数量
struct regulator_bulk_data *consumers
消费者数据;客户端存储在此处。
描述
这个便捷的 API 允许使用者通过单个 API 调用来释放多个稳压器客户端。
-
int regulator_notifier_call_chain(struct regulator_dev *rdev, unsigned long event, void *data)¶
调用稳压器事件通知器
参数
struct regulator_dev *rdev
稳压器源
unsigned long event
通知器块
void *data
回调特定的数据。
描述
由稳压器驱动程序调用,以通知客户端发生了稳压器事件。
返回
NOTIFY_DONE
.
-
int regulator_mode_to_status(unsigned int mode)¶
将稳压器模式转换为状态
参数
unsigned int mode
要转换的模式
描述
将稳压器模式转换为状态。
返回
对应于给定模式的 REGULATOR_STATUS_*
值。
-
struct regulator_dev *regulator_register(struct device *dev, const struct regulator_desc *regulator_desc, const struct regulator_config *cfg)¶
注册稳压器
参数
struct device *dev
驱动稳压器的设备
const struct regulator_desc *regulator_desc
要注册的稳压器
const struct regulator_config *cfg
稳压器的运行时配置
描述
由稳压器驱动程序调用以注册稳压器。
返回
- 成功时指向有效的
struct regulator_dev
的指针,或 失败时指向
ERR_PTR()
编码的负错误号的指针。
-
void regulator_unregister(struct regulator_dev *rdev)¶
注销稳压器
参数
struct regulator_dev *rdev
要注销的稳压器
描述
由稳压器驱动程序调用以注销稳压器。
-
void regulator_has_full_constraints(void)¶
系统具有完全指定的约束
参数
void
无参数
描述
调用此函数将导致稳压器 API 在 late_initcall 中禁用所有使用计数为零且没有 always_on 约束的稳压器。
其目的是使其成为未来内核版本中的默认行为,因此鼓励用户现在使用此功能。
-
void *rdev_get_drvdata(struct regulator_dev *rdev)¶
获取 rdev 稳压器驱动程序数据
参数
struct regulator_dev *rdev
稳压器
描述
获取 rdev 稳压器驱动程序私有数据。此调用可以在稳压器驱动程序上下文中使用。
返回
指向稳压器驱动程序私有数据的指针。
参数
struct regulator *regulator
稳压器
描述
获取稳压器驱动程序私有数据。当需要调用非 API 稳压器特定函数时,此调用可以在使用者驱动程序上下文中使用。
返回
指向稳压器驱动程序私有数据的指针。
参数
struct regulator *regulator
稳压器
void *data
data
-
int rdev_get_id(struct regulator_dev *rdev)¶
获取稳压器 ID
参数
struct regulator_dev *rdev
稳压器
返回
rdev 的稳压器 ID。