Blame view

drivers/ide/ide-generic.c 3.87 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  /*
   * generic/default IDE host driver
   *
52913ab2c   Bartlomiej Zolnierkiewicz   ide-generic: remo...
4
   * Copyright (C) 2004, 2008-2009 Bartlomiej Zolnierkiewicz
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
   * This code was split off from ide.c.  See it for original copyrights.
   *
   * May be copied or modified under the terms of the GNU General Public License.
   */
  
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/ide.h>
20df429dd   Borislav Petkov   ide-generic: hand...
14
  #include <linux/pci_ids.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15

4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
16
17
18
19
  /* FIXME: convert arm and m32r to use ide_platform host driver */
  #ifdef CONFIG_ARM
  #include <asm/irq.h>
  #endif
f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
20
21
22
  #ifdef CONFIG_M32R
  #include <asm/m32r.h>
  #endif
f0298512c   Bartlomiej Zolnierkiewicz   ide-generic: add ...
23
  #define DRV_NAME	"ide_generic"
20df429dd   Borislav Petkov   ide-generic: hand...
24
  static int probe_mask;
0cbccbc30   Bartlomiej Zolnierkiewicz   ide-generic: don'...
25
26
  module_param(probe_mask, int, 0);
  MODULE_PARM_DESC(probe_mask, "probe mask for legacy ISA IDE ports");
e518e5877   Bartlomiej Zolnierkiewicz   ide-generic: use ...
27
28
  static const struct ide_port_info ide_generic_port_info = {
  	.host_flags		= IDE_HFLAG_NO_DMA,
29e52cf79   Bartlomiej Zolnierkiewicz   ide: remove chips...
29
  	.chipset		= ide_generic,
e518e5877   Bartlomiej Zolnierkiewicz   ide-generic: use ...
30
  };
4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
31
32
33
34
35
  #ifdef CONFIG_ARM
  static const u16 legacy_bases[] = { 0x1f0 };
  static const int legacy_irqs[]  = { IRQ_HARDDISK };
  #elif defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) || \
        defined(CONFIG_PLAT_OPSPUT)
f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
36
37
38
39
40
41
42
43
44
45
46
47
  static const u16 legacy_bases[] = { 0x1f0 };
  static const int legacy_irqs[]  = { PLD_IRQ_CFIREQ };
  #elif defined(CONFIG_PLAT_MAPPI3)
  static const u16 legacy_bases[] = { 0x1f0, 0x170 };
  static const int legacy_irqs[]  = { PLD_IRQ_CFIREQ, PLD_IRQ_IDEIREQ };
  #elif defined(CONFIG_ALPHA)
  static const u16 legacy_bases[] = { 0x1f0, 0x170, 0x1e8, 0x168 };
  static const int legacy_irqs[]  = { 14, 15, 11, 10 };
  #else
  static const u16 legacy_bases[] = { 0x1f0, 0x170, 0x1e8, 0x168, 0x1e0, 0x160 };
  static const int legacy_irqs[]  = { 14, 15, 11, 10, 8, 12 };
  #endif
