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 に答える