Blame view

drivers/ide/falconide.c 3.87 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
58f189fcc   Bartlomiej Zolnierkiewicz   ide: delete filen...
2
   *  Atari Falcon IDE Driver
1da177e4c   Linus Torvalds   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   Al Viro   m68k: missing exp...
10
  #include <linux/module.h>
1da177e4c   Linus Torvalds   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   Linus Torvalds   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   Geert Uytterhoeven   ide: falconide/q4...
22
  #include <asm/ide.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23

cb5528ab1   Bartlomiej Zolnierkiewicz   falconide: fix re...
24
  #define DRV_NAME "falconide"
1da177e4c   Linus Torvalds   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   Linus Torvalds   Linux-2.6.12-rc2
35
  #define ATA_HD_CONTROL	0x39
1da177e4c   Linus Torvalds   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   Bartlomiej Zolnierkiewicz   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   Linus Torvalds   Linux-2.6.12-rc2
62

adb1af980   Bartlomiej Zolnierkiewicz   ide: pass command...
63
  static void falconide_input_data(ide_drive_t *drive, struct ide_cmd *cmd,
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
64
  				 void *buf, unsigned int len)
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
65
  {
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
66
  	unsigned long data_addr = drive->hwif->io_ports.data_addr;
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
67

d18812070   Geert Uytterhoeven   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   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
72

f94116aee   Bartlomiej Zolnierkiewicz   ide: cleanup <asm...
73
  	raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
74
  }
adb1af980   Bartlomiej Zolnierkiewicz   ide: pass command...
75
  static void falconide_output_data(ide_drive_t *drive, struct ide_cmd *cmd,
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
76
  				  void *buf, unsigned int len)
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
77
  {
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
78
  	unsigned long data_addr = drive->hwif->io_ports.data_addr;
d18812070   Geert Uytterhoeven   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   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
83

f94116aee   Bartlomiej Zolnierkiewicz   ide: cleanup <asm...
84
  	raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
85
  }
374e042c3   Bartlomiej Zolnierkiewicz   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   Sergei Shtylyov   ide: turn set_irq...
91
  	.write_devctl		= ide_write_devctl,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
92

abb596b25   Sergei Shtylyov   ide: turn selectp...
93
  	.dev_select		= ide_dev_select,
374e042c3   Bartlomiej Zolnierkiewicz   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   Bartlomiej Zolnierkiewicz   ide: remove IDE_A...
102
103
  	.get_lock		= falconide_get_lock,
  	.release_lock		= falconide_release_lock,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
104
  	.tp_ops			= &falconide_tp_ops,
09a3e7918   Bartlomiej Zolnierkiewicz   ide: make m68k ho...
105
106
  	.host_flags		= IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE |
  				  IDE_HFLAG_NO_DMA,
255115fb3   Bartlomiej Zolnierkiewicz   ide: allow host d...
107
  	.irq_flags		= IRQF_SHARED,
29e52cf79   Bartlomiej Zolnierkiewicz   ide: remove chips...
108
  	.chipset		= ide_generic,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
109
  };
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
110
  static void __init falconide_setup_ports(struct ide_hw *hw)
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
111
112
113
114
  {
  	int i;
  
  	memset(hw, 0, sizeof(*hw));
4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
115
  	hw->io_ports.data_addr = ATA_HD_BASE;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
116
117
  
  	for (i = 1; i < 8; i++)
4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
118
  		hw->io_ports_array[i] = ATA_HD_BASE + 1 + i * 4;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
119

4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
120
  	hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
121
122
  
  	hw->irq = IRQ_MFP_IDE;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
123
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
127
  
      /*
       *  Probe for a Falcon IDE interface
       */
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
128
  static int __init falconide_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  {
48c3c1072   Bartlomiej Zolnierkiewicz   ide: add struct i...
130
  	struct ide_host *host;
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
131
  	struct ide_hw hw, *hws[] = { &hw };
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
132
  	int rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133

29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
134
  	if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE))
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
135
  		return -ENODEV;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
136

c99c92c58   Bartlomiej Zolnierkiewicz   ide: print banner...
137
138
  	printk(KERN_INFO "ide: Falcon IDE controller
  ");
cb5528ab1   Bartlomiej Zolnierkiewicz   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   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
144
  	falconide_setup_ports(&hw);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145

dca398305   Bartlomiej Zolnierkiewicz   ide: pass number ...
146
  	host = ide_host_alloc(&falconide_port_info, hws, 1);
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
147
148
149
  	if (host == NULL) {
  		rc = -ENOMEM;
  		goto err;
cbb010c18   Bartlomiej Zolnierkiewicz   ide: drop 'initia...
150
  	}
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
151

e354c1d80   Bartlomiej Zolnierkiewicz   ide: remove IDE_A...
152
  	falconide_get_lock(NULL, NULL);
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
153
  	rc = ide_host_register(host, &falconide_port_info, hws);
e354c1d80   Bartlomiej Zolnierkiewicz   ide: remove IDE_A...
154
  	falconide_release_lock();
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
155
156
157
  
  	if (rc)
  		goto err_free;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
158
  	return 0;
8a69580e1   Bartlomiej Zolnierkiewicz   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   Linus Torvalds   Linux-2.6.12-rc2
164
  }
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
165
166
  
  module_init(falconide_init);
0c5ec97b3   Adrian Bunk   ide/legacy/falcon...
167
168
  
  MODULE_LICENSE("GPL");