20df429dd   Borislav Petkov   ide-generic: hand...
48
49
  static void ide_generic_check_pci_legacy_iobases(int *primary, int *secondary)
  {
4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
50
  #ifdef CONFIG_PCI
20df429dd   Borislav Petkov   ide-generic: hand...
51
52
53
54
  	struct pci_dev *p = NULL;
  	u16 val;
  
  	for_each_pci_dev(p) {
20df429dd   Borislav Petkov   ide-generic: hand...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  		if (pci_resource_start(p, 0) == 0x1f0)
  			*primary = 1;
  		if (pci_resource_start(p, 2) == 0x170)
  			*secondary = 1;
  
  		/* Cyrix CS55{1,2}0 pre SFF MWDMA ATA on the bridge */
  		if (p->vendor == PCI_VENDOR_ID_CYRIX &&
  		    (p->device == PCI_DEVICE_ID_CYRIX_5510 ||
  		     p->device == PCI_DEVICE_ID_CYRIX_5520))
  			*primary = *secondary = 1;
  
  		/* Intel MPIIX - PIO ATA on non PCI side of bridge */
  		if (p->vendor == PCI_VENDOR_ID_INTEL &&
  		    p->device == PCI_DEVICE_ID_INTEL_82371MX) {
20df429dd   Borislav Petkov   ide-generic: hand...
69
70
71
72
73
74
75
76
77
78
  			pci_read_config_word(p, 0x6C, &val);
  			if (val & 0x8000) {
  				/* ATA port enabled */
  				if (val & 0x4000)
  					*secondary = 1;
  				else
  					*primary = 1;
  			}
  		}
  	}
4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
79
  #endif
20df429dd   Borislav Petkov   ide-generic: hand...
80
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
82
  static int __init ide_generic_init(void)
  {
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
83
  	struct ide_hw hw, *hws[] = { &hw };
8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
84
  	unsigned long io_addr;
6ccc6d7ec   Bartlomiej Zolnierkiewicz   ide-generic: no n...
85
  	int i, rc = 0, primary = 0, secondary = 0;
151575e46   Bartlomiej Zolnierkiewicz   ide: remove idepr...
86

20df429dd   Borislav Petkov   ide-generic: hand...
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  	ide_generic_check_pci_legacy_iobases(&primary, &secondary);
  
  	if (!probe_mask) {
  		printk(KERN_INFO DRV_NAME ": please use \"probe_mask=0x3f\" "
  		     "module parameter for probing all legacy ISA IDE ports
  ");
  
  		if (primary == 0)
  			probe_mask |= 0x1;
  
  		if (secondary == 0)
  			probe_mask |= 0x2;
  	} else
  		printk(KERN_INFO DRV_NAME ": enforcing probing of I/O ports "
  			"upon user request
  ");
0cbccbc30   Bartlomiej Zolnierkiewicz   ide-generic: don'...
103

f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
104
105
  	for (i = 0; i < ARRAY_SIZE(legacy_bases); i++) {
  		io_addr = legacy_bases[i];
486c92e29   Bartlomiej Zolnierkiewicz   ide: move default...
106

0cbccbc30   Bartlomiej Zolnierkiewicz   ide-generic: don'...
107
  		if ((probe_mask & (1 << i)) && io_addr) {
166494984   Bartlomiej Zolnierkiewicz   ide-generic: mana...
108
109
110
111
112
  			if (!request_region(io_addr, 8, DRV_NAME)) {
  				printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX "
  						"not free.
  ",
  						DRV_NAME, io_addr, io_addr + 7);
4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
113
  				rc = -EBUSY;
166494984   Bartlomiej Zolnierkiewicz   ide-generic: mana...
114
115
116
117
118
119
120
121
122
  				continue;
  			}
  
  			if (!request_region(io_addr + 0x206, 1, DRV_NAME)) {
  				printk(KERN_ERR "%s: I/O resource 0x%lX "
  						"not free.
  ",
  						DRV_NAME, io_addr + 0x206);
  				release_region(io_addr, 8);
4465461ec   Bartlomiej Zolnierkiewicz   ide: merge ide_ar...
123
  				rc = -EBUSY;
166494984   Bartlomiej Zolnierkiewicz   ide-generic: mana...
124
125
  				continue;
  			}
6ccc6d7ec   Bartlomiej Zolnierkiewicz   ide-generic: no n...
126
127
  			memset(&hw, 0, sizeof(hw));
  			ide_std_init_ports(&hw, io_addr, io_addr + 0x206);
f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
128
  #ifdef CONFIG_IA64
6ccc6d7ec   Bartlomiej Zolnierkiewicz   ide-generic: no n...
129
  			hw.irq = isa_irq_to_vector(legacy_irqs[i]);
f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
130
  #else
6ccc6d7ec   Bartlomiej Zolnierkiewicz   ide-generic: no n...
131
  			hw.irq = legacy_irqs[i];
f01d35d87   Bartlomiej Zolnierkiewicz   ide-generic: remo...
132
  #endif
dca398305   Bartlomiej Zolnierkiewicz   ide: pass number ...
133
  			rc = ide_host_add(&ide_generic_port_info, hws, 1, NULL);
6ccc6d7ec   Bartlomiej Zolnierkiewicz   ide-generic: no n...
134
135
136
137
  			if (rc) {
  				release_region(io_addr + 0x206, 1);
  				release_region(io_addr, 8);
  			}
166494984   Bartlomiej Zolnierkiewicz   ide-generic: mana...
138
  		}
b2a53bc63   Bartlomiej Zolnierkiewicz   ide-generic: prob...
139
  	}
151575e46   Bartlomiej Zolnierkiewicz   ide: remove idepr...
140

8a69580e1   Bartlomiej Zolnierkiewicz   ide: add ide_host...
141
  	return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
144
145
146
  }
  
  module_init(ide_generic_init);
  
  MODULE_LICENSE("GPL");