blob: b7e459e4f284af88a00b26a50b40ffed734f531d [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 *);
Dominik Brodowski15b99ac2006-03-31 17:26:06 +020091static int 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 Brodowski15b99ac2006-03-31 17:26:06 +0200106static int ide_probe(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 Brodowski15b99ac2006-03-31 17:26:06 +0200128 return ide_config(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129} /* ide_attach */
130
131/*======================================================================
132
133 This deletes a driver "instance". The device is de-registered
134 with Card Services. If it has been released, all local data
135 structures are freed. Otherwise, the structures will be freed
136 when the device is released.
137
138======================================================================*/
139
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200140static void ide_detach(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142 DEBUG(0, "ide_detach(0x%p)\n", link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700143
Dominik Brodowskie2d40962006-03-02 00:09:29 +0100144 ide_release(link);
Dominik Brodowskib4635812005-11-14 21:25:35 +0100145
Linus Torvalds1da177e2005-04-16 15:20:36 -0700146 kfree(link->priv);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700147} /* ide_detach */
148
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200149static void idecs_mmio_fixup(ide_hwif_t *hwif)
150{
151 default_hwif_mmiops(hwif);
152 hwif->mmio = 2;
153
154 ide_undecoded_slave(hwif);
155}
156
157static int idecs_register(unsigned long io, unsigned long ctl,
158 unsigned long irq, struct pcmcia_device *handle, int is_mmio)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700159{
160 hw_regs_t hw;
161 memset(&hw, 0, sizeof(hw));
162 ide_init_hwif_ports(&hw, io, ctl, NULL);
163 hw.irq = irq;
164 hw.chipset = ide_pci;
Hannes Reinecke4349d5c2005-11-09 22:47:18 +0100165 hw.dev = &handle->dev;
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200166
167 if(is_mmio)
168 return ide_register_hw_with_fixup(&hw, NULL, idecs_mmio_fixup);
169 else
170 return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave);
171}
172
173void outb_io(unsigned char value, unsigned long port) {
174 outb(value, port);
175}
176
177void outb_mem(unsigned char value, unsigned long port) {
178 writeb(value, (void __iomem *) port);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700179}
180
181/*======================================================================
182
183 ide_config() is scheduled to run after a CARD_INSERTION event
184 is received, to configure the PCMCIA socket, and to make the
185 ide device available to the system.
186
187======================================================================*/
188
189#define CS_CHECK(fn, ret) \
190do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)
191
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200192static int ide_config(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700193{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700194 ide_info_t *info = link->priv;
195 tuple_t tuple;
196 struct {
197 u_short buf[128];
198 cisparse_t parse;
199 config_info_t conf;
200 cistpl_cftable_entry_t dflt;
201 } *stk = NULL;
202 cistpl_cftable_entry_t *cfg;
203 int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0;
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200204 unsigned long io_base, ctl_base, is_mmio, try_slave;
205 void (*my_outb)(unsigned char, unsigned long);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700206
207 DEBUG(0, "ide_config(0x%p)\n", link);
208
Deepak Saxenaf5e3c2f2005-11-07 01:01:25 -0800209 stk = kzalloc(sizeof(*stk), GFP_KERNEL);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700210 if (!stk) goto err_mem;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211 cfg = &stk->parse.cftable_entry;
212
213 tuple.TupleData = (cisdata_t *)&stk->buf;
214 tuple.TupleOffset = 0;
215 tuple.TupleDataMax = 255;
216 tuple.Attributes = 0;
217 tuple.DesiredTuple = CISTPL_CONFIG;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200218 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
219 CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));
220 CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &stk->parse));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700221 link->conf.ConfigBase = stk->parse.config.base;
222 link->conf.Present = stk->parse.config.rmask[0];
223
224 tuple.DesiredTuple = CISTPL_MANFID;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200225 if (!pcmcia_get_first_tuple(link, &tuple) &&
226 !pcmcia_get_tuple_data(link, &tuple) &&
227 !pcmcia_parse_tuple(link, &tuple, &stk->parse))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700228 is_kme = ((stk->parse.manfid.manf == MANFID_KME) &&
229 ((stk->parse.manfid.card == PRODID_KME_KXLC005_A) ||
230 (stk->parse.manfid.card == PRODID_KME_KXLC005_B)));
231
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232 /* Not sure if this is right... look up the current Vcc */
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200233 CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700234
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200235 pass = io_base = ctl_base = is_mmio = try_slave = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700236 tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
237 tuple.Attributes = 0;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200238 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239 while (1) {
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200240 if (pcmcia_get_tuple_data(link, &tuple) != 0) goto next_entry;
241 if (pcmcia_parse_tuple(link, &tuple, &stk->parse) != 0) goto next_entry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700242
243 /* Check for matching Vcc, unless we're desperate */
244 if (!pass) {
245 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
246 if (stk->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)
247 goto next_entry;
248 } else if (stk->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
249 if (stk->conf.Vcc != stk->dflt.vcc.param[CISTPL_POWER_VNOM] / 10000)
250 goto next_entry;
251 }
252 }
253
254 if (cfg->vpp1.present & (1 << CISTPL_POWER_VNOM))
Dominik Brodowski70294b42006-01-15 12:43:16 +0100255 link->conf.Vpp =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;
257 else if (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))
Dominik Brodowski70294b42006-01-15 12:43:16 +0100258 link->conf.Vpp =
Linus Torvalds1da177e2005-04-16 15:20:36 -0700259 stk->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;
260
261 if ((cfg->io.nwin > 0) || (stk->dflt.io.nwin > 0)) {
262 cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &stk->dflt.io;
263 link->conf.ConfigIndex = cfg->index;
264 link->io.BasePort1 = io->win[0].base;
265 link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;
266 if (!(io->flags & CISTPL_IO_16BIT))
267 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
268 if (io->nwin == 2) {
269 link->io.NumPorts1 = 8;
270 link->io.BasePort2 = io->win[1].base;
271 link->io.NumPorts2 = (is_kme) ? 2 : 1;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200272 if (pcmcia_request_io(link, &link->io) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700273 goto next_entry;
274 io_base = link->io.BasePort1;
275 ctl_base = link->io.BasePort2;
276 } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {
277 link->io.NumPorts1 = io->win[0].len;
278 link->io.NumPorts2 = 0;
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200279 if (pcmcia_request_io(link, &link->io) != 0)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 goto next_entry;
281 io_base = link->io.BasePort1;
282 ctl_base = link->io.BasePort1 + 0x0e;
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200283
284 if (io->win[0].len >= 0x20)
285 try_slave = 1;
286
Linus Torvalds1da177e2005-04-16 15:20:36 -0700287 } else goto next_entry;
288 /* If we've got this far, we're done */
289 break;
290 }
291
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200292 if ((cfg->mem.nwin > 0) || (stk->dflt.mem.nwin > 0)) {
293 win_req_t req;
294 memreq_t map;
295 cistpl_mem_t *mem = (cfg->mem.nwin) ? &cfg->mem : &stk->dflt.mem;
296
297 if (mem->win[0].len < 16)
298 goto next_entry;
299
300 req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;
301 req.Attributes |= WIN_ENABLE;
302 req.Base = mem->win[0].host_addr;
303 req.Size = 0;
304
305 req.AccessSpeed = 0;
306 if (pcmcia_request_window(&link, &req, &link->win) != 0)
307 goto next_entry;
308 map.Page = 0; map.CardOffset = mem->win[0].card_addr;
309 if (pcmcia_map_mem_page(link->win, &map) != 0)
310 goto next_entry;
311
312 io_base = (unsigned long) ioremap(req.Base, req.Size);
313 ctl_base = io_base + 0x0e;
314 is_mmio = 1;
315
316 if (mem->win[0].len >= 0x20)
317 try_slave = 1;
318
319 break;
320 }
321
Linus Torvalds1da177e2005-04-16 15:20:36 -0700322 next_entry:
323 if (cfg->flags & CISTPL_CFTABLE_DEFAULT)
324 memcpy(&stk->dflt, cfg, sizeof(stk->dflt));
325 if (pass) {
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200326 CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));
327 } else if (pcmcia_get_next_tuple(link, &tuple) != 0) {
328 CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700329 memset(&stk->dflt, 0, sizeof(stk->dflt));
330 pass++;
331 }
332 }
333
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200334 CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));
335 CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700336
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200337 if(is_mmio)
338 my_outb = outb_mem;
339 else
340 my_outb = outb_io;
341
Linus Torvalds1da177e2005-04-16 15:20:36 -0700342 /* disable drive interrupts during IDE probe */
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200343 my_outb(0x02, ctl_base);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344
345 /* special setup for KXLC005 card */
346 if (is_kme)
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200347 my_outb(0x81, ctl_base+1);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700348
349 /* retry registration in case device is still spinning up */
350 for (hd = -1, i = 0; i < 10; i++) {
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200351 hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link, is_mmio);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352 if (hd >= 0) break;
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200353 if (try_slave) {
354 my_outb(0x02, ctl_base + 0x10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700355 hd = idecs_register(io_base + 0x10, ctl_base + 0x10,
Thomas Kleffel5040cb82006-05-14 15:16:30 +0200356 link->irq.AssignedIRQ, link, is_mmio);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700357 if (hd >= 0) {
358 io_base += 0x10;
359 ctl_base += 0x10;
360 break;
361 }
362 }
Nishanth Aravamudan2aad5f02005-09-10 00:27:15 -0700363 msleep(100);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700364 }
365
366 if (hd < 0) {
367 printk(KERN_NOTICE "ide-cs: ide_register() at 0x%3lx & 0x%3lx"
368 ", irq %u failed\n", io_base, ctl_base,
369 link->irq.AssignedIRQ);
370 goto failed;
371 }
372
373 info->ndev = 1;
374 sprintf(info->node.dev_name, "hd%c", 'a' + (hd * 2));
375 info->node.major = ide_major[hd];
376 info->node.minor = 0;
377 info->hd = hd;
Dominik Brodowskifd238232006-03-05 10:45:09 +0100378 link->dev_node = &info->node;
Dominik Brodowski70294b42006-01-15 12:43:16 +0100379 printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n",
380 info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700381
Linus Torvalds1da177e2005-04-16 15:20:36 -0700382 kfree(stk);
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200383 return 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700384
385err_mem:
386 printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n");
387 goto failed;
388
389cs_failed:
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200390 cs_error(link, last_fn, last_ret);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391failed:
392 kfree(stk);
393 ide_release(link);
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200394 return -ENODEV;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395} /* ide_config */
396
397/*======================================================================
398
399 After a card is removed, ide_release() will unregister the net
400 device, and release the PCMCIA configuration. If the device is
401 still open, this will be postponed until it is closed.
402
403======================================================================*/
404
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200405void ide_release(struct pcmcia_device *link)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700406{
407 ide_info_t *info = link->priv;
408
409 DEBUG(0, "ide_release(0x%p)\n", link);
410
411 if (info->ndev) {
412 /* FIXME: if this fails we need to queue the cleanup somehow
413 -- need to investigate the required PCMCIA magic */
414 ide_unregister(info->hd);
415 }
416 info->ndev = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417
Dominik Brodowskifba395e2006-03-31 17:21:06 +0200418 pcmcia_disable_device(link);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700419} /* ide_release */
420
Dominik Brodowski98e4c282005-11-14 21:21:18 +0100421
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422/*======================================================================
423
424 The card status event handler. Mostly, this schedules other
425 stuff to run after an event is received. A CARD_REMOVAL event
426 also sets some flags to discourage the ide drivers from
427 talking to the ports.
428
429======================================================================*/
430
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700431static struct pcmcia_device_id ide_ids[] = {
432 PCMCIA_DEVICE_FUNC_ID(4),
Richard Purdie725a6ab2006-01-05 09:56:03 +0000433 PCMCIA_DEVICE_MANF_CARD(0x0007, 0x0000), /* Hitachi */
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700434 PCMCIA_DEVICE_MANF_CARD(0x0032, 0x0704),
Dominik Brodowskif8f7cc02005-06-27 16:28:29 -0700435 PCMCIA_DEVICE_MANF_CARD(0x0045, 0x0401),
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700436 PCMCIA_DEVICE_MANF_CARD(0x0098, 0x0000), /* Toshiba */
437 PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x002d),
438 PCMCIA_DEVICE_MANF_CARD(0x00ce, 0x0000), /* Samsung */
Richard Purdie725a6ab2006-01-05 09:56:03 +0000439 PCMCIA_DEVICE_MANF_CARD(0x0319, 0x0000), /* Hitachi */
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700440 PCMCIA_DEVICE_MANF_CARD(0x2080, 0x0001),
441 PCMCIA_DEVICE_MANF_CARD(0x4e01, 0x0200), /* Lexar */
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700442 PCMCIA_DEVICE_PROD_ID123("Caravelle", "PSC-IDE ", "PSC000", 0x8c36137c, 0xd0693ab8, 0x2768a9f0),
443 PCMCIA_DEVICE_PROD_ID123("CDROM", "IDE", "MCD-601p", 0x1b9179ca, 0xede88951, 0x0d902f74),
444 PCMCIA_DEVICE_PROD_ID123("PCMCIA", "IDE CARD", "F1", 0x281f1c5d, 0x1907960c, 0xf7fde8b9),
445 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "CD-ROM", 0x78f308dc, 0x66536591),
446 PCMCIA_DEVICE_PROD_ID12("ARGOSY", "PnPIDE", 0x78f308dc, 0x0c694728),
447 PCMCIA_DEVICE_PROD_ID12("CNF CD-M", "CD-ROM", 0x7d93b852, 0x66536591),
448 PCMCIA_DEVICE_PROD_ID12("Creative Technology Ltd.", "PCMCIA CD-ROM Interface Card", 0xff8c8a45, 0xfe8020c4),
449 PCMCIA_DEVICE_PROD_ID12("Digital Equipment Corporation.", "Digital Mobile Media CD-ROM", 0x17692a66, 0xef1dcbde),
Komurod277ad02005-07-28 01:07:24 -0700450 PCMCIA_DEVICE_PROD_ID12("EXP", "CD+GAME", 0x6f58c983, 0x63c13aaf),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700451 PCMCIA_DEVICE_PROD_ID12("EXP ", "CD-ROM", 0x0a5c52fd, 0x66536591),
452 PCMCIA_DEVICE_PROD_ID12("EXP ", "PnPIDE", 0x0a5c52fd, 0x0c694728),
453 PCMCIA_DEVICE_PROD_ID12("FREECOM", "PCCARD-IDE", 0x5714cbf7, 0x48e0ab8e),
Richard Purdie725a6ab2006-01-05 09:56:03 +0000454 PCMCIA_DEVICE_PROD_ID12("HITACHI", "FLASH", 0xf4f43949, 0x9eb86aae),
455 PCMCIA_DEVICE_PROD_ID12("HITACHI", "microdrive", 0xf4f43949, 0xa6d76178),
Thomas Kleffel264a3412006-05-15 09:44:37 -0700456 PCMCIA_DEVICE_PROD_ID12("IBM", "microdrive", 0xb569a6e5, 0xa6d76178),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700457 PCMCIA_DEVICE_PROD_ID12("IBM", "IBM17JSSFP20", 0xb569a6e5, 0xf2508753),
458 PCMCIA_DEVICE_PROD_ID12("IO DATA", "CBIDE2 ", 0x547e66dc, 0x8671043b),
459 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149),
460 PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674),
461 PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b),
Dominik Brodowski2570b742005-09-17 11:17:56 +0200462 PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700463 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591),
464 PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728),
465 PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1),
466 PCMCIA_DEVICE_PROD_ID12("TOSHIBA", "MK2001MPL", 0xb4585a1a, 0x3489e003),
David Brownell42935652006-01-25 06:36:32 -0800467 PCMCIA_DEVICE_PROD_ID1("TRANSCEND 512M ", 0xd0909443),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700468 PCMCIA_DEVICE_PROD_ID12("WIT", "IDE16", 0x244e5994, 0x3e232852),
469 PCMCIA_DEVICE_PROD_ID1("STI Flash", 0xe4a13209),
Dominik Brodowskid3feb182005-09-09 13:03:28 -0700470 PCMCIA_DEVICE_PROD_ID12("STI", "Flash 5.0", 0xbf2df18d, 0x8cb57a0e),
Pavel Roskin698e22c2005-07-28 01:07:19 -0700471 PCMCIA_MFC_DEVICE_PROD_ID12(1, "SanDisk", "ConnectPlus", 0x7a954bd9, 0x74be00c6),
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700472 PCMCIA_DEVICE_NULL,
473};
474MODULE_DEVICE_TABLE(pcmcia, ide_ids);
475
Linus Torvalds1da177e2005-04-16 15:20:36 -0700476static struct pcmcia_driver ide_cs_driver = {
477 .owner = THIS_MODULE,
478 .drv = {
479 .name = "ide-cs",
480 },
Dominik Brodowski15b99ac2006-03-31 17:26:06 +0200481 .probe = ide_probe,
Dominik Brodowskicc3b4862005-11-14 21:23:14 +0100482 .remove = ide_detach,
Dominik Brodowskif70b7d42005-06-27 16:28:28 -0700483 .id_table = ide_ids,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484};
485
486static int __init init_ide_cs(void)
487{
488 return pcmcia_register_driver(&ide_cs_driver);
489}
490
491static void __exit exit_ide_cs(void)
492{
493 pcmcia_unregister_driver(&ide_cs_driver);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494}
495
Dominik Brodowski2b8d4662005-08-01 14:16:55 +0200496late_initcall(init_ide_cs);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700497module_exit(exit_ide_cs);