Linux 运行时电源管理(PM Runtime)API 使用说民
在内核驱动中,经常看到以下这几个常见的pm_runtime_开头的函数,下面试这详细说明这类函数的用法。
pm_runtime_get_sync(dev);
pm_runtime_put(dev);pm_runtime_set_active(dev);
pm_runtime_enable(dev);
pm_runtime_idle(dev);pm_runtime_disable(dev);
pm_runtime_status_suspended(dev))
pm_runtime_set_suspended(dev);
在 Linux 运行时电源管理(PM Runtime)机制中,上文提到的这些函数是管理设备电源状态的核心接口,用于跟踪设备活跃状态、控制电源管理使能 / 禁用、触发低功耗切换等。以下是每个函数的具体作用及典型使用场景:
一、核心状态跟踪函数:pm_runtime_get_sync 与 pm_runtime_put
这两个函数是 PM Runtime 中 ** 跟踪设备 “使用计数”** 的核心接口,用于判断设备是否处于 “被使用” 状态(影响是否进入低功耗)。
*1. pm_runtime_get_sync(struct device dev)
作用:
增加设备的 “使用计数”(dev->power.usage_count),并确保设备处于活跃状态(active)。
若设备当前处于 suspend 状态,会触发设备dev 的runtime_resume 回调(唤醒设备),直到设备进入 active 状态才返回。
若设备已活跃,仅增加计数,不做额外操作。
调用场景:
当设备即将被访问时(如用户打开设备、驱动需要读写硬件寄存器),需先调用此函数,防止设备在操作过程中进入低功耗。
例:摄像头驱动在 stream_on(开始采集)前调用,确保传感器处于上电状态。
*2. pm_runtime_put(struct device dev)
作用:
减少设备的 “使用计数”(dev->power.usage_count)。当计数减至 0 时,表明设备当前可能空闲,会触发 pm_runtime_idle(dev)(通知框架检查是否可以进入低功耗)。
调用场景:
设备操作结束后(如用户关闭设备、数据传输完成)调用,释放对设备的 “占用”,允许设备在空闲时进入 suspend 状态。
例:摄像头驱动在 stream_off(停止采集)后调用,允许传感器下电。
二、状态初始化与使能函数
*3. pm_runtime_set_active(struct device dev)
作用:
手动将设备状态设置为活跃(active),并重置使用计数(usage_count = 1)。
通常用于设备初始化阶段(如 probe 函数中),告知 PM Runtime 框架 “dev设备初始状态为活跃”。
不会触发硬件操作(如上电),仅更新框架的状态标记。
调用场景:
驱动 probe 时初始化设备状态,避免框架误判设备为 suspend。
*4. pm_runtime_enable(struct device dev)
作用:
启用设备的 PM Runtime 功能。启用后,框架才会根据使用计数、空闲状态等自动触发 runtime_suspend/runtime_resume(即允许设备自动进入低功耗或被唤醒)。
禁用状态下(pm_runtime_disable 之后),PM Runtime 机制失效,设备通常保持 active 状态。
调用场景:
设备初始化完成后,在 probe 函数末尾启用 PM 功能:
三、状态禁用与查询函数
*6. pm_runtime_disable(struct device dev)
作用:
禁用设备的 PM Runtime 功能。禁用后:
自动挂起 / 唤醒机制失效,pm_runtime_get/put 等调用仅更新计数,不触发状态切换。
若设备当前处于 suspend 状态,会强制唤醒设备(调用 runtime_resume),确保设备回到 active 状态。
调用场景:
设备移除(remove 函数)或需要临时关闭 PM 功能时:
*7. pm_runtime_status_suspended(struct device dev)
作用:
查询设备当前是否处于 suspend 状态(返回 true 表示已 suspend,false 表示 active 或其他状态)。
调用场景:
驱动中需要根据设备当前电源状态执行不同操作时(如唤醒前先判断是否已 suspend):
*8. pm_runtime_set_suspended(struct device dev)
作用:
手动将设备状态标记为 suspend,同时重置使用计数(usage_count = 0)。
仅更新框架状态标记,不直接触发硬件下电操作(硬件操作需在 runtime_suspend 回调中实现)。
调用场景:
通常在 runtime_suspend 回调成功完成后调用,告知框架 “设备已进入低功耗”:
总结
这些函数共同构成了 PM Runtime 的状态管理体系:
pm_runtime_get_sync/pm_runtime_put 跟踪设备 “被使用” 状态;
pm_runtime_set_active/pm_runtime_set_suspended 手动设置状态标记;
pm_runtime_enable/pm_runtime_disable 控制 PM 机制的开关;
pm_runtime_idle 触发空闲检查,衔接至自动 suspend;
pm_runtime_status_suspended 用于查询当前状态。
正确组合使用这些函数,可实现设备在活跃时高效运行、空闲时自动进入低功耗的电源管理策略。
