This source file includes following definitions.
- sub22
- dtc2278_set_pio_mode
- dtc2278_probe
- dtc2278_init
1
2
3
4
5
6 #include <linux/module.h>
7 #include <linux/types.h>
8 #include <linux/kernel.h>
9 #include <linux/delay.h>
10 #include <linux/timer.h>
11 #include <linux/mm.h>
12 #include <linux/ioport.h>
13 #include <linux/blkdev.h>
14 #include <linux/ide.h>
15 #include <linux/init.h>
16
17 #include <asm/io.h>
18
19 #define DRV_NAME "dtc2278"
20
21
22
23
24 #undef ALWAYS_SET_DTC2278_PIO_MODE
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 static void sub22 (char b, char c)
53 {
54 int i;
55
56 for(i = 0; i < 3; ++i) {
57 inb(0x3f6);
58 outb_p(b,0xb0);
59 inb(0x3f6);
60 outb_p(c,0xb4);
61 inb(0x3f6);
62 if(inb(0xb4) == c) {
63 outb_p(7,0xb0);
64 inb(0x3f6);
65 return;
66 }
67 }
68 }
69
70 static DEFINE_SPINLOCK(dtc2278_lock);
71
72 static void dtc2278_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
73 {
74 unsigned long flags;
75
76 if (drive->pio_mode >= XFER_PIO_3) {
77 spin_lock_irqsave(&dtc2278_lock, flags);
78
79
80
81 sub22(1,0xc3);
82 sub22(0,0xa0);
83 spin_unlock_irqrestore(&dtc2278_lock, flags);
84 } else {
85
86
87
88 }
89 }
90
91 static const struct ide_port_ops dtc2278_port_ops = {
92 .set_pio_mode = dtc2278_set_pio_mode,
93 };
94
95 static const struct ide_port_info dtc2278_port_info __initconst = {
96 .name = DRV_NAME,
97 .chipset = ide_dtc2278,
98 .port_ops = &dtc2278_port_ops,
99 .host_flags = IDE_HFLAG_SERIALIZE |
100 IDE_HFLAG_NO_UNMASK_IRQS |
101 IDE_HFLAG_IO_32BIT |
102
103 IDE_HFLAG_NO_IO_32BIT |
104 IDE_HFLAG_NO_DMA |
105 IDE_HFLAG_DTC2278,
106 .pio_mask = ATA_PIO4,
107 };
108
109 static int __init dtc2278_probe(void)
110 {
111 unsigned long flags;
112
113 local_irq_save(flags);
114
115
116
117 outb_p(4,0xb0);
118 inb(0x3f6);
119 outb_p(0x20,0xb4);
120 inb(0x3f6);
121 #ifdef ALWAYS_SET_DTC2278_PIO_MODE
122
123
124
125
126 sub22(1,0xc3);
127 sub22(0,0xa0);
128 #endif
129 local_irq_restore(flags);
130
131 return ide_legacy_device_add(&dtc2278_port_info, 0);
132 }
133
134 static bool probe_dtc2278;
135
136 module_param_named(probe, probe_dtc2278, bool, 0);
137 MODULE_PARM_DESC(probe, "probe for DTC2278xx chipsets");
138
139 static int __init dtc2278_init(void)
140 {
141 if (probe_dtc2278 == 0)
142 return -ENODEV;
143
144 if (dtc2278_probe()) {
145 printk(KERN_ERR "dtc2278: ide interfaces already in use!\n");
146 return -EBUSY;
147 }
148 return 0;
149 }
150
151 module_init(dtc2278_init);
152
153 MODULE_AUTHOR("See Local File");
154 MODULE_DESCRIPTION("support of DTC-2278 VLB IDE chipsets");
155 MODULE_LICENSE("GPL");