Commit d1bc10f6 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 0df74221
......@@ -753,18 +753,6 @@ static struct fmc_driver trtl_dev_drv = {
},
};
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_SERIAL,
.subtype = SERIAL_TYPE_NORMAL,
.flags = TTY_DRIVER_DYNAMIC_DEV,
.ops = &trtl_tty_ops,
};
/**
* Allocate resources for the driver. Char devices and FMC driver
......@@ -812,15 +800,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);
err = tty_register_driver(&trtl_tty_driver);
if (err < 0) {
goto out_tty;
}
/* Register the FMC driver */
err = fmc_driver_register(&trtl_dev_drv);
......@@ -832,8 +811,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);
......@@ -853,7 +830,6 @@ out_all:
static void trtl_exit(void)
{
fmc_driver_unregister(&trtl_dev_drv);
tty_unregister_driver(&trtl_tty_driver);
cdev_del(&cdev_hmq);
cdev_del(&cdev_cpu);
cdev_del(&cdev_dev);
......
......@@ -185,6 +185,8 @@ struct trtl_dev {
uint32_t message_sequence; /**< message sequence number */
struct spinlock lock_cpu_sel;
struct tty_driver *tty_driver;
};
static inline u32 trtl_ioread(struct trtl_dev *trtl, int addr)
......@@ -217,8 +219,6 @@ extern const struct attribute_group *trtl_hmq_groups[];
extern const struct file_operations trtl_hmq_fops;
extern irqreturn_t trtl_irq_handler(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);
......
......@@ -176,13 +176,15 @@ 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 = trtl_tty_get_minor();
if (cpu->tty_index < 0)
return -1;
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)) {
......@@ -196,7 +198,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);
trtl_tty_put_minor(cpu->tty_index);
}
......@@ -214,6 +218,12 @@ void trtl_tty_remove(struct trtl_dev *trtl)
for (i = 0; i < trtl->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);
}
......@@ -222,6 +232,27 @@ int trtl_tty_probe(struct trtl_dev *trtl)
struct fmc_device *fmc = to_fmc_dev(trtl);
int i, err;
trtl->tty_driver = alloc_tty_driver(TRTL_MAX_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_SERIAL;
trtl->tty_driver->subtype = SERIAL_TYPE_NORMAL;
trtl->tty_driver->flags = TTY_DRIVER_DYNAMIC_DEV;
trtl->tty_driver->ops = &trtl_tty_ops;
err = tty_register_driver(trtl->tty_driver);
if (err < 0) {
goto out_tty;
}
for (i = 0; i < trtl->n_cpu; ++i) {
err = trtl_tty_port_init(&trtl->cpu[i]);
if (err)
......@@ -242,5 +273,11 @@ err_irq:
err_port:
while(--i)
trtl_tty_port_exit(&trtl->cpu[i]);
tty_unregister_driver(trtl->tty_driver);
out_tty:
err_cfg:
kfree(trtl->tty_driver->driver_name);
kfree(trtl->tty_driver->name);
put_tty_driver(trtl->tty_driver);
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