Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
scsi
sni_53c710.c
Go to the documentation of this file.
1
/* -*- mode: c; c-basic-offset: 8 -*- */
2
3
/* SNI RM driver
4
*
5
* Copyright (C) 2001 by
[email protected]
6
**-----------------------------------------------------------------------------
7
**
8
** This program is free software; you can redistribute it and/or modify
9
** it under the terms of the GNU General Public License as published by
10
** the Free Software Foundation; either version 2 of the License, or
11
** (at your option) any later version.
12
**
13
** This program is distributed in the hope that it will be useful,
14
** but WITHOUT ANY WARRANTY; without even the implied warranty of
15
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
** GNU General Public License for more details.
17
**
18
** You should have received a copy of the GNU General Public License
19
** along with this program; if not, write to the Free Software
20
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
**
22
**-----------------------------------------------------------------------------
23
*/
24
25
/*
26
* Based on lasi700.c
27
*/
28
29
#include <linux/kernel.h>
30
#include <linux/module.h>
31
#include <
linux/init.h
>
32
#include <linux/types.h>
33
#include <linux/slab.h>
34
#include <linux/stat.h>
35
#include <
linux/mm.h
>
36
#include <
linux/blkdev.h
>
37
#include <linux/sched.h>
38
#include <
linux/ioport.h
>
39
#include <
linux/dma-mapping.h
>
40
#include <
linux/platform_device.h
>
41
42
#include <asm/page.h>
43
#include <asm/pgtable.h>
44
#include <asm/irq.h>
45
#include <asm/delay.h>
46
47
#include <
scsi/scsi_host.h
>
48
#include <
scsi/scsi_device.h
>
49
#include <
scsi/scsi_transport.h
>
50
#include <
scsi/scsi_transport_spi.h
>
51
52
#include "
53c700.h
"
53
54
MODULE_AUTHOR
(
"Thomas Bogendörfer"
);
55
MODULE_DESCRIPTION
(
"SNI RM 53c710 SCSI Driver"
);
56
MODULE_LICENSE
(
"GPL"
);
57
MODULE_ALIAS
(
"platform:snirm_53c710"
);
58
59
#define SNIRM710_CLOCK 32
60
61
static
struct
scsi_host_template
snirm710_template = {
62
.name =
"SNI RM SCSI 53c710"
,
63
.proc_name =
"snirm_53c710"
,
64
.this_id = 7,
65
.module =
THIS_MODULE
,
66
};
67
68
static
int
__devinit
snirm710_probe(
struct
platform_device
*
dev
)
69
{
70
unsigned
long
base
;
71
struct
NCR_700_Host_Parameters
*
hostdata
;
72
struct
Scsi_Host
*
host
;
73
struct
resource
*
res
;
74
75
res =
platform_get_resource
(dev,
IORESOURCE_MEM
, 0);
76
if
(!res)
77
return
-
ENODEV
;
78
79
base = res->
start
;
80
hostdata = kzalloc(
sizeof
(*hostdata),
GFP_KERNEL
);
81
if
(!hostdata) {
82
dev_printk(
KERN_ERR
, dev,
"Failed to allocate host data\n"
);
83
return
-
ENOMEM
;
84
}
85
86
hostdata->
dev
= &dev->
dev
;
87
dma_set_mask
(&dev->
dev
,
DMA_BIT_MASK
(32));
88
hostdata->
base
=
ioremap_nocache
(base, 0x100);
89
hostdata->
differential
= 0;
90
91
hostdata->
clock
=
SNIRM710_CLOCK
;
92
hostdata->force_le_on_be = 1;
93
hostdata->
chip710
= 1;
94
hostdata->
burst_length
= 4;
95
96
host =
NCR_700_detect
(&snirm710_template, hostdata, &dev->
dev
);
97
if
(!host)
98
goto
out_kfree;
99
host->
this_id
= 7;
100
host->
base
= base;
101
host->
irq
=
platform_get_irq
(dev, 0);
102
if
(
request_irq
(host->
irq
,
NCR_700_intr
,
IRQF_SHARED
,
"snirm710"
, host)) {
103
printk
(
KERN_ERR
"snirm710: request_irq failed!\n"
);
104
goto
out_put_host;
105
}
106
107
dev_set_drvdata
(&dev->
dev
, host);
108
scsi_scan_host
(host);
109
110
return
0;
111
112
out_put_host:
113
scsi_host_put
(host);
114
out_kfree:
115
iounmap
(hostdata->
base
);
116
kfree
(hostdata);
117
return
-
ENODEV
;
118
}
119
120
static
int
__exit
snirm710_driver_remove(
struct
platform_device
*dev)
121
{
122
struct
Scsi_Host
*host =
dev_get_drvdata
(&dev->
dev
);
123
struct
NCR_700_Host_Parameters
*hostdata =
124
(
struct
NCR_700_Host_Parameters
*)host->hostdata[0];
125
126
scsi_remove_host
(host);
127
NCR_700_release
(host);
128
free_irq
(host->
irq
, host);
129
iounmap
(hostdata->
base
);
130
kfree
(hostdata);
131
132
return
0;
133
}
134
135
static
struct
platform_driver
snirm710_driver = {
136
.probe = snirm710_probe,
137
.remove =
__devexit_p
(snirm710_driver_remove),
138
.driver = {
139
.name =
"snirm_53c710"
,
140
.owner =
THIS_MODULE
,
141
},
142
};
143
144
static
int
__init
snirm710_init(
void
)
145
{
146
return
platform_driver_register
(&snirm710_driver);
147
}
148
149
static
void
__exit
snirm710_exit(
void
)
150
{
151
platform_driver_unregister
(&snirm710_driver);
152
}
153
154
module_init
(snirm710_init);
155
module_exit
(snirm710_exit);
Generated on Thu Jan 10 2013 14:24:45 for Linux Kernel by
1.8.2