Blame view

drivers/ide/q40ide.c 4.12 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
58f189fcc   Bartlomiej Zolnierkiewicz   ide: delete filen...
2
   *  Q40 I/O port IDE Driver
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   *
   *     (c) Richard Zidlicky
   *
   *  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.
   *
   *
   */
  
  #include <linux/types.h>
  #include <linux/mm.h>
  #include <linux/interrupt.h>
  #include <linux/blkdev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
  #include <linux/ide.h>
bff7832dd   Paul Gortmaker   ide/ata: Add modu...
18
  #include <linux/module.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19

d18812070   Geert Uytterhoeven   ide: falconide/q4...
20
  #include <asm/ide.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
      /*
       *  Bases of the IDE interfaces
       */
  
  #define Q40IDE_NUM_HWIFS	2
  
  #define PCIDE_BASE1	0x1f0
  #define PCIDE_BASE2	0x170
  #define PCIDE_BASE3	0x1e8
  #define PCIDE_BASE4	0x168
  #define PCIDE_BASE5	0x1e0
  #define PCIDE_BASE6	0x160
  
  static const unsigned long pcide_bases[Q40IDE_NUM_HWIFS] = {
      PCIDE_BASE1, PCIDE_BASE2, /* PCIDE_BASE3, PCIDE_BASE4  , PCIDE_BASE5,
      PCIDE_BASE6 */
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
39
40
41
42
43
44
45
46
47
48
49
50
  static int q40ide_default_irq(unsigned long base)
  {
             switch (base) {
  	            case 0x1f0: return 14;
  		    case 0x170: return 15;
  		    case 0x1e8: return 11;
  		    default:
  			return 0;
  	   }
  }
  
  
  /*
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
51
   * Addresses are pretranslated for Q40 ISA access.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
   */
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
53
  static void q40_ide_setup_ports(struct ide_hw *hw, unsigned long base, int irq)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  {
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
55
  	memset(hw, 0, sizeof(*hw));
d28aa3ac4   Al Viro   q40ide breakage
56
57
58
59
60
61
62
63
64
65
66
  	/* BIG FAT WARNING: 
  	   assumption: only DATA port is ever used in 16 bit mode */
  	hw->io_ports.data_addr = Q40_ISA_IO_W(base);
  	hw->io_ports.error_addr = Q40_ISA_IO_B(base + 1);
  	hw->io_ports.nsect_addr = Q40_ISA_IO_B(base + 2);
  	hw->io_ports.lbal_addr = Q40_ISA_IO_B(base + 3);
  	hw->io_ports.lbam_addr = Q40_ISA_IO_B(base + 4);
  	hw->io_ports.lbah_addr = Q40_ISA_IO_B(base + 5);
  	hw->io_ports.device_addr = Q40_ISA_IO_B(base + 6);
  	hw->io_ports.status_addr = Q40_ISA_IO_B(base + 7);
  	hw->io_ports.ctl_addr = Q40_ISA_IO_B(base + 0x206);
86f3a492b   Bartlomiej Zolnierkiewicz   icside: use ec->d...
67

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68
  	hw->irq = irq;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
  }
adb1af980   Bartlomiej Zolnierkiewicz   ide: pass command...
70
  static void q40ide_input_data(ide_drive_t *drive, struct ide_cmd *cmd,
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
71
  			      void *buf, unsigned int len)
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
72
  {
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
73
  	unsigned long data_addr = drive->hwif->io_ports.data_addr;
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
74

d18812070   Geert Uytterhoeven   ide: falconide/q4...
75
76
77
78
  	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:...
79

f94116aee   Bartlomiej Zolnierkiewicz   ide: cleanup <asm...
80
  	raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
81
  }
adb1af980   Bartlomiej Zolnierkiewicz   ide: pass command...
82
  static void q40ide_output_data(ide_drive_t *drive, struct ide_cmd *cmd,
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
83
  			       void *buf, unsigned int len)
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
84
  {
9567b349f   Bartlomiej Zolnierkiewicz   ide: merge ->atap...
85
  	unsigned long data_addr = drive->hwif->io_ports.data_addr;
d18812070   Geert Uytterhoeven   ide: falconide/q4...
86
87
88
89
  	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:...
90

f94116aee   Bartlomiej Zolnierkiewicz   ide: cleanup <asm...
91
  	raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
92d3ab27e   Bartlomiej Zolnierkiewicz   falconide/q40ide:...
92
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93

374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
94
95
96
97
98
  /* Q40 has a byte-swapped IDE interface */
  static const struct ide_tp_ops q40ide_tp_ops = {
  	.exec_command		= ide_exec_command,
  	.read_status		= ide_read_status,
  	.read_altstatus		= ide_read_altstatus,
ecf3a31d2   Sergei Shtylyov   ide: turn set_irq...
99
  	.write_devctl		= ide_write_devctl,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
100

abb596b25   Sergei Shtylyov   ide: turn selectp...
101
  	.dev_select		= ide_dev_select,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
102
103
104
105
106
107
108
109
110
  	.tf_load		= ide_tf_load,
  	.tf_read		= ide_tf_read,
  
  	.input_data		= q40ide_input_data,
  	.output_data		= q40ide_output_data,
  };
  
  static const struct ide_port_info q40ide_port_info = {
  	.tp_ops			= &q40ide_tp_ops,
09a3e7918   Bartlomiej Zolnierkiewicz   ide: make m68k ho...
111
  	.host_flags		= IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
255115fb3   Bartlomiej Zolnierkiewicz   ide: allow host d...
112
  	.irq_flags		= IRQF_SHARED,
29e52cf79   Bartlomiej Zolnierkiewicz   ide: remove chips...
113
  	.chipset		= ide_generic,
374e042c3   Bartlomiej Zolnierkiewicz   ide: add struct i...
114
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
116
  /* 
   * the static array is needed to have the name reported in /proc/ioports,
96de0e252   Jan Engelhardt   Convert files to ...
117
   * hwif->name unfortunately isn't available yet
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
121
122
123
124
125
   */
  static const char *q40_ide_names[Q40IDE_NUM_HWIFS]={
  	"ide0", "ide1"
  };
  
  /*
   *  Probe for Q40 IDE interfaces
   */
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
126
  static int __init q40ide_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
  {
      int i;
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
129
      struct ide_hw hw[Q40IDE_NUM_HWIFS], *hws[] = { NULL, NULL };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
  
      if (!MACH_IS_Q40)
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
132
        return -ENODEV;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133

c99c92c58   Bartlomiej Zolnierkiewicz   ide: print banner...
134
135
      printk(KERN_INFO "ide: Q40 IDE controller
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
      for (i = 0; i < Q40IDE_NUM_HWIFS; i++) {
c97c6aca7   Bartlomiej Zolnierkiewicz   ide: pass hw_regs...
137
  	const char *name = q40_ide_names[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
140
141
142
143
144
145
146
147
148
149
150
151
  	if (!request_region(pcide_bases[i], 8, name)) {
  		printk("could not reserve ports %lx-%lx for %s
  ",
  		       pcide_bases[i],pcide_bases[i]+8,name);
  		continue;
  	}
  	if (!request_region(pcide_bases[i]+0x206, 1, name)) {
  		printk("could not reserve port %lx for %s
  ",
  		       pcide_bases[i]+0x206,name);
  		release_region(pcide_bases[i], 8);
  		continue;
  	}
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
152
  	q40_ide_setup_ports(&hw[i], pcide_bases[i],
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153
  			q40ide_default_irq(pcide_bases[i]));
cbb010c18   Bartlomiej Zolnierkiewicz   ide: drop 'initia...
154

48c3c1072   Bartlomiej Zolnierkiewicz   ide: add struct i...
155
  	hws[i] = &hw[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
      }
8ac4ce742   Bartlomiej Zolnierkiewicz   ide: fix host dri...
157

dca398305   Bartlomiej Zolnierkiewicz   ide: pass number ...
158
      return ide_host_add(&q40ide_port_info, hws, Q40IDE_NUM_HWIFS, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
159
  }
ade2daf9c   Bartlomiej Zolnierkiewicz   ide: make remaini...
160
  module_init(q40ide_init);
f743d04dc   Adrian Bunk   ide/legacy/q40ide...
161
162
  
  MODULE_LICENSE("GPL");