Blame view
drivers/ide/falconide.c
3.87 KB
1da177e4c Linux-2.6.12-rc2 |
1 |
/* |
58f189fcc ide: delete filen... |
2 |
* Atari Falcon IDE Driver |
1da177e4c Linux-2.6.12-rc2 |
3 4 5 6 7 8 9 |
* * Created 12 Jul 1997 by Geert Uytterhoeven * * This file is subject to the terms and conditions of the GNU General Public * License. See the file COPYING in the main directory of this archive for * more details. */ |
88f8bb780 m68k: missing exp... |
10 |
#include <linux/module.h> |
1da177e4c Linux-2.6.12-rc2 |
11 12 13 14 |
#include <linux/types.h> #include <linux/mm.h> #include <linux/interrupt.h> #include <linux/blkdev.h> |
1da177e4c Linux-2.6.12-rc2 |
15 16 17 18 19 20 21 |
#include <linux/ide.h> #include <linux/init.h> #include <asm/setup.h> #include <asm/atarihw.h> #include <asm/atariints.h> #include <asm/atari_stdma.h> |
d18812070 ide: falconide/q4... |
22 |
#include <asm/ide.h> |
1da177e4c Linux-2.6.12-rc2 |
23 |
|
cb5528ab1 falconide: fix re... |
24 |
#define DRV_NAME "falconide" |
1da177e4c Linux-2.6.12-rc2 |
25 26 27 28 29 30 31 32 33 34 |
/* * Base of the IDE interface */ #define ATA_HD_BASE 0xfff00000 /* * Offsets from the above base */ |
1da177e4c Linux-2.6.12-rc2 |
35 |
#define ATA_HD_CONTROL 0x39 |
1da177e4c Linux-2.6.12-rc2 |
36 37 38 39 |
/* * falconide_intr_lock is used to obtain access to the IDE interrupt, * which is shared between several drivers. */ |
e354c1d80 ide: remove IDE_A... |
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
static int falconide_intr_lock; static void falconide_release_lock(void) { if (falconide_intr_lock == 0) { printk(KERN_ERR "%s: bug ", __func__); return; } falconide_intr_lock = 0; stdma_release(); } static void falconide_get_lock(irq_handler_t handler, void *data) { if (falconide_intr_lock == 0) { if (in_interrupt() > 0) panic("Falcon IDE hasn't ST-DMA lock in interrupt"); stdma_lock(handler, data); falconide_intr_lock = 1; } } |
1da177e4c Linux-2.6.12-rc2 |
62 |
|
adb1af980 ide: pass command... |
63 |
static void falconide_input_data(ide_drive_t *drive, struct ide_cmd *cmd, |
9567b349f ide: merge ->atap... |
64 |
void *buf, unsigned int len) |
92d3ab27e falconide/q40ide:... |
65 |
{ |
9567b349f ide: merge ->atap... |
66 |
unsigned long data_addr = drive->hwif->io_ports.data_addr; |
92d3ab27e falconide/q40ide:... |
67 |
|
d18812070 ide: falconide/q4... |
68 69 70 71 |
if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { __ide_mm_insw(data_addr, buf, (len + 1) / 2); return; } |
92d3ab27e falconide/q40ide:... |
72 |
|
f94116aee ide: cleanup <asm... |
73 |
raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2); |
92d3ab27e falconide/q40ide:... |
74 |
} |
adb1af980 ide: pass command... |
75 |
static void falconide_output_data(ide_drive_t *drive, struct ide_cmd *cmd, |
9567b349f ide: merge ->atap... |
76 |
void *buf, unsigned int len) |
92d3ab27e falconide/q40ide:... |
77 |
{ |
9567b349f ide: merge ->atap... |
78 |
unsigned long data_addr = drive->hwif->io_ports.data_addr; |
d18812070 ide: falconide/q4... |
79 80 81 82 |
if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) { __ide_mm_outsw(data_addr, buf, (len + 1) / 2); return; } |
92d3ab27e falconide/q40ide:... |
83 |
|
f94116aee ide: cleanup <asm... |
84 |
raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2); |
92d3ab27e falconide/q40ide:... |
85 |
} |
374e042c3 ide: add struct i... |
86 87 88 89 90 |
/* Atari has a byte-swapped IDE interface */ static const struct ide_tp_ops falconide_tp_ops = { .exec_command = ide_exec_command, .read_status = ide_read_status, .read_altstatus = ide_read_altstatus, |
ecf3a31d2 ide: turn set_irq... |
91 |
.write_devctl = ide_write_devctl, |
374e042c3 ide: add struct i... |
92 |
|
abb596b25 ide: turn selectp... |
93 |
.dev_select = ide_dev_select, |
374e042c3 ide: add struct i... |
94 95 96 97 98 99 100 101 |
.tf_load = ide_tf_load, .tf_read = ide_tf_read, .input_data = falconide_input_data, .output_data = falconide_output_data, }; static const struct ide_port_info falconide_port_info = { |
e354c1d80 ide: remove IDE_A... |
102 103 |
.get_lock = falconide_get_lock, .release_lock = falconide_release_lock, |
374e042c3 ide: add struct i... |
104 |
.tp_ops = &falconide_tp_ops, |
09a3e7918 ide: make m68k ho... |
105 106 |
.host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE | IDE_HFLAG_NO_DMA, |
255115fb3 ide: allow host d... |
107 |
.irq_flags = IRQF_SHARED, |
29e52cf79 ide: remove chips... |
108 |
.chipset = ide_generic, |
374e042c3 ide: add struct i... |
109 |
}; |
9f36d3143 ide: remove hw_re... |
110 |
static void __init falconide_setup_ports(struct ide_hw *hw) |
29dd59755 ide: remove ide_s... |
111 112 113 114 |
{ int i; memset(hw, 0, sizeof(*hw)); |
4c3032d8a ide: add struct i... |
115 |
hw->io_ports.data_addr = ATA_HD_BASE; |
29dd59755 ide: remove ide_s... |
116 117 |
for (i = 1; i < 8; i++) |
4c3032d8a ide: add struct i... |
118 |
hw->io_ports_array[i] = ATA_HD_BASE + 1 + i * 4; |
29dd59755 ide: remove ide_s... |
119 |
|
4c3032d8a ide: add struct i... |
120 |
hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL; |
29dd59755 ide: remove ide_s... |
121 122 |
hw->irq = IRQ_MFP_IDE; |
29dd59755 ide: remove ide_s... |
123 |
} |
1da177e4c Linux-2.6.12-rc2 |
124 125 126 127 |
/* * Probe for a Falcon IDE interface */ |
ade2daf9c ide: make remaini... |
128 |
static int __init falconide_init(void) |
1da177e4c Linux-2.6.12-rc2 |
129 |
{ |
48c3c1072 ide: add struct i... |
130 |
struct ide_host *host; |
9f36d3143 ide: remove hw_re... |
131 |
struct ide_hw hw, *hws[] = { &hw }; |
8a69580e1 ide: add ide_host... |
132 |
int rc; |
1da177e4c Linux-2.6.12-rc2 |
133 |
|
29dd59755 ide: remove ide_s... |
134 |
if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE)) |
8a69580e1 ide: add ide_host... |
135 |
return -ENODEV; |
29dd59755 ide: remove ide_s... |
136 |
|
c99c92c58 ide: print banner... |
137 138 |
printk(KERN_INFO "ide: Falcon IDE controller "); |
cb5528ab1 falconide: fix re... |
139 140 141 142 143 |
if (!request_mem_region(ATA_HD_BASE, 0x40, DRV_NAME)) { printk(KERN_ERR "%s: resources busy ", DRV_NAME); return -EBUSY; } |
29dd59755 ide: remove ide_s... |
144 |
falconide_setup_ports(&hw); |
1da177e4c Linux-2.6.12-rc2 |
145 |
|
dca398305 ide: pass number ... |
146 |
host = ide_host_alloc(&falconide_port_info, hws, 1); |
8a69580e1 ide: add ide_host... |
147 148 149 |
if (host == NULL) { rc = -ENOMEM; goto err; |
cbb010c18 ide: drop 'initia... |
150 |
} |
ade2daf9c ide: make remaini... |
151 |
|
e354c1d80 ide: remove IDE_A... |
152 |
falconide_get_lock(NULL, NULL); |
8a69580e1 ide: add ide_host... |
153 |
rc = ide_host_register(host, &falconide_port_info, hws); |
e354c1d80 ide: remove IDE_A... |
154 |
falconide_release_lock(); |
8a69580e1 ide: add ide_host... |
155 156 157 |
if (rc) goto err_free; |
29dd59755 ide: remove ide_s... |
158 |
return 0; |
8a69580e1 ide: add ide_host... |
159 160 161 162 163 |
err_free: ide_host_free(host); err: release_mem_region(ATA_HD_BASE, 0x40); return rc; |
1da177e4c Linux-2.6.12-rc2 |
164 |
} |
ade2daf9c ide: make remaini... |
165 166 |
module_init(falconide_init); |
0c5ec97b3 ide/legacy/falcon... |
167 168 |
MODULE_LICENSE("GPL"); |