linux-2.6.33/__uio_register_device()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#k15af749]
#backlinks
*説明 [#v278fd84]
-パス: [[linux-2.6.33/drivers/uio/uio.c]]
-FIXME: これは何?
--説明
**引数 [#g94acd49]
-
--
**返り値 [#vcc453f0]
-
--
**参考 [#z051e64f]
*実装 [#d9c130dd]
/**
* uio_register_device - register a new userspace IO dev...
* @owner: module that creates the new device
* @parent: parent device
* @info: UIO device capabilities
*
* returns zero on success or a negative error code.
*/
int __uio_register_device(struct module *owner,
struct device *parent,
struct uio_info *info)
{
struct uio_device *idev;
-
--[[linux-2.6.33/uio_device]]
int ret = 0;
if (!parent || !info || !info->name || !info->version)
return -EINVAL;
info->uio_dev = NULL;
ret = init_uio_class();
if (ret)
return ret;
-
--[[linux-2.6.33/init_uio_class()]]
idev = kzalloc(sizeof(*idev), GFP_KERNEL);
if (!idev) {
ret = -ENOMEM;
goto err_kzalloc;
}
-
--[[linux-2.6.33/kzalloc()]]
idev->owner = owner;
idev->info = info;
init_waitqueue_head(&idev->wait);
atomic_set(&idev->event, 0);
-
--[[linux-2.6.33/init_waitqueue_head()]]
-
--[[linux-2.6.33/atomic_set()]]
ret = uio_get_minor(idev);
if (ret)
goto err_get_minor;
-
--[[linux-2.6.33/uio_get_minor()]]
idev->dev = device_create(uio_class->class, parent,
MKDEV(uio_major, idev->minor), idev,
"uio%d", idev->minor);
if (IS_ERR(idev->dev)) {
printk(KERN_ERR "UIO: device register failed\n");
ret = PTR_ERR(idev->dev);
goto err_device_create;
}
-
--[[linux-2.6.33/device_create()]]
-
--[[linux-2.6.33/IS_ERR()]]
-
--[[linux-2.6.33/printk()]]
-
--[[linux-2.6.33/PTR_ERR()]]
ret = uio_dev_add_attributes(idev);
if (ret)
goto err_uio_dev_add_attributes;
-
--[[linux-2.6.33/uio_dev_add_attributes()]]
info->uio_dev = idev;
if (idev->info->irq >= 0) {
ret = request_irq(idev->info->irq, uio_interrupt,
idev->info->irq_flags, idev->info->name, idev);
if (ret)
goto err_request_irq;
}
-ユーザ定義のデバイスが割り込みを使用するならば、
カーネルにハンドラを登録する。
-ただしユーザ定義のハンドラを直接登録するのではなく、
いったん uio_interrupt() を登録し、
uio_interrupt() 経由でユーザ定義のハンドラを呼び出す。
--[[linux-2.6.33/request_irq()]]
--[[linux-2.6.33/uio_interrupt()]]
return 0;
err_request_irq:
uio_dev_del_attributes(idev);
-
--[[linux-2.6.33/uio_dev_del_attributes()]]
err_uio_dev_add_attributes:
device_destroy(uio_class->class, MKDEV(uio_major, idev-...
-
--[[linux-2.6.33/device_destroy()]]
err_device_create:
uio_free_minor(idev);
-
--[[linux-2.6.33/uio_free_monitor()]]
err_get_minor:
kfree(idev);
-
--[[linux-2.6.33/kfree()]]
err_kzalloc:
uio_class_destroy();
-
--[[linux-2.6.33/uio_class_destroy()]]
return ret;
}
EXPORT_SYMBOL_GPL(__uio_register_device);
-他のモジュールにシンボルを公開する。
--[[linux-2.6.33/EXPORT_SYMBOL_GPL()]]
*コメント [#y9d563cd]
終了行:
*参照元 [#k15af749]
#backlinks
*説明 [#v278fd84]
-パス: [[linux-2.6.33/drivers/uio/uio.c]]
-FIXME: これは何?
--説明
**引数 [#g94acd49]
-
--
**返り値 [#vcc453f0]
-
--
**参考 [#z051e64f]
*実装 [#d9c130dd]
/**
* uio_register_device - register a new userspace IO dev...
* @owner: module that creates the new device
* @parent: parent device
* @info: UIO device capabilities
*
* returns zero on success or a negative error code.
*/
int __uio_register_device(struct module *owner,
struct device *parent,
struct uio_info *info)
{
struct uio_device *idev;
-
--[[linux-2.6.33/uio_device]]
int ret = 0;
if (!parent || !info || !info->name || !info->version)
return -EINVAL;
info->uio_dev = NULL;
ret = init_uio_class();
if (ret)
return ret;
-
--[[linux-2.6.33/init_uio_class()]]
idev = kzalloc(sizeof(*idev), GFP_KERNEL);
if (!idev) {
ret = -ENOMEM;
goto err_kzalloc;
}
-
--[[linux-2.6.33/kzalloc()]]
idev->owner = owner;
idev->info = info;
init_waitqueue_head(&idev->wait);
atomic_set(&idev->event, 0);
-
--[[linux-2.6.33/init_waitqueue_head()]]
-
--[[linux-2.6.33/atomic_set()]]
ret = uio_get_minor(idev);
if (ret)
goto err_get_minor;
-
--[[linux-2.6.33/uio_get_minor()]]
idev->dev = device_create(uio_class->class, parent,
MKDEV(uio_major, idev->minor), idev,
"uio%d", idev->minor);
if (IS_ERR(idev->dev)) {
printk(KERN_ERR "UIO: device register failed\n");
ret = PTR_ERR(idev->dev);
goto err_device_create;
}
-
--[[linux-2.6.33/device_create()]]
-
--[[linux-2.6.33/IS_ERR()]]
-
--[[linux-2.6.33/printk()]]
-
--[[linux-2.6.33/PTR_ERR()]]
ret = uio_dev_add_attributes(idev);
if (ret)
goto err_uio_dev_add_attributes;
-
--[[linux-2.6.33/uio_dev_add_attributes()]]
info->uio_dev = idev;
if (idev->info->irq >= 0) {
ret = request_irq(idev->info->irq, uio_interrupt,
idev->info->irq_flags, idev->info->name, idev);
if (ret)
goto err_request_irq;
}
-ユーザ定義のデバイスが割り込みを使用するならば、
カーネルにハンドラを登録する。
-ただしユーザ定義のハンドラを直接登録するのではなく、
いったん uio_interrupt() を登録し、
uio_interrupt() 経由でユーザ定義のハンドラを呼び出す。
--[[linux-2.6.33/request_irq()]]
--[[linux-2.6.33/uio_interrupt()]]
return 0;
err_request_irq:
uio_dev_del_attributes(idev);
-
--[[linux-2.6.33/uio_dev_del_attributes()]]
err_uio_dev_add_attributes:
device_destroy(uio_class->class, MKDEV(uio_major, idev-...
-
--[[linux-2.6.33/device_destroy()]]
err_device_create:
uio_free_minor(idev);
-
--[[linux-2.6.33/uio_free_monitor()]]
err_get_minor:
kfree(idev);
-
--[[linux-2.6.33/kfree()]]
err_kzalloc:
uio_class_destroy();
-
--[[linux-2.6.33/uio_class_destroy()]]
return ret;
}
EXPORT_SYMBOL_GPL(__uio_register_device);
-他のモジュールにシンボルを公開する。
--[[linux-2.6.33/EXPORT_SYMBOL_GPL()]]
*コメント [#y9d563cd]
ページ名: