Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / isdn / divert / divert_init.c
1 /* $Id divert_init.c,v 1.5.6.2 2001/01/24 22:18:17 kai Exp $
2  *
3  * Module init for DSS1 diversion services for i4l.
4  *
5  * Copyright 1999       by Werner Cornelius (werner@isdn4linux.de)
6  *
7  * This software may be used and distributed according to the terms
8  * of the GNU General Public License, incorporated herein by reference.
9  *
10  */
11
12 #include <linux/module.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15
16 #include "isdn_divert.h"
17
18 MODULE_DESCRIPTION("ISDN4Linux: Call diversion support");
19 MODULE_AUTHOR("Werner Cornelius");
20 MODULE_LICENSE("GPL");
21
22 /****************************************/
23 /* structure containing interface to hl */
24 /****************************************/
25 isdn_divert_if divert_if = {
26         DIVERT_IF_MAGIC,        /* magic value */
27         DIVERT_CMD_REG,         /* register cmd */
28         ll_callback,            /* callback routine from ll */
29         NULL,                   /* command still not specified */
30         NULL,                   /* drv_to_name */
31         NULL,                   /* name_to_drv */
32 };
33
34 /*************************/
35 /* Module interface code */
36 /* no cmd line parms     */
37 /*************************/
38 static int __init divert_init(void)
39 {
40         int i;
41
42         if (divert_dev_init()) {
43                 printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n");
44                 return (-EIO);
45         }
46         if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) {
47                 divert_dev_deinit();
48                 printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i);
49                 return (-EIO);
50         }
51         printk(KERN_INFO "dss1_divert module successfully installed\n");
52         return (0);
53 }
54
55 /**********************/
56 /* Module deinit code */
57 /**********************/
58 static void __exit divert_exit(void)
59 {
60         unsigned long flags;
61         int i;
62
63         spin_lock_irqsave(&divert_lock, flags);
64         divert_if.cmd = DIVERT_CMD_REL; /* release */
65         if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) {
66                 printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i);
67                 spin_unlock_irqrestore(&divert_lock, flags);
68                 return;
69         }
70         if (divert_dev_deinit()) {
71                 printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n");
72                 spin_unlock_irqrestore(&divert_lock, flags);
73                 return;
74         }
75         spin_unlock_irqrestore(&divert_lock, flags);
76         deleterule(-1); /* delete all rules and free mem */
77         deleteprocs();
78         printk(KERN_INFO "dss1_divert module successfully removed \n");
79 }
80
81 module_init(divert_init);
82 module_exit(divert_exit);