int tty_register_driver(struct tty_driver *driver)
来源:互联网 发布:对联软件在线制作 编辑:程序博客网 时间:2024/06/15 09:01
drivers/tty/tty_io.c
/*
* Called by a tty driver to register itself.*/
int tty_register_driver(struct tty_driver *driver)
{
int error;
int i;
dev_t dev;
void **p = NULL;
struct device *d;
if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL);
if (!p)
return -ENOMEM;
}
if (!driver->major) {
error = alloc_chrdev_region(&dev, driver->minor_start,
driver->num, driver->name);
if (!error) {
driver->major = MAJOR(dev);
driver->minor_start = MINOR(dev);
}
} else {
dev = MKDEV(driver->major, driver->minor_start);
error = register_chrdev_region(dev, driver->num, driver->name);
}
if (error < 0) {
kfree(p);
return error;
}
if (p) {
driver->ttys = (struct tty_struct **)p;
driver->termios = (struct ktermios **)(p + driver->num);
} else {
driver->ttys = NULL;
driver->termios = NULL;
}
cdev_init(&driver->cdev, &tty_fops);
driver->cdev.owner = driver->owner;
error = cdev_add(&driver->cdev, dev, driver->num);
if (error) {
unregister_chrdev_region(dev, driver->num);
driver->ttys = NULL;
driver->termios = NULL;
kfree(p);
return error;
}
mutex_lock(&tty_mutex);
list_add(&driver->tty_drivers, &tty_drivers);
mutex_unlock(&tty_mutex);
if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV)) {
for (i = 0; i < driver->num; i++) {
d = tty_register_device(driver, i, NULL);
if (IS_ERR(d)) {
error = PTR_ERR(d);
goto err;
}
}
}
proc_tty_register_driver(driver);
driver->flags |= TTY_DRIVER_INSTALLED;
return 0;
err:
for (i--; i >= 0; i--)
tty_unregister_device(driver, i);
mutex_lock(&tty_mutex);
list_del(&driver->tty_drivers);
mutex_unlock(&tty_mutex);
unregister_chrdev_region(dev, driver->num);
driver->ttys = NULL;
driver->termios = NULL;
kfree(p);
return error;
}
EXPORT_SYMBOL(tty_register_driver);
- int tty_register_driver(struct tty_driver *driver)
- struct tty_driver
- 函数 static inline int i2c_add_driver(struct i2c_driver *driver) 代码分析
- int platform_driver_register(struct platform_driver *drv)
- int driver_register(struct device_driver *drv)
- int s3c24xx_serial_probe(struct platform_device *dev,
- int uart_register_driver(struct uart_driver *drv)
- int device_register(struct device *dev)
- struct中的位域:struct {int i:4}
- int spi_write_then_read (struct …
- int,int32_t,int64_t和struct内存对齐
- 位段 struct s{int a:1};
- typedef struct AA { int b1:5; int b2:2; }AA;
- SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
- union myun { struct{ int x; int y; int z; }u; int k; }a;
- template<int N> struct A和template<const int N> struct A有区别吗?
- struct bit {int a:3; int b:2; int c:3; };
- struct s1 { int i: 8; int j: 4; int a: 3; double b; };
- 一个总要的日子
- 【继承】 JAVA
- (转载)COM和ATL学习方法
- FURPS模型
- 诫子书
- int tty_register_driver(struct tty_driver *driver)
- 在 java控制台实现 类似java Copy srcpath despath这种DOS命令行的文件拷贝功能 文件IO StringBuffer
- 输出形如"0001","0002"的字符串
- uva 10344 23 out of 5(DFS)
- xcode快捷键
- define 后面指跟一个变量时的意思
- 《数据通信与网络》笔记--虚电路网络:帧中继和ATM
- Android控件之——RadioGroup
- 如何学好C++ 用好类库很重要