blob: 58690c1ff6ba1a9801ab2c2b3c79ea2eae928bbc [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*======================================================================
2
3 A driver for PCMCIA IDE/ATA disk cards
4
5 ide-cs.c 1.3 2002/10/26 05:45:31
6
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
11
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
16
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
20
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in
23 which case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
31
32======================================================================*/
33
34#include <linux/module.h>
35#include <linux/kernel.h>
36#include <linux/init.h>
37#include <linux/sched.h>
38#include <linux/ptrace.h>
39#include <linux/slab.h>
40#include <linux/string.h>
41#include <linux/timer.h>
42#include <linux/ioport.h>
43#include <linux/ide.h>
44#include <linux/hdreg.h>
45#include <linux/major.h>
Nishanth Aravamudan2aad5f02005-09-10 00:27:15 -070046#include <linux/delay.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070047#include <asm/io.h>
48#include <asm/system.h>
49
Linus Torvalds1da177e2005-04-16 15:20:36 -070050#include <pcmcia/cs_types.h>
51#include <pcmcia/cs.h>
52#include <pcmcia/cistpl.h>
53#include <pcmcia/ds.h>
54#include <pcmcia/cisreg.h>
55#include <pcmcia/ciscode.h>
56
57/*====================================================================*/
58
59/* Module parameters */
60
61MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
62MODULE_DESCRIPTION("PCMCIA ATA/IDE card driver");
63MODULE_LICENSE("Dual MPL/GPL");
64
65#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)
66
67#ifdef PCMCIA_DEBUG
68INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);
69#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)
70static char *version =
71"ide-cs.c 1.3 2002/10/26 05:45:31 (David Hinds)";
72#else
73#define DEBUG(n, args...)
74#endif
75
76/*====================================================================*/
77
78static const char ide_major[] = {
79 IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR,
80 IDE4_MAJOR, IDE5_MAJOR
81};
82
83typedef struct ide_info_t {
Dominik Brodowskifd238232006-03-05 10:45:09 +010084 struct pcmcia_device *p_dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -070085 int ndev;
86 dev_node_t node;
87 int hd;
88} ide_info_t;
89
Dominik Brodowskifba395e2006-03-31 17:21:06 +020090static void ide_release(struct pcmcia_device *);
91static void ide_config(struct pcmcia_device *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070092
Dominik Brodowskicc3b4862005-11-14 21:23:14 +010093static void ide_detach(struct pcmcia_device *p_dev);
Linus Torvalds1da177e2005-04-16 15:20:36 -070094
Dominik Brodowskib4635812005-11-14 21:25:35 +010095
96
Linus Torvalds1da177e2005-04-16 15:20:36 -070097
98/*======================================================================
99
100 ide_attach() creates an "instance" of the driver, allocating
101 local data structures for one device. The device is registered
102 with Card Services.
103
104======================================================================*/
105
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200106static int ide_attach(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107{
108 ide_info_t *info;
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100109
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110 DEBUG(0, "ide_attach()\n");
111
112 /* Create new ide device */
Deepak Saxenaf5e3c2f2005-11-07 01:01:25 -0800113 info = kzalloc(sizeof(*info), GFP_KERNEL);
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100114 if (!info)
115 return -ENOMEM;
Dominik Brodowskifd238232006-03-05 10:45:09 +0100116
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200117 info->p_dev = link;
Dominik Brodowskifd238232006-03-05 10:45:09 +0100118 link->priv = info;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119
120 link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
121 link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;
122 link->io.IOAddrLines = 3;
123 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
124 link->irq.IRQInfo1 = IRQ_LEVEL_ID;
125 link->conf.Attributes = CONF_ENABLE_IRQ;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126 link->conf.IntType = INT_MEMORY_AND_IO;
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100127
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100128 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
129 ide_config(link);
130
131 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700132} /* ide_attach */
133
134/*======================================================================
135
136 This deletes a driver "instance". The device is de-registered
137 with Card Services. If it has been released, all local data
138 structures are freed. Otherwise, the structures will be freed
139 when the device is released.
140
141======================================================================*/
142
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200143static void ide_detach(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700144{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 DEBUG(0, "ide_detach(0x%p)\n", link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146
147 if (link->state & DEV_CONFIG)
148 ide_release(link);
Dominik Brodowskib4635812005-11-14 21:25:35 +0100149
Linus Torvalds1da177e2005-04-16 15:20:36 -0700150 kfree(link->priv);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700151} /* ide_detach */
152
Hannes Reinecke4349d5c2005-11-09 22:47:18 +0100153static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq, struct pcmcia_device *handle)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700154{
155 hw_regs_t hw;
156 memset(&hw, 0, sizeof(hw));
157 ide_init_hwif_ports(&hw, io, ctl, NULL);
158 hw.irq = irq;
159 hw.chipset = ide_pci;
Hannes Reinecke4349d5c2005-11-09 22:47:18 +0100160 hw.dev = &handle->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700161 return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave);
162}
163
164/*======================================================================
165
166 ide_config() is scheduled to run after a CARD_INSERTION event
167 is received, to configure the PCMCIA socket, and to make the
168 ide device available to the system.
169
170======================================================================*/
171
172#define CS_CHECK(fn, ret) \
173do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
174
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200175static void ide_config(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700177 ide_info_t *info = link->priv;
178 tuple_t tuple;
179 struct {
180 u_short buf[128];
181 cisparse_t parse;
182 config_info_t conf;
183 cistpl_cftable_entry_t dflt;
184 } *stk = NULL;
185 cistpl_cftable_entry_t *cfg;
186 int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0;
187 unsigned long io_base, ctl_base;
188
189 DEBUG(0, "ide_config(0x%p)\n", link);
190
Deepak Saxenaf5e3c2f2005-11-07 01:01:25 -0800191 stk = kzalloc(sizeof(*stk), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700192 if (!stk) goto err_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193 cfg = &stk->parse.cftable_entry;
194
195 tuple.TupleData = (cisdata_t *)&stk->buf;
196 tuple.TupleOffset = 0;
197 tuple.TupleDataMax = 255;
198 tuple.Attributes = 0;
199 tuple.DesiredTuple = CISTPL_CONFIG;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200200 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
201 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
202 CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &stk->parse));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700203 link->conf.ConfigBase = stk->parse.config.base;
204 link->conf.Present = stk->parse.config.rmask[0];
205
206 tuple.DesiredTuple = CISTPL_MANFID;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200207 if (!pcmcia_get_first_tuple(link, &tuple) &&
208 !pcmcia_get_tuple_data(link, &tuple) &&
209 !pcmcia_parse_tuple(link, &tuple, &stk->parse))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 is_kme = ((stk->parse.manfid.manf == MANFID_KME) &&
211 ((stk->parse.manfid.card == PRODID_KME_KXLC005_A) ||
212 (stk->parse.manfid.card == PRODID_KME_KXLC005_B)));
213
214 /* Configure card */
215 link->state |= DEV_CONFIG;
216
217 /* Not sure if this is right... look up the current Vcc */
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200218 CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700219
220 pass = io_base = ctl_base = 0;
221 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
222 tuple.Attributes = 0;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200223 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700224 while (1) {
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200225 if (pcmcia_get_tuple_data(link, &tuple) != 0) goto next_entry;
226 if (pcmcia_parse_tuple(link, &tuple, &stk->parse) != 0) goto next_entry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227
228 /* Check for matching Vcc, unless we're desperate */
229 if (!pass) {
230 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
231 if (stk->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
232 goto next_entry;
233 } else if (stk->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
234 if (stk->conf.Vcc != stk->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000)
235 goto next_entry;
236 }
237 }
238
239 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
Dominik Brodowski70294b42006-01-15 12:43:16 +0100240 link->conf.Vpp =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
242 else if (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))
Dominik Brodowski70294b42006-01-15 12:43:16 +0100243 link->conf.Vpp =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700244 stk->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
245
246 if ((cfg->io.nwin > 0) || (stk->dflt.io.nwin > 0)) {
247 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &stk->dflt.io;
248 link->conf.ConfigIndex = cfg->index;
249 link->io.BasePort1 = io->win[0].base;
250 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
251 if (!(io->flags & CISTPL_IO_16BIT))
252 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
253 if (io->nwin == 2) {
254 link->io.NumPorts1 = 8;
255 link->io.BasePort2 = io->win[1].base;
256 link->io.NumPorts2 = (is_kme) ? 2 : 1;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200257 if (pcmcia_request_io(link, &link->io) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700258 goto next_entry;
259 io_base = link->io.BasePort1;
260 ctl_base = link->io.BasePort2;
261 } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
262 link->io.NumPorts1 = io->win[0].len;
263 link->io.NumPorts2 = 0;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200264 if (pcmcia_request_io(link, &link->io) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700265 goto next_entry;
266 io_base = link->io.BasePort1;
267 ctl_base = link->io.BasePort1 + 0x0e;
268 } else goto next_entry;
269 /* If we've got this far, we're done */
270 break;
271 }
272
273 next_entry:
274 if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
275 memcpy(&stk->dflt, cfg, sizeof(stk->dflt));
276 if (pass) {
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200277 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
278 } else if (pcmcia_get_next_tuple(link, &tuple) != 0) {
279 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 memset(&stk->dflt, 0, sizeof(stk->dflt));
281 pass++;
282 }
283 }
284
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200285 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
286 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287
288 /* disable drive interrupts during IDE probe */
289 outb(0x02, ctl_base);
290
291 /* special setup for KXLC005 card */
292 if (is_kme)
293 outb(0x81, ctl_base+1);
294
295 /* retry registration in case device is still spinning up */
296 for (hd = -1, i = 0; i < 10; i++) {
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200297 hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700298 if (hd >= 0) break;
299 if (link->io.NumPorts1 == 0x20) {
300 outb(0x02, ctl_base + 0x10);
301 hd = idecs_register(io_base + 0x10, ctl_base + 0x10,
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200302 link->irq.AssignedIRQ, link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700303 if (hd >= 0) {
304 io_base += 0x10;
305 ctl_base += 0x10;
306 break;
307 }
308 }
Nishanth Aravamudan2aad5f02005-09-10 00:27:15 -0700309 msleep(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700310 }
311
312 if (hd < 0) {
313 printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx"
314 ", irq %u failed\n", io_base, ctl_base,
315 link->irq.AssignedIRQ);
316 goto failed;
317 }
318
319 info->ndev = 1;
320 sprintf(info->node.dev_name, "hd%c", 'a' + (hd * 2));
321 info->node.major = ide_major[hd];
322 info->node.minor = 0;
323 info->hd = hd;
Dominik Brodowskifd238232006-03-05 10:45:09 +0100324 link->dev_node = &info->node;
Dominik Brodowski70294b42006-01-15 12:43:16 +0100325 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n",
326 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700327
328 link->state &= ~DEV_CONFIG_PENDING;
329 kfree(stk);
330 return;
331
332err_mem:
333 printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n");
334 goto failed;
335
336cs_failed:
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200337 cs_error(link, last_fn, last_ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700338failed:
339 kfree(stk);
340 ide_release(link);
341 link->state &= ~DEV_CONFIG_PENDING;
342} /* ide_config */
343
344/*======================================================================
345
346 After a card is removed, ide_release() will unregister the net
347 device, and release the PCMCIA configuration. If the device is
348 still open, this will be postponed until it is closed.
349
350======================================================================*/
351
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200352void ide_release(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700353{
354 ide_info_t *info = link->priv;
355
356 DEBUG(0, "ide_release(0x%p)\n", link);
357
358 if (info->ndev) {
359 /* FIXME: if this fails we need to queue the cleanup somehow
360 -- need to investigate the required PCMCIA magic */
361 ide_unregister(info->hd);
362 }
363 info->ndev = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200365 pcmcia_disable_device(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700366} /* ide_release */
367
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100368
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369/*======================================================================
370
371 The card status event handler. Mostly, this schedules other
372 stuff to run after an event is received. A CARD_REMOVAL event
373 also sets some flags to discourage the ide drivers from
374 talking to the ports.
375
376======================================================================*/
377
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700378static struct pcmcia_device_id ide_ids[] = {
379 PCMCIA_DEVICE_FUNC_ID(4),
Richard Purdie725a6ab2006-01-05 09:56:03 +0000380 PCMCIA_DEVICE_MANF_CARD(0x0007, 0x0000), /* Hitachi */
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700381 PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704),
Dominik Brodowskif8f7cc02005-06-27 16:28:29 -0700382 PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401),
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700383 PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */
384 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d),
385 PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */
Richard Purdie725a6ab2006-01-05 09:56:03 +0000386 PCMCIA_DEVICE_MANF_CARD(0x0319, 0x0000), /* Hitachi */
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700387 PCMCIA_DEVICE_MANF_CARD(0x2080, 0x0001),
388 PCMCIA_DEVICE_MANF_CARD(0x4e01, 0x0200), /* Lexar */
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700389 PCMCIA_DEVICE_PROD_ID123("Caravelle", "PSC-IDE ", "PSC000", 0x8c36137c, 0xd0693ab8, 0x2768a9f0),
390 PCMCIA_DEVICE_PROD_ID123("CDROM", "IDE", "MCD-601p", 0x1b9179ca, 0xede88951, 0x0d902f74),
391 PCMCIA_DEVICE_PROD_ID123("PCMCIA", "IDE CARD", "F1", 0x281f1c5d, 0x1907960c, 0xf7fde8b9),
392 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "CD-ROM", 0x78f308dc, 0x66536591),
393 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "PnPIDE", 0x78f308dc, 0x0c694728),
394 PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591),
395 PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4),
396 PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde),
Komurod277ad02005-07-28 01:07:24 -0700397 PCMCIA_DEVICE_PROD_ID12("EXP", "CD+GAME", 0x6f58c983, 0x63c13aaf),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700398 PCMCIA_DEVICE_PROD_ID12("EXP ", "CD-ROM", 0x0a5c52fd, 0x66536591),
399 PCMCIA_DEVICE_PROD_ID12("EXP ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
400 PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
Richard Purdie725a6ab2006-01-05 09:56:03 +0000401 PCMCIA_DEVICE_PROD_ID12("HITACHI", "FLASH", 0xf4f43949, 0x9eb86aae),
402 PCMCIA_DEVICE_PROD_ID12("HITACHI", "microdrive", 0xf4f43949, 0xa6d76178),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700403 PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
404 PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
405 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
406 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
407 PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b),
Dominik Brodowski2570b742005-09-17 11:17:56 +0200408 PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700409 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
410 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
411 PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
412 PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
David Brownell42935652006-01-25 06:36:32 -0800413 PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700414 PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
415 PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700416 PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
Pavel Roskin698e22c2005-07-28 01:07:19 -0700417 PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700418 PCMCIA_DEVICE_NULL,
419};
420MODULE_DEVICE_TABLE(pcmcia, ide_ids);
421
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422static struct pcmcia_driver ide_cs_driver = {
423 .owner = THIS_MODULE,
424 .drv = {
425 .name = "ide-cs",
426 },
Dominik Brodowskif8cfa612005-11-14 21:25:51 +0100427 .probe = ide_attach,
Dominik Brodowskicc3b4862005-11-14 21:23:14 +0100428 .remove = ide_detach,
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700429 .id_table = ide_ids,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700430};
431
432static int __init init_ide_cs(void)
433{
434 return pcmcia_register_driver(&ide_cs_driver);
435}
436
437static void __exit exit_ide_cs(void)
438{
439 pcmcia_unregister_driver(&ide_cs_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440}
441
Dominik Brodowski2b8d4662005-08-01 14:16:55 +0200442late_initcall(init_ide_cs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700443module_exit(exit_ide_cs);