6b13f685e
김민수
BSP 최초 추가
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/blkdev.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/module.h>
#include <asm/macintosh.h>
#include <asm/macints.h>
#include <asm/mac_baboon.h>
#define IDE_BASE 0x50F1A000 /* Base address of IDE controller */
#define IDE_CONTROL 0x38 /* control/altstatus */
#define IDE_IFR 0x101 /* (0x101) IDE interrupt flags on Quadra:
*
* Bit 0+1: some interrupt flags
* Bit 2+3: some interrupt enable
* Bit 4: ??
* Bit 5: IDE interrupt flag (any hwif)
* Bit 6: maybe IDE interrupt enable (any hwif) ??
* Bit 7: Any interrupt condition
*/
volatile unsigned char *ide_ifr = (unsigned char *) (IDE_BASE + IDE_IFR);
int macide_test_irq(ide_hwif_t *hwif)
{
if (*ide_ifr & 0x20)
return 1;
return 0;
}
static void macide_clear_irq(ide_drive_t *drive)
{
*ide_ifr &= ~0x20;
}
static void __init macide_setup_ports(struct ide_hw *hw, unsigned long base,
int irq)
{
int i;
memset(hw, 0, sizeof(*hw));
for (i = 0; i < 8; i++)
hw->io_ports_array[i] = base + i * 4;
hw->io_ports.ctl_addr = base + IDE_CONTROL;
hw->irq = irq;
}
static const struct ide_port_ops macide_port_ops = {
.clear_irq = macide_clear_irq,
.test_irq = macide_test_irq,
};
static const struct ide_port_info macide_port_info = {
.port_ops = &macide_port_ops,
.host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
.irq_flags = IRQF_SHARED,
.chipset = ide_generic,
};
static const char *mac_ide_name[] =
{ "Quadra", "Powerbook", "Powerbook Baboon" };
static int __init macide_init(void)
{
unsigned long base;
int irq;
struct ide_hw hw, *hws[] = { &hw };
struct ide_port_info d = macide_port_info;
if (!MACH_IS_MAC)
return -ENODEV;
switch (macintosh_config->ide_type) {
case MAC_IDE_QUADRA:
base = IDE_BASE;
irq = IRQ_NUBUS_F;
break;
case MAC_IDE_PB:
base = IDE_BASE;
irq = IRQ_NUBUS_C;
break;
case MAC_IDE_BABOON:
base = BABOON_BASE;
d.port_ops = NULL;
irq = IRQ_BABOON_1;
break;
default:
return -ENODEV;
}
printk(KERN_INFO "ide: Macintosh %s IDE controller
",
mac_ide_name[macintosh_config->ide_type - 1]);
macide_setup_ports(&hw, base, irq);
return ide_host_add(&d, hws, 1, NULL);
}
module_init(macide_init);
MODULE_LICENSE("GPL");
|