dev_set_drvdata和dev_get_drvdata函數

 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數據。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章