Blame view
drivers/parport/parport_cs.c
5.74 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/*====================================================================== A driver for PCMCIA parallel port adapters (specifically, for the Quatech SPP-100 EPP card: other cards will probably require driver tweaks) parport_cs.c 1.29 2002/10/11 06:57:41 The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The initial developer of the original code is David A. Hinds <dahinds@users.sourceforge.net>. Portions created by David A. Hinds are Copyright (C) 1999 David A. Hinds. All Rights Reserved. Alternatively, the contents of this file may be used under the terms of the GNU General Public License version 2 (the "GPL"), in which case the provisions of the GPL are applicable instead of the above. If you wish to allow the use of your version of this file only under the terms of the GPL and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the GPL. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the GPL. ======================================================================*/ #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> |
1da177e4c Linux-2.6.12-rc2 |
40 41 42 43 44 45 |
#include <linux/ptrace.h> #include <linux/slab.h> #include <linux/string.h> #include <linux/timer.h> #include <linux/ioport.h> #include <linux/major.h> |
51dcdfec6 parport: Use the ... |
46 |
#include <linux/interrupt.h> |
1da177e4c Linux-2.6.12-rc2 |
47 48 49 |
#include <linux/parport.h> #include <linux/parport_pc.h> |
1da177e4c Linux-2.6.12-rc2 |
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#include <pcmcia/cistpl.h> #include <pcmcia/ds.h> #include <pcmcia/cisreg.h> #include <pcmcia/ciscode.h> /*====================================================================*/ /* Module parameters */ MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>"); MODULE_DESCRIPTION("PCMCIA parallel port card driver"); MODULE_LICENSE("Dual MPL/GPL"); #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0) INT_MODULE_PARM(epp_mode, 1); |
1da177e4c Linux-2.6.12-rc2 |
66 67 68 69 70 71 |
/*====================================================================*/ #define FORCE_EPP_MODE 0x08 typedef struct parport_info_t { |
fd238232c [PATCH] pcmcia: e... |
72 |
struct pcmcia_device *p_dev; |
1da177e4c Linux-2.6.12-rc2 |
73 |
int ndev; |
1da177e4c Linux-2.6.12-rc2 |
74 75 |
struct parport *port; } parport_info_t; |
cc3b4866b [PATCH] pcmcia: u... |
76 |
static void parport_detach(struct pcmcia_device *p_dev); |
15b99ac17 [PATCH] pcmcia: a... |
77 |
static int parport_config(struct pcmcia_device *link); |
fba395eee [PATCH] pcmcia: r... |
78 |
static void parport_cs_release(struct pcmcia_device *); |
1da177e4c Linux-2.6.12-rc2 |
79 |
|
15b99ac17 [PATCH] pcmcia: a... |
80 |
static int parport_probe(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
81 82 |
{ parport_info_t *info; |
f8cfa618d [PATCH] pcmcia: u... |
83 |
|
9b44de201 pcmcia: use dynam... |
84 85 |
dev_dbg(&link->dev, "parport_attach() "); |
1da177e4c Linux-2.6.12-rc2 |
86 87 |
/* Create new parport device */ |
dd00cc486 some kmalloc/mems... |
88 |
info = kzalloc(sizeof(*info), GFP_KERNEL); |
f8cfa618d [PATCH] pcmcia: u... |
89 |
if (!info) return -ENOMEM; |
fd238232c [PATCH] pcmcia: e... |
90 |
link->priv = info; |
fba395eee [PATCH] pcmcia: r... |
91 |
info->p_dev = link; |
1da177e4c Linux-2.6.12-rc2 |
92 |
|
00990e7ce pcmcia: use autoc... |
93 |
link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; |
f8cfa618d [PATCH] pcmcia: u... |
94 |
|
15b99ac17 [PATCH] pcmcia: a... |
95 |
return parport_config(link); |
1da177e4c Linux-2.6.12-rc2 |
96 |
} /* parport_attach */ |
fba395eee [PATCH] pcmcia: r... |
97 |
static void parport_detach(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
98 |
{ |
9b44de201 pcmcia: use dynam... |
99 100 |
dev_dbg(&link->dev, "parport_detach "); |
cc3b4866b [PATCH] pcmcia: u... |
101 |
|
e2d409636 [PATCH] pcmcia: u... |
102 |
parport_cs_release(link); |
cc3b4866b [PATCH] pcmcia: u... |
103 |
|
1da177e4c Linux-2.6.12-rc2 |
104 |
kfree(link->priv); |
1da177e4c Linux-2.6.12-rc2 |
105 |
} /* parport_detach */ |
00990e7ce pcmcia: use autoc... |
106 |
static int parport_config_check(struct pcmcia_device *p_dev, void *priv_data) |
84e2d3400 pcmcia: use pcmci... |
107 |
{ |
00990e7ce pcmcia: use autoc... |
108 109 110 111 112 113 |
p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH; p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; p_dev->resource[1]->flags &= ~IO_DATA_PATH_WIDTH; p_dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_8; return pcmcia_request_io(p_dev); |
84e2d3400 pcmcia: use pcmci... |
114 |
} |
15b99ac17 [PATCH] pcmcia: a... |
115 |
static int parport_config(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
116 |
{ |
1da177e4c Linux-2.6.12-rc2 |
117 |
parport_info_t *info = link->priv; |
1da177e4c Linux-2.6.12-rc2 |
118 |
struct parport *p; |
9b44de201 pcmcia: use dynam... |
119 |
int ret; |
84e2d3400 pcmcia: use pcmci... |
120 |
|
9b44de201 pcmcia: use dynam... |
121 122 |
dev_dbg(&link->dev, "parport_config "); |
84e2d3400 pcmcia: use pcmci... |
123 |
|
00990e7ce pcmcia: use autoc... |
124 125 |
if (epp_mode) link->config_index |= FORCE_EPP_MODE; |
9b44de201 pcmcia: use dynam... |
126 127 |
ret = pcmcia_loop_config(link, parport_config_check, NULL); if (ret) |
84e2d3400 pcmcia: use pcmci... |
128 |
goto failed; |
84e2d3400 pcmcia: use pcmci... |
129 |
|
eb14120f7 pcmcia: re-work p... |
130 |
if (!link->irq) |
9b44de201 pcmcia: use dynam... |
131 |
goto failed; |
1ac71e5a3 pcmcia: convert p... |
132 |
ret = pcmcia_enable_device(link); |
9b44de201 pcmcia: use dynam... |
133 134 |
if (ret) goto failed; |
1da177e4c Linux-2.6.12-rc2 |
135 |
|
9a017a910 pcmcia: do not us... |
136 137 |
p = parport_pc_probe_port(link->resource[0]->start, link->resource[1]->start, |
eb14120f7 pcmcia: re-work p... |
138 |
link->irq, PARPORT_DMA_NONE, |
51dcdfec6 parport: Use the ... |
139 |
&link->dev, IRQF_SHARED); |
1da177e4c Linux-2.6.12-rc2 |
140 141 |
if (p == NULL) { printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at " |
9a017a910 pcmcia: do not us... |
142 143 144 |
"0x%3x, irq %u failed ", (unsigned int) link->resource[0]->start, |
eb14120f7 pcmcia: re-work p... |
145 |
link->irq); |
1da177e4c Linux-2.6.12-rc2 |
146 147 148 149 150 151 152 |
goto failed; } p->modes |= PARPORT_MODE_PCSPP; if (epp_mode) p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP; info->ndev = 1; |
1da177e4c Linux-2.6.12-rc2 |
153 |
info->port = p; |
1da177e4c Linux-2.6.12-rc2 |
154 |
|
15b99ac17 [PATCH] pcmcia: a... |
155 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
156 157 |
failed: parport_cs_release(link); |
15b99ac17 [PATCH] pcmcia: a... |
158 |
return -ENODEV; |
1da177e4c Linux-2.6.12-rc2 |
159 |
} /* parport_config */ |
23d5f96ce make parport_cs_r... |
160 |
static void parport_cs_release(struct pcmcia_device *link) |
1da177e4c Linux-2.6.12-rc2 |
161 |
{ |
5f2a71fcb [PATCH] pcmcia: a... |
162 |
parport_info_t *info = link->priv; |
1da177e4c Linux-2.6.12-rc2 |
163 |
|
9b44de201 pcmcia: use dynam... |
164 165 |
dev_dbg(&link->dev, "parport_release "); |
5f2a71fcb [PATCH] pcmcia: a... |
166 167 168 169 170 171 |
if (info->ndev) { struct parport *p = info->port; parport_pc_unregister_port(p); } info->ndev = 0; |
1da177e4c Linux-2.6.12-rc2 |
172 |
|
fba395eee [PATCH] pcmcia: r... |
173 |
pcmcia_disable_device(link); |
1da177e4c Linux-2.6.12-rc2 |
174 |
} /* parport_cs_release */ |
98e4c28b7 [PATCH] pcmcia: n... |
175 |
|
25f8f54f6 pcmcia: Convert p... |
176 |
static const struct pcmcia_device_id parport_ids[] = { |
476835afd [PATCH] pcmcia: i... |
177 |
PCMCIA_DEVICE_FUNC_ID(3), |
44e5e33e9 [PATCH] pcmcia: I... |
178 |
PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc), |
476835afd [PATCH] pcmcia: i... |
179 180 181 182 |
PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0003), PCMCIA_DEVICE_NULL }; MODULE_DEVICE_TABLE(pcmcia, parport_ids); |
1da177e4c Linux-2.6.12-rc2 |
183 184 |
static struct pcmcia_driver parport_cs_driver = { .owner = THIS_MODULE, |
2e9b981a7 pcmcia: move driv... |
185 |
.name = "parport_cs", |
15b99ac17 [PATCH] pcmcia: a... |
186 |
.probe = parport_probe, |
cc3b4866b [PATCH] pcmcia: u... |
187 |
.remove = parport_detach, |
476835afd [PATCH] pcmcia: i... |
188 |
.id_table = parport_ids, |
1da177e4c Linux-2.6.12-rc2 |
189 190 191 192 193 194 195 196 197 198 |
}; static int __init init_parport_cs(void) { return pcmcia_register_driver(&parport_cs_driver); } static void __exit exit_parport_cs(void) { pcmcia_unregister_driver(&parport_cs_driver); |
1da177e4c Linux-2.6.12-rc2 |
199 200 201 202 |
} module_init(init_parport_cs); module_exit(exit_parport_cs); |