2

Freescale MX6 と 3.10.31 Freescale 修正カーネルを使用しています。私はマキシム MAX7325 を IO エクスパンダとして使用しています。これには、P0-P2 にプッシュボタンが接続されています。7325 からの割り込みラインは GPIO_3 パッドに接続されています (これは GPIO1_3 だと思います...)

次のように、デバイス ツリーに 7325 と gpio キーを設定します。

max7325_reset: max7325-reset {
  compatible = "gpio-reset";
  reset-gpios = <&gpio5 16 GPIO_ACTIVE_LOW>;
  reset-delay-us = <1>;
  #reset-cells = <0>;
};


gpio-keys {
  compatible = "gpio-keys";

  sw2 {
     gpios = <&max7325 2 GPIO_ACTIVE_LOW>;
     linux,code = <30>;    //a
     gpio-key,wakeup;
  };
};

&i2c1 {
   clock-frequency = <100000>;
   pinctrl-names = "default";
   pinctrl-0 = <&pinctrl_i2c1_2>;
   status = "okay";

   max7325: gpio@68 {
      compatible = "maxim,max7325";
      reg = <0x68>;
      gpio-controller;
      #gpio-cells = <2>;
      resets = <&max7325_reset>;

      gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
      interrupt-parent = <&gpio1>;
      interrupts = <3 2>;
   };
};

MAX7325 ドライバのプローブが呼び出されると、client->dev.platform_data が NULL になるように見えます。このため、後で max732x_irq_setup が呼び出されたときに、chip->gpio_chip.to_irq ポインターが max732x_gpio_to_irq 関数を指すようにセットアップされません (おそらく、これが機能するための適切な情報がないためです)。最初の入力を設定しようとすると、割り込みを設定しようとすると失敗し、他のキーは設定されません。

gpio-keys gpio-keys.20: Unable to get irq number for GPIO 242, error -6

/sys インターフェイスを使用して、P0 が GPIO 240 にマップされることを確認したので、GPIO 242 は、セットアップしようとしていた sw2 GPIO-KEY です。

このドライバはデバイス ツリーで動作しないのでしょうか? デバイス ツリーのプロパティを取得しようとしている様子は見られませんが、私が調べた他の IO エキスパンダー ドライバーも同様でした。そのため、I2C コアがデバイス ツリーを読み取っており、そこから platform_data を入力する必要があるのではないかと考えました。ドライバーのプローブ関数を呼び出します (?)

私はこれにかなり慣れていないので、助けていただければ幸いです。=) デバイス ツリーのドキュメントをオンラインでいくつか読みましたが、これはかなり具体的なことであり、正しく行っていないため、カバーされていないと思います... (?)

カーネルで CONFIG_GPIO_MAX732X_IRQ を構成しています...そして、ある時点で max7325 I2c1 ノードの interrupt-controller プロパティを設定しようとしましたが、それが必要かどうか確信が持てませんでした (?)

4

1 に答える 1

5

MAX732x デバイスツリーのサポート

使用しているドライバーは、デバイス ツリーのデータでは機能しません。このドライバーにデバイス ツリーのサポートを追加し、レビューのためにカーネル メーリング リストに送信しましたが、まだマージされていません。このスレッドを参照してください(合計 4 つのパッチ):

これらのパッチをブランチに適用するか、アップストリーム カーネルに適用されるのを待ってから、そこから (ブランチに) チェリー ピックすることができます。

バインディングのドキュメント(上記のパッチを参照)には、MAX732xのデバイスツリー宣言を作成する方法が示されています。あなたの場合、次のようになります。

&i2c1 {
    expander: max7325@68 {
        compatible = "maxim,max7325";
        reg = <0x68>;
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
        interrupt-parent = <&gpio1>;
        interrupts = <3 2>;
    };
};

このドライバーを (上記のパッチなしで) 使用するもう 1 つの方法は、ボードのボード ファイルでプラットフォーム データを指定することです。次のファイルのいずれかである必要があると思います。

  • アーチ/アーム/マッハ-imx/マッハ-imx6q.c
  • アーチ/アーム/マッハ-imx/マッハ-imx6sl.c
  • アーチ/アーム/マッハ-imx/マッハ-imx6sx.c

これを行う方法の例は、arch/arm/mach-pxa/littleton.c の 394 行にあります。

しかし、それは信頼できる方法ではないかもしれません. また、board ファイルと dts ファイルにデバイスの定義を分散させるのも悪いようです。したがって、上記のパッチを使用することを強くお勧めします。

質問への回答

MAX7325 ドライバのプローブが呼び出されると、client->dev.platform_data が NULL になるように見えます。

これは、ドライバがボード ファイルからではなく、デバイス ツリー ファイルからのデバイス宣言にバインドされているために発生します。その場合、ドライバーはclient->dev.platform_dataの代わりにclient-> dev.of_node を使用する必要があります。上記のパッチでそれがどのように行われるかを見てください。

バインド/マッチング/インスタンス化がどのように行われるかについては、カーネルのドキュメントで詳しく読むことができます:

  • Documentation/i2c/instantiating-devices
  • Documentation/devicetree/usage-model.txt

I2C コアがデバイス ツリーを読み取っており、ドライバーのプローブ関数を呼び出す前に、そこから platform_data を何らかの方法で入力することになっているのではないかと思いました (?)

いいえ。バインディングが発生すると、client->irqが I2C コアに自動的に入力されます (ドライバーのプローブ関数が呼び出される前)。gpio_baseirq_baseなどのプロパティ-- データがデバイス ツリーから取得された場合は必要ありません。

ある時点で、max7325 I2c1 ノードの interrupt-controller プロパティを設定しようとしましたが、それが必要かどうか確信が持てませんでした (?)

MAX7325 は、入力ライン (より具体的には、入力として構成されたオープンドレイン I/O ポート) の変化を検出すると、SoC に割り込みを発行します。そのため、ドライバーが入力 I/O ラインごとに個別の割り込みを生成するようにする場合 (他のドライバーがそれらを消費できるようにするため)、「interrupt-controller」および「#interrupt-cells」プロパティを指定する必要があります。ただし、これには、上記のすべてのパッチを適用する必要があります。

パッチのステータス

上記のすべてのパッチがアップストリーム カーネル (v4.0 以降) にマージされました。

  1. gpio: max732x: デバイス ツリーのサポートを追加
  2. gpio: max732x: irq_domain API を使用するように IRQ コードを書き直しました
  3. gpio: max732x: デッドロックの可能性を修正
  4. gpio: max732x: DT バインディングのドキュメントを追加

また、私のパッチの上にいくつかの新しいパッチが作成されたことにも注意してください。ここで見ることができます。

于 2015-01-14T00:24:50.237 に答える