转自:http://blog.csdn.net/wlwl0071986/article/details/42677403

一、Runtime PM引言

1. 背景

(1)display的需求

(2)系统整机动态功耗优化的需求

(3)upstream

2. 解决方案

(1)引入debounce

(2)使用统一的workqueue来管理任务

(3)实时地关闭不需要工作的device

(4)当device作为parent时,所有的child不工作时,关闭该device

(5)引入pm_rutime

3. 性能指标

(1)快速开关屏场景,亮屏速度提升

(2)动态功耗,更为稳定;唤醒而不亮屏的场景,功耗更低

(3)有助于降低系统整机动态功耗

二、Runtime PM框架

1. Runtime PM层次结构

2. Runtime PM状态

3. Runtime PM控制流程

每个设备或者子系统都会向Runtime PM core注册3个callback。

在struct dev_pm_ops结构体中,定义了这三个callback:
          struct dev_pm_ops {
    ...
    int (*runtime_suspend)(struct device *dev);
    int (*runtime_resume)(struct device *dev);
    int (*runtime_idle)(struct device *dev);
    .suspend
    .resume
          };
     注:引入runtime之后,suspend 接口需和runtime接口放在同一个数据结构内;

4. rpm_status(include\linux\pm.h)

enum rpm_status {
            RPM_ACTIVE = 0, /* 表示runtime_resume()被成功执行 */
            RPM_RESUMING, /* 表示runtime_resume()正在被执行 */
            RPM_SUSPENDED, /* 表示runtime_suspend()被成功执行 */
            RPM_SUSPENDING, /* 表示runtime_suspend()正在被执行 */
        };

5. rpm_request(include\linux\pm.h)

enum rpm_request {
            RPM_REQ_NONE = 0,RPM_REQ_IDLE, /* 执行runtime_idle() */

RPM_REQ_SUSPEND, /* 执行runtime_suspend () */
            RPM_REQ_AUTOSUSPEND,  /* 延迟autosuspend_delay后执行runtime_suspend() */
            RPM_REQ_RESUME,  /* 执行runtime_resume() */
        };
       请求的类型(设置request_pending才有效)。

6. Idle Reference API

pm_runtime_put_noidle: only put
        pm_runtime_idle
        pm_request_idle:async
        pm_runtime_put: put + async
        pm_runtime_put_sync

7. Suspend Reference API

pm_schedule_suspend
        pm_runtime_suspend: 
        pm_runtime_put_sync_suspend: put
        pm_runtime_autosuspend: auto
        pm_request_autosuspend:async + auto
        pm_runtime_put_autosuspend: put + async + auto
        pm_runtime_put_sync_autosuspend: put + auto

8. Resume Reference API

pm_runtime_get_noresume
        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_put_autosuspend: put + async + auto
        pm_runtime_put_sync_autosuspend: put + auto
    suspend的条件:
        usage_cnt= 0; 
        disable_depth = 0; 
        runtime_status = RPM_ACTIVE

10. Device Runtime PM idle流程

idle的触发:
        pm_runtime_put_noidle: only put
        pm_runtime_idle
        pm_request_idle:async
        pm_runtime_put: put + async
        pm_runtime_put_sync
      idle的条件:
        usage_cnt= 0; 
        disable_depth = 0; 
        runtime_status = RPM_ACTIVE

11. Device Runtime PM resume流程

触发:
          pm_runtime_get_noresume
          pm_runtime_resume
          pm_request_resume: async
          pm_runtime_get: get + async
          pm_runtime_get_sync: get
      条件:
          disable_depth = 0
          runtime_status != RPM_ACTIVE

三、Runtime PM和设备模型

1. Device Runtime PM 初始化

(1)设备模型完成pm_runtime 的初始化;

(2)对pm_runtime 状态的改变,需在device_register 之后实现;

(3)设备模型,在调用drv probe, remove, shutdown 等接口时,

可以保证pm_runtime 处于disable 状态,或其他约定状态;

void pm_runtime_init(struct device *dev)
        {
            dev->power.runtime_status = RPM_SUSPENDED;
            dev->power.idle_notification = false;
            dev->power.disable_depth = 1;
            atomic_set(&dev->power.usage_count, 0);
            dev->power.runtime_error = 0;
            atomic_set(&dev->power.child_count, 0);
            pm_suspend_ignore_children(dev, false);
            dev->power.runtime_auto = true;
            dev->power.request_pending = false;
            dev->power.request = RPM_REQ_NONE;
            dev->power.deferred_resume = false;
            dev->power.accounting_timestamp = jiffies;
            INIT_WORK(&dev->power.work, pm_runtime_work);
            dev->power.timer_expires = 0;
            setup_timer(&dev->power.suspend_timer, pm_suspend_timer_fn, (unsigned long)dev);
            init_waitqueue_head(&dev->power.wait_queue);
        }

platform_device_register(&platform_disp_device);
        pm_runtime_set_active(&platform_disp_device.dev);
        pm_runtime_get_noresume(&platform_disp_device.dev);
        pm_runtime_enable(&platform_disp_device.dev);
        pm_runtime_set_autosuspend_delay(&platform_disp_device.dev, 5000);
        pm_runtime_use_autosuspend(&platform_disp_device.dev);
        platform_driver_register(&disp_driver);

2. Device Runtime PM remove流程

3. Device Runtime PM shutdown流程

四、Runtime PM和电源管理

1. system sleep flow

2. system sleep flow: resume

3. system sleep flow: suspend

五、Runtime PM实例分析

Linux Runtime PM介绍【转】的更多相关文章

  1. linux runtime pm在深入了解的机制

    一:runtime机构简介 何为runtime机制?也就是系统在非睡眠状态,设备在空暇时能够进入runtime suspend状态同一时候不依赖系统wake_lock机制.非空暇时运行runtime  ...

  2. linux驱动程序之电源管理之Run-time PM 详解(4)

    Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback   struct dev_pm_ops { ... int (*runtime_su ...

  3. Runtime PM 处理不当导致的 external abort on non-linefetch 案例分享

    硬件平台:某ARM SoC 软件平台:Linux 1 Runtime PM 简介 在介绍 Runtime PM 之前,不妨先看看传统的电源管理.传统的电源管理机制,称之为 System PM(Syst ...

  4. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  5. Linux的简单介绍和常用命令的介绍

    Linux的简单介绍和常用命令的介绍 本说明以Ubuntu系统为例 Ubuntu系统的安装自行百度,或者参考http://www.cnblogs.com/CoderJYF/p/6091068.html ...

  6. Linux性能工具介绍

    l  Linux性能工具介绍 p  CPU高 p  磁盘I/O p  网络 p  内存 p  应用程序跟踪 l  操作系统与应用程序的关系比喻为“唇亡齿寒”一点不为过 l  应用程序的性能问题/功能问 ...

  7. Linux core 文件介绍

    Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个 ...

  8. Linux 启动参数介绍

    Linux 启动参数介绍 取自2.6.18 kernel Documentation/i386/boot.txt 文件中介绍 vga= 这里的不是一个整数(在C语言表示法中,应是十进制,八进制或者十六 ...

  9. Linux系统启动过程介绍

    Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...

随机推荐

  1. MySQL主从配置问题整理

    前段时间线下数据库需要搭建主从库.由于不想备份数据库,打算直接克隆数据库虚拟机到新的一台,然后配置主从同步.以前没这么干过,所以也没有遇到过什么问题,今天把遇到的问题整理了一下. 192.168.3. ...

  2. pwd命令(转)

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  3. 56个睿智帅气貌美的CTO大牛陪你叨逼叨

    技术领域门槛高,苦读十年有时不如大牛一指点 可CTO级别的大牛何处找? 别急,别急 他们1月12日都去参加APICloud新品发布会了! (没图说啥子) 各路大牛们云集,不仅是为APICloud新品发 ...

  4. ucenter 客户端里的自动方法

    <?php /** * UCenter 应用程序开发 Example * * UCenter 简易应用程序,应用程序有自己的用户表 * 使用到的接口函数: * uc_authcode() 可选, ...

  5. 作业一直"执行"

    背景:一个作业有7个步骤,前面的步骤成功/失败都转到下一步,直至最后退出,作业计划是每天早上8点执行.步骤中的语句是例行检查脚本,之前的历史记录都是一分钟内完成.此次重启数据库服务器后,检查发现此作业 ...

  6. IDisplayTransformation

    IDisplayTransformation Bounds Full extent in world coordinates. The Bounds property controls the ful ...

  7. iOS - (TableView中利用系统的 cell 设置 cell.textlabel 位置和大小)

    今天工作稍微的遇到了一点小小的难题,需求效果中 TableView cell 中的 Label 字体大小比原先系统中的要大些且 Label 位置不是在前面,而是在中间往后,对于这个问题我第一时间也是想 ...

  8. Java基础之一组有用的类——使用Scanner对象(TryScanner)

    控制台程序. java.util.Scanner类定义的对象使用正则表达式来扫描来自各种源的字符输入,并把输入显示为各种基本类型的一系列标记或者显示为字符串. 默认情况下,Scanner对象读取标记时 ...

  9. JDK里的设计模式

    一.Creational patterns 创建模式 Abstract factory (recognizeable by creational methods returning the facto ...

  10. IntelliJ IDEA 常用设置讲解3

    IntelliJ IDEA 有很多人性化的设置我们必须单独拿出来讲解,也因为这些人性化的设置让我们这些 IntelliJ IDEA 死忠粉更加死心塌地使用它和分享它. 常用设置 如上图 Gif 所示, ...