staging: comedi: das08_cs: refactor the pcmcia probe/remove
[deliverable/linux.git] / drivers / staging / comedi / drivers / das08_cs.c
CommitLineData
0882eaa6
DS
1/*
2 comedi/drivers/das08_cs.c
3 DAS08 driver
4
5 COMEDI - Linux Control and Measurement Device Interface
6 Copyright (C) 2000 David A. Schleef <ds@schleef.org>
7 Copyright (C) 2001,2002,2003 Frank Mori Hess <fmhess@users.sourceforge.net>
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22
c332d969
HS
23 PCMCIA support code for this driver is adapted from the dummy_cs.c
24 driver of the Linux PCMCIA Card Services package.
25
26 The initial developer of the original code is David A. Hinds
27 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
28 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
29
0882eaa6
DS
30*****************************************************************
31
32*/
33/*
34Driver: das08_cs
35Description: DAS-08 PCMCIA boards
36Author: Warren Jasper, ds, Frank Hess
37Devices: [ComputerBoards] PCM-DAS08 (pcm-das08)
38Status: works
39
40This is the PCMCIA-specific support split off from the
41das08 driver.
42
43Options (for pcm-das08):
d539047c 44 NONE
0882eaa6
DS
45
46Command support does not exist, but could be added for this board.
47*/
48
49#include "../comedidev.h"
50
51#include <linux/delay.h>
52#include <linux/pci.h>
5a0e3ad6 53#include <linux/slab.h>
0882eaa6
DS
54
55#include "das08.h"
56
2696fb57 57/* pcmcia includes */
0882eaa6
DS
58#include <pcmcia/cistpl.h>
59#include <pcmcia/ds.h>
60
d539047c 61static struct pcmcia_device *cur_dev;
0882eaa6
DS
62
63#define thisboard ((const struct das08_board_struct *)dev->board_ptr)
64
0a85b6f0
MT
65static int das08_cs_attach(struct comedi_device *dev,
66 struct comedi_devconfig *it);
0882eaa6 67
139dfbdf 68static struct comedi_driver driver_das08_cs = {
68c3dbff
BP
69 .driver_name = "das08_cs",
70 .module = THIS_MODULE,
71 .attach = das08_cs_attach,
72 .detach = das08_common_detach,
73 .board_name = &das08_cs_boards[0].name,
b6ac1613 74 .num_names = ARRAY_SIZE(das08_cs_boards),
68c3dbff 75 .offset = sizeof(struct das08_board_struct),
0882eaa6
DS
76};
77
0a85b6f0
MT
78static int das08_cs_attach(struct comedi_device *dev,
79 struct comedi_devconfig *it)
0882eaa6
DS
80{
81 int ret;
82 unsigned long iobase;
2696fb57 83 struct pcmcia_device *link = cur_dev; /* XXX hack */
0882eaa6 84
c3744138
BP
85 ret = alloc_private(dev, sizeof(struct das08_private_struct));
86 if (ret < 0)
0882eaa6
DS
87 return ret;
88
f41ad667 89 dev_info(dev->class_dev, "das08_cs: attach\n");
2696fb57 90 /* deal with a pci board */
0882eaa6
DS
91
92 if (thisboard->bustype == pcmcia) {
93 if (link == NULL) {
f41ad667 94 dev_err(dev->class_dev, "no pcmcia cards found\n");
0882eaa6
DS
95 return -EIO;
96 }
9a017a91 97 iobase = link->resource[0]->start;
0882eaa6 98 } else {
f41ad667
IA
99 dev_err(dev->class_dev,
100 "bug! board does not have PCMCIA bustype\n");
0882eaa6
DS
101 return -EINVAL;
102 }
103
0882eaa6
DS
104 return das08_common_attach(dev, iobase);
105}
106
55a19b39 107static int das08_pcmcia_config_loop(struct pcmcia_device *p_dev,
55a19b39
DB
108 void *priv_data)
109{
00990e7c
DB
110 if (p_dev->config_index == 0)
111 return -EINVAL;
112
113 return pcmcia_request_io(p_dev);
55a19b39
DB
114}
115
ae6eba84 116static int das08_pcmcia_attach(struct pcmcia_device *link)
0882eaa6 117{
55a19b39 118 int ret;
0882eaa6 119
00990e7c
DB
120 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
121
55a19b39 122 ret = pcmcia_loop_config(link, das08_pcmcia_config_loop, NULL);
ae6eba84 123 if (ret)
55a19b39 124 goto failed;
0882eaa6 125
eb14120f
DB
126 if (!link->irq)
127 goto failed;
0882eaa6 128
1ac71e5a 129 ret = pcmcia_enable_device(link);
55a19b39
DB
130 if (ret)
131 goto failed;
0882eaa6 132
fb795746 133 cur_dev = link;
fb795746 134 return 0;
ae6eba84
HS
135
136failed:
137 pcmcia_disable_device(link);
138 return ret;
fb795746
HS
139}
140
141static void das08_pcmcia_detach(struct pcmcia_device *link)
142{
ae6eba84
HS
143 pcmcia_disable_device(link);
144 cur_dev = NULL;
c332d969 145}
0882eaa6 146
2202a5a7 147static const struct pcmcia_device_id das08_cs_id_table[] = {
0882eaa6
DS
148 PCMCIA_DEVICE_MANF_CARD(0x01c5, 0x4001),
149 PCMCIA_DEVICE_NULL
150};
0882eaa6
DS
151MODULE_DEVICE_TABLE(pcmcia, das08_cs_id_table);
152
27fa05bc
HS
153static struct pcmcia_driver das08_cs_driver = {
154 .name = "pcm-das08",
155 .owner = THIS_MODULE,
156 .probe = das08_pcmcia_attach,
157 .remove = das08_pcmcia_detach,
27fa05bc 158 .id_table = das08_cs_id_table,
0882eaa6
DS
159};
160
0882eaa6
DS
161static int __init das08_cs_init_module(void)
162{
163 int ret;
164
36061c84 165 ret = comedi_driver_register(&driver_das08_cs);
0882eaa6
DS
166 if (ret < 0)
167 return ret;
168
36061c84
HS
169 ret = pcmcia_register_driver(&das08_cs_driver);
170 if (ret < 0) {
171 comedi_driver_unregister(&driver_das08_cs);
172 return ret;
173 }
174
175 return 0;
176
0882eaa6 177}
46877702 178module_init(das08_cs_init_module);
0882eaa6
DS
179
180static void __exit das08_cs_exit_module(void)
181{
46877702 182 pcmcia_unregister_driver(&das08_cs_driver);
0882eaa6
DS
183 comedi_driver_unregister(&driver_das08_cs);
184}
0882eaa6 185module_exit(das08_cs_exit_module);
3a36ad17
HS
186
187MODULE_AUTHOR("David A. Schleef <ds@schleef.org>, "
188 "Frank Mori Hess <fmhess@users.sourceforge.net>");
189MODULE_DESCRIPTION("Comedi driver for ComputerBoards DAS-08 PCMCIA boards");
190MODULE_LICENSE("GPL");
This page took 0.323935 seconds and 5 git commands to generate.