]> git.hungrycats.org Git - linux/commitdiff
[PATCH] tty_driver refcounting
authorAlexander Viro <viro@www.linux.org.uk>
Wed, 11 Jun 2003 14:46:49 +0000 (07:46 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Wed, 11 Jun 2003 14:46:49 +0000 (07:46 -0700)
drivers/isdn/capi/capi.c converted to dynamic allocation

drivers/isdn/capi/capi.c

index 4ca7bd0bd7b460079c64948ee19514f09a991f34..6599c4c7078e289a9d4e21380d21944a8700c977 100644 (file)
@@ -1263,22 +1263,42 @@ static int capinc_tty_read_proc(char *page, char **start, off_t off,
 }
 
 #define CAPINC_NR_PORTS 256
-static struct tty_driver capinc_tty_driver;
+static struct tty_driver *capinc_tty_driver;
+
+static struct tty_operations capinc_ops = {
+       .open = capinc_tty_open,
+       .close = capinc_tty_close,
+       .write = capinc_tty_write,
+       .put_char = capinc_tty_put_char,
+       .flush_chars = capinc_tty_flush_chars,
+       .write_room = capinc_tty_write_room,
+       .chars_in_buffer = capinc_tty_chars_in_buffer,
+       .ioctl = capinc_tty_ioctl,
+       .set_termios = capinc_tty_set_termios,
+       .throttle = capinc_tty_throttle,
+       .unthrottle = capinc_tty_unthrottle,
+       .stop = capinc_tty_stop,
+       .start = capinc_tty_start,
+       .hangup = capinc_tty_hangup,
+       .break_ctl = capinc_tty_break_ctl,
+       .flush_buffer = capinc_tty_flush_buffer,
+       .set_ldisc = capinc_tty_set_ldisc,
+       .send_xchar = capinc_tty_send_xchar,
+       .read_proc = capinc_tty_read_proc,
+};
 
 static int capinc_tty_init(void)
 {
-       struct tty_driver *drv = &capinc_tty_driver;
+       struct tty_driver *drv = alloc_tty_driver(CAPINC_NR_PORTS);
+
+       if (!drv)
+               return -ENOMEM;
 
-       /* Initialize the tty_driver structure */
-       
-       memset(drv, 0, sizeof(struct tty_driver));
-       drv->magic = TTY_DRIVER_MAGIC;
        drv->owner = THIS_MODULE;
        drv->driver_name = "capi_nc";
        drv->name = "capi/";
        drv->major = capi_ttymajor;
        drv->minor_start = 0;
-       drv->num = CAPINC_NR_PORTS;
        drv->type = TTY_DRIVER_TYPE_SERIAL;
        drv->subtype = SERIAL_TYPE_NORMAL;
        drv->init_termios = tty_std_termios;
@@ -1287,39 +1307,23 @@ static int capinc_tty_init(void)
        drv->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
        drv->init_termios.c_lflag = 0;
        drv->flags = TTY_DRIVER_REAL_RAW|TTY_DRIVER_RESET_TERMIOS;
-
-       drv->open = capinc_tty_open;
-       drv->close = capinc_tty_close;
-       drv->write = capinc_tty_write;
-       drv->put_char = capinc_tty_put_char;
-       drv->flush_chars = capinc_tty_flush_chars;
-       drv->write_room = capinc_tty_write_room;
-       drv->chars_in_buffer = capinc_tty_chars_in_buffer;
-       drv->ioctl = capinc_tty_ioctl;
-       drv->set_termios = capinc_tty_set_termios;
-       drv->throttle = capinc_tty_throttle;
-       drv->unthrottle = capinc_tty_unthrottle;
-       drv->stop = capinc_tty_stop;
-       drv->start = capinc_tty_start;
-       drv->hangup = capinc_tty_hangup;
-       drv->break_ctl = capinc_tty_break_ctl;
-       drv->flush_buffer = capinc_tty_flush_buffer;
-       drv->set_ldisc = capinc_tty_set_ldisc;
-       drv->send_xchar = capinc_tty_send_xchar;
-       drv->read_proc = capinc_tty_read_proc;
+       tty_set_operations(drv, &capinc_ops);
        if (tty_register_driver(drv)) {
+               put_tty_driver(drv);
                printk(KERN_ERR "Couldn't register capi_nc driver\n");
                return -1;
        }
+       capinc_tty_driver = drv;
        return 0;
 }
 
 static void capinc_tty_exit(void)
 {
-       struct tty_driver *drv = &capinc_tty_driver;
+       struct tty_driver *drv = capinc_tty_driver;
        int retval;
        if ((retval = tty_unregister_driver(drv)))
                printk(KERN_ERR "capi: failed to unregister capi_nc driver (%d)\n", retval);
+       put_tty_driver(drv);
 }
 
 #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */