哪个挂起/恢复指针是正确的使用



我正在研究 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. i2c_driver - 旧版支持。
  2. device_driver - 标准支持。
  3. dev_pm_ops - 扩展电源管理。

请注意,它们都是函数指针有挂起恢复的顺序。 例如,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,但显式执行此操作更好。

驱动程序模型、i2c 电源管理和电源驱动程序文档包含有关结构和概述的详细信息。

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

最新更新