4

我正在研究 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)

谢谢!

4

1 回答 1

2

为什么会有这么多挂起和恢复函数指针?

  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_OPSdev_pm_opsdevice_driver如果存在,将被复制到dev_pm_ops,但明确执行会更好。

driver-modeli2c 电源管理电源驱动程序文档包含有关结构和概述的更多信息。

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

于 2013-10-19T15:21:24.733 回答