Commit e375d87b authored by Federico Vaga's avatar Federico Vaga

sw:drv: use alloc_tty_driver

Apparently the current code does not run on modern kernels. The usage
of alloc_tty_driver() is safer, even if it is deprecated in moder
versions (4.x).
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 9e07d84a
......@@ -749,20 +749,6 @@ static struct platform_driver trtl_platform_driver = {
.id_table = trtl_id,
};
struct tty_driver trtl_tty_driver = {
.owner = THIS_MODULE,
.driver_name = KBUILD_MODNAME"tty",
.name = "ttyTRTL",
.num = TRTL_MAX_CPU_MINORS,
.major = 0,
.minor_start = 0,
.type = TTY_DRIVER_TYPE_CONSOLE,
.subtype = 0,
.flags = TTY_DRIVER_REAL_RAW |
TTY_DRIVER_DYNAMIC_DEV |
TTY_DRIVER_RESET_TERMIOS,
.ops = &trtl_tty_ops,
};
/**
* Allocate resources for the driver. Char devices and platform driver
......@@ -810,22 +796,6 @@ static int trtl_init(void)
if (err)
goto out_cdev_hmq;
/*
* NOTE: Because we do not yse alloc_tty_driver,
* we have to manualy initialize the kref
*/
kref_init(&trtl_tty_driver.kref);
trtl_tty_driver.init_termios = tty_std_termios;
trtl_tty_driver.init_termios.c_iflag = ICRNL;
trtl_tty_driver.init_termios.c_oflag = 0;
trtl_tty_driver.init_termios.c_cflag = CS8 | CREAD | CLOCAL;
trtl_tty_driver.init_termios.c_lflag = 0;
err = tty_register_driver(&trtl_tty_driver);
if (err < 0) {
goto out_tty;
}
/* Register the platform driver */
err = platform_driver_register(&trtl_platform_driver);
if (err)
......@@ -836,8 +806,6 @@ static int trtl_init(void)
out_reg:
tty_unregister_driver(&trtl_tty_driver);
out_tty:
cdev_del(&cdev_hmq);
out_cdev_hmq:
cdev_del(&cdev_cpu);
......@@ -856,7 +824,6 @@ out_all:
*/
static void trtl_exit(void)
{
tty_unregister_driver(&trtl_tty_driver);
platform_driver_unregister(&trtl_platform_driver);
cdev_del(&cdev_hmq);
......
......@@ -219,6 +219,8 @@ struct trtl_dev {
struct spinlock lock_hmq_sel;
const struct trtl_config_rom cfgrom; /**< synthesis configuration ROM */
struct tty_driver *tty_driver;
};
static inline u32 trtl_ioread(struct trtl_dev *trtl, void *addr)
......@@ -250,8 +252,6 @@ extern const struct file_operations trtl_hmq_fops;
extern irqreturn_t trtl_irq_handler_out(int irq_core_base, void *arg);
extern irqreturn_t trtl_irq_handler_in(int irq_core_base, void *arg);
/* TTY */
extern struct tty_driver trtl_tty_driver;
extern const struct tty_operations trtl_tty_ops;
extern int trtl_tty_probe(struct trtl_dev *trtl);
extern void trtl_tty_remove(struct trtl_dev *trtl);
......
......@@ -153,6 +153,8 @@ static const struct tty_port_operations null_ops = { };
static int trtl_tty_port_init(struct trtl_cpu *cpu)
{
struct trtl_dev *trtl = to_trtl_dev(cpu->dev.parent);
cpu->tty_index = ida_simple_get(&trtl_tty_ida, 0, TRTL_MAX_CPU_MINORS,
GFP_KERNEL);
if (cpu->tty_index < 0)
......@@ -160,7 +162,7 @@ static int trtl_tty_port_init(struct trtl_cpu *cpu)
tty_port_init(&cpu->tty_port);
cpu->tty_port.ops = &null_ops;
cpu->tty_dev = tty_register_device(&trtl_tty_driver,
cpu->tty_dev = tty_register_device(trtl->tty_driver,
cpu->tty_index,
&cpu->dev);
if (IS_ERR_OR_NULL(cpu->tty_dev)) {
......@@ -174,8 +176,9 @@ static int trtl_tty_port_init(struct trtl_cpu *cpu)
static void trtl_tty_port_exit(struct trtl_cpu *cpu)
{
tty_unregister_device(&trtl_tty_driver, cpu->tty_index);
struct trtl_dev *trtl = to_trtl_dev(cpu->dev.parent);
tty_unregister_device(trtl->tty_driver, cpu->tty_index);
ida_simple_remove(&trtl_tty_ida, cpu->tty_index);
}
......@@ -192,6 +195,12 @@ void trtl_tty_remove(struct trtl_dev *trtl)
for (i = 0; i < trtl->cfgrom.n_cpu; ++i)
trtl_tty_port_exit(&trtl->cpu[i]);
tty_unregister_driver(trtl->tty_driver);
kfree(trtl->tty_driver->driver_name);
kfree(trtl->tty_driver->name);
put_tty_driver(trtl->tty_driver);
}
......@@ -207,12 +216,42 @@ int trtl_tty_probe(struct trtl_dev *trtl)
"disable console: invalid interrupt source\n");
goto err; /* no error code, we can live without console */
}
trtl->tty_driver = alloc_tty_driver(trtl->cfgrom.n_cpu);
if (!trtl->tty_driver)
return -ENOMEM;
trtl->tty_driver->driver_name = kasprintf(GFP_KERNEL, "%s-tty",
dev_name(&trtl->dev));
trtl->tty_driver->name = kasprintf(GFP_KERNEL, "tty%s-",
dev_name(&trtl->dev));
if (!trtl->tty_driver->driver_name || !trtl->tty_driver->name) {
err = -ENOMEM;
goto err_cfg;
}
trtl->tty_driver->type = TTY_DRIVER_TYPE_CONSOLE;
trtl->tty_driver->subtype = 0;
trtl->tty_driver->flags = TTY_DRIVER_REAL_RAW |
TTY_DRIVER_DYNAMIC_DEV |
TTY_DRIVER_RESET_TERMIOS;
trtl->tty_driver->ops = &trtl_tty_ops;
trtl->tty_driver->init_termios = tty_std_termios;
trtl->tty_driver->init_termios.c_iflag = ICRNL;
trtl->tty_driver->init_termios.c_oflag = 0;
trtl->tty_driver->init_termios.c_cflag = CS8 | CREAD | CLOCAL;
trtl->tty_driver->init_termios.c_lflag = 0;
err = tty_register_driver(trtl->tty_driver);
if (err < 0) {
goto err_tty;
}
for (i = 0; i < trtl->cfgrom.n_cpu; ++i) {
err = trtl_tty_port_init(&trtl->cpu[i]);
if (err)
goto err_port;
}
/* Enable debug interrupts */
err = request_irq(r->start, trtl_tty_handler, 0,
r->name, trtl);
......@@ -229,6 +268,12 @@ err_irq:
err_port:
while(--i)
trtl_tty_port_exit(&trtl->cpu[i]);
tty_unregister_driver(trtl->tty_driver);
err_tty:
err_cfg:
kfree(trtl->tty_driver->driver_name);
kfree(trtl->tty_driver->name);
put_tty_driver(trtl->tty_driver);
err:
return err;
}
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