哪个暂停/恢复指针是正确的?

时间:2013-10-18 21:55:05

标签: linux-kernel power-management

我正在研究i2c驱动程序的电源管理,并注意到一些奇怪的事情。

include/linux/i2c.h

struct i2c_driver {
    //...
    int (*suspend)(struct i2c_client *, pm_message_t mesg);
    int (*resume)(struct i2c_client *);
    //...
    struct device_driver driver;
    //...
}

include/linux/device.h

struct device_driver {
    //...
    int (*suspend) (struct device *dev, pm_message_t state);
    int (*resume) (struct device *dev);
    //...
    const struct dev_pm_ops *pm;
    //...
}

include/linux/pm.h

struct dev_pm_ops {
    //...
    int (*suspend)(struct device *dev);
    int (*resume)(struct device *dev);
    //...
}

为什么有这么多暂停和恢复功能指针?某种传统的东西?我应该为司机使用哪一个?

我正在使用旧内核(2.6.35)

谢谢!

1 个答案:

答案 0 :(得分:1)

  

为什么有这么多暂停和恢复功能指针?

  1. i2c_driver - 遗产支持。
  2. device_driver - 标准支持。
  3. dev_pm_ops - 扩展电源管理。
  4. 请注意,它们都是函数指针。有暂停恢复的顺序。例如, i2c 控制器必须在设备之后挂起,但之前已恢复

      

    某种遗产?

    struct i2c_driver是传统的机械主义。它在整个电力基础设施建立之前就存在了。同样,某些配置可能会排除完整的struct dev_pm_ops指针,但会有suspendresume个驱动程序挂钩。完整struct dev_pm_ops支持挂起到磁盘和其他功能。 挂起到内存更常见,并在struct device_driver中给出指针空间。如果struct dev_pm_ops为非NULL,则两个指针将相同。这两个应该在你的驱动程序中调用相同的例程。

      

    我应该为司机使用哪一个?

    你可能不应该使用它们中的任何一个。您的驱动程序可能更有可能是其他子系统的一部分。 请参阅注意 例如, i2c 用于编解码器,如wm8940.c。通常, i2c 不是中央控制子系统。它是由其他东西用来控制芯片组的驱动程序。 声音子系统将在 i2c 之前暂停,最好将挂钩放在那里。如果您的驱动程序是纯 i2c ,则使用pm.h中的宏,例如SET_SYSTEM_SLEEP_PM_OPS来设置dev_pm_ops;所以设置它们。如果device_driver存在,dev_pm_ops很可能会被复制到device_driver,但明确地做到这一点会更好。

    driver-modeli2c power managementpower driver文档提供了有关结构和概述的更多信息。

    注意:在这种情况下,有多个i2c_driver结构。通常suspend由控制驱动程序管理。控制驱动程序应为其子系统实现resume / i2c_driver,该子系统使用{{1}}接口。