其中bus_type里会有一套runtime_pm的三个callback,Bdev自身还有另一套runtime_pm的三个callback。 当dev1的两个counter都为零了,就会调用bus_type里的runtime_idle,一般情况下这个idle会调用pm_runtime_suspend,仅按照上面的介绍,就会调用这个bus_type里的runtime_suspend call back。之后
pm_runtime_resume pm_request_resume: async pm_runtime_get: get + async pm_runtime_get_sync: get 9. Device Runtime suspend 流程 触发: pm_schedule_suspend pm_runtime_suspend: pm_runtime_put_sync_suspend: put pm_runtime_autosuspend: auto pm_request_autosuspend:async + auto pm_runtime_...
需要使用该设备的时候,设备驱动调用pm_runtime_get/pm_runtime_get_sync接口,增加变量usage_count的值;不再使用该设备的时候,调用pm_runtime_put/pm_runtime_put_sync接口,减小usage_count变量的值。 每次调用get接口的时候,Runtime PM framework会判断该设备的状态。如果该不是active状态,则使用异步(ASYNC)或者...
RPM get 操作类接口 当driver认为其设备需要进行工作(退出低功耗)时,调用pm_rumtime_get()/ pm_rumtime_get_sync (),向RPM core请求设备恢复正常,若条件满足,RPM core会执行到driver的runtime_resume回调函数,配置设备为工作的状态。 对于get操作接口的实现:每个设备都维护一个usage_count变量,用于记录该设备的...
pm_runtime_resume pm_request_resume: async pm_runtime_get: get + async pm_runtime_get_sync: get 9. Device Runtime suspend 流程 触发: pm_schedule_suspend pm_runtime_suspend: pm_runtime_put_sync_suspend: put pm_runtime_autosuspend: auto ...
每次调用get接口的时候,Runtime PM framework会判断该设备的状态。如果该不是active状态,则使用异步(ASYNC)或者同步(SYNC)方式调用runtime_resume回调函数,唤醒设备。 每次调用put接口的时候,Runtime PM framewokr会判断设备的引用计数,如果为零,则使用异步(ASYNC)或者同步(SYNC)方式调用runtime_idle回调函数。
5)pm_runtime_autosuspend、pm_request_autosuspend等接口,会起一个timer,并在timer到期后,使用异步(ASYNC)或同步(SYNC)的方式,调用设备的.runtime_suspend回调函数,suspend设备,同时记录设备的PM状态。 6)每一次get,RPM core都会判断设备的PM状态,如果不是active,则会使用异步(ASYNC)或同步(SYNC)的方式,调用设备...
当driver认为其设备不需要工作时,会调用pm_rumtime_get()或pm_rumtime_get_sync()请求设备进入低功耗状态。RPM core会执行到driver的runtime_resume回调函数,配置设备为低功耗状态。对于get操作接口的实现,每个设备维护一个usage_count变量,用于记录使用情况。当该值从0变成非0时,会调用到设备...
pm_runtime_get_noresume(parent); spin_lock(&parent->power.lock); /* * We can resume if the parent's run-time PM is disabled or it * is set to ignore children. */ if (!parent->power.disable_depth && !parent->power.ignore_children) { __pm_runtime_resu...
因此,RPM core提供的默认接口(pm_runtime_get/pm_runtime_put等),采用异步调用的方式(由ASYNC flag表示),启动一个work queue,在单独的线程中,调用.runtime_xxx回调函数,这可以保证设备驱动之外的其它模块正常运行。 另外,如果设备驱动清楚地知道自己要做什么,也可以使用同步接口(pm_runtime_get_sync/pm_runtime...