Blame view

drivers/parport/parport_cs.c 5.74 KB
1da177e4c   Linus Torvalds   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   Linus Torvalds   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   Alan Cox   parport: Use the ...
46
  #include <linux/interrupt.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
48
49
  
  #include <linux/parport.h>
  #include <linux/parport_pc.h>
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
  
  /*====================================================================*/
  
  #define FORCE_EPP_MODE	0x08
  
  typedef struct parport_info_t {
fd238232c   Dominik Brodowski   [PATCH] pcmcia: e...
72
  	struct pcmcia_device	*p_dev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
73
      int			ndev;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
      struct parport	*port;
  } parport_info_t;
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
76
  static void parport_detach(struct pcmcia_device *p_dev);
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
77
  static int parport_config(struct pcmcia_device *link);
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
78
  static void parport_cs_release(struct pcmcia_device *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79

15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
80
  static int parport_probe(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
  {
      parport_info_t *info;
f8cfa618d   Dominik Brodowski   [PATCH] pcmcia: u...
83

9b44de201   Dominik Brodowski   pcmcia: use dynam...
84
85
      dev_dbg(&link->dev, "parport_attach()
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
87
  
      /* Create new parport device */
dd00cc486   Yoann Padioleau   some kmalloc/mems...
88
      info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618d   Dominik Brodowski   [PATCH] pcmcia: u...
89
      if (!info) return -ENOMEM;
fd238232c   Dominik Brodowski   [PATCH] pcmcia: e...
90
      link->priv = info;
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
91
      info->p_dev = link;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92

00990e7ce   Dominik Brodowski   pcmcia: use autoc...
93
      link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
f8cfa618d   Dominik Brodowski   [PATCH] pcmcia: u...
94

15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
95
      return parport_config(link);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  } /* parport_attach */
fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
97
  static void parport_detach(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  {
9b44de201   Dominik Brodowski   pcmcia: use dynam...
99
100
      dev_dbg(&link->dev, "parport_detach
  ");
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
101

e2d409636   Dominik Brodowski   [PATCH] pcmcia: u...
102
      parport_cs_release(link);
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
103

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
104
      kfree(link->priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  } /* parport_detach */
00990e7ce   Dominik Brodowski   pcmcia: use autoc...
106
  static int parport_config_check(struct pcmcia_device *p_dev, void *priv_data)
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
107
  {
00990e7ce   Dominik Brodowski   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   Dominik Brodowski   pcmcia: use pcmci...
114
  }
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
115
  static int parport_config(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
116
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
      parport_info_t *info = link->priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
      struct parport *p;
9b44de201   Dominik Brodowski   pcmcia: use dynam...
119
      int ret;
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
120

9b44de201   Dominik Brodowski   pcmcia: use dynam...
121
122
      dev_dbg(&link->dev, "parport_config
  ");
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
123

00990e7ce   Dominik Brodowski   pcmcia: use autoc...
124
125
      if (epp_mode)
  	    link->config_index |= FORCE_EPP_MODE;
9b44de201   Dominik Brodowski   pcmcia: use dynam...
126
127
      ret = pcmcia_loop_config(link, parport_config_check, NULL);
      if (ret)
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
128
  	    goto failed;
84e2d3400   Dominik Brodowski   pcmcia: use pcmci...
129

eb14120f7   Dominik Brodowski   pcmcia: re-work p...
130
      if (!link->irq)
9b44de201   Dominik Brodowski   pcmcia: use dynam...
131
  	    goto failed;
1ac71e5a3   Dominik Brodowski   pcmcia: convert p...
132
      ret = pcmcia_enable_device(link);
9b44de201   Dominik Brodowski   pcmcia: use dynam...
133
134
      if (ret)
  	    goto failed;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135

9a017a910   Dominik Brodowski   pcmcia: do not us...
136
137
      p = parport_pc_probe_port(link->resource[0]->start,
  			      link->resource[1]->start,
eb14120f7   Dominik Brodowski   pcmcia: re-work p...
138
  			      link->irq, PARPORT_DMA_NONE,
51dcdfec6   Alan Cox   parport: Use the ...
139
  			      &link->dev, IRQF_SHARED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
      if (p == NULL) {
  	printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "
9a017a910   Dominik Brodowski   pcmcia: do not us...
142
143
144
  	       "0x%3x, irq %u failed
  ",
  	       (unsigned int) link->resource[0]->start,
eb14120f7   Dominik Brodowski   pcmcia: re-work p...
145
  	       link->irq);
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
153
      info->port = p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154

15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
155
      return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
157
  failed:
      parport_cs_release(link);
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
158
      return -ENODEV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
  } /* parport_config */
23d5f96ce   Adrian Bunk   make parport_cs_r...
160
  static void parport_cs_release(struct pcmcia_device *link)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
  {
5f2a71fcb   Dominik Brodowski   [PATCH] pcmcia: a...
162
  	parport_info_t *info = link->priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163

9b44de201   Dominik Brodowski   pcmcia: use dynam...
164
165
  	dev_dbg(&link->dev, "parport_release
  ");
5f2a71fcb   Dominik Brodowski   [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   Linus Torvalds   Linux-2.6.12-rc2
172

fba395eee   Dominik Brodowski   [PATCH] pcmcia: r...
173
  	pcmcia_disable_device(link);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
  } /* parport_cs_release */
98e4c28b7   Dominik Brodowski   [PATCH] pcmcia: n...
175

25f8f54f6   Joe Perches   pcmcia: Convert p...
176
  static const struct pcmcia_device_id parport_ids[] = {
476835afd   Dominik Brodowski   [PATCH] pcmcia: i...
177
  	PCMCIA_DEVICE_FUNC_ID(3),
44e5e33e9   Tony Olech   [PATCH] pcmcia: I...
178
  	PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc),
476835afd   Dominik Brodowski   [PATCH] pcmcia: i...
179
180
181
182
  	PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0003),
  	PCMCIA_DEVICE_NULL
  };
  MODULE_DEVICE_TABLE(pcmcia, parport_ids);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
183
184
  static struct pcmcia_driver parport_cs_driver = {
  	.owner		= THIS_MODULE,
2e9b981a7   Dominik Brodowski   pcmcia: move driv...
185
  	.name		= "parport_cs",
15b99ac17   Dominik Brodowski   [PATCH] pcmcia: a...
186
  	.probe		= parport_probe,
cc3b4866b   Dominik Brodowski   [PATCH] pcmcia: u...
187
  	.remove		= parport_detach,
476835afd   Dominik Brodowski   [PATCH] pcmcia: i...
188
  	.id_table	= parport_ids,
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
199
200
201
202
  }
  
  module_init(init_parport_cs);
  module_exit(exit_parport_cs);