在上一章我们介绍了regulator子系统相关的数据结构间的关联以及每一个数据结构的定义。针对数据结构间的关联则需要regulator子系统提供的接口实现。而本章我们就说明这些接口。本章的章节如下:
一、regulator device的注册与注销
二、regulator的注册与注销(regulator device的使用者)
三、regulator子系统提供的接口
针对regulator device的注册与注销函数主要涉及regulator_register、regulator_unregister这两个函数。而针对regulator_register函数,其实现哪些功能呢?我们还是以数据结构图来说明吧,如下图所示,根据下图中标号1中的“regulator_dev运行配置参数”、标号2中的“regulator_dev静态描述相关参数”,完成以下功能:
若该regulator_dev支持使用gpio控制使能与否,则完成下图标号3的gpio相关配置,并将该regulator_dev 使能控制相关的gpio参数注册到下图标号7中的链表regulator_env_gpio_list,通过函数regulator_ena_gpio_request实现;将该regulator dev的所有使用者相关的信息(struct regulator_map类型变量),注册到下图标号5中的链表regulator_map_list;确定该regulator_dev的约束信息(下图标号4 struct regulator_constraints类型的变量配置,通过函数set_machine_constraints实现);完成该regulator_dev的注册,即将该regulator_dev注册到下图标号6中所示的regulator_list上;除了上述四个主要的内容外,还涉及如下内容:
对regulator dev相关的参数进行合法性检测,如get_voltage_sel、list_voltage这两个接口是否只设置一个等;为该regulator_dev创建struct device类型的变量,并注册到linux设备驱动模型子系统中,并完成与regulator_class的关联;为该regulator_dev创建设备属性文件(在sysfs文件系统下创建属性文件,以便应用程序通过设备属性文件即可查看该regulator_dev相关的配置信息,如最小电压、最大电压、操作模式、使能状态、bypass、suspend相关state等),通过函数add_regulator_attributes;若该regulator dev由别的regulator dev提供电压/电流输入,则需要使能其输出,通过函数regulator_enable实现;以上即为regulator_register实现的主要功能。而针对regulator_unregister则主要实现相反的操作。
针对regulator_dev的使用者,则主要涉及接口regulator_get、regulator_put这两个函数。而针对regulator_get接口,其主要用于创建struct regulator类型的变量,并完成与regulator_dev的关联,建立如下图的关联关系,具体说明如下:
根据dev_name、supply name,在regulator_map_list上进行查找与匹配,若查找到,即获取到对应的regulator_dev;调用create_regulator接口创建一个regulator,并加入到regulator_dev的consumer_list链表中;
上面所说的regulator_register、regulator_unregister、regulator_get、regulator_put主要实现regulator_dev的注册与注销、regulator的创建与销毁。而regulator 子系统也提供了regulator 电压、电流的设置、操作模式设置、电压获取、电流获取、regulator dev使能相关的接口。而这些接口主要由regulator dev的使用者调用(传递的均是struct regulator类型的变量),这些接口包括regulator_enable、regulator_disable、regulator_get_current_limit、regulator_get_mode、regulator_get_voltage、regulator_is_enabled、regulator_list_voltage、regulator_set_current_limit、regulator_set_voltage、regulator_set_mode、regulator_suspend_prepare、regulator_suspend_finish、regulator_force_disable、regulator_bulk_get等等。各外设驱动在通过regulator_get完成struct regulator类型变量的创建后,则可以使用这些接口进行电压、电流、regulator dev使能相关的操作。
以上即为本章的内容,主要说明regulator dev的注册与注销、regulator的注册与注销、regulator操作相关的接口。其实regulator子系统的软件架构与之前我们介绍的pinctrl子系统类似,相对而言还没有pinctrl子系统复杂。在pinctrl子系统中我们所说的board级别的pinctrl配置即类似于regulator consumer map的注册(实现regulator_map…),但pinctrl 子系统的board级别的pinctrl配置注册可通过单独的函数pinctrl_register_mappings实现,而regulator consumer对应regulator_map的注册则只由regulator_register函数调用实现。至此我们基本完成regulator 子系统的分析。
