From ce7240e445303de3ca66e6d08f17a2ec278a5bf6 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Tue, 17 Jul 2012 17:06:20 +0100 Subject: 8250: three way resolve of the 8250 diffs This resolves the differences between the original 8250 patch, the revised 8250 patch and the independant clean up of the octeon driver (to use platform devices properly yay!) Signed-off-by: Alan Cox Signed-off-by: Greg Kroah-Hartman --- drivers/misc/ibmasm/uart.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/ibmasm/uart.c b/drivers/misc/ibmasm/uart.c index 1dcb9ae1905a..01e2b0d7e590 100644 --- a/drivers/misc/ibmasm/uart.c +++ b/drivers/misc/ibmasm/uart.c @@ -33,7 +33,7 @@ void ibmasm_register_uart(struct service_processor *sp) { - struct uart_port uport; + struct uart_8250_port uart; void __iomem *iomem_base; iomem_base = sp->base_address + SCOUT_COM_B_BASE; @@ -47,14 +47,14 @@ void ibmasm_register_uart(struct service_processor *sp) return; } - memset(&uport, 0, sizeof(struct uart_port)); - uport.irq = sp->irq; - uport.uartclk = 3686400; - uport.flags = UPF_SHARE_IRQ; - uport.iotype = UPIO_MEM; - uport.membase = iomem_base; + memset(&uart, 0, sizeof(uart)); + uart.port.irq = sp->irq; + uart.port.uartclk = 3686400; + uart.port.flags = UPF_SHARE_IRQ; + uart.port.iotype = UPIO_MEM; + uart.port.membase = iomem_base; - sp->serial_line = serial8250_register_port(&uport); + sp->serial_line = serial8250_register_8250_port(&uart); if (sp->serial_line < 0) { dev_err(sp->dev, "Failed to register serial port\n"); return; -- cgit v1.2.3-59-g8ed1b From d15684228a1f82555fcd3c5fcd86a0884bad29e3 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:29 +0200 Subject: misc: pti, add const to pci_device_id table It is annotated as __devinitconst. Despite the annotation is useless in most cases, const keyword is misssing there. So we are placing non-const data into rodata section. Fix that now. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index b7eb545394b1..5cb61f7e6f8a 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -76,7 +76,7 @@ struct pti_dev { */ static DEFINE_MUTEX(alloclock); -static struct pci_device_id pci_ids[] __devinitconst = { +static const struct pci_device_id pci_ids[] __devinitconst = { {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x82B)}, {0} }; -- cgit v1.2.3-59-g8ed1b From c6333cc65d12fddf9cf79de3950b65bc142784e1 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:30 +0200 Subject: misc: pti, pci drvdata cannot be NULL in ->remove As we set drvdata unconditionally in ->probe, we need not check if it is NULL. Let us remove the check. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 5cb61f7e6f8a..88da085e450a 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -400,16 +400,13 @@ EXPORT_SYMBOL_GPL(pti_writedata); */ static void __devexit pti_pci_remove(struct pci_dev *pdev) { - struct pti_dev *drv_data; + struct pti_dev *drv_data = pci_get_drvdata(pdev); - drv_data = pci_get_drvdata(pdev); - if (drv_data != NULL) { - pci_iounmap(pdev, drv_data->pti_ioaddr); - pci_set_drvdata(pdev, NULL); - kfree(drv_data); - pci_release_region(pdev, 1); - pci_disable_device(pdev); - } + pci_iounmap(pdev, drv_data->pti_ioaddr); + pci_set_drvdata(pdev, NULL); + kfree(drv_data); + pci_release_region(pdev, 1); + pci_disable_device(pdev); } /* -- cgit v1.2.3-59-g8ed1b From dda3f32c3a7201ee79e7e6a7b1d827b89759b4bc Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:31 +0200 Subject: misc: pti, stop using iomap's unmap on ioremap space Ioremap space is different to iomap. ->probe function uses ioremap, but ->remove calls pci_iounmap. That one is illegal. Fix that by using iounmap. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 88da085e450a..3bfc8e37cb51 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -402,7 +402,7 @@ static void __devexit pti_pci_remove(struct pci_dev *pdev) { struct pti_dev *drv_data = pci_get_drvdata(pdev); - pci_iounmap(pdev, drv_data->pti_ioaddr); + iounmap(drv_data->pti_ioaddr); pci_set_drvdata(pdev, NULL); kfree(drv_data); pci_release_region(pdev, 1); -- cgit v1.2.3-59-g8ed1b From 065185f604c604ce77c43d7f26faf712f0bfa265 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:32 +0200 Subject: misc: pti, move ->remove to the PCI code The function is lost somewhere in the forest. Move it to have it along with probe and other pci_driver stuff. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 3bfc8e37cb51..4a24421136a3 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -393,22 +393,6 @@ void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count) } EXPORT_SYMBOL_GPL(pti_writedata); -/** - * pti_pci_remove()- Driver exit method to remove PTI from - * PCI bus. - * @pdev: variable containing pci info of PTI. - */ -static void __devexit pti_pci_remove(struct pci_dev *pdev) -{ - struct pti_dev *drv_data = pci_get_drvdata(pdev); - - iounmap(drv_data->pti_ioaddr); - pci_set_drvdata(pdev, NULL); - kfree(drv_data); - pci_release_region(pdev, 1); - pci_disable_device(pdev); -} - /* * for the tty_driver_*() basic function descriptions, see tty_driver.h. * Specific header comments made for PTI-related specifics. @@ -881,6 +865,22 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, return retval; } +/** + * pti_pci_remove()- Driver exit method to remove PTI from + * PCI bus. + * @pdev: variable containing pci info of PTI. + */ +static void __devexit pti_pci_remove(struct pci_dev *pdev) +{ + struct pti_dev *drv_data = pci_get_drvdata(pdev); + + iounmap(drv_data->pti_ioaddr); + pci_set_drvdata(pdev, NULL); + kfree(drv_data); + pci_release_region(pdev, 1); + pci_disable_device(pdev); +} + static struct pci_driver pti_pci_driver = { .name = PCINAME, .id_table = pci_ids, -- cgit v1.2.3-59-g8ed1b From 3140bae26c9105b4ec8ff4935631f2f09882553d Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:33 +0200 Subject: misc: pti, do the opposite of ->probe in ->remove Currently, probe initializes some parts. Then, some of them are unwound in ->remove, some in module_exit. Let us do the opposite of whole ->probe in ->remove. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 4a24421136a3..be6e6795d79d 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -874,11 +874,18 @@ static void __devexit pti_pci_remove(struct pci_dev *pdev) { struct pti_dev *drv_data = pci_get_drvdata(pdev); + unregister_console(&pti_console); + + tty_unregister_device(pti_tty_driver, 0); + tty_unregister_device(pti_tty_driver, 1); + iounmap(drv_data->pti_ioaddr); pci_set_drvdata(pdev, NULL); kfree(drv_data); pci_release_region(pdev, 1); pci_disable_device(pdev); + + misc_deregister(&pti_char_driver); } static struct pci_driver pti_pci_driver = { @@ -959,9 +966,6 @@ static void __exit pti_exit(void) { int retval; - tty_unregister_device(pti_tty_driver, 0); - tty_unregister_device(pti_tty_driver, 1); - retval = tty_unregister_driver(pti_tty_driver); if (retval) { pr_err("%s(%d): TTY unregistration failed of pti driver\n", @@ -971,17 +975,6 @@ static void __exit pti_exit(void) } pci_unregister_driver(&pti_pci_driver); - - retval = misc_deregister(&pti_char_driver); - if (retval) { - pr_err("%s(%d): CHAR unregistration failed of pti driver\n", - __func__, __LINE__); - pr_err("%s(%d): Error value returned: %d\n", - __func__, __LINE__, retval); - } - - unregister_console(&pti_console); - return; } module_init(pti_init); -- cgit v1.2.3-59-g8ed1b From fbf1c247dac8574ef3973adce4b20d40ff22214e Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:34 +0200 Subject: misc: pti, fix fail paths Fail paths in ->probe and pti_init are incomplete. Fix that by adding proper clean-up paths. Note that we used to leak tty_driver on module unload. This is fixed here too. tty_unregister_driver needs not retval checking, so remove that. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 53 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 28 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index be6e6795d79d..90de855abb90 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -811,7 +811,7 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, __func__, __LINE__); pr_err("%s(%d): Error value returned: %d\n", __func__, __LINE__, retval); - return retval; + goto err; } retval = pci_enable_device(pdev); @@ -819,17 +819,16 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, dev_err(&pdev->dev, "%s: pci_enable_device() returned error %d\n", __func__, retval); - return retval; + goto err_unreg_misc; } drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); - if (drv_data == NULL) { retval = -ENOMEM; dev_err(&pdev->dev, "%s(%d): kmalloc() returned NULL memory.\n", __func__, __LINE__); - return retval; + goto err_disable_pci; } drv_data->pti_addr = pci_resource_start(pdev, pci_bar); @@ -838,18 +837,15 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, dev_err(&pdev->dev, "%s(%d): pci_request_region() returned error %d\n", __func__, __LINE__, retval); - kfree(drv_data); - return retval; + goto err_free_dd; } drv_data->aperture_base = drv_data->pti_addr+APERTURE_14; drv_data->pti_ioaddr = ioremap_nocache((u32)drv_data->aperture_base, APERTURE_LEN); if (!drv_data->pti_ioaddr) { - pci_release_region(pdev, pci_bar); retval = -ENOMEM; - kfree(drv_data); - return retval; + goto err_rel_reg; } pci_set_drvdata(pdev, drv_data); @@ -862,6 +858,16 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, register_console(&pti_console); + return 0; +err_rel_reg: + pci_release_region(pdev, pci_bar); +err_free_dd: + kfree(drv_data); +err_disable_pci: + pci_disable_device(pdev); +err_unreg_misc: + misc_deregister(&pti_char_driver); +err: return retval; } @@ -937,25 +943,24 @@ static int __init pti_init(void) pr_err("%s(%d): Error value returned: %d\n", __func__, __LINE__, retval); - pti_tty_driver = NULL; - return retval; + goto put_tty; } retval = pci_register_driver(&pti_pci_driver); - if (retval) { pr_err("%s(%d): PCI registration failed of pti driver\n", __func__, __LINE__); pr_err("%s(%d): Error value returned: %d\n", __func__, __LINE__, retval); - - tty_unregister_driver(pti_tty_driver); - pr_err("%s(%d): Unregistering TTY part of pti driver\n", - __func__, __LINE__); - pti_tty_driver = NULL; - return retval; + goto unreg_tty; } + return 0; +unreg_tty: + tty_unregister_driver(pti_tty_driver); +put_tty: + put_tty_driver(pti_tty_driver); + pti_tty_driver = NULL; return retval; } @@ -964,17 +969,9 @@ static int __init pti_init(void) */ static void __exit pti_exit(void) { - int retval; - - retval = tty_unregister_driver(pti_tty_driver); - if (retval) { - pr_err("%s(%d): TTY unregistration failed of pti driver\n", - __func__, __LINE__); - pr_err("%s(%d): Error value returned: %d\n", - __func__, __LINE__, retval); - } - + tty_unregister_driver(pti_tty_driver); pci_unregister_driver(&pti_pci_driver); + put_tty_driver(pti_tty_driver); } module_init(pti_init); -- cgit v1.2.3-59-g8ed1b From 5bd420009716f3348610fdf9c6307f0db583ba04 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:35 +0200 Subject: misc: pti, fix tty_port count We now have *one* tty_port for both TTYs. How this was supposed to work? Change it to have a tty_port for each of TTYs. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index 90de855abb90..fe76f9dca1de 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -60,7 +60,7 @@ struct pti_tty { }; struct pti_dev { - struct tty_port port; + struct tty_port port[PTITTY_MINOR_NUM]; unsigned long pti_addr; unsigned long aperture_base; void __iomem *pti_ioaddr; @@ -427,7 +427,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) * also removes a locking requirement for the actual write * procedure. */ - return tty_port_open(&drv_data->port, tty, filp); + return tty_port_open(&drv_data->port[tty->index], tty, filp); } /** @@ -443,7 +443,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) */ static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) { - tty_port_close(&drv_data->port, tty, filp); + tty_port_close(&drv_data->port[tty->index], tty, filp); } /** @@ -799,6 +799,7 @@ static const struct tty_port_operations tty_port_ops = { static int __devinit pti_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { + unsigned int a; int retval = -EINVAL; int pci_bar = 1; @@ -850,11 +851,13 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, pci_set_drvdata(pdev, drv_data); - tty_port_init(&drv_data->port); - drv_data->port.ops = &tty_port_ops; + for (a = 0; a < PTITTY_MINOR_NUM; a++) { + struct tty_port *port = &drv_data->port[a]; + tty_port_init(port); + port->ops = &tty_port_ops; - tty_register_device(pti_tty_driver, 0, &pdev->dev); - tty_register_device(pti_tty_driver, 1, &pdev->dev); + tty_register_device(pti_tty_driver, a, &pdev->dev); + } register_console(&pti_console); -- cgit v1.2.3-59-g8ed1b From c565ee07708e19474cd1133bf50289a36b5bcc26 Mon Sep 17 00:00:00 2001 From: Jiri Slaby Date: Tue, 7 Aug 2012 21:47:36 +0200 Subject: misc: pti, use tty_port_register_device So now we have enough of tty_ports, so we can signal the TTY layer to use them by tty_port_register_device. The upside is that we look like we can introduce tty_port_easy_open and put it directly as tty_operations->open to drivers doing nothing in open and using tty_port_register_device. Because the easy open can obtain a tty_port rather easily from a tty now. Heh, what a nice by-product. Signed-off-by: Jiri Slaby Cc: J Freyensee Signed-off-by: Greg Kroah-Hartman --- drivers/misc/pti.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'drivers/misc') diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index fe76f9dca1de..4999b34b7a60 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c @@ -427,7 +427,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) * also removes a locking requirement for the actual write * procedure. */ - return tty_port_open(&drv_data->port[tty->index], tty, filp); + return tty_port_open(tty->port, tty, filp); } /** @@ -443,7 +443,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) */ static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) { - tty_port_close(&drv_data->port[tty->index], tty, filp); + tty_port_close(tty->port, tty, filp); } /** @@ -856,7 +856,7 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, tty_port_init(port); port->ops = &tty_port_ops; - tty_register_device(pti_tty_driver, a, &pdev->dev); + tty_port_register_device(port, pti_tty_driver, a, &pdev->dev); } register_console(&pti_console); -- cgit v1.2.3-59-g8ed1b