Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /*====================================================================== |
2 | ||
475be4d8 JP |
3 | A Sedlbauer PCMCIA client driver |
4 | ||
5 | This driver is for the Sedlbauer Speed Star and Speed Star II, | |
6 | which are ISDN PCMCIA Cards. | |
7 | ||
8 | The contents of this file are subject to the Mozilla Public | |
9 | License Version 1.1 (the "License"); you may not use this file | |
10 | except in compliance with the License. You may obtain a copy of | |
11 | the License at http://www.mozilla.org/MPL/ | |
12 | ||
13 | Software distributed under the License is distributed on an "AS | |
14 | IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | |
15 | implied. See the License for the specific language governing | |
16 | rights and limitations under the License. | |
17 | ||
18 | The initial developer of the original code is David A. Hinds | |
19 | <dahinds@users.sourceforge.net>. Portions created by David A. Hinds | |
20 | are Copyright (C) 1999 David A. Hinds. All Rights Reserved. | |
21 | ||
22 | Modifications from dummy_cs.c are Copyright (C) 1999-2001 Marcus Niemann | |
23 | <maniemann@users.sourceforge.net>. All Rights Reserved. | |
24 | ||
25 | Alternatively, the contents of this file may be used under the | |
26 | terms of the GNU General Public License version 2 (the "GPL"), in | |
27 | which case the provisions of the GPL are applicable instead of the | |
28 | above. If you wish to allow the use of your version of this file | |
29 | only under the terms of the GPL and not to allow others to use | |
30 | your version of this file under the MPL, indicate your decision | |
31 | by deleting the provisions above and replace them with the notice | |
32 | and other provisions required by the GPL. If you do not delete | |
33 | the provisions above, a recipient may use your version of this | |
34 | file under either the MPL or the GPL. | |
35 | ||
36 | ======================================================================*/ | |
1da177e4 LT |
37 | |
38 | #include <linux/kernel.h> | |
39 | #include <linux/module.h> | |
40 | #include <linux/init.h> | |
1da177e4 LT |
41 | #include <linux/ptrace.h> |
42 | #include <linux/slab.h> | |
43 | #include <linux/string.h> | |
44 | #include <linux/timer.h> | |
45 | #include <linux/ioport.h> | |
46 | #include <asm/io.h> | |
1da177e4 | 47 | |
1da177e4 LT |
48 | #include <pcmcia/cistpl.h> |
49 | #include <pcmcia/cisreg.h> | |
50 | #include <pcmcia/ds.h> | |
51 | #include "hisax_cfg.h" | |
52 | ||
53 | MODULE_DESCRIPTION("ISDN4Linux: PCMCIA client driver for Sedlbauer cards"); | |
54 | MODULE_AUTHOR("Marcus Niemann"); | |
55 | MODULE_LICENSE("Dual MPL/GPL"); | |
56 | ||
1da177e4 LT |
57 | |
58 | /*====================================================================*/ | |
59 | ||
60 | /* Parameters that can be set with 'insmod' */ | |
61 | ||
62 | static int protocol = 2; /* EURO-ISDN Default */ | |
63 | module_param(protocol, int, 0); | |
64 | ||
ed5a84cd | 65 | static int sedlbauer_config(struct pcmcia_device *link); |
fba395ee | 66 | static void sedlbauer_release(struct pcmcia_device *link); |
1da177e4 | 67 | |
ed5a84cd | 68 | static void sedlbauer_detach(struct pcmcia_device *p_dev); |
1da177e4 | 69 | |
1da177e4 | 70 | typedef struct local_info_t { |
fd238232 | 71 | struct pcmcia_device *p_dev; |
475be4d8 JP |
72 | int stop; |
73 | int cardnr; | |
1da177e4 LT |
74 | } local_info_t; |
75 | ||
ed5a84cd | 76 | static int sedlbauer_probe(struct pcmcia_device *link) |
1da177e4 | 77 | { |
475be4d8 | 78 | local_info_t *local; |
fba395ee | 79 | |
475be4d8 | 80 | dev_dbg(&link->dev, "sedlbauer_attach()\n"); |
1da177e4 | 81 | |
475be4d8 JP |
82 | /* Allocate space for private device-specific data */ |
83 | local = kzalloc(sizeof(local_info_t), GFP_KERNEL); | |
84 | if (!local) return -ENOMEM; | |
85 | local->cardnr = -1; | |
fd238232 | 86 | |
475be4d8 JP |
87 | local->p_dev = link; |
88 | link->priv = local; | |
fd238232 | 89 | |
475be4d8 | 90 | return sedlbauer_config(link); |
1da177e4 LT |
91 | } /* sedlbauer_attach */ |
92 | ||
ed5a84cd | 93 | static void sedlbauer_detach(struct pcmcia_device *link) |
1da177e4 | 94 | { |
e773cfe1 | 95 | dev_dbg(&link->dev, "sedlbauer_detach(0x%p)\n", link); |
1da177e4 | 96 | |
e2d40963 DB |
97 | ((local_info_t *)link->priv)->stop = 1; |
98 | sedlbauer_release(link); | |
1da177e4 | 99 | |
e2d40963 DB |
100 | /* This points to the parent local_info_t struct */ |
101 | kfree(link->priv); | |
1da177e4 LT |
102 | } /* sedlbauer_detach */ |
103 | ||
00990e7c | 104 | static int sedlbauer_config_check(struct pcmcia_device *p_dev, void *priv_data) |
1da177e4 | 105 | { |
00990e7c DB |
106 | if (p_dev->config_index == 0) |
107 | return -EINVAL; | |
108 | ||
109 | p_dev->io_lines = 3; | |
110 | return pcmcia_request_io(p_dev); | |
5fcd4da0 DB |
111 | } |
112 | ||
ed5a84cd | 113 | static int sedlbauer_config(struct pcmcia_device *link) |
5fcd4da0 | 114 | { |
475be4d8 JP |
115 | int ret; |
116 | IsdnCard_t icard; | |
117 | ||
118 | dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link); | |
1da177e4 | 119 | |
475be4d8 JP |
120 | link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC | |
121 | CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; | |
122 | ||
123 | ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL); | |
124 | if (ret) | |
125 | goto failed; | |
126 | ||
127 | ret = pcmcia_enable_device(link); | |
128 | if (ret) | |
129 | goto failed; | |
130 | ||
131 | icard.para[0] = link->irq; | |
132 | icard.para[1] = link->resource[0]->start; | |
133 | icard.protocol = protocol; | |
134 | icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA; | |
135 | ||
136 | ret = hisax_init_pcmcia(link, | |
137 | &(((local_info_t *)link->priv)->stop), &icard); | |
138 | if (ret < 0) { | |
139 | printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n", | |
140 | ret, link->resource[0]); | |
141 | sedlbauer_release(link); | |
142 | return -ENODEV; | |
143 | } else | |
144 | ((local_info_t *)link->priv)->cardnr = ret; | |
145 | ||
146 | return 0; | |
1da177e4 | 147 | |
5fcd4da0 | 148 | failed: |
475be4d8 JP |
149 | sedlbauer_release(link); |
150 | return -ENODEV; | |
1da177e4 LT |
151 | |
152 | } /* sedlbauer_config */ | |
153 | ||
fba395ee | 154 | static void sedlbauer_release(struct pcmcia_device *link) |
1da177e4 | 155 | { |
475be4d8 JP |
156 | local_info_t *local = link->priv; |
157 | dev_dbg(&link->dev, "sedlbauer_release(0x%p)\n", link); | |
158 | ||
159 | if (local) { | |
160 | if (local->cardnr >= 0) { | |
161 | /* no unregister function with hisax */ | |
162 | HiSax_closecard(local->cardnr); | |
163 | } | |
1da177e4 | 164 | } |
1da177e4 | 165 | |
475be4d8 | 166 | pcmcia_disable_device(link); |
1da177e4 LT |
167 | } /* sedlbauer_release */ |
168 | ||
fba395ee | 169 | static int sedlbauer_suspend(struct pcmcia_device *link) |
98e4c28b | 170 | { |
98e4c28b DB |
171 | local_info_t *dev = link->priv; |
172 | ||
98e4c28b | 173 | dev->stop = 1; |
98e4c28b DB |
174 | |
175 | return 0; | |
176 | } | |
177 | ||
fba395ee | 178 | static int sedlbauer_resume(struct pcmcia_device *link) |
98e4c28b | 179 | { |
98e4c28b DB |
180 | local_info_t *dev = link->priv; |
181 | ||
98e4c28b DB |
182 | dev->stop = 0; |
183 | ||
184 | return 0; | |
185 | } | |
186 | ||
1da177e4 | 187 | |
25f8f54f | 188 | static const struct pcmcia_device_id sedlbauer_ids[] = { |
84d370b9 | 189 | PCMCIA_DEVICE_PROD_ID123("SEDLBAUER", "speed star II", "V 3.1", 0x81fb79f5, 0xf3612e1d, 0x6b95c78a), |
70799734 DB |
190 | PCMCIA_DEVICE_PROD_ID123("SEDLBAUER", "ISDN-Adapter", "4D67", 0x81fb79f5, 0xe4e9bc12, 0x397b7e90), |
191 | PCMCIA_DEVICE_PROD_ID123("SEDLBAUER", "ISDN-Adapter", "4D98", 0x81fb79f5, 0xe4e9bc12, 0x2e5c7fce), | |
192 | PCMCIA_DEVICE_PROD_ID123("SEDLBAUER", "ISDN-Adapter", " (C) 93-94 VK", 0x81fb79f5, 0xe4e9bc12, 0x8db143fe), | |
193 | PCMCIA_DEVICE_PROD_ID123("SEDLBAUER", "ISDN-Adapter", " (c) 93-95 VK", 0x81fb79f5, 0xe4e9bc12, 0xb391ab4c), | |
194 | PCMCIA_DEVICE_PROD_ID12("HST High Soft Tech GmbH", "Saphir II B", 0xd79e0b84, 0x21d083ae), | |
195 | /* PCMCIA_DEVICE_PROD_ID1234("SEDLBAUER", 0x81fb79f5), */ /* too generic*/ | |
196 | PCMCIA_DEVICE_NULL | |
197 | }; | |
198 | MODULE_DEVICE_TABLE(pcmcia, sedlbauer_ids); | |
199 | ||
1da177e4 LT |
200 | static struct pcmcia_driver sedlbauer_driver = { |
201 | .owner = THIS_MODULE, | |
2e9b981a | 202 | .name = "sedlbauer_cs", |
15b99ac1 | 203 | .probe = sedlbauer_probe, |
ed5a84cd | 204 | .remove = sedlbauer_detach, |
70799734 | 205 | .id_table = sedlbauer_ids, |
98e4c28b DB |
206 | .suspend = sedlbauer_suspend, |
207 | .resume = sedlbauer_resume, | |
1da177e4 | 208 | }; |
0aae9c6a | 209 | module_pcmcia_driver(sedlbauer_driver); |