diff options
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/stallion.c | 256 |
1 files changed, 120 insertions, 136 deletions
diff --git a/drivers/char/stallion.c b/drivers/char/stallion.c index b108ac6e3d83..f49f145e20ee 100644 --- a/drivers/char/stallion.c +++ b/drivers/char/stallion.c | |||
@@ -278,9 +278,6 @@ static struct { | |||
278 | /* | 278 | /* |
279 | * Define the module agruments. | 279 | * Define the module agruments. |
280 | */ | 280 | */ |
281 | MODULE_AUTHOR("Greg Ungerer"); | ||
282 | MODULE_DESCRIPTION("Stallion Multiport Serial Driver"); | ||
283 | MODULE_LICENSE("GPL"); | ||
284 | 281 | ||
285 | module_param_array(board0, charp, &stl_nargs, 0); | 282 | module_param_array(board0, charp, &stl_nargs, 0); |
286 | MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]"); | 283 | MODULE_PARM_DESC(board0, "Board 0 config -> name[,ioaddr[,ioaddr2][,irq]]"); |
@@ -458,7 +455,6 @@ static int stl_parsebrd(struct stlconf *confp, char **argp); | |||
458 | 455 | ||
459 | static unsigned long stl_atol(char *str); | 456 | static unsigned long stl_atol(char *str); |
460 | 457 | ||
461 | static int stl_init(void); | ||
462 | static int stl_open(struct tty_struct *tty, struct file *filp); | 458 | static int stl_open(struct tty_struct *tty, struct file *filp); |
463 | static void stl_close(struct tty_struct *tty, struct file *filp); | 459 | static void stl_close(struct tty_struct *tty, struct file *filp); |
464 | static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count); | 460 | static int stl_write(struct tty_struct *tty, const unsigned char *buf, int count); |
@@ -708,91 +704,9 @@ static const struct file_operations stl_fsiomem = { | |||
708 | .ioctl = stl_memioctl, | 704 | .ioctl = stl_memioctl, |
709 | }; | 705 | }; |
710 | 706 | ||
711 | /*****************************************************************************/ | ||
712 | |||
713 | static struct class *stallion_class; | 707 | static struct class *stallion_class; |
714 | 708 | ||
715 | /* | 709 | /* |
716 | * Loadable module initialization stuff. | ||
717 | */ | ||
718 | |||
719 | static int __init stallion_module_init(void) | ||
720 | { | ||
721 | stl_init(); | ||
722 | return 0; | ||
723 | } | ||
724 | |||
725 | /*****************************************************************************/ | ||
726 | |||
727 | static void __exit stallion_module_exit(void) | ||
728 | { | ||
729 | struct stlbrd *brdp; | ||
730 | struct stlpanel *panelp; | ||
731 | struct stlport *portp; | ||
732 | int i, j, k; | ||
733 | |||
734 | pr_debug("cleanup_module()\n"); | ||
735 | |||
736 | printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle, | ||
737 | stl_drvversion); | ||
738 | |||
739 | /* | ||
740 | * Free up all allocated resources used by the ports. This includes | ||
741 | * memory and interrupts. As part of this process we will also do | ||
742 | * a hangup on every open port - to try to flush out any processes | ||
743 | * hanging onto ports. | ||
744 | */ | ||
745 | i = tty_unregister_driver(stl_serial); | ||
746 | put_tty_driver(stl_serial); | ||
747 | if (i) { | ||
748 | printk("STALLION: failed to un-register tty driver, " | ||
749 | "errno=%d\n", -i); | ||
750 | return; | ||
751 | } | ||
752 | for (i = 0; i < 4; i++) | ||
753 | class_device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i)); | ||
754 | if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"))) | ||
755 | printk("STALLION: failed to un-register serial memory device, " | ||
756 | "errno=%d\n", -i); | ||
757 | class_destroy(stallion_class); | ||
758 | |||
759 | for (i = 0; (i < stl_nrbrds); i++) { | ||
760 | if ((brdp = stl_brds[i]) == NULL) | ||
761 | continue; | ||
762 | |||
763 | free_irq(brdp->irq, brdp); | ||
764 | |||
765 | for (j = 0; (j < STL_MAXPANELS); j++) { | ||
766 | panelp = brdp->panels[j]; | ||
767 | if (panelp == NULL) | ||
768 | continue; | ||
769 | for (k = 0; (k < STL_PORTSPERPANEL); k++) { | ||
770 | portp = panelp->ports[k]; | ||
771 | if (portp == NULL) | ||
772 | continue; | ||
773 | if (portp->tty != NULL) | ||
774 | stl_hangup(portp->tty); | ||
775 | kfree(portp->tx.buf); | ||
776 | kfree(portp); | ||
777 | } | ||
778 | kfree(panelp); | ||
779 | } | ||
780 | |||
781 | release_region(brdp->ioaddr1, brdp->iosize1); | ||
782 | if (brdp->iosize2 > 0) | ||
783 | release_region(brdp->ioaddr2, brdp->iosize2); | ||
784 | |||
785 | kfree(brdp); | ||
786 | stl_brds[i] = NULL; | ||
787 | } | ||
788 | } | ||
789 | |||
790 | module_init(stallion_module_init); | ||
791 | module_exit(stallion_module_exit); | ||
792 | |||
793 | /*****************************************************************************/ | ||
794 | |||
795 | /* | ||
796 | * Check for any arguments passed in on the module load command line. | 710 | * Check for any arguments passed in on the module load command line. |
797 | */ | 711 | */ |
798 | 712 | ||
@@ -2935,55 +2849,6 @@ static const struct tty_operations stl_ops = { | |||
2935 | }; | 2849 | }; |
2936 | 2850 | ||
2937 | /*****************************************************************************/ | 2851 | /*****************************************************************************/ |
2938 | |||
2939 | static int __init stl_init(void) | ||
2940 | { | ||
2941 | int i; | ||
2942 | printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion); | ||
2943 | |||
2944 | spin_lock_init(&stallion_lock); | ||
2945 | spin_lock_init(&brd_lock); | ||
2946 | |||
2947 | stl_initbrds(); | ||
2948 | |||
2949 | stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); | ||
2950 | if (!stl_serial) | ||
2951 | return -1; | ||
2952 | |||
2953 | /* | ||
2954 | * Set up a character driver for per board stuff. This is mainly used | ||
2955 | * to do stats ioctls on the ports. | ||
2956 | */ | ||
2957 | if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem)) | ||
2958 | printk("STALLION: failed to register serial board device\n"); | ||
2959 | |||
2960 | stallion_class = class_create(THIS_MODULE, "staliomem"); | ||
2961 | for (i = 0; i < 4; i++) | ||
2962 | class_device_create(stallion_class, NULL, | ||
2963 | MKDEV(STL_SIOMEMMAJOR, i), NULL, | ||
2964 | "staliomem%d", i); | ||
2965 | |||
2966 | stl_serial->owner = THIS_MODULE; | ||
2967 | stl_serial->driver_name = stl_drvname; | ||
2968 | stl_serial->name = "ttyE"; | ||
2969 | stl_serial->major = STL_SERIALMAJOR; | ||
2970 | stl_serial->minor_start = 0; | ||
2971 | stl_serial->type = TTY_DRIVER_TYPE_SERIAL; | ||
2972 | stl_serial->subtype = SERIAL_TYPE_NORMAL; | ||
2973 | stl_serial->init_termios = stl_deftermios; | ||
2974 | stl_serial->flags = TTY_DRIVER_REAL_RAW; | ||
2975 | tty_set_operations(stl_serial, &stl_ops); | ||
2976 | |||
2977 | if (tty_register_driver(stl_serial)) { | ||
2978 | put_tty_driver(stl_serial); | ||
2979 | printk("STALLION: failed to register serial driver\n"); | ||
2980 | return -1; | ||
2981 | } | ||
2982 | |||
2983 | return 0; | ||
2984 | } | ||
2985 | |||
2986 | /*****************************************************************************/ | ||
2987 | /* CD1400 HARDWARE FUNCTIONS */ | 2852 | /* CD1400 HARDWARE FUNCTIONS */ |
2988 | /*****************************************************************************/ | 2853 | /*****************************************************************************/ |
2989 | 2854 | ||
@@ -4954,4 +4819,123 @@ static void stl_sc26198otherisr(struct stlport *portp, unsigned int iack) | |||
4954 | } | 4819 | } |
4955 | } | 4820 | } |
4956 | 4821 | ||
4957 | /*****************************************************************************/ | 4822 | /* |
4823 | * Loadable module initialization stuff. | ||
4824 | */ | ||
4825 | static int __init stallion_module_init(void) | ||
4826 | { | ||
4827 | unsigned int i; | ||
4828 | |||
4829 | printk(KERN_INFO "%s: version %s\n", stl_drvtitle, stl_drvversion); | ||
4830 | |||
4831 | spin_lock_init(&stallion_lock); | ||
4832 | spin_lock_init(&brd_lock); | ||
4833 | |||
4834 | stl_initbrds(); | ||
4835 | |||
4836 | stl_serial = alloc_tty_driver(STL_MAXBRDS * STL_MAXPORTS); | ||
4837 | if (!stl_serial) | ||
4838 | return -1; | ||
4839 | |||
4840 | /* | ||
4841 | * Set up a character driver for per board stuff. This is mainly used | ||
4842 | * to do stats ioctls on the ports. | ||
4843 | */ | ||
4844 | if (register_chrdev(STL_SIOMEMMAJOR, "staliomem", &stl_fsiomem)) | ||
4845 | printk("STALLION: failed to register serial board device\n"); | ||
4846 | |||
4847 | stallion_class = class_create(THIS_MODULE, "staliomem"); | ||
4848 | for (i = 0; i < 4; i++) | ||
4849 | class_device_create(stallion_class, NULL, | ||
4850 | MKDEV(STL_SIOMEMMAJOR, i), NULL, | ||
4851 | "staliomem%d", i); | ||
4852 | |||
4853 | stl_serial->owner = THIS_MODULE; | ||
4854 | stl_serial->driver_name = stl_drvname; | ||
4855 | stl_serial->name = "ttyE"; | ||
4856 | stl_serial->major = STL_SERIALMAJOR; | ||
4857 | stl_serial->minor_start = 0; | ||
4858 | stl_serial->type = TTY_DRIVER_TYPE_SERIAL; | ||
4859 | stl_serial->subtype = SERIAL_TYPE_NORMAL; | ||
4860 | stl_serial->init_termios = stl_deftermios; | ||
4861 | stl_serial->flags = TTY_DRIVER_REAL_RAW; | ||
4862 | tty_set_operations(stl_serial, &stl_ops); | ||
4863 | |||
4864 | if (tty_register_driver(stl_serial)) { | ||
4865 | put_tty_driver(stl_serial); | ||
4866 | printk("STALLION: failed to register serial driver\n"); | ||
4867 | return -1; | ||
4868 | } | ||
4869 | |||
4870 | return 0; | ||
4871 | } | ||
4872 | |||
4873 | static void __exit stallion_module_exit(void) | ||
4874 | { | ||
4875 | struct stlbrd *brdp; | ||
4876 | struct stlpanel *panelp; | ||
4877 | struct stlport *portp; | ||
4878 | int i, j, k; | ||
4879 | |||
4880 | pr_debug("cleanup_module()\n"); | ||
4881 | |||
4882 | printk(KERN_INFO "Unloading %s: version %s\n", stl_drvtitle, | ||
4883 | stl_drvversion); | ||
4884 | |||
4885 | /* | ||
4886 | * Free up all allocated resources used by the ports. This includes | ||
4887 | * memory and interrupts. As part of this process we will also do | ||
4888 | * a hangup on every open port - to try to flush out any processes | ||
4889 | * hanging onto ports. | ||
4890 | */ | ||
4891 | i = tty_unregister_driver(stl_serial); | ||
4892 | put_tty_driver(stl_serial); | ||
4893 | if (i) { | ||
4894 | printk("STALLION: failed to un-register tty driver, " | ||
4895 | "errno=%d\n", -i); | ||
4896 | return; | ||
4897 | } | ||
4898 | for (i = 0; i < 4; i++) | ||
4899 | class_device_destroy(stallion_class, MKDEV(STL_SIOMEMMAJOR, i)); | ||
4900 | if ((i = unregister_chrdev(STL_SIOMEMMAJOR, "staliomem"))) | ||
4901 | printk("STALLION: failed to un-register serial memory device, " | ||
4902 | "errno=%d\n", -i); | ||
4903 | class_destroy(stallion_class); | ||
4904 | |||
4905 | for (i = 0; (i < stl_nrbrds); i++) { | ||
4906 | if ((brdp = stl_brds[i]) == NULL) | ||
4907 | continue; | ||
4908 | |||
4909 | free_irq(brdp->irq, brdp); | ||
4910 | |||
4911 | for (j = 0; (j < STL_MAXPANELS); j++) { | ||
4912 | panelp = brdp->panels[j]; | ||
4913 | if (panelp == NULL) | ||
4914 | continue; | ||
4915 | for (k = 0; (k < STL_PORTSPERPANEL); k++) { | ||
4916 | portp = panelp->ports[k]; | ||
4917 | if (portp == NULL) | ||
4918 | continue; | ||
4919 | if (portp->tty != NULL) | ||
4920 | stl_hangup(portp->tty); | ||
4921 | kfree(portp->tx.buf); | ||
4922 | kfree(portp); | ||
4923 | } | ||
4924 | kfree(panelp); | ||
4925 | } | ||
4926 | |||
4927 | release_region(brdp->ioaddr1, brdp->iosize1); | ||
4928 | if (brdp->iosize2 > 0) | ||
4929 | release_region(brdp->ioaddr2, brdp->iosize2); | ||
4930 | |||
4931 | kfree(brdp); | ||
4932 | stl_brds[i] = NULL; | ||
4933 | } | ||
4934 | } | ||
4935 | |||
4936 | module_init(stallion_module_init); | ||
4937 | module_exit(stallion_module_exit); | ||
4938 | |||
4939 | MODULE_AUTHOR("Greg Ungerer"); | ||
4940 | MODULE_DESCRIPTION("Stallion Multiport Serial Driver"); | ||
4941 | MODULE_LICENSE("GPL"); | ||