pcmcia: use autoconfiguration feature for ioports and iomem
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / scsi / pcmcia / aha152x_stub.c
CommitLineData
1da177e4
LT
1/*======================================================================
2
3 A driver for Adaptec AHA152X-compatible PCMCIA SCSI cards.
4
5 This driver supports the Adaptec AHA-1460, the New Media Bus
6 Toaster, and the New Media Toast & Jam.
7
8 aha152x_cs.c 1.54 2000/06/12 21:27:25
9
10 The contents of this file are subject to the Mozilla Public
11 License Version 1.1 (the "License"); you may not use this file
12 except in compliance with the License. You may obtain a copy of
13 the License at http://www.mozilla.org/MPL/
14
15 Software distributed under the License is distributed on an "AS
16 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
17 implied. See the License for the specific language governing
18 rights and limitations under the License.
19
20 The initial developer of the original code is David A. Hinds
21 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
22 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
23
24 Alternatively, the contents of this file may be used under the
25 terms of the GNU General Public License version 2 (the "GPL"), in which
26 case the provisions of the GPL are applicable instead of the
27 above. If you wish to allow the use of your version of this file
28 only under the terms of the GPL and not to allow others to use
29 your version of this file under the MPL, indicate your decision
30 by deleting the provisions above and replace them with the notice
31 and other provisions required by the GPL. If you do not delete
32 the provisions above, a recipient may use your version of this
33 file under either the MPL or the GPL.
34
35======================================================================*/
36
37#include <linux/module.h>
38#include <linux/init.h>
39#include <linux/kernel.h>
1da177e4
LT
40#include <linux/slab.h>
41#include <linux/string.h>
42#include <linux/ioport.h>
43#include <scsi/scsi.h>
44#include <linux/major.h>
45#include <linux/blkdev.h>
46#include <scsi/scsi_ioctl.h>
47
48#include "scsi.h"
49#include <scsi/scsi_host.h>
50#include "aha152x.h"
51
1da177e4
LT
52#include <pcmcia/cistpl.h>
53#include <pcmcia/ds.h>
54
1da177e4
LT
55
56/*====================================================================*/
57
58/* Parameters that can be set with 'insmod' */
59
60/* SCSI bus setup options */
61static int host_id = 7;
62static int reconnect = 1;
63static int parity = 1;
64static int synchronous = 1;
65static int reset_delay = 100;
66static int ext_trans = 0;
67
68module_param(host_id, int, 0);
69module_param(reconnect, int, 0);
70module_param(parity, int, 0);
71module_param(synchronous, int, 0);
72module_param(reset_delay, int, 0);
73module_param(ext_trans, int, 0);
74
75MODULE_LICENSE("Dual MPL/GPL");
76
77/*====================================================================*/
78
79typedef struct scsi_info_t {
fd238232 80 struct pcmcia_device *p_dev;
1da177e4
LT
81 struct Scsi_Host *host;
82} scsi_info_t;
83
fba395ee 84static void aha152x_release_cs(struct pcmcia_device *link);
cc3b4866 85static void aha152x_detach(struct pcmcia_device *p_dev);
15b99ac1 86static int aha152x_config_cs(struct pcmcia_device *link);
1da177e4 87
fba395ee 88static struct pcmcia_device *dev_list;
1da177e4 89
15b99ac1 90static int aha152x_probe(struct pcmcia_device *link)
1da177e4
LT
91{
92 scsi_info_t *info;
fba395ee 93
3e716617 94 dev_dbg(&link->dev, "aha152x_attach()\n");
1da177e4
LT
95
96 /* Create new SCSI device */
dd00cc48 97 info = kzalloc(sizeof(*info), GFP_KERNEL);
f8cfa618 98 if (!info) return -ENOMEM;
fba395ee 99 info->p_dev = link;
fd238232 100 link->priv = info;
1da177e4 101
00990e7c 102 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;
7feabb64 103 link->config_regs = PRESENT_OPTION;
1da177e4 104
15b99ac1 105 return aha152x_config_cs(link);
1da177e4
LT
106} /* aha152x_attach */
107
108/*====================================================================*/
109
fba395ee 110static void aha152x_detach(struct pcmcia_device *link)
1da177e4 111{
3e716617 112 dev_dbg(&link->dev, "aha152x_detach\n");
1da177e4 113
e2d40963 114 aha152x_release_cs(link);
1da177e4 115
1da177e4 116 /* Unlink device structure, free bits */
1da177e4 117 kfree(link->priv);
1da177e4
LT
118} /* aha152x_detach */
119
120/*====================================================================*/
121
00990e7c 122static int aha152x_config_check(struct pcmcia_device *p_dev, void *priv_data)
0e6f9d27 123{
90abdc3b 124 p_dev->io_lines = 10;
00990e7c 125
0e6f9d27 126 /* For New Media T&J, look for a SCSI window */
00990e7c
DB
127 if ((p_dev->resource[0]->end < 0x20) &&
128 (p_dev->resource[1]->end >= 0x20))
129 p_dev->resource[0]->start = p_dev->resource[1]->start;
130
131 if (p_dev->resource[0]->start >= 0xffff)
132 return -EINVAL;
133
134 p_dev->resource[1]->start = p_dev->resource[1]->end = 0;
135 p_dev->resource[0]->end = 0x20;
136 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;
137 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;
138
139 return pcmcia_request_io(p_dev);
0e6f9d27
DB
140}
141
15b99ac1 142static int aha152x_config_cs(struct pcmcia_device *link)
1da177e4 143{
1da177e4
LT
144 scsi_info_t *info = link->priv;
145 struct aha152x_setup s;
3e716617 146 int ret;
1da177e4 147 struct Scsi_Host *host;
0e6f9d27 148
3e716617 149 dev_dbg(&link->dev, "aha152x_config\n");
1da177e4 150
3e716617
DB
151 ret = pcmcia_loop_config(link, aha152x_config_check, NULL);
152 if (ret)
153 goto failed;
0e6f9d27 154
eb14120f 155 if (!link->irq)
3e716617
DB
156 goto failed;
157
1ac71e5a 158 ret = pcmcia_enable_device(link);
3e716617
DB
159 if (ret)
160 goto failed;
1da177e4
LT
161
162 /* Set configuration options for the aha152x driver */
163 memset(&s, 0, sizeof(s));
164 s.conf = "PCMCIA setup";
9a017a91 165 s.io_port = link->resource[0]->start;
eb14120f 166 s.irq = link->irq;
1da177e4
LT
167 s.scsiid = host_id;
168 s.reconnect = reconnect;
169 s.parity = parity;
170 s.synchronous = synchronous;
171 s.delay = reset_delay;
172 if (ext_trans)
173 s.ext_trans = ext_trans;
174
175 host = aha152x_probe_one(&s);
176 if (host == NULL) {
177 printk(KERN_INFO "aha152x_cs: no SCSI devices found\n");
3e716617 178 goto failed;
1da177e4
LT
179 }
180
1da177e4
LT
181 info->host = host;
182
15b99ac1
DB
183 return 0;
184
0e6f9d27 185failed:
1da177e4 186 aha152x_release_cs(link);
15b99ac1 187 return -ENODEV;
1da177e4
LT
188}
189
fba395ee 190static void aha152x_release_cs(struct pcmcia_device *link)
1da177e4
LT
191{
192 scsi_info_t *info = link->priv;
193
194 aha152x_release(info->host);
fba395ee 195 pcmcia_disable_device(link);
1da177e4
LT
196}
197
fba395ee 198static int aha152x_resume(struct pcmcia_device *link)
98e4c28b 199{
98e4c28b
DB
200 scsi_info_t *info = link->priv;
201
8661bb5b 202 aha152x_host_reset_host(info->host);
98e4c28b
DB
203
204 return 0;
205}
206
2dc27daa
DB
207static struct pcmcia_device_id aha152x_ids[] = {
208 PCMCIA_DEVICE_PROD_ID123("New Media", "SCSI", "Bus Toaster", 0xcdf7e4cc, 0x35f26476, 0xa8851d6e),
209 PCMCIA_DEVICE_PROD_ID123("NOTEWORTHY", "SCSI", "Bus Toaster", 0xad89c6e8, 0x35f26476, 0xa8851d6e),
210 PCMCIA_DEVICE_PROD_ID12("Adaptec, Inc.", "APA-1460 SCSI Host Adapter", 0x24ba9738, 0x3a3c3d20),
211 PCMCIA_DEVICE_PROD_ID12("New Media Corporation", "Multimedia Sound/SCSI", 0x085a850b, 0x80a6535c),
212 PCMCIA_DEVICE_PROD_ID12("NOTEWORTHY", "NWCOMB02 SCSI/AUDIO COMBO CARD", 0xad89c6e8, 0x5f9a615b),
213 PCMCIA_DEVICE_NULL,
214};
215MODULE_DEVICE_TABLE(pcmcia, aha152x_ids);
216
1da177e4
LT
217static struct pcmcia_driver aha152x_cs_driver = {
218 .owner = THIS_MODULE,
219 .drv = {
220 .name = "aha152x_cs",
221 },
15b99ac1 222 .probe = aha152x_probe,
cc3b4866 223 .remove = aha152x_detach,
2dc27daa 224 .id_table = aha152x_ids,
98e4c28b 225 .resume = aha152x_resume,
1da177e4
LT
226};
227
228static int __init init_aha152x_cs(void)
229{
230 return pcmcia_register_driver(&aha152x_cs_driver);
231}
232
233static void __exit exit_aha152x_cs(void)
234{
235 pcmcia_unregister_driver(&aha152x_cs_driver);
236 BUG_ON(dev_list != NULL);
237}
238
239module_init(init_aha152x_cs);
240module_exit(exit_aha152x_cs);