1 /*
2 * linux/include/asm-sh/ide.h
3 *
4 * Copyright (C) 1994-1996 Linus Torvalds & authors
5 */
6
7 /*
8 * This file contains the i386 architecture specific IDE code.
9 * In future, SuperH code.
10 */
11
12 #ifndef __ASM_SH_IDE_H
13 #define __ASM_SH_IDE_H
14
15 #ifdef __KERNEL__
16
17 #include <linux/config.h>
18 #include <asm-generic/ide_iops.h>
19 #include <asm/machvec.h>
20
21 #ifndef MAX_HWIFS
22 /* Should never have fewer than 2, ide-pci.c(ide_match_hwif) requires it */
23 #define MAX_HWIFS 4
24 #endif
25
ide_default_irq_hs7729pci(ide_ioreg_t base)26 static __inline__ int ide_default_irq_hs7729pci(ide_ioreg_t base)
27 {
28 switch (base) {
29 case 0x01f0: return 9;
30 case 0x0170: return 14;
31 default:
32 return 0;
33 }
34 }
35
ide_default_irq_hp600(ide_ioreg_t base)36 static __inline__ int ide_default_irq_hp600(ide_ioreg_t base)
37 {
38 switch (base) {
39 case 0x01f0: return 93;
40 case 0x0170: return 94;
41 default:
42 return 0;
43 }
44 }
45
ide_default_irq(ide_ioreg_t base)46 static __inline__ int ide_default_irq(ide_ioreg_t base)
47 {
48 if (MACH_HP600) {
49 return ide_default_irq_hp600(base);
50 }
51 if (MACH_HS7729PCI) {
52 return ide_default_irq_hs7729pci(base);
53 }
54 switch (base) {
55 case 0x01f0: return 14;
56 case 0x0170: return 15;
57 default:
58 return 0;
59 }
60 }
61
ide_default_io_base_hp600(int index)62 static __inline__ ide_ioreg_t ide_default_io_base_hp600(int index)
63 {
64 switch (index) {
65 case 0:
66 return 0x01f0;
67 case 1:
68 return 0x0170;
69 default:
70 return 0;
71 }
72 }
73
ide_default_io_base(int index)74 static __inline__ ide_ioreg_t ide_default_io_base(int index)
75 {
76 if (MACH_HP600) {
77 return ide_default_io_base_hp600(index);
78 }
79 switch (index) {
80 case 0:
81 return 0x1f0;
82 case 1:
83 return 0x170;
84 default:
85 return 0;
86 }
87 }
88
ide_init_hwif_ports(hw_regs_t * hw,ide_ioreg_t data_port,ide_ioreg_t ctrl_port,int * irq)89 static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
90 {
91 ide_ioreg_t reg = data_port;
92 int i;
93
94 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
95 hw->io_ports[i] = reg;
96 reg += 1;
97 }
98 if (ctrl_port) {
99 hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
100 } else {
101 hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
102 }
103 if (irq != NULL)
104 *irq = 0;
105 hw->io_ports[IDE_IRQ_OFFSET] = 0;
106 }
107
ide_init_default_hwifs(void)108 static __inline__ void ide_init_default_hwifs(void)
109 {
110 #ifndef CONFIG_BLK_DEV_IDEPCI
111 hw_regs_t hw;
112 int index;
113
114 for(index = 0; index < MAX_HWIFS; index++) {
115 memset(&hw, 0, sizeof hw);
116 ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
117 hw.irq = ide_default_irq(ide_default_io_base(index));
118 ide_register_hw(&hw, NULL);
119 }
120 #endif /* CONFIG_BLK_DEV_IDEPCI */
121 }
122
123 #endif /* __KERNEL__ */
124
125 #endif /* __ASM_SH_IDE_H */
126