void my_hd (void *addr, int len);
-static struct tty_driver rio_driver, rio_driver2;
+static struct tty_driver *rio_driver, *rio_driver2;
/* The name "p" is a bit non-descript. But that's what the rio-lynxos
sources use all over the place. */
int rio_minor(struct tty_struct *tty)
{
- return tty->index + (tty->driver == &rio_driver) ? 0 : 256;
+ return tty->index + (tty->driver == rio_driver) ? 0 : 256;
}
return &vpdp;
}
-
+static struct tty_operations rio_ops = {
+ .open = riotopen,
+ .close = gs_close,
+ .write = gs_write,
+ .put_char = gs_put_char,
+ .flush_chars = gs_flush_chars,
+ .write_room = gs_write_room,
+ .chars_in_buffer = gs_chars_in_buffer,
+ .flush_buffer = gs_flush_buffer,
+ .ioctl = rio_ioctl,
+ .throttle = rio_throttle,
+ .unthrottle = rio_unthrottle,
+ .set_termios = gs_set_termios,
+ .stop = gs_stop,
+ .start = gs_start,
+ .hangup = gs_hangup,
+};
static int rio_init_drivers(void)
{
- int error;
-
- func_enter();
-
- memset(&rio_driver, 0, sizeof(rio_driver));
- rio_driver.magic = TTY_DRIVER_MAGIC;
- rio_driver.owner = THIS_MODULE;
- rio_driver.driver_name = "specialix_rio";
- rio_driver.name = "ttySR";
- rio_driver.major = RIO_NORMAL_MAJOR0;
- rio_driver.num = 256;
- rio_driver.type = TTY_DRIVER_TYPE_SERIAL;
- rio_driver.subtype = SERIAL_TYPE_NORMAL;
- rio_driver.init_termios = tty_std_termios;
- rio_driver.init_termios.c_cflag =
- B9600 | CS8 | CREAD | HUPCL | CLOCAL;
- rio_driver.flags = TTY_DRIVER_REAL_RAW;
-
- rio_driver.open = riotopen;
- rio_driver.close = gs_close;
- rio_driver.write = gs_write;
- rio_driver.put_char = gs_put_char;
- rio_driver.flush_chars = gs_flush_chars;
- rio_driver.write_room = gs_write_room;
- rio_driver.chars_in_buffer = gs_chars_in_buffer;
- rio_driver.flush_buffer = gs_flush_buffer;
- rio_driver.ioctl = rio_ioctl;
- rio_driver.throttle = rio_throttle;
- rio_driver.unthrottle = rio_unthrottle;
- rio_driver.set_termios = gs_set_termios;
- rio_driver.stop = gs_stop;
- rio_driver.start = gs_start;
- rio_driver.hangup = gs_hangup;
-
- rio_driver2 = rio_driver;
- rio_driver2.major = RIO_NORMAL_MAJOR1;
-
- rio_dprintk (RIO_DEBUG_INIT, "set_termios = %p\n", gs_set_termios);
-
- if ((error = tty_register_driver(&rio_driver))) goto bad1;
- if ((error = tty_register_driver(&rio_driver2))) goto bad2;
-
- func_exit();
- return 0;
- /*
- bad3:tty_unregister_driver (&rio_driver2);
- bad2:tty_unregister_driver (&rio_driver);
- bad1:printk(KERN_ERR "rio: Couldn't register a rio driver, error = %d\n",
- error);
- return 1;
+ int error = -ENOMEM;
+
+ rio_driver = alloc_tty_driver(256);
+ if (!rio_driver)
+ goto out;
+ rio_driver2 = alloc_tty_driver(256);
+ if (!rio_driver2)
+ goto out1;
+
+ func_enter();
+
+ rio_driver->owner = THIS_MODULE;
+ rio_driver->driver_name = "specialix_rio";
+ rio_driver->name = "ttySR";
+ rio_driver->major = RIO_NORMAL_MAJOR0;
+ rio_driver->type = TTY_DRIVER_TYPE_SERIAL;
+ rio_driver->subtype = SERIAL_TYPE_NORMAL;
+ rio_driver->init_termios = tty_std_termios;
+ rio_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+ rio_driver->flags = TTY_DRIVER_REAL_RAW;
+ tty_set_operations(rio_driver, &rio_ops);
+
+ rio_driver2->owner = THIS_MODULE;
+ rio_driver2->driver_name = "specialix_rio";
+ rio_driver2->name = "ttySR";
+ rio_driver2->major = RIO_NORMAL_MAJOR1;
+ rio_driver2->type = TTY_DRIVER_TYPE_SERIAL;
+ rio_driver2->subtype = SERIAL_TYPE_NORMAL;
+ rio_driver2->init_termios = tty_std_termios;
+ rio_driver2->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+ rio_driver2->flags = TTY_DRIVER_REAL_RAW;
+ tty_set_operations(rio_driver2, &rio_ops);
+
+ rio_dprintk (RIO_DEBUG_INIT, "set_termios = %p\n", gs_set_termios);
+
+ if ((error = tty_register_driver(rio_driver)))
+ goto out2;
+ if ((error = tty_register_driver(rio_driver2)))
+ goto out3;
+ func_exit();
+ return 0;
+out3:
+ tty_unregister_driver(rio_driver);
+out2:
+ put_tty_driver(rio_driver2);
+out1:
+ put_tty_driver(rio_driver);
+out:
+ printk(KERN_ERR "rio: Couldn't register a rio driver, error = %d\n",
+ error);
+ return 1;
}
static void __exit rio_release_drivers(void)
{
func_enter();
- tty_unregister_driver (&rio_driver2);
- tty_unregister_driver (&rio_driver);
+ tty_unregister_driver(rio_driver2);
+ tty_unregister_driver(rio_driver);
+ put_tty_driver(rio_driver2);
+ put_tty_driver(rio_driver);
func_exit();
}