Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/arm/include/asm/floppy.h
17384 views
1
/*
2
* arch/arm/include/asm/floppy.h
3
*
4
* Copyright (C) 1996-2000 Russell King
5
*
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License version 2 as
8
* published by the Free Software Foundation.
9
*
10
* Note that we don't touch FLOPPY_DMA nor FLOPPY_IRQ here
11
*/
12
#ifndef __ASM_ARM_FLOPPY_H
13
#define __ASM_ARM_FLOPPY_H
14
#if 0
15
#include <mach/floppy.h>
16
#endif
17
18
#define fd_outb(val,port) \
19
do { \
20
if ((port) == FD_DOR) \
21
fd_setdor((val)); \
22
else \
23
outb((val),(port)); \
24
} while(0)
25
26
#define fd_inb(port) inb((port))
27
#define fd_request_irq() request_irq(IRQ_FLOPPYDISK,floppy_interrupt,\
28
IRQF_DISABLED,"floppy",NULL)
29
#define fd_free_irq() free_irq(IRQ_FLOPPYDISK,NULL)
30
#define fd_disable_irq() disable_irq(IRQ_FLOPPYDISK)
31
#define fd_enable_irq() enable_irq(IRQ_FLOPPYDISK)
32
33
static inline int fd_dma_setup(void *data, unsigned int length,
34
unsigned int mode, unsigned long addr)
35
{
36
set_dma_mode(DMA_FLOPPY, mode);
37
__set_dma_addr(DMA_FLOPPY, data);
38
set_dma_count(DMA_FLOPPY, length);
39
virtual_dma_port = addr;
40
enable_dma(DMA_FLOPPY);
41
return 0;
42
}
43
#define fd_dma_setup fd_dma_setup
44
45
#define fd_request_dma() request_dma(DMA_FLOPPY,"floppy")
46
#define fd_free_dma() free_dma(DMA_FLOPPY)
47
#define fd_disable_dma() disable_dma(DMA_FLOPPY)
48
49
/* need to clean up dma.h */
50
#define DMA_FLOPPYDISK DMA_FLOPPY
51
52
/* Floppy_selects is the list of DOR's to select drive fd
53
*
54
* On initialisation, the floppy list is scanned, and the drives allocated
55
* in the order that they are found. This is done by seeking the drive
56
* to a non-zero track, and then restoring it to track 0. If an error occurs,
57
* then there is no floppy drive present. [to be put back in again]
58
*/
59
static unsigned char floppy_selects[2][4] =
60
{
61
{ 0x10, 0x21, 0x23, 0x33 },
62
{ 0x10, 0x21, 0x23, 0x33 }
63
};
64
65
#define fd_setdor(dor) \
66
do { \
67
int new_dor = (dor); \
68
if (new_dor & 0xf0) \
69
new_dor = (new_dor & 0x0c) | floppy_selects[fdc][new_dor & 3]; \
70
else \
71
new_dor &= 0x0c; \
72
outb(new_dor, FD_DOR); \
73
} while (0)
74
75
/*
76
* Someday, we'll automatically detect which drives are present...
77
*/
78
static inline void fd_scandrives (void)
79
{
80
#if 0
81
int floppy, drive_count;
82
83
fd_disable_irq();
84
raw_cmd = &default_raw_cmd;
85
raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_SEEK;
86
raw_cmd->track = 0;
87
raw_cmd->rate = ?;
88
drive_count = 0;
89
for (floppy = 0; floppy < 4; floppy ++) {
90
current_drive = drive_count;
91
/*
92
* Turn on floppy motor
93
*/
94
if (start_motor(redo_fd_request))
95
continue;
96
/*
97
* Set up FDC
98
*/
99
fdc_specify();
100
/*
101
* Tell FDC to recalibrate
102
*/
103
output_byte(FD_RECALIBRATE);
104
LAST_OUT(UNIT(floppy));
105
/* wait for command to complete */
106
if (!successful) {
107
int i;
108
for (i = drive_count; i < 3; i--)
109
floppy_selects[fdc][i] = floppy_selects[fdc][i + 1];
110
floppy_selects[fdc][3] = 0;
111
floppy -= 1;
112
} else
113
drive_count++;
114
}
115
#else
116
floppy_selects[0][0] = 0x10;
117
floppy_selects[0][1] = 0x21;
118
floppy_selects[0][2] = 0x23;
119
floppy_selects[0][3] = 0x33;
120
#endif
121
}
122
123
#define FDC1 (0x3f0)
124
125
#define FLOPPY0_TYPE 4
126
#define FLOPPY1_TYPE 4
127
128
#define N_FDC 1
129
#define N_DRIVE 4
130
131
#define CROSS_64KB(a,s) (0)
132
133
/*
134
* This allows people to reverse the order of
135
* fd0 and fd1, in case their hardware is
136
* strangely connected (as some RiscPCs
137
* and A5000s seem to be).
138
*/
139
static void driveswap(int *ints, int dummy, int dummy2)
140
{
141
floppy_selects[0][0] ^= floppy_selects[0][1];
142
floppy_selects[0][1] ^= floppy_selects[0][0];
143
floppy_selects[0][0] ^= floppy_selects[0][1];
144
}
145
146
#define EXTRA_FLOPPY_PARAMS ,{ "driveswap", &driveswap, NULL, 0, 0 }
147
148
#endif
149
150