Commit 56250ab0 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] tty_driver refcounting

drivers/isdn/i4l/isdn_tty.c converted to dynamic allocation
parent 8bfd2705
...@@ -1986,6 +1986,21 @@ modem_write_profile(atemu * m) ...@@ -1986,6 +1986,21 @@ modem_write_profile(atemu * m)
group_send_sig_info(SIGIO, SEND_SIG_PRIV, dev->profd); group_send_sig_info(SIGIO, SEND_SIG_PRIV, dev->profd);
} }
static struct tty_operations modem_ops = {
.open = isdn_tty_open,
.close = isdn_tty_close,
.write = isdn_tty_write,
.flush_chars = isdn_tty_flush_chars,
.write_room = isdn_tty_write_room,
.chars_in_buffer = isdn_tty_chars_in_buffer,
.flush_buffer = isdn_tty_flush_buffer,
.ioctl = isdn_tty_ioctl,
.throttle = isdn_tty_throttle,
.unthrottle = isdn_tty_unthrottle,
.set_termios = isdn_tty_set_termios,
.hangup = isdn_tty_hangup,
};
int int
isdn_tty_init(void) isdn_tty_init(void)
{ {
...@@ -1994,36 +2009,21 @@ isdn_tty_init(void) ...@@ -1994,36 +2009,21 @@ isdn_tty_init(void)
modem_info *info; modem_info *info;
m = &isdn_mdm; m = &isdn_mdm;
memset(&m->tty_modem, 0, sizeof(struct tty_driver)); m->tty_modem = alloc_tty_driver(ISDN_MAX_CHANNELS);
m->tty_modem.magic = TTY_DRIVER_MAGIC; if (!m->tty_modem)
m->tty_modem.name = "ttyI"; return -ENOMEM;
m->tty_modem.devfs_name = "isdn/ttyI"; m->tty_modem->name = "ttyI";
m->tty_modem.major = ISDN_TTY_MAJOR; m->tty_modem->devfs_name = "isdn/ttyI";
m->tty_modem.minor_start = 0; m->tty_modem->major = ISDN_TTY_MAJOR;
m->tty_modem.num = ISDN_MAX_CHANNELS; m->tty_modem->minor_start = 0;
m->tty_modem.type = TTY_DRIVER_TYPE_SERIAL; m->tty_modem->type = TTY_DRIVER_TYPE_SERIAL;
m->tty_modem.subtype = SERIAL_TYPE_NORMAL; m->tty_modem->subtype = SERIAL_TYPE_NORMAL;
m->tty_modem.init_termios = tty_std_termios; m->tty_modem->init_termios = tty_std_termios;
m->tty_modem.init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; m->tty_modem->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
m->tty_modem.flags = TTY_DRIVER_REAL_RAW; m->tty_modem->flags = TTY_DRIVER_REAL_RAW;
m->tty_modem.open = isdn_tty_open; m->tty_modem->driver_name = "isdn_tty";
m->tty_modem.close = isdn_tty_close; tty_set_operations(m->tty_modem, &modem_ops);
m->tty_modem.write = isdn_tty_write; retval = tty_register_driver(m->tty_modem);
m->tty_modem.put_char = NULL;
m->tty_modem.flush_chars = isdn_tty_flush_chars;
m->tty_modem.write_room = isdn_tty_write_room;
m->tty_modem.chars_in_buffer = isdn_tty_chars_in_buffer;
m->tty_modem.flush_buffer = isdn_tty_flush_buffer;
m->tty_modem.ioctl = isdn_tty_ioctl;
m->tty_modem.throttle = isdn_tty_throttle;
m->tty_modem.unthrottle = isdn_tty_unthrottle;
m->tty_modem.set_termios = isdn_tty_set_termios;
m->tty_modem.stop = NULL;
m->tty_modem.start = NULL;
m->tty_modem.hangup = isdn_tty_hangup;
m->tty_modem.driver_name = "isdn_tty";
retval = tty_register_driver(&m->tty_modem);
if (retval) { if (retval) {
printk(KERN_WARNING "isdn_tty: Couldn't register modem-device\n"); printk(KERN_WARNING "isdn_tty: Couldn't register modem-device\n");
goto err; goto err;
...@@ -2096,8 +2096,10 @@ isdn_tty_init(void) ...@@ -2096,8 +2096,10 @@ isdn_tty_init(void)
kfree(info->xmit_buf - 4); kfree(info->xmit_buf - 4);
} }
err_unregister_tty: err_unregister_tty:
tty_unregister_driver(&isdn_mdm.tty_modem); tty_unregister_driver(&isdn_mdm->tty_modem);
err: err:
put_tty_driver(&isdn_mdm->tty_modem);
isdn_mdm->tty_modem = NULL;
return retval; return retval;
} }
...@@ -2116,7 +2118,9 @@ isdn_tty_exit(void) ...@@ -2116,7 +2118,9 @@ isdn_tty_exit(void)
#endif #endif
kfree(info->xmit_buf - 4); kfree(info->xmit_buf - 4);
} }
tty_unregister_driver(&isdn_mdm.tty_modem); tty_unregister_driver(&isdn_mdm->tty_modem);
put_tty_driver(&isdn_mdm->tty_modem);
isdn_mdm->tty_modem = NULL;
} }
/* /*
......
...@@ -114,7 +114,7 @@ extern int isdn_tty_init(void); ...@@ -114,7 +114,7 @@ extern int isdn_tty_init(void);
extern void isdn_tty_exit(void); extern void isdn_tty_exit(void);
struct isdn_modem { struct isdn_modem {
struct tty_driver tty_modem; /* tty-device */ struct tty_driver *tty_modem; /* tty-device */
modem_info info[ISDN_MAX_CHANNELS]; /* Private data */ modem_info info[ISDN_MAX_CHANNELS]; /* Private data */
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment