linux dpm机制分析(下)【转】

简介:

转自:http://blog.csdn.net/lixiaojie1012/article/details/23707901

1      设备注册到dpm_list路径

(Platform_device->device->device_driver指向platform_driver->driver)

 

2      低功耗接口

dpm_suspend_start():调用注册到dpm_list的设备的回调函数,执行睡眠前的准备和保存工作;

dpm_suspend_end():执行suspend_late和suspend_noirq设备的回调函数,进行睡眠前的准备工作。

睡眠时,设备在链表中的转移:

dpm_list--->dpm_prepared_list-->dpm_suspended_list---->

dpm_late_early_list--->dpm_noirq_list

 

Dpm_resume_start():执行设备的resume_noirq和resume_early回调,恢复suspend_noirq和suspend_late阶段保存的东西

dpm_resume_end():执行各设备的resume和complete回调接口,做suspend和prepare的逆操作

唤醒时,设备从链表中的转移顺序是上述suspend阶段顺序的逆序。

3      低功耗接口是如何调用到各设备驱动注册的回调函数的

系统进入睡眠前回调设备的回调函数是有选择的:

如果dev->pm_domain域的回调函数注册的话,首选此处的回调函数

否则,如果dev->type域和dev->type->pm域都注册的话,会选择dev->type->pm处的回调函数

否则,如果dev->class 和 dev->class->pm两处都注册回调函数的话,会选择dev->class->pm的回调函数

如果dev->bus 和 dev->bus->pm两处都注册回调函数的话,会选择dev->bus->pm的回调函数

示例方法1和方法4:

3.1       在dev域的电源域进行注册

struct platform_device {

       const char       * name;

       int          id;

       bool        id_auto;

       struct device   dev;

       u32         num_resources;

       struct resource * resource;

       const struct platform_device_id     *id_entry;

       /* MFD cell pointer */

       struct mfd_cell *mfd_cell;

       /* arch specific additions */

       struct pdev_archdata      archdata;

};

struct device {

       struct device          *parent;

       struct device_private      *p;

       struct kobject kobj;

       const char              *init_name; /* initial name of the device */

       const struct device_type *type;

       struct mutex           mutex;    /* mutex to synchronize calls to

                                    * its driver.*/

       struct bus_type       *bus;              /* type of bus device is on */

       struct device_driver *driver;  /* which driver has allocated this device */

       void        *platform_data;      /* Platform specific data, device core doesn't touch it */

       struct dev_pm_info power;

       struct dev_pm_domain *pm_domain;

…….}

struct dev_pm_domain {

       struct dev_pm_ops  ops;

};

struct dev_pm_ops {

       int (*prepare)(struct device *dev);

       void (*complete)(struct device *dev);

       int (*suspend)(struct device *dev);

       int (*resume)(struct device *dev);

       int (*freeze)(struct device *dev);

       int (*thaw)(struct device *dev);

       int (*poweroff)(struct device *dev);

       int (*restore)(struct device *dev);

       int (*suspend_late)(struct device *dev);

       int (*resume_early)(struct device *dev);

       int (*freeze_late)(struct device *dev);

       int (*thaw_early)(struct device *dev);

       int (*poweroff_late)(struct device *dev);

       int (*restore_early)(struct device *dev);

       int (*suspend_noirq)(struct device *dev);

       int (*resume_noirq)(struct device *dev);

       int (*freeze_noirq)(struct device *dev);

       int (*thaw_noirq)(struct device *dev);

       int (*poweroff_noirq)(struct device *dev);

       int (*restore_noirq)(struct device *dev);

       int (*runtime_suspend)(struct device *dev);

       int (*runtime_resume)(struct device *dev);

       int (*runtime_idle)(struct device *dev);

};

低功耗接口在函数__device_suspend函数内会首先调用在struct device电源域注册的回调函数。

 

唤醒时调用顺序:

 

3.2       在bus的ops电源域进行注册

注册设备和注册驱动进行匹配成功后

Platform_device->device->device_driver指针会指向platform_driver->driver成员

设备注册:

 (1)int platform_device_add(struct platform_device *pdev)

{

       ……………

       if (!pdev->dev.parent)

              pdev->dev.parent = &platform_bus;

       pdev->dev.bus = &platform_bus_type;

…………..

}

(2)struct bus_type platform_bus_type = {

       .name             = "platform",

       .dev_attrs       = platform_dev_attrs,

       .match            = platform_match,

       .uevent           = platform_uevent,

       .pm         = &platform_dev_pm_ops,

};

(3)static const struct dev_pm_ops platform_dev_pm_ops = {

       .runtime_suspend = pm_generic_runtime_suspend,

       .runtime_resume = pm_generic_runtime_resume,

       .runtime_idle = pm_generic_runtime_idle,

       USE_PLATFORM_PM_SLEEP_OPS

};

(4)#define USE_PLATFORM_PM_SLEEP_OPS \

       .suspend = platform_pm_suspend, \

       .resume = platform_pm_resume, \

       .freeze = platform_pm_freeze, \

       .thaw = platform_pm_thaw, \

       .poweroff = platform_pm_poweroff, \

       .restore = platform_pm_restore,

(5) int platform_pm_suspend(struct device *dev)

{

       struct device_driver *drv = dev->driver;

       int ret = 0;

       if (!drv)

              return 0;

       if (drv->pm) {

              if (drv->pm->suspend)

                     ret = drv->pm->suspend(dev);

       } else {

              ret = platform_legacy_suspend(dev, PMSG_SUSPEND);

       }

       return ret;

}










本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5333660.html,如需转载请自行联系原作者

相关文章
|
5天前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
30 0
|
Unix Linux iOS开发
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
52 0
|
11月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制
本文深入探讨了Linux操作系统中用于管理多线程和进程的并发控制的关键技术,包括原子操作、锁机制、自旋锁、互斥量以及信号量。通过详细分析这些技术的原理和应用,旨在为读者提供一个关于如何有效利用Linux内核提供的并发控制工具以优化系统性能和稳定性的综合视角。
238 11
|
6月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
235 11
|
10月前
|
存储 编译器 Linux
动态链接的魔法:Linux下动态链接库机制探讨
本文将深入探讨Linux系统中的动态链接库机制,这其中包括但不限于全局符号介入、延迟绑定以及地址无关代码等内容。
1892 141
|
7月前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
145 19
|
8月前
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
734 33
|
8月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
137 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
10月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
236 7
|
10月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
290 1