]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/dgrp/dgrp_driver.c
Merge remote-tracking branch 'xen-tip/linux-next'
[karo-tx-linux.git] / drivers / staging / dgrp / dgrp_driver.c
1 /*
2  *
3  * Copyright 1999-2003 Digi International (www.digi.com)
4  *     Jeff Randall
5  *     James Puzzo  <jamesp at digi dot com>
6  *     Scott Kilau  <Scott_Kilau at digi dot com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
15  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16  * PURPOSE.  See the GNU General Public License for more details.
17  *
18  */
19
20 /*
21  *      Driver specific includes
22  */
23 #include <linux/module.h>
24 #include <linux/slab.h>
25 #include <linux/tty.h>
26 #include <linux/init.h>
27
28 /*
29  *  PortServer includes
30  */
31 #include "dgrp_common.h"
32
33
34 MODULE_LICENSE("GPL");
35 MODULE_AUTHOR("Digi International, http://www.digi.com");
36 MODULE_DESCRIPTION("RealPort driver for Digi's ethernet-based serial connectivity product line");
37 MODULE_VERSION(DIGI_VERSION);
38
39 struct list_head nd_struct_list;
40 struct dgrp_poll_data dgrp_poll_data;
41
42 int dgrp_register_cudevices = 1;/* Turn on/off registering legacy cu devices */
43 int dgrp_register_prdevices = 1;/* Turn on/off registering transparent print */
44 int dgrp_poll_tick = 20;        /* Poll interval - in ms */
45
46 module_param_named(register_cudevices, dgrp_register_cudevices, int, 0644);
47 MODULE_PARM_DESC(register_cudevices, "Turn on/off registering legacy cu devices");
48
49 module_param_named(register_prdevices, dgrp_register_prdevices, int, 0644);
50 MODULE_PARM_DESC(register_prdevices, "Turn on/off registering transparent print devices");
51
52 module_param_named(pollrate, dgrp_poll_tick, int, 0644);
53 MODULE_PARM_DESC(pollrate, "Poll interval in ms");
54
55 /*
56  * init_module()
57  *
58  * Module load.  This is where it all starts.
59  */
60 static int __init dgrp_init_module(void)
61 {
62         int ret;
63
64         INIT_LIST_HEAD(&nd_struct_list);
65
66         spin_lock_init(&dgrp_poll_data.poll_lock);
67         init_timer(&dgrp_poll_data.timer);
68         dgrp_poll_data.poll_tick = dgrp_poll_tick;
69         dgrp_poll_data.timer.function = dgrp_poll_handler;
70         dgrp_poll_data.timer.data = (unsigned long) &dgrp_poll_data;
71
72         ret = dgrp_create_class_sysfs_files();
73         if (ret)
74                 return ret;
75
76         dgrp_register_proc();
77
78         return 0;
79 }
80
81
82 /*
83  *      Module unload.  This is where it all ends.
84  */
85 static void __exit dgrp_cleanup_module(void)
86 {
87         struct nd_struct *nd, *next;
88
89         /*
90          *      Attempting to free resources in backwards
91          *      order of allocation, in case that helps
92          *      memory pool fragmentation.
93          */
94         dgrp_unregister_proc();
95
96         dgrp_remove_class_sysfs_files();
97
98
99         list_for_each_entry_safe(nd, next, &nd_struct_list, list) {
100                 dgrp_tty_uninit(nd);
101                 kfree(nd);
102         }
103 }
104
105 module_init(dgrp_init_module);
106 module_exit(dgrp_cleanup_module);