This source file includes following definitions.
- sun_82072_fd_inb
- sun_82072_fd_outb
- sun_82077_fd_inb
- sun_82077_fd_outb
- virtual_dma_init
- sun_fd_disable_dma
- sun_fd_set_dma_mode
- sun_fd_set_dma_addr
- sun_fd_set_dma_count
- sun_fd_enable_dma
- sun_fd_request_irq
- sun_floppy_init
1
2
3
4
5
6 #ifndef __ASM_SPARC_FLOPPY_H
7 #define __ASM_SPARC_FLOPPY_H
8
9 #include <asm/page.h>
10 #include <asm/pgtable.h>
11 #include <asm/system.h>
12 #include <asm/idprom.h>
13 #include <asm/machines.h>
14 #include <asm/oplib.h>
15 #include <asm/auxio.h>
16 #include <asm/irq.h>
17
18
19
20
21
22
23 struct sun_flpy_controller {
24 volatile unsigned char status_82072;
25 #define dcr_82072 status_82072
26 #define status1_82077 status_82072
27
28 volatile unsigned char data_82072;
29 #define status2_82077 data_82072
30
31 volatile unsigned char dor_82077;
32 volatile unsigned char tapectl_82077;
33
34 volatile unsigned char status_82077;
35 #define drs_82077 status_82077
36
37 volatile unsigned char data_82077;
38 volatile unsigned char ___unused;
39 volatile unsigned char dir_82077;
40 #define dcr_82077 dir_82077
41 };
42
43
44 static struct sun_flpy_controller *sun_fdc = NULL;
45 volatile unsigned char *fdc_status;
46
47 struct sun_floppy_ops {
48 unsigned char (*fd_inb)(int port);
49 void (*fd_outb)(unsigned char value, int port);
50 };
51
52 static struct sun_floppy_ops sun_fdops;
53
54 #define fd_inb(port) sun_fdops.fd_inb(port)
55 #define fd_outb(value,port) sun_fdops.fd_outb(value,port)
56 #define fd_enable_dma() sun_fd_enable_dma()
57 #define fd_disable_dma() sun_fd_disable_dma()
58 #define fd_request_dma() (0)
59 #define fd_free_dma()
60 #define fd_clear_dma_ff()
61 #define fd_set_dma_mode(mode) sun_fd_set_dma_mode(mode)
62 #define fd_set_dma_addr(addr) sun_fd_set_dma_addr(addr)
63 #define fd_set_dma_count(count) sun_fd_set_dma_count(count)
64 #define fd_enable_irq()
65 #define fd_disable_irq()
66 #define fd_cacheflush(addr, size)
67 #define fd_request_irq() sun_fd_request_irq()
68 #define fd_free_irq()
69
70
71 #define virt_to_bus(x) (x)
72 #define bus_to_virt(x) (x)
73
74
75 #define get_dma_residue(x) (0)
76
77 #define FLOPPY0_TYPE 4
78 #define FLOPPY1_TYPE 0
79
80
81 #undef HAVE_DISABLE_HLT
82
83
84
85
86
87 #define FDC1 sun_floppy_init()
88
89 static int FDC2=-1;
90
91 #define N_FDC 1
92 #define N_DRIVE 8
93
94
95 #define CROSS_64KB(a,s) (0)
96
97
98 static unsigned char sun_82072_fd_inb(int port)
99 {
100 switch(port & 7) {
101 default:
102 printk("floppy: Asked to read unknown port %d\n", port);
103 panic("floppy: Port bolixed.");
104 case 4:
105 return sun_fdc->status_82072 & ~STATUS_DMA;
106 case 5:
107 return sun_fdc->data_82072;
108 case 7:
109
110
111
112 return 0;
113 };
114 panic("sun_82072_fd_inb: How did I get here?");
115 }
116
117 static void sun_82072_fd_outb(unsigned char value, int port)
118 {
119 switch(port & 7) {
120 default:
121 printk("floppy: Asked to write to unknown port %d\n", port);
122 panic("floppy: Port bolixed.");
123 case 2:
124
125
126
127
128
129
130
131
132 #if 0
133 if(value & 0xf0)
134 #else
135 if(value & 0x10)
136 #endif
137 set_auxio(AUXIO_FLPY_DSEL, 0);
138 else
139 set_auxio(0, AUXIO_FLPY_DSEL);
140 break;
141 case 5:
142 sun_fdc->data_82072 = value;
143 break;
144 case 7:
145 sun_fdc->dcr_82072 = value;
146 break;
147 case 4:
148 sun_fdc->status_82072 = value;
149 break;
150 };
151 return;
152 }
153
154 static unsigned char sun_82077_fd_inb(int port)
155 {
156 switch(port & 7) {
157 default:
158 printk("floppy: Asked to read unknown port %d\n", port);
159 panic("floppy: Port bolixed.");
160 case 4:
161 return sun_fdc->status_82077 & ~STATUS_DMA;
162 case 5:
163 return sun_fdc->data_82077;
164 case 7:
165
166
167
168 return 0;
169 };
170 panic("sun_82072_fd_inb: How did I get here?");
171 }
172
173 static void sun_82077_fd_outb(unsigned char value, int port)
174 {
175 switch(port & 7) {
176 default:
177 printk("floppy: Asked to write to unknown port %d\n", port);
178 panic("floppy: Port bolixed.");
179 case 2:
180
181 sun_fdc->dor_82077 = value;
182 break;
183 case 5:
184 sun_fdc->data_82077 = value;
185 break;
186 case 7:
187 sun_fdc->dcr_82077 = value;
188 break;
189 case 4:
190 sun_fdc->status_82077 = value;
191 break;
192 };
193 return;
194 }
195
196
197
198
199
200
201
202
203
204
205
206 char *pdma_vaddr;
207 unsigned long pdma_size;
208 int doing_pdma = 0;
209
210
211 static inline void virtual_dma_init(void)
212 {
213
214 }
215
216 static inline void sun_fd_disable_dma(void)
217 {
218 doing_pdma = 0;
219 }
220
221 static inline void sun_fd_set_dma_mode(int mode)
222 {
223 switch(mode) {
224 case DMA_MODE_READ:
225 doing_pdma = 1;
226 break;
227 case DMA_MODE_WRITE:
228 doing_pdma = 2;
229 break;
230 default:
231 printk("Unknown dma mode %d\n", mode);
232 panic("floppy: Giving up...");
233 }
234 }
235
236 static inline void sun_fd_set_dma_addr(char *buffer)
237 {
238 pdma_vaddr = buffer;
239 }
240
241 static inline void sun_fd_set_dma_count(int length)
242 {
243 pdma_size = length;
244 }
245
246 static inline void sun_fd_enable_dma(void)
247 {
248
249 pdma_vaddr = mmu_lockarea(pdma_vaddr, pdma_size);
250 }
251
252
253 extern void floppy_hardint(int irq, struct pt_regs *regs);
254
255 static int sun_fd_request_irq(void)
256 {
257 static int once = 0;
258 int error;
259
260 if(!once) {
261 once = 1;
262 error = request_fast_irq(FLOPPY_IRQ, floppy_hardint, SA_INTERRUPT, "floppy");
263 return ((error == 0) ? 0 : -1);
264 } else return 0;
265 }
266
267 static struct linux_prom_registers fd_regs[2];
268
269 static int sun_floppy_init(void)
270 {
271 char state[128];
272 int tnode, fd_node, num_regs;
273
274 FLOPPY_IRQ = 11;
275
276
277
278 if((sparc_cpu_model != sun4c && sparc_cpu_model != sun4m) ||
279 ((idprom->id_machtype == (SM_SUN4C | SM_4C_SLC)) ||
280 (idprom->id_machtype == (SM_SUN4C | SM_4C_ELC)))) {
281
282 goto no_sun_fdc;
283 }
284
285 tnode = prom_getchild(prom_root_node);
286 fd_node = prom_searchsiblings(tnode, "obio");
287 if(fd_node != 0) {
288 tnode = prom_getchild(fd_node);
289 fd_node = prom_searchsiblings(tnode, "SUNW,fdtwo");
290 } else {
291 fd_node = prom_searchsiblings(tnode, "fd");
292 }
293 if(fd_node == 0) {
294 goto no_sun_fdc;
295 }
296
297
298 if(sparc_cpu_model == sun4m) {
299 prom_getproperty(fd_node, "status", state, sizeof(state));
300 if(!strcmp(state, "disabled")) {
301 goto no_sun_fdc;
302 }
303 }
304 num_regs = prom_getproperty(fd_node, "reg", (char *) fd_regs, sizeof(fd_regs));
305 num_regs = (num_regs / sizeof(fd_regs[0]));
306 prom_apply_obio_ranges(fd_regs, num_regs);
307 sun_fdc = (struct sun_flpy_controller *) sparc_alloc_io(fd_regs[0].phys_addr,
308 0x0,
309 fd_regs[0].reg_size,
310 "floppy",
311 fd_regs[0].which_io,
312 0x0);
313
314 if(sun_fdc->status_82072 == 0xff) {
315 sun_fdc = NULL;
316 goto no_sun_fdc;
317 }
318
319
320
321
322
323 sun_fdops.fd_inb = sun_82077_fd_inb;
324 sun_fdops.fd_outb = sun_82077_fd_outb;
325 fdc_status = &sun_fdc->status_82077;
326
327
328
329
330
331 if(sun_fdc->dor_82077 == 0x80) {
332 sun_fdc->dor_82077 = 2;
333 if(sun_fdc->dor_82077 == 0x80) {
334
335 sun_fdops.fd_inb = sun_82072_fd_inb;
336 sun_fdops.fd_outb = sun_82072_fd_outb;
337 fdc_status = &sun_fdc->status_82072;
338 }
339 }
340
341
342
343
344 set_auxio(AUXIO_FLPY_EJCT, 0);
345 udelay(1000);
346 set_auxio(AUXIO_FLPY_DSEL, AUXIO_FLPY_EJCT);
347 udelay(1000);
348 set_auxio(0, AUXIO_FLPY_DSEL);
349
350
351 return (int) sun_fdc;
352
353 no_sun_fdc:
354 return -1;
355 }
356
357 #endif