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ポインターが除外される場合がありますが、suspendおよびresumeドライバーフックがあります。ディスクへのサスペンドやその他の機能 を完全にstruct dev_pm_opsサポートします。メモリへのサスペンドはより一般的であり、. が NULL でない場合、2 つのポインタは同じになります。これら 2 つは、ドライバーで同じルーチンを呼び出す必要があります。struct device_driverstruct dev_pm_ops

ドライバーにはどれを使用すればよいですか?

おそらく、それらのいずれも使用しないでください。おそらく、ドライバーが他のサブシステムの一部である可能性が高くなります。 たとえば、i2cはwm8940.cなどコーデックで使用されます。一般に、i2cは中央制御サブシステムではありません。これは、チップセットを制御するために他の何かによって使用されるドライバーです。サウンドサブシステムはi2cの前に中断されるため、そこにフックを配置することをお勧めします。ドライバが純粋なi2cの場合は、pm.hのマクロを使用して、 ;SET_SYSTEM_SLEEP_PM_OPSの設定を条件付けします。dev_pm_ops両方を設定します。おそらく、device_driver存在する場合はにコピーされますdev_pm_opsが、明示的に行う方が適切です。

driver-modeli2c 電源管理、および電源ドライバーのドキュメントには、構造と概要に関する詳細情報があります。

注:この場合、複数のdevice_driver構造があります。通常はi2c_driver、制御ドライバーによって管理されます。制御ドライバーは、インターフェイスを使用するサブシステムのsuspend/を実装する必要があります。resumei2c_driver

于 2013-10-19T15:21:24.733 に答える