diff options
Diffstat (limited to 'drivers/misc/pti.c')
-rw-r--r-- | drivers/misc/pti.c | 128 |
1 files changed, 59 insertions, 69 deletions
diff --git a/drivers/misc/pti.c b/drivers/misc/pti.c index b7eb545394b1..4999b34b7a60 100644 --- a/drivers/misc/pti.c +++ b/drivers/misc/pti.c | |||
@@ -60,7 +60,7 @@ struct pti_tty { | |||
60 | }; | 60 | }; |
61 | 61 | ||
62 | struct pti_dev { | 62 | struct pti_dev { |
63 | struct tty_port port; | 63 | struct tty_port port[PTITTY_MINOR_NUM]; |
64 | unsigned long pti_addr; | 64 | unsigned long pti_addr; |
65 | unsigned long aperture_base; | 65 | unsigned long aperture_base; |
66 | void __iomem *pti_ioaddr; | 66 | void __iomem *pti_ioaddr; |
@@ -76,7 +76,7 @@ struct pti_dev { | |||
76 | */ | 76 | */ |
77 | static DEFINE_MUTEX(alloclock); | 77 | static DEFINE_MUTEX(alloclock); |
78 | 78 | ||
79 | static struct pci_device_id pci_ids[] __devinitconst = { | 79 | static const struct pci_device_id pci_ids[] __devinitconst = { |
80 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x82B)}, | 80 | {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x82B)}, |
81 | {0} | 81 | {0} |
82 | }; | 82 | }; |
@@ -393,25 +393,6 @@ void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count) | |||
393 | } | 393 | } |
394 | EXPORT_SYMBOL_GPL(pti_writedata); | 394 | EXPORT_SYMBOL_GPL(pti_writedata); |
395 | 395 | ||
396 | /** | ||
397 | * pti_pci_remove()- Driver exit method to remove PTI from | ||
398 | * PCI bus. | ||
399 | * @pdev: variable containing pci info of PTI. | ||
400 | */ | ||
401 | static void __devexit pti_pci_remove(struct pci_dev *pdev) | ||
402 | { | ||
403 | struct pti_dev *drv_data; | ||
404 | |||
405 | drv_data = pci_get_drvdata(pdev); | ||
406 | if (drv_data != NULL) { | ||
407 | pci_iounmap(pdev, drv_data->pti_ioaddr); | ||
408 | pci_set_drvdata(pdev, NULL); | ||
409 | kfree(drv_data); | ||
410 | pci_release_region(pdev, 1); | ||
411 | pci_disable_device(pdev); | ||
412 | } | ||
413 | } | ||
414 | |||
415 | /* | 396 | /* |
416 | * for the tty_driver_*() basic function descriptions, see tty_driver.h. | 397 | * for the tty_driver_*() basic function descriptions, see tty_driver.h. |
417 | * Specific header comments made for PTI-related specifics. | 398 | * Specific header comments made for PTI-related specifics. |
@@ -446,7 +427,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) | |||
446 | * also removes a locking requirement for the actual write | 427 | * also removes a locking requirement for the actual write |
447 | * procedure. | 428 | * procedure. |
448 | */ | 429 | */ |
449 | return tty_port_open(&drv_data->port, tty, filp); | 430 | return tty_port_open(tty->port, tty, filp); |
450 | } | 431 | } |
451 | 432 | ||
452 | /** | 433 | /** |
@@ -462,7 +443,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp) | |||
462 | */ | 443 | */ |
463 | static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) | 444 | static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) |
464 | { | 445 | { |
465 | tty_port_close(&drv_data->port, tty, filp); | 446 | tty_port_close(tty->port, tty, filp); |
466 | } | 447 | } |
467 | 448 | ||
468 | /** | 449 | /** |
@@ -818,6 +799,7 @@ static const struct tty_port_operations tty_port_ops = { | |||
818 | static int __devinit pti_pci_probe(struct pci_dev *pdev, | 799 | static int __devinit pti_pci_probe(struct pci_dev *pdev, |
819 | const struct pci_device_id *ent) | 800 | const struct pci_device_id *ent) |
820 | { | 801 | { |
802 | unsigned int a; | ||
821 | int retval = -EINVAL; | 803 | int retval = -EINVAL; |
822 | int pci_bar = 1; | 804 | int pci_bar = 1; |
823 | 805 | ||
@@ -830,7 +812,7 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, | |||
830 | __func__, __LINE__); | 812 | __func__, __LINE__); |
831 | pr_err("%s(%d): Error value returned: %d\n", | 813 | pr_err("%s(%d): Error value returned: %d\n", |
832 | __func__, __LINE__, retval); | 814 | __func__, __LINE__, retval); |
833 | return retval; | 815 | goto err; |
834 | } | 816 | } |
835 | 817 | ||
836 | retval = pci_enable_device(pdev); | 818 | retval = pci_enable_device(pdev); |
@@ -838,17 +820,16 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, | |||
838 | dev_err(&pdev->dev, | 820 | dev_err(&pdev->dev, |
839 | "%s: pci_enable_device() returned error %d\n", | 821 | "%s: pci_enable_device() returned error %d\n", |
840 | __func__, retval); | 822 | __func__, retval); |
841 | return retval; | 823 | goto err_unreg_misc; |
842 | } | 824 | } |
843 | 825 | ||
844 | drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); | 826 | drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); |
845 | |||
846 | if (drv_data == NULL) { | 827 | if (drv_data == NULL) { |
847 | retval = -ENOMEM; | 828 | retval = -ENOMEM; |
848 | dev_err(&pdev->dev, | 829 | dev_err(&pdev->dev, |
849 | "%s(%d): kmalloc() returned NULL memory.\n", | 830 | "%s(%d): kmalloc() returned NULL memory.\n", |
850 | __func__, __LINE__); | 831 | __func__, __LINE__); |
851 | return retval; | 832 | goto err_disable_pci; |
852 | } | 833 | } |
853 | drv_data->pti_addr = pci_resource_start(pdev, pci_bar); | 834 | drv_data->pti_addr = pci_resource_start(pdev, pci_bar); |
854 | 835 | ||
@@ -857,33 +838,65 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev, | |||
857 | dev_err(&pdev->dev, | 838 | dev_err(&pdev->dev, |
858 | "%s(%d): pci_request_region() returned error %d\n", | 839 | "%s(%d): pci_request_region() returned error %d\n", |
859 | __func__, __LINE__, retval); | 840 | __func__, __LINE__, retval); |
860 | kfree(drv_data); | 841 | goto err_free_dd; |
861 | return retval; | ||
862 | } | 842 | } |
863 | drv_data->aperture_base = drv_data->pti_addr+APERTURE_14; | 843 | drv_data->aperture_base = drv_data->pti_addr+APERTURE_14; |
864 | drv_data->pti_ioaddr = | 844 | drv_data->pti_ioaddr = |
865 | ioremap_nocache((u32)drv_data->aperture_base, | 845 | ioremap_nocache((u32)drv_data->aperture_base, |
866 | APERTURE_LEN); | 846 | APERTURE_LEN); |
867 | if (!drv_data->pti_ioaddr) { | 847 | if (!drv_data->pti_ioaddr) { |
868 | pci_release_region(pdev, pci_bar); | ||
869 | retval = -ENOMEM; | 848 | retval = -ENOMEM; |
870 | kfree(drv_data); | 849 | goto err_rel_reg; |
871 | return retval; | ||
872 | } | 850 | } |
873 | 851 | ||
874 | pci_set_drvdata(pdev, drv_data); | 852 | pci_set_drvdata(pdev, drv_data); |
875 | 853 | ||
876 | tty_port_init(&drv_data->port); | 854 | for (a = 0; a < PTITTY_MINOR_NUM; a++) { |
877 | drv_data->port.ops = &tty_port_ops; | 855 | struct tty_port *port = &drv_data->port[a]; |
856 | tty_port_init(port); | ||
857 | port->ops = &tty_port_ops; | ||
878 | 858 | ||
879 | tty_register_device(pti_tty_driver, 0, &pdev->dev); | 859 | tty_port_register_device(port, pti_tty_driver, a, &pdev->dev); |
880 | tty_register_device(pti_tty_driver, 1, &pdev->dev); | 860 | } |
881 | 861 | ||
882 | register_console(&pti_console); | 862 | register_console(&pti_console); |
883 | 863 | ||
864 | return 0; | ||
865 | err_rel_reg: | ||
866 | pci_release_region(pdev, pci_bar); | ||
867 | err_free_dd: | ||
868 | kfree(drv_data); | ||
869 | err_disable_pci: | ||
870 | pci_disable_device(pdev); | ||
871 | err_unreg_misc: | ||
872 | misc_deregister(&pti_char_driver); | ||
873 | err: | ||
884 | return retval; | 874 | return retval; |
885 | } | 875 | } |
886 | 876 | ||
877 | /** | ||
878 | * pti_pci_remove()- Driver exit method to remove PTI from | ||
879 | * PCI bus. | ||
880 | * @pdev: variable containing pci info of PTI. | ||
881 | */ | ||
882 | static void __devexit pti_pci_remove(struct pci_dev *pdev) | ||
883 | { | ||
884 | struct pti_dev *drv_data = pci_get_drvdata(pdev); | ||
885 | |||
886 | unregister_console(&pti_console); | ||
887 | |||
888 | tty_unregister_device(pti_tty_driver, 0); | ||
889 | tty_unregister_device(pti_tty_driver, 1); | ||
890 | |||
891 | iounmap(drv_data->pti_ioaddr); | ||
892 | pci_set_drvdata(pdev, NULL); | ||
893 | kfree(drv_data); | ||
894 | pci_release_region(pdev, 1); | ||
895 | pci_disable_device(pdev); | ||
896 | |||
897 | misc_deregister(&pti_char_driver); | ||
898 | } | ||
899 | |||
887 | static struct pci_driver pti_pci_driver = { | 900 | static struct pci_driver pti_pci_driver = { |
888 | .name = PCINAME, | 901 | .name = PCINAME, |
889 | .id_table = pci_ids, | 902 | .id_table = pci_ids, |
@@ -933,25 +946,24 @@ static int __init pti_init(void) | |||
933 | pr_err("%s(%d): Error value returned: %d\n", | 946 | pr_err("%s(%d): Error value returned: %d\n", |
934 | __func__, __LINE__, retval); | 947 | __func__, __LINE__, retval); |
935 | 948 | ||
936 | pti_tty_driver = NULL; | 949 | goto put_tty; |
937 | return retval; | ||
938 | } | 950 | } |
939 | 951 | ||
940 | retval = pci_register_driver(&pti_pci_driver); | 952 | retval = pci_register_driver(&pti_pci_driver); |
941 | |||
942 | if (retval) { | 953 | if (retval) { |
943 | pr_err("%s(%d): PCI registration failed of pti driver\n", | 954 | pr_err("%s(%d): PCI registration failed of pti driver\n", |
944 | __func__, __LINE__); | 955 | __func__, __LINE__); |
945 | pr_err("%s(%d): Error value returned: %d\n", | 956 | pr_err("%s(%d): Error value returned: %d\n", |
946 | __func__, __LINE__, retval); | 957 | __func__, __LINE__, retval); |
947 | 958 | goto unreg_tty; | |
948 | tty_unregister_driver(pti_tty_driver); | ||
949 | pr_err("%s(%d): Unregistering TTY part of pti driver\n", | ||
950 | __func__, __LINE__); | ||
951 | pti_tty_driver = NULL; | ||
952 | return retval; | ||
953 | } | 959 | } |
954 | 960 | ||
961 | return 0; | ||
962 | unreg_tty: | ||
963 | tty_unregister_driver(pti_tty_driver); | ||
964 | put_tty: | ||
965 | put_tty_driver(pti_tty_driver); | ||
966 | pti_tty_driver = NULL; | ||
955 | return retval; | 967 | return retval; |
956 | } | 968 | } |
957 | 969 | ||
@@ -960,31 +972,9 @@ static int __init pti_init(void) | |||
960 | */ | 972 | */ |
961 | static void __exit pti_exit(void) | 973 | static void __exit pti_exit(void) |
962 | { | 974 | { |
963 | int retval; | 975 | tty_unregister_driver(pti_tty_driver); |
964 | |||
965 | tty_unregister_device(pti_tty_driver, 0); | ||
966 | tty_unregister_device(pti_tty_driver, 1); | ||
967 | |||
968 | retval = tty_unregister_driver(pti_tty_driver); | ||
969 | if (retval) { | ||
970 | pr_err("%s(%d): TTY unregistration failed of pti driver\n", | ||
971 | __func__, __LINE__); | ||
972 | pr_err("%s(%d): Error value returned: %d\n", | ||
973 | __func__, __LINE__, retval); | ||
974 | } | ||
975 | |||
976 | pci_unregister_driver(&pti_pci_driver); | 976 | pci_unregister_driver(&pti_pci_driver); |
977 | 977 | put_tty_driver(pti_tty_driver); | |
978 | retval = misc_deregister(&pti_char_driver); | ||
979 | if (retval) { | ||
980 | pr_err("%s(%d): CHAR unregistration failed of pti driver\n", | ||
981 | __func__, __LINE__); | ||
982 | pr_err("%s(%d): Error value returned: %d\n", | ||
983 | __func__, __LINE__, retval); | ||
984 | } | ||
985 | |||
986 | unregister_console(&pti_console); | ||
987 | return; | ||
988 | } | 978 | } |
989 | 979 | ||
990 | module_init(pti_init); | 980 | module_init(pti_init); |