linux/arch/arm/include/asm/floppy.h
<<
>>
Prefs
   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
  33static 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 */
  59static unsigned char floppy_selects[2][4] =
  60{
  61        { 0x10, 0x21, 0x23, 0x33 },
  62        { 0x10, 0x21, 0x23, 0x33 }
  63};
  64
  65#define fd_setdor(dor)                                                          \
  66do {                                                                            \
  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 */
  78static 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 */
 139static 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