]> Git Repo - linux.git/blame - drivers/ide/ide-cs.c
pcmcia: Documentation update
[linux.git] / drivers / ide / ide-cs.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for PCMCIA IDE/ATA disk cards
4
1da177e4
LT
5 The contents of this file are subject to the Mozilla Public
6 License Version 1.1 (the "License"); you may not use this file
7 except in compliance with the License. You may obtain a copy of
8 the License at http://www.mozilla.org/MPL/
9
10 Software distributed under the License is distributed on an "AS
11 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
12 implied. See the License for the specific language governing
13 rights and limitations under the License.
14
15 The initial developer of the original code is David A. Hinds
16 <[email protected]>. Portions created by David A. Hinds
17 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
18
19 Alternatively, the contents of this file may be used under the
20 terms of the GNU General Public License version 2 (the "GPL"), in
21 which case the provisions of the GPL are applicable instead of the
22 above. If you wish to allow the use of your version of this file
23 only under the terms of the GPL and not to allow others to use
24 your version of this file under the MPL, indicate your decision
25 by deleting the provisions above and replace them with the notice
26 and other provisions required by the GPL. If you do not delete
27 the provisions above, a recipient may use your version of this
28 file under either the MPL or the GPL.
7b1dec59 29
1da177e4
LT
30======================================================================*/
31
32#include <linux/module.h>
33#include <linux/kernel.h>
34#include <linux/init.h>
1da177e4
LT
35#include <linux/ptrace.h>
36#include <linux/slab.h>
37#include <linux/string.h>
38#include <linux/timer.h>
39#include <linux/ioport.h>
40#include <linux/ide.h>
1da177e4 41#include <linux/major.h>
2aad5f03 42#include <linux/delay.h>
1da177e4
LT
43#include <asm/io.h>
44#include <asm/system.h>
45
1da177e4
LT
46#include <pcmcia/cistpl.h>
47#include <pcmcia/ds.h>
48#include <pcmcia/cisreg.h>
49#include <pcmcia/ciscode.h>
50
d703b79e
BZ
51#define DRV_NAME "ide-cs"
52
1da177e4
LT
53/*====================================================================*/
54
55/* Module parameters */
56
57MODULE_AUTHOR("David Hinds <[email protected]>");
58MODULE_DESCRIPTION("PCMCIA ATA/IDE card driver");
59MODULE_LICENSE("Dual MPL/GPL");
60
1da177e4
LT
61/*====================================================================*/
62
1da177e4 63typedef struct ide_info_t {
fd238232 64 struct pcmcia_device *p_dev;
48c3c107 65 struct ide_host *host;
ded6a1a3 66 int ndev;
1da177e4
LT
67} ide_info_t;
68
fba395ee 69static void ide_release(struct pcmcia_device *);
15b99ac1 70static int ide_config(struct pcmcia_device *);
1da177e4 71
cc3b4866 72static void ide_detach(struct pcmcia_device *p_dev);
1da177e4 73
b4635811
DB
74
75
1da177e4
LT
76
77/*======================================================================
78
79 ide_attach() creates an "instance" of the driver, allocating
80 local data structures for one device. The device is registered
81 with Card Services.
82
83======================================================================*/
84
15b99ac1 85static int ide_probe(struct pcmcia_device *link)
1da177e4
LT
86{
87 ide_info_t *info;
f8cfa618 88
444486a5 89 dev_dbg(&link->dev, "ide_attach()\n");
1da177e4
LT
90
91 /* Create new ide device */
f5e3c2fa 92 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618
DB
93 if (!info)
94 return -ENOMEM;
fd238232 95
fba395ee 96 info->p_dev = link;
fd238232 97 link->priv = info;
1da177e4 98
90abdc3b
DB
99 link->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
100 link->resource[1]->flags |= IO_DATA_PATH_WIDTH_8;
1ac71e5a 101 link->config_flags |= CONF_ENABLE_IRQ;
f8cfa618 102
15b99ac1 103 return ide_config(link);
1da177e4
LT
104} /* ide_attach */
105
106/*======================================================================
107
108 This deletes a driver "instance". The device is de-registered
109 with Card Services. If it has been released, all local data
110 structures are freed. Otherwise, the structures will be freed
111 when the device is released.
112
113======================================================================*/
114
fba395ee 115static void ide_detach(struct pcmcia_device *link)
1da177e4 116{
d703b79e 117 ide_info_t *info = link->priv;
d703b79e 118
444486a5 119 dev_dbg(&link->dev, "ide_detach(0x%p)\n", link);
1da177e4 120
e2d40963 121 ide_release(link);
b4635811 122
d703b79e 123 kfree(info);
1da177e4
LT
124} /* ide_detach */
125
ac95beed
BZ
126static const struct ide_port_ops idecs_port_ops = {
127 .quirkproc = ide_undecoded_slave,
128};
129
dccdf527
BZ
130static const struct ide_port_info idecs_port_info = {
131 .port_ops = &idecs_port_ops,
132 .host_flags = IDE_HFLAG_NO_DMA,
255115fb 133 .irq_flags = IRQF_SHARED,
29e52cf7 134 .chipset = ide_pci,
dccdf527
BZ
135};
136
48c3c107 137static struct ide_host *idecs_register(unsigned long io, unsigned long ctl,
d703b79e 138 unsigned long irq, struct pcmcia_device *handle)
1da177e4 139{
48c3c107 140 struct ide_host *host;
9e016a71 141 ide_hwif_t *hwif;
6f904d01 142 int i, rc;
9f36d314 143 struct ide_hw hw, *hws[] = { &hw };
9e016a71 144
d703b79e
BZ
145 if (!request_region(io, 8, DRV_NAME)) {
146 printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n",
147 DRV_NAME, io, io + 7);
148 return NULL;
149 }
150
151 if (!request_region(ctl, 1, DRV_NAME)) {
152 printk(KERN_ERR "%s: I/O resource 0x%lX not free.\n",
153 DRV_NAME, ctl);
154 release_region(io, 8);
155 return NULL;
156 }
157
1da177e4 158 memset(&hw, 0, sizeof(hw));
dcb425f5 159 ide_std_init_ports(&hw, io, ctl);
1da177e4 160 hw.irq = irq;
4349d5cd 161 hw.dev = &handle->dev;
9e016a71 162
dca39830 163 rc = ide_host_add(&idecs_port_info, hws, 1, &host);
6f904d01 164 if (rc)
d703b79e 165 goto out_release;
9e016a71 166
48c3c107 167 hwif = host->ports[0];
9e016a71 168
d703b79e 169 if (hwif->present)
48c3c107 170 return host;
d703b79e 171
792a1a98
BZ
172 /* retry registration in case device is still spinning up */
173 for (i = 0; i < 10; i++) {
174 msleep(100);
175 ide_port_scan(hwif);
176 if (hwif->present)
48c3c107 177 return host;
792a1a98
BZ
178 }
179
48c3c107 180 return host;
792a1a98 181
d703b79e
BZ
182out_release:
183 release_region(ctl, 1);
184 release_region(io, 8);
185 return NULL;
1da177e4
LT
186}
187
188/*======================================================================
189
190 ide_config() is scheduled to run after a CARD_INSERTION event
191 is received, to configure the PCMCIA socket, and to make the
192 ide device available to the system.
193
194======================================================================*/
195
0bac660a 196struct pcmcia_config_check {
0bac660a
DB
197 unsigned long ctl_base;
198 int skip_vcc;
199 int is_kme;
200};
201
202static int pcmcia_check_one_config(struct pcmcia_device *pdev,
203 cistpl_cftable_entry_t *cfg,
8e2fc39d 204 cistpl_cftable_entry_t *dflt,
ad913c11 205 unsigned int vcc,
0bac660a
DB
206 void *priv_data)
207{
208 struct pcmcia_config_check *stk = priv_data;
209
210 /* Check for matching Vcc, unless we're desperate */
211 if (!stk->skip_vcc) {
212 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
ad913c11 213 if (vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
8e2fc39d
DB
214 return -ENODEV;
215 } else if (dflt->vcc.present & (1 << CISTPL_POWER_VNOM)) {
ad913c11 216 if (vcc != dflt->vcc.param[CISTPL_POWER_VNOM] / 10000)
8e2fc39d 217 return -ENODEV;
0bac660a
DB
218 }
219 }
220
221 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
e8405f0f 222 pdev->vpp = cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
8e2fc39d 223 else if (dflt->vpp1.present & (1 << CISTPL_POWER_VNOM))
e8405f0f 224 pdev->vpp = dflt->vpp1.param[CISTPL_POWER_VNOM] / 10000;
0bac660a 225
8e2fc39d
DB
226 if ((cfg->io.nwin > 0) || (dflt->io.nwin > 0)) {
227 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt->io;
90abdc3b 228 pdev->io_lines = io->flags & CISTPL_IO_LINES_MASK;
7feabb64 229 pdev->config_index = cfg->index;
90abdc3b
DB
230 pdev->resource[0]->start = io->win[0].base;
231 if (!(io->flags & CISTPL_IO_16BIT)) {
232 pdev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
233 pdev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8;
234 }
0bac660a 235 if (io->nwin == 2) {
90abdc3b
DB
236 pdev->resource[0]->end = 8;
237 pdev->resource[1]->start = io->win[1].base;
238 pdev->resource[1]->end = (stk->is_kme) ? 2 : 1;
239 if (pcmcia_request_io(pdev) != 0)
8e2fc39d 240 return -ENODEV;
9a017a91 241 stk->ctl_base = pdev->resource[1]->start;
0bac660a 242 } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
90abdc3b
DB
243 pdev->resource[0]->end = io->win[0].len;
244 pdev->resource[1]->end = 0;
245 if (pcmcia_request_io(pdev) != 0)
8e2fc39d 246 return -ENODEV;
9a017a91 247 stk->ctl_base = pdev->resource[0]->start + 0x0e;
0bac660a 248 } else
8e2fc39d 249 return -ENODEV;
0bac660a
DB
250 /* If we've got this far, we're done */
251 return 0;
252 }
0bac660a
DB
253 return -ENODEV;
254}
255
15b99ac1 256static int ide_config(struct pcmcia_device *link)
1da177e4 257{
1da177e4 258 ide_info_t *info = link->priv;
0bac660a 259 struct pcmcia_config_check *stk = NULL;
444486a5 260 int ret = 0, is_kme = 0;
2f1b9250 261 unsigned long io_base, ctl_base;
48c3c107 262 struct ide_host *host;
1da177e4 263
444486a5 264 dev_dbg(&link->dev, "ide_config(0x%p)\n", link);
1da177e4 265
efd50585
DB
266 is_kme = ((link->manf_id == MANFID_KME) &&
267 ((link->card_id == PRODID_KME_KXLC005_A) ||
268 (link->card_id == PRODID_KME_KXLC005_B)));
1da177e4 269
0bac660a
DB
270 stk = kzalloc(sizeof(*stk), GFP_KERNEL);
271 if (!stk)
272 goto err_mem;
273 stk->is_kme = is_kme;
0bac660a 274 stk->skip_vcc = io_base = ctl_base = 0;
ad913c11 275
0bac660a 276 if (pcmcia_loop_config(link, pcmcia_check_one_config, stk)) {
0bac660a
DB
277 stk->skip_vcc = 1;
278 if (pcmcia_loop_config(link, pcmcia_check_one_config, stk))
279 goto failed; /* No suitable config found */
1da177e4 280 }
9a017a91 281 io_base = link->resource[0]->start;
0bac660a 282 ctl_base = stk->ctl_base;
1da177e4 283
eb14120f 284 if (!link->irq)
444486a5 285 goto failed;
1ac71e5a
DB
286
287 ret = pcmcia_enable_device(link);
444486a5
DB
288 if (ret)
289 goto failed;
1da177e4
LT
290
291 /* disable drive interrupts during IDE probe */
2f1b9250 292 outb(0x02, ctl_base);
1da177e4
LT
293
294 /* special setup for KXLC005 card */
295 if (is_kme)
2f1b9250 296 outb(0x81, ctl_base+1);
1da177e4 297
eb14120f 298 host = idecs_register(io_base, ctl_base, link->irq, link);
9a017a91 299 if (host == NULL && resource_size(link->resource[0]) == 0x20) {
2f1b9250 300 outb(0x02, ctl_base + 0x10);
48c3c107 301 host = idecs_register(io_base + 0x10, ctl_base + 0x10,
eb14120f 302 link->irq, link);
1da177e4
LT
303 }
304
48c3c107 305 if (host == NULL)
1da177e4 306 goto failed;
1da177e4
LT
307
308 info->ndev = 1;
48c3c107 309 info->host = host;
ded6a1a3
DB
310 dev_info(&link->dev, "ide-cs: hd%c: Vpp = %d.%d\n",
311 'a' + host->ports[0]->index * 2,
e8405f0f 312 link->vpp / 10, link->vpp % 10);
1da177e4 313
1da177e4 314 kfree(stk);
15b99ac1 315 return 0;
1da177e4
LT
316
317err_mem:
318 printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n");
319 goto failed;
320
1da177e4
LT
321failed:
322 kfree(stk);
323 ide_release(link);
15b99ac1 324 return -ENODEV;
1da177e4
LT
325} /* ide_config */
326
327/*======================================================================
328
329 After a card is removed, ide_release() will unregister the net
330 device, and release the PCMCIA configuration. If the device is
331 still open, this will be postponed until it is closed.
7b1dec59 332
1da177e4
LT
333======================================================================*/
334
727c6742 335static void ide_release(struct pcmcia_device *link)
1da177e4
LT
336{
337 ide_info_t *info = link->priv;
48c3c107 338 struct ide_host *host = info->host;
7b1dec59 339
444486a5 340 dev_dbg(&link->dev, "ide_release(0x%p)\n", link);
1da177e4 341
d4ae5415
WS
342 if (info->ndev) {
343 ide_hwif_t *hwif = host->ports[0];
344 unsigned long data_addr, ctl_addr;
345
346 data_addr = hwif->io_ports.data_addr;
347 ctl_addr = hwif->io_ports.ctl_addr;
348
48c3c107 349 ide_host_remove(host);
d4ae5415 350 info->ndev = 0;
48c3c107 351
d4ae5415
WS
352 release_region(ctl_addr, 1);
353 release_region(data_addr, 8);
354 }
1da177e4 355
fba395ee 356 pcmcia_disable_device(link);
1da177e4
LT
357} /* ide_release */
358
98e4c28b 359
1da177e4
LT
360/*======================================================================
361
362 The card status event handler. Mostly, this schedules other
363 stuff to run after an event is received. A CARD_REMOVAL event
364 also sets some flags to discourage the ide drivers from
365 talking to the ports.
7b1dec59 366
1da177e4
LT
367======================================================================*/
368
f70b7d40
DB
369static struct pcmcia_device_id ide_ids[] = {
370 PCMCIA_DEVICE_FUNC_ID(4),
7b1dec59 371 PCMCIA_DEVICE_MANF_CARD(0x0000, 0x0000), /* Corsair */
725a6abf 372 PCMCIA_DEVICE_MANF_CARD(0x0007, 0x0000), /* Hitachi */
ed896167
MD
373 PCMCIA_DEVICE_MANF_CARD(0x000a, 0x0000), /* I-O Data CFA */
374 PCMCIA_DEVICE_MANF_CARD(0x001c, 0x0001), /* Mitsubishi CFA */
f70b7d40 375 PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704),
795659ef 376 PCMCIA_DEVICE_MANF_CARD(0x0032, 0x2904),
ed896167 377 PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401), /* SanDisk CFA */
a49c06bf 378 PCMCIA_DEVICE_MANF_CARD(0x004f, 0x0000), /* Kingston */
795659ef 379 PCMCIA_DEVICE_MANF_CARD(0x0097, 0x1620), /* TI emulated */
d3feb184 380 PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */
f70b7d40 381 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d),
d3feb184 382 PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */
7b1dec59 383 PCMCIA_DEVICE_MANF_CARD(0x0319, 0x0000), /* Hitachi */
f70b7d40 384 PCMCIA_DEVICE_MANF_CARD(0x2080, 0x0001),
ed896167
MD
385 PCMCIA_DEVICE_MANF_CARD(0x4e01, 0x0100), /* Viking CFA */
386 PCMCIA_DEVICE_MANF_CARD(0x4e01, 0x0200), /* Lexar, Viking CFA */
f70b7d40
DB
387 PCMCIA_DEVICE_PROD_ID123("Caravelle", "PSC-IDE ", "PSC000", 0x8c36137c, 0xd0693ab8, 0x2768a9f0),
388 PCMCIA_DEVICE_PROD_ID123("CDROM", "IDE", "MCD-601p", 0x1b9179ca, 0xede88951, 0x0d902f74),
389 PCMCIA_DEVICE_PROD_ID123("PCMCIA", "IDE CARD", "F1", 0x281f1c5d, 0x1907960c, 0xf7fde8b9),
390 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "CD-ROM", 0x78f308dc, 0x66536591),
391 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "PnPIDE", 0x78f308dc, 0x0c694728),
c9a2bfd1 392 PCMCIA_DEVICE_PROD_ID12("CNF ", "CD-ROM", 0x46d7db81, 0x66536591),
f70b7d40
DB
393 PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591),
394 PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4),
395 PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde),
d277ad0e 396 PCMCIA_DEVICE_PROD_ID12("EXP", "CD+GAME", 0x6f58c983, 0x63c13aaf),
f70b7d40
DB
397 PCMCIA_DEVICE_PROD_ID12("EXP ", "CD-ROM", 0x0a5c52fd, 0x66536591),
398 PCMCIA_DEVICE_PROD_ID12("EXP ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
399 PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
725a6abf
RP
400 PCMCIA_DEVICE_PROD_ID12("HITACHI", "FLASH", 0xf4f43949, 0x9eb86aae),
401 PCMCIA_DEVICE_PROD_ID12("HITACHI", "microdrive", 0xf4f43949, 0xa6d76178),
7b1dec59 402 PCMCIA_DEVICE_PROD_ID12("Hyperstone", "Model1", 0x3d5b9ef5, 0xca6ab420),
264a3412 403 PCMCIA_DEVICE_PROD_ID12("IBM", "microdrive", 0xb569a6e5, 0xa6d76178),
f70b7d40 404 PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
85ea2d3f 405 PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 1GB", 0x2e6d1829, 0x55d5bffb),
f25798ed 406 PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF CARD 4GB", 0x2e6d1829, 0x531e7d10),
363f7e42 407 PCMCIA_DEVICE_PROD_ID12("KINGSTON", "CF8GB", 0x2e6d1829, 0xacbe682e),
f70b7d40
DB
408 PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
409 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
410 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
411 PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b),
74e23386 412 PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF300", 0x7ed2ad87, 0x7e9e78ee),
4fa902a9 413 PCMCIA_DEVICE_PROD_ID12("M-Systems", "CF500", 0x7ed2ad87, 0x7a13045c),
2570b746 414 PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
f70b7d40
DB
415 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
416 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
417 PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
4fa902a9
MJ
418 PCMCIA_DEVICE_PROD_ID12("SEAGATE", "ST1", 0x87c1b330, 0xe1f30883),
419 PCMCIA_DEVICE_PROD_ID12("SAMSUNG", "04/05/06", 0x43d74cb4, 0x6a22777d),
420 PCMCIA_DEVICE_PROD_ID12("SMI VENDOR", "SMI PRODUCT", 0x30896c92, 0x703cc5f6),
f70b7d40 421 PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
42935656 422 PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
a17bf220 423 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF45", 0x709b1bf1, 0xf68b6f32),
bf4e1829 424 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS1GCF80", 0x709b1bf1, 0x2a54d4b1),
aa12b284 425 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS2GCF120", 0x709b1bf1, 0x969aa4f2),
4fa902a9 426 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF120", 0x709b1bf1, 0xf54a91c8),
85ea2d3f 427 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS4GCF133", 0x709b1bf1, 0x7558f133),
f25798ed 428 PCMCIA_DEVICE_PROD_ID12("TRANSCEND", "TS8GCF133", 0x709b1bf1, 0xb2f89b47),
f70b7d40 429 PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
0517793f 430 PCMCIA_DEVICE_PROD_ID12("WEIDA", "TWTTI", 0xcc7cf69c, 0x212bb918),
f70b7d40 431 PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
d3feb184 432 PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
698e22c4 433 PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
980fc29f 434 PCMCIA_DEVICE_PROD_ID2("Flash Card", 0x5a362506),
f70b7d40
DB
435 PCMCIA_DEVICE_NULL,
436};
437MODULE_DEVICE_TABLE(pcmcia, ide_ids);
438
1da177e4
LT
439static struct pcmcia_driver ide_cs_driver = {
440 .owner = THIS_MODULE,
441 .drv = {
442 .name = "ide-cs",
443 },
15b99ac1 444 .probe = ide_probe,
cc3b4866 445 .remove = ide_detach,
f70b7d40 446 .id_table = ide_ids,
1da177e4
LT
447};
448
449static int __init init_ide_cs(void)
450{
451 return pcmcia_register_driver(&ide_cs_driver);
452}
453
454static void __exit exit_ide_cs(void)
455{
456 pcmcia_unregister_driver(&ide_cs_driver);
1da177e4
LT
457}
458
2b8d4669 459late_initcall(init_ide_cs);
1da177e4 460module_exit(exit_ide_cs);
This page took 0.690227 seconds and 4 git commands to generate.