File: /usr/src/linux/arch/mips/lib/floppy-std.c
1 /* $Id: floppy-std.c,v 1.2 1999/01/04 16:03:51 ralf Exp $
2 *
3 * This file is subject to the terms and conditions of the GNU General Public
4 * License. See the file "COPYING" in the main directory of this archive
5 * for more details.
6 *
7 * Access the floppy hardware on PC style hardware
8 *
9 * Copyright (C) 1996, 1997, 1998 by Ralf Baechle
10 */
11 #include <linux/delay.h>
12 #include <linux/init.h>
13 #include <linux/ioport.h>
14 #include <linux/sched.h>
15 #include <linux/kernel.h>
16 #include <linux/linkage.h>
17 #include <linux/types.h>
18 #include <linux/mm.h>
19 #include <asm/bootinfo.h>
20 #include <asm/cachectl.h>
21 #include <asm/dma.h>
22 #include <asm/floppy.h>
23 #include <asm/keyboard.h>
24 #include <asm/io.h>
25 #include <asm/irq.h>
26 #include <asm/mc146818rtc.h>
27 #include <asm/pgtable.h>
28
29 /*
30 * How to access the FDC's registers.
31 */
32 static unsigned char std_fd_inb(unsigned int port)
33 {
34 return inb_p(port);
35 }
36
37 static void std_fd_outb(unsigned char value, unsigned int port)
38 {
39 outb_p(value, port);
40 }
41
42 /*
43 * How to access the floppy DMA functions.
44 */
45 static void std_fd_enable_dma(int channel)
46 {
47 enable_dma(channel);
48 }
49
50 static void std_fd_disable_dma(int channel)
51 {
52 disable_dma(channel);
53 }
54
55 static int std_fd_request_dma(int channel)
56 {
57 return request_dma(channel, "floppy");
58 }
59
60 static void std_fd_free_dma(int channel)
61 {
62 free_dma(channel);
63 }
64
65 static void std_fd_clear_dma_ff(int channel)
66 {
67 clear_dma_ff(channel);
68 }
69
70 static void std_fd_set_dma_mode(int channel, char mode)
71 {
72 set_dma_mode(channel, mode);
73 }
74
75 static void std_fd_set_dma_addr(int channel, unsigned int addr)
76 {
77 set_dma_addr(channel, addr);
78 }
79
80 static void std_fd_set_dma_count(int channel, unsigned int count)
81 {
82 set_dma_count(channel, count);
83 }
84
85 static int std_fd_get_dma_residue(int channel)
86 {
87 return get_dma_residue(channel);
88 }
89
90 static void std_fd_enable_irq(int irq)
91 {
92 enable_irq(irq);
93 }
94
95 static void std_fd_disable_irq(int irq)
96 {
97 disable_irq(irq);
98 }
99
100 static unsigned long std_fd_getfdaddr1(void)
101 {
102 return 0x3f0;
103 }
104
105 static unsigned long std_fd_dma_mem_alloc(unsigned long size)
106 {
107 unsigned long mem;
108
109 mem = __get_dma_pages(GFP_KERNEL,get_order(size));
110
111 return mem;
112 }
113
114 static void std_fd_dma_mem_free(unsigned long addr, unsigned long size)
115 {
116 free_pages(addr, get_order(size));
117 }
118
119 static unsigned long std_fd_drive_type(unsigned long n)
120 {
121 if (n == 0)
122 return 4; /* 3,5", 1.44mb */
123
124 return 0;
125 }
126
127 struct fd_ops std_fd_ops = {
128 /*
129 * How to access the floppy controller's ports
130 */
131 std_fd_inb,
132 std_fd_outb,
133 /*
134 * How to access the floppy DMA functions.
135 */
136 std_fd_enable_dma,
137 std_fd_disable_dma,
138 std_fd_request_dma,
139 std_fd_free_dma,
140 std_fd_clear_dma_ff,
141 std_fd_set_dma_mode,
142 std_fd_set_dma_addr,
143 std_fd_set_dma_count,
144 std_fd_get_dma_residue,
145 std_fd_enable_irq,
146 std_fd_disable_irq,
147 std_fd_getfdaddr1,
148 std_fd_dma_mem_alloc,
149 std_fd_dma_mem_free,
150 std_fd_drive_type
151 };
152