dca-sysfs.c

来自「linux 内核源代码」· C语言 代码 · 共 89 行

C
89
字号
#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/device.h>#include <linux/idr.h>#include <linux/kdev_t.h>#include <linux/err.h>#include <linux/dca.h>static struct class *dca_class;static struct idr dca_idr;static spinlock_t dca_idr_lock;int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot){	struct class_device *cd;	cd = class_device_create(dca_class, dca->cd, MKDEV(0, slot + 1),				 dev, "requester%d", slot);	if (IS_ERR(cd))		return PTR_ERR(cd);	return 0;}void dca_sysfs_remove_req(struct dca_provider *dca, int slot){	class_device_destroy(dca_class, MKDEV(0, slot + 1));}int dca_sysfs_add_provider(struct dca_provider *dca, struct device *dev){	struct class_device *cd;	int err = 0;idr_try_again:	if (!idr_pre_get(&dca_idr, GFP_KERNEL))		return -ENOMEM;	spin_lock(&dca_idr_lock);	err = idr_get_new(&dca_idr, dca, &dca->id);	spin_unlock(&dca_idr_lock);	switch (err) {	case 0:		break;	case -EAGAIN:		goto idr_try_again;	default:		return err;	}	cd = class_device_create(dca_class, NULL, MKDEV(0, 0),				 dev, "dca%d", dca->id);	if (IS_ERR(cd)) {		spin_lock(&dca_idr_lock);		idr_remove(&dca_idr, dca->id);		spin_unlock(&dca_idr_lock);		return PTR_ERR(cd);	}	dca->cd = cd;	return 0;}void dca_sysfs_remove_provider(struct dca_provider *dca){	class_device_unregister(dca->cd);	dca->cd = NULL;	spin_lock(&dca_idr_lock);	idr_remove(&dca_idr, dca->id);	spin_unlock(&dca_idr_lock);}int __init dca_sysfs_init(void){	idr_init(&dca_idr);	spin_lock_init(&dca_idr_lock);	dca_class = class_create(THIS_MODULE, "dca");	if (IS_ERR(dca_class)) {		idr_destroy(&dca_idr);		return PTR_ERR(dca_class);	}	return 0;}void __exit dca_sysfs_exit(void){	class_destroy(dca_class);	idr_destroy(&dca_idr);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?