diff --git a/drivers/staging/dgnc/dgnc_driver.c b/drivers/staging/dgnc/dgnc_driver.c index a95d13c7ef30f0c95c5427f68a9334b038ea33ed..ffe55a239f4e92892e861139056241825fdca824 100644 --- a/drivers/staging/dgnc/dgnc_driver.c +++ b/drivers/staging/dgnc/dgnc_driver.c @@ -299,13 +299,13 @@ static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) rc = dgnc_finalize_board_init(brd); if (rc < 0) { pr_err(DRVSTR ": Can't finalize board init (%d)\n", rc); - goto failed; + goto unregister_tty; } rc = dgnc_tty_init(brd); if (rc < 0) { pr_err(DRVSTR ": Can't init tty devices (%d)\n", rc); - goto failed; + goto unregister_tty; } brd->state = BOARD_READY; @@ -317,6 +317,9 @@ static int dgnc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) return 0; +unregister_tty: + dgnc_tty_unregister(brd); + failed: kfree(brd); diff --git a/drivers/staging/dgnc/dgnc_tty.c b/drivers/staging/dgnc/dgnc_tty.c index 1c1ac8427b6ed797dce3628a4ba17e6f52ef94dd..4f781955726b3f5f21e2f1a341afe032d82176f7 100644 --- a/drivers/staging/dgnc/dgnc_tty.c +++ b/drivers/staging/dgnc/dgnc_tty.c @@ -273,6 +273,14 @@ int dgnc_tty_register(struct dgnc_board *brd) return rc; } +void dgnc_tty_unregister(struct dgnc_board *brd) +{ + tty_unregister_driver(brd->print_driver); + tty_unregister_driver(brd->serial_driver); + put_tty_driver(brd->print_driver); + put_tty_driver(brd->serial_driver); +} + /* * dgnc_tty_init() * diff --git a/drivers/staging/dgnc/dgnc_tty.h b/drivers/staging/dgnc/dgnc_tty.h index 21d3369b875ce147fcf6285ecd996e970b3958c1..f065c8fff1b0ee45ee50baf6cf8d0ccbfde1bcfa 100644 --- a/drivers/staging/dgnc/dgnc_tty.h +++ b/drivers/staging/dgnc/dgnc_tty.h @@ -19,6 +19,7 @@ #include "dgnc_driver.h" int dgnc_tty_register(struct dgnc_board *brd); +void dgnc_tty_unregister(struct dgnc_board *brd); int dgnc_tty_preinit(void); int dgnc_tty_init(struct dgnc_board *);