デバイスドライバ内で、ドライバの固有情報を設定、取得する方法の概要です。
基本的には、最初に dev_set_drvdata() で struct device に覚えさせた値を、必要なタイミングで dev_get_drvdata() で取得するだけです。
そんな機能の何が嬉しいか?というと、コールバックなどで引数として struct device * を渡されたときに、デバイスに対応する、ドライバの固有の情報を引き出せます。
デバイスとドライバの対応を持つ必要も無いし、グローバル変数も要りません。嬉しいですよね?
使い方のイメージ
struct my_device { int some_data; ... }; //デバイスの登録 int my_probe(struct device *dev) { struct my_device *d; ... //ドライバで使う固有のデータなどを設定する d = kzalloc(sizeof(struct my_device)); d->some_data = 1000; ... //デバイスに固有データの領域を覚えておいてもらう dev_set_drvdata(dev, d); ... device_add(dev); } //デバイスに対して何かする int my_callback(struct device *dev) { struct my_device *d = dev_get_drvdata(dev); ... //ドライバで使う固有のデータにアクセスできる printk("data is %d.\n", d->some_data); ... }
取得、設定する関数は下記の通り。
似た名前の関数 (...._get_drvdata()) は他にもあるが、同じスキームで動いていると思ってもらって構わないはず。