2

我观察到整个设备拓扑基于Buses --> Device + Driver. linux 提供的电源管理(suspend + resume)存在于总线中。设备驱动程序中也有类似的功能。

struct bus_type { ***

    int (*suspend)(struct device *dev, pm_message_t state);

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

    *** }


    struct device_driver { ***

    int (*suspend) (struct device *dev, pm_message_t state);

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

    *** }

那么这是如何实现的呢?

4

1 回答 1

1

我搜索了很多,最后在文档中得到了答案:

为了确保在设备挂起或恢复时需要与设备通信的网桥和类似链接可用,设备树以自下而上的顺序遍历以挂起设备。自上而下的顺序用于恢复这些设备。

设备树的顺序由设备注册的顺序定义:一个孩子永远不能在其父设备之前注册、探测或恢复;并且不能在该父级之后删除或暂停。

策略是设备树应该匹配硬件总线拓扑。

关于总线和设备挂起和恢复回调:

所有阶段都使用总线、类型或类回调(即在 dev->bus->pm、dev->type->pm 或 dev->class->pm 中定义的方法)。
这些回调是互斥的,所以如果设备类型提供了一个由其 pm 字段指向的 struct dev_pm_ops 对象(即同时定义了 dev->type 和 dev->type->pm),则包含在该对象中的回调(即 dev ->type->pm) 将被使用。否则,如果类提供了一个由其 pm 字段指向的 struct dev_pm_ops 对象(即定义了 dev->class 和 dev->class->pm),PM 核心将使用来自该对象的回调(即 dev->类->下午)。
最后,如果设备类型和类对象的 pm 字段都为 NULL(或者这些对象不存在),则将使用总线提供的回调(即来自 dev->bus->pm 的回调)(这允许设备类型在必要时覆盖总线类型或类提供的回调)。

于 2012-10-26T05:34:41.683 回答