dev_set_drvdata函數用來設置device 的私有數據,
dev_get_drvdata函數用來獲取device 的私有數據。
兩個函數的定義如下:
/*
* These exports can't be _GPL due to .h files using this within them, and it
* might break something that was previously working...
*/
void *dev_get_drvdata(const struct device *dev)
{
if (dev && dev->p)
return dev->p->driver_data;
return NULL;
}
EXPORT_SYMBOL(dev_get_drvdata);
int dev_set_drvdata(struct device *dev, void *data)
{
int error;
if (!dev->p) {
error = device_private_init(dev);
if (error)
return error;
}
dev->p->driver_data = data;
return 0;
}
EXPORT_SYMBOL(dev_set_drvdata);
dev_set_drvdata函數一般在初始化 dev後執行, dev_get_drvdata函數主要在於其他子系統交互的函數中執行,用來獲取當前driver data。
舉例參考:
power_supply_core.c文件中, dev_set_drvdata函數在power_supply_register中初始化,
其他驅動調用power_supply_register註冊power_supply。
int power_supply_register(struct device *parent, struct power_supply *psy)
{
struct device *dev;
int rc;
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)
return -ENOMEM;
device_initialize(dev);
dev->class = power_supply_class;
dev->type = &power_supply_dev_type;
dev->parent = parent;
dev->release = power_supply_dev_release;
dev_set_drvdata(dev, psy);
psy->dev = dev;
............
}
對dev初始化完畢後執行dev_set_drvdata,保存驅動的私有數據。
static int __power_supply_is_system_supplied(struct device *dev, void *data)
{
union power_supply_propval ret = {0,};
struct power_supply *psy = dev_get_drvdata(dev);
unsigned int *count = data;
(*count)++;
if (psy->type != POWER_SUPPLY_TYPE_BATTERY) {
if (psy->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &ret))
return 0;
if (ret.intval)
return ret.intval;
}
return 0;
}
在__power_supply_is_system_supplied函數中調用dev_get_drvdata獲取device的私有數據,這樣不同的驅動使用power_supply_register註冊,都能夠獲取到對應的device數據。