电压和电流调节器 API¶
- 作者:
Liam Girdwood
- 作者:
Mark Brown
简介¶
此框架旨在提供一个标准的内核接口来控制电压和电流调节器。
目的是允许系统动态控制调节器的功率输出,以节省电量并延长电池寿命。 这适用于电压调节器(其中电压输出可控)和电流吸收器(其中电流限制可控)。
请注意,Linux 内核源代码中提供了其他(且目前更完整的)文档,位于 Documentation/power/regulator
下。
词汇表¶
调节器 API 使用了许多可能不熟悉的术语
调节器
向其他设备供电的电子设备。 大多数调节器可以启用和禁用其输出,有些还可以控制其输出电压或电流。
消费者
消耗由调节器提供的电力的电子设备。 这些可以是静态的,仅需要固定的电源,也可以是动态的,需要在运行时对调节器进行主动管理。
电源域
由给定调节器供电的电子电路,包括调节器和所有消费者设备。 调节器的配置在电路中的所有组件之间共享。
电源管理集成电路 (PMIC)
包含多个调节器且通常还包含其他子系统的 IC。 在嵌入式系统中,主 PMIC 通常等效于桌面系统中的 PSU 和南桥的组合。
消费者驱动程序接口¶
这提供了类似于内核时钟框架的 API。 消费者驱动程序使用 get 和 put 操作来获取和释放调节器。 提供了 启用 和 禁用 调节器以及获取和设置调节器运行时参数的函数。
请求调节器时,消费者使用电源的符号名称,例如 “Vcc”,这些名称通过机器接口映射到实际的调节器设备。
当未使用调节器框架时,会提供此 API 的存根版本,以最大程度地减少使用 ifdefs 的需要。
启用和禁用¶
调节器 API 提供调节器的引用计数启用和禁用。 消费者设备使用 regulator_enable()
和 regulator_disable()
函数来启用和禁用调节器。 对这两个函数的调用必须是平衡的。
请注意,由于多个消费者可能正在使用调节器,并且机器约束可能不允许禁用调节器,因此不能保证调用 regulator_disable()
实际上会导致禁用调节器提供的电源。 消费者驱动程序应假定调节器可能始终处于启用状态。
配置¶
某些消费者设备可能需要能够动态配置其电源。 例如,MMC 驱动程序可能需要为其卡选择正确的操作电压。 这可以在启用或禁用调节器时完成。
regulator_set_voltage()
和 regulator_set_current_limit()
函数提供了此功能的主要接口。 两者都采用电压和电流范围,支持不需要特定值的驱动程序(例如,CPU 频率缩放通常允许 CPU 在较低频率下使用更宽的电源电压范围,但不要求降低电源电压)。 如果需要精确值,则最小值和最大值应相同。
回调¶
还可以为诸如调节失败之类的事件注册回调。
调节器驱动程序接口¶
调节器芯片的驱动程序将调节器注册到调节器核心,从而为核心提供操作结构。 通知程序接口允许将错误情况报告给核心。
注册应由平台完成的显式设置触发,为调节器提供 struct regulator_init_data
,其中包含约束和电源信息。
机器接口¶
此接口提供了一种定义调节器如何在给定系统上连接到消费者,以及系统的有效操作参数是什么的方法。
电源¶
调节器电源使用 struct 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 pw_budget_mW;
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
最大输入电流。
pw_budget_mW
调节器的功率预算,单位为 mW。
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 应指示过流情况是由
不可恢复的错误引起的,但 HW 不执行自动关闭。
- 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 驱动程序的 Value 存储。 核心不更新此值。 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 用于指示 HW 损坏情况,则最好关闭稳压器或在错误处理重复失败时重新启动 SOC。 如果给出了 fatal_cnt,则如果 IRQ 处理失败 fatal_cnt 次,则中止 IRQ 处理,并调用 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 的错误和通知,因为核心不清除映射数据。 可以返回 REGULATOR_FAILED_RETRY 以指示从 IC 读取状态失败。 如果重复 fatal_cnt 次,则核心将调用 die() 回调或关闭系统电源作为最后的手段以保护 HW。
renable
重新启用 IRQ 之前检查状态的可选回调(如果 HW 支持)。 如果已实现,则应清除错误标志,以便更新
regulator_get_error_flags()
获取的错误。 如果未实现回调,则假定错误已清除,并且重新启用 IRQ。 可以返回 REGULATOR_FAILED_RETRY 以指示从 IC 读取状态失败。 如果对 “fatal_cnt” 重复此操作,则核心将调用 die() 回调,或者如果未填充 die(),则尝试关闭系统电源作为最后的手段以保护 HW。 返回零表示已解决 HW 中的问题,并且将重新启用 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() 编码为 -
EOPNOTSUPP
,如果 稳压器 不使用 regmap。
-
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;或者如果 稳压器 的电压无法更改并且电压回读失败,则为负错误
数字。
参数
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
稳压器源
返回
稳压器的未声明功率预算,单位为mW。
参数
struct regulator *regulator
稳压器源
unsigned int pw_req
请求的功率
返回
成功时返回 0,失败时返回负错误号。
参数
struct regulator *regulator
稳压器源
unsigned int pw
要释放的功率。
返回
稳压器的功率预算,单位为mW。
参数
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,或者如果无法更改旁路,或者
失败时为负错误号。
-
int regulator_register_notifier(struct regulator *regulator, struct notifier_block *nb)¶
注册稳压器事件通知程序
参数
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。