]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/scsi/pcmcia/fdomain_stub.c
pcmcia: use autoconfiguration feature for ioports and iomem
[mirror_ubuntu-artful-kernel.git] / drivers / scsi / pcmcia / fdomain_stub.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for Future Domain-compatible PCMCIA SCSI cards
4
5 fdomain_cs.c 1.47 2001/10/13 00:08:52
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/init.h>
36#include <linux/kernel.h>
1da177e4
LT
37#include <linux/slab.h>
38#include <linux/string.h>
39#include <linux/ioport.h>
40#include <scsi/scsi.h>
41#include <linux/major.h>
42#include <linux/blkdev.h>
43#include <scsi/scsi_ioctl.h>
44
45#include "scsi.h"
46#include <scsi/scsi_host.h>
47#include "fdomain.h"
48
1da177e4
LT
49#include <pcmcia/cistpl.h>
50#include <pcmcia/ds.h>
51
52/*====================================================================*/
53
54/* Module parameters */
55
56MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");
57MODULE_DESCRIPTION("Future Domain PCMCIA SCSI driver");
58MODULE_LICENSE("Dual MPL/GPL");
59
1da177e4
LT
60/*====================================================================*/
61
62typedef struct scsi_info_t {
fd238232 63 struct pcmcia_device *p_dev;
1da177e4
LT
64 struct Scsi_Host *host;
65} scsi_info_t;
66
67
fba395ee 68static void fdomain_release(struct pcmcia_device *link);
cc3b4866 69static void fdomain_detach(struct pcmcia_device *p_dev);
15b99ac1 70static int fdomain_config(struct pcmcia_device *link);
1da177e4 71
15b99ac1 72static int fdomain_probe(struct pcmcia_device *link)
1da177e4 73{
15b99ac1
DB
74 scsi_info_t *info;
75
3e716617 76 dev_dbg(&link->dev, "fdomain_attach()\n");
15b99ac1
DB
77
78 /* Create new SCSI device */
79 info = kzalloc(sizeof(*info), GFP_KERNEL);
80 if (!info)
81 return -ENOMEM;
82
83 info->p_dev = link;
84 link->priv = info;
00990e7c 85 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
7feabb64 86 link->config_regs = PRESENT_OPTION;
15b99ac1 87
15b99ac1 88 return fdomain_config(link);
1da177e4
LT
89} /* fdomain_attach */
90
91/*====================================================================*/
92
fba395ee 93static void fdomain_detach(struct pcmcia_device *link)
1da177e4 94{
3e716617 95 dev_dbg(&link->dev, "fdomain_detach\n");
b4635811 96
e2d40963 97 fdomain_release(link);
b4635811
DB
98
99 kfree(link->priv);
1da177e4
LT
100} /* fdomain_detach */
101
102/*====================================================================*/
103
00990e7c 104static int fdomain_config_check(struct pcmcia_device *p_dev, void *priv_data)
0e6f9d27 105{
90abdc3b 106 p_dev->io_lines = 10;
00990e7c
DB
107 p_dev->resource[0]->end = 0x10;
108 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
109 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
90abdc3b 110 return pcmcia_request_io(p_dev);
0e6f9d27
DB
111}
112
113
15b99ac1 114static int fdomain_config(struct pcmcia_device *link)
1da177e4 115{
1da177e4 116 scsi_info_t *info = link->priv;
3e716617 117 int ret;
ecb8a847 118 char str[22];
1da177e4
LT
119 struct Scsi_Host *host;
120
3e716617 121 dev_dbg(&link->dev, "fdomain_config\n");
1da177e4 122
3e716617
DB
123 ret = pcmcia_loop_config(link, fdomain_config_check, NULL);
124 if (ret)
0e6f9d27 125 goto failed;
1da177e4 126
eb14120f 127 if (!link->irq)
3e716617 128 goto failed;
1ac71e5a 129 ret = pcmcia_enable_device(link);
3e716617
DB
130 if (ret)
131 goto failed;
15b99ac1 132
1da177e4 133 /* A bad hack... */
9a017a91 134 release_region(link->resource[0]->start, resource_size(link->resource[0]));
1da177e4
LT
135
136 /* Set configuration options for the fdomain driver */
9a017a91 137 sprintf(str, "%d,%d", (unsigned int) link->resource[0]->start, link->irq);
1da177e4 138 fdomain_setup(str);
15b99ac1 139
1da177e4
LT
140 host = __fdomain_16x0_detect(&fdomain_driver_template);
141 if (!host) {
142 printk(KERN_INFO "fdomain_cs: no SCSI devices found\n");
3e716617 143 goto failed;
1da177e4 144 }
15b99ac1
DB
145
146 if (scsi_add_host(host, NULL))
3e716617 147 goto failed;
1da177e4
LT
148 scsi_scan_host(host);
149
1da177e4 150 info->host = host;
15b99ac1 151
15b99ac1
DB
152 return 0;
153
0e6f9d27 154failed:
1da177e4 155 fdomain_release(link);
15b99ac1 156 return -ENODEV;
1da177e4
LT
157} /* fdomain_config */
158
159/*====================================================================*/
160
fba395ee 161static void fdomain_release(struct pcmcia_device *link)
1da177e4 162{
5f2a71fc 163 scsi_info_t *info = link->priv;
1da177e4 164
3e716617 165 dev_dbg(&link->dev, "fdomain_release\n");
1da177e4 166
5f2a71fc 167 scsi_remove_host(info->host);
fba395ee 168 pcmcia_disable_device(link);
5f2a71fc 169 scsi_unregister(info->host);
1da177e4
LT
170}
171
172/*====================================================================*/
173
fba395ee 174static int fdomain_resume(struct pcmcia_device *link)
98e4c28b 175{
e2d40963 176 fdomain_16x0_bus_reset(NULL);
98e4c28b
DB
177
178 return 0;
179}
180
2d1fb376
DB
181static struct pcmcia_device_id fdomain_ids[] = {
182 PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88, 0x859cad20),
183 PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e),
184 PCMCIA_DEVICE_PROD_ID12(" SIMPLE TECHNOLOGY Corporation", "SCSI PCMCIA Credit Card Controller", 0x182bdafe, 0xc80d106f),
185 PCMCIA_DEVICE_NULL,
186};
187MODULE_DEVICE_TABLE(pcmcia, fdomain_ids);
188
1da177e4
LT
189static struct pcmcia_driver fdomain_cs_driver = {
190 .owner = THIS_MODULE,
191 .drv = {
192 .name = "fdomain_cs",
193 },
15b99ac1 194 .probe = fdomain_probe,
cc3b4866 195 .remove = fdomain_detach,
2d1fb376 196 .id_table = fdomain_ids,
98e4c28b 197 .resume = fdomain_resume,
1da177e4
LT
198};
199
200static int __init init_fdomain_cs(void)
201{
202 return pcmcia_register_driver(&fdomain_cs_driver);
203}
204
205static void __exit exit_fdomain_cs(void)
206{
207 pcmcia_unregister_driver(&fdomain_cs_driver);
1da177e4
LT
208}
209
210module_init(init_fdomain_cs);
211module_exit(exit_fdomain_cs);