2011-10-03 7 views
4

私はlinuxに登録された特定のデバイスへのポインタを取得する必要があります。簡単に言うと、このデバイスはmii_busオブジェクトを表します。問題は、このデバイスはバスに属していないようです(そのdev->busNULLです)ので、例えばbus_for_each_devの機能を使用することはできません。しかし、デバイスはOpen Firmwareレイヤーによって登録されており、/sys/bus/of_platformに相対的なof_device(興味のあるデバイスの親である)が表示されます。私のデバイスもclassに登録されていますので、/sys/class/mdio_busで見つけられます。今の質問:linuxのstructデバイスへのポインタを取得するためのよりクリーンな方法はどれですか?

  1. それは私たちが望むデバイスの親であるof_deviceへのポインタを使ってポインタを取得することが可能ですか?

  2. 名前を使用して既にインスタンス化されたクラスへのポインタを取得するにはどうすればよいですか?可能であれば、そのクラスのデバイスを反復することができます。

その他のアドバイスは非常に便利です!皆さん、ありがとうございました。

答えて

5

私は方法を見つけました。私はそれを簡単に説明します、それは役に立つかもしれません。使用できる方法はdevice_find_childです。このメソッドは、第3のパラメータとして、比較論理を実装する関数へのポインタをとる。特定のデバイスを最初のパラメータとして呼び出したときに関数がゼロでない場合、device_find_childはそのポインタを返します。

#include <linux/device.h> 
#include <linux/of_platform.h> 

static int custom_match_dev(struct device *dev, void *data) 
{ 
    /* this function implements the comaparison logic. Return not zero if device 
    pointed by dev is the device you are searching for. 
    */ 
} 

static struct device *find_dev() 
{ 
    struct device *ofdev = bus_find_device_by_name(&of_platform_bus_type, 
               NULL, "OF_device_name"); 
    if (ofdev) 
    { 
    /* of device is the parent of device we are interested in */ 

    struct device *real_dev = device_find_child(ofdev, 
               NULL, /* passed in the second param to custom_match_dev */ 
               custom_match_dev); 
    if (real_dev) 
     return real_dev; 
    } 
    return NULL; 
} 
+1

device_find_child()は、見つかった子デバイスの参照カウンタを増加させることに注意してください。したがって、子デバイスの使用が終了したら** put_device()を実行する必要があります。 – Federico

関連する問題