root/drivers/ide/falconide.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. falconide_release_lock
  2. falconide_get_lock
  3. falconide_input_data
  4. falconide_output_data
  5. falconide_setup_ports
  6. falconide_init

   1 /*
   2  *  Atari Falcon IDE Driver
   3  *
   4  *     Created 12 Jul 1997 by Geert Uytterhoeven
   5  *
   6  *  This file is subject to the terms and conditions of the GNU General Public
   7  *  License.  See the file COPYING in the main directory of this archive for
   8  *  more details.
   9  */
  10 
  11 #include <linux/module.h>
  12 #include <linux/types.h>
  13 #include <linux/mm.h>
  14 #include <linux/interrupt.h>
  15 #include <linux/blkdev.h>
  16 #include <linux/ide.h>
  17 #include <linux/init.h>
  18 
  19 #include <asm/setup.h>
  20 #include <asm/atarihw.h>
  21 #include <asm/atariints.h>
  22 #include <asm/atari_stdma.h>
  23 #include <asm/ide.h>
  24 
  25 #define DRV_NAME "falconide"
  26 
  27     /*
  28      *  Base of the IDE interface
  29      */
  30 
  31 #define ATA_HD_BASE     0xfff00000
  32 
  33     /*
  34      *  Offsets from the above base
  35      */
  36 
  37 #define ATA_HD_CONTROL  0x39
  38 
  39     /*
  40      *  falconide_intr_lock is used to obtain access to the IDE interrupt,
  41      *  which is shared between several drivers.
  42      */
  43 
  44 static int falconide_intr_lock;
  45 
  46 static void falconide_release_lock(void)
  47 {
  48         if (falconide_intr_lock == 0) {
  49                 printk(KERN_ERR "%s: bug\n", __func__);
  50                 return;
  51         }
  52         falconide_intr_lock = 0;
  53         stdma_release();
  54 }
  55 
  56 static void falconide_get_lock(irq_handler_t handler, void *data)
  57 {
  58         if (falconide_intr_lock == 0) {
  59                 if (in_interrupt() > 0)
  60                         panic("Falcon IDE hasn't ST-DMA lock in interrupt");
  61                 stdma_lock(handler, data);
  62                 falconide_intr_lock = 1;
  63         }
  64 }
  65 
  66 static void falconide_input_data(ide_drive_t *drive, struct ide_cmd *cmd,
  67                                  void *buf, unsigned int len)
  68 {
  69         unsigned long data_addr = drive->hwif->io_ports.data_addr;
  70 
  71         if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) {
  72                 __ide_mm_insw(data_addr, buf, (len + 1) / 2);
  73                 return;
  74         }
  75 
  76         raw_insw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
  77 }
  78 
  79 static void falconide_output_data(ide_drive_t *drive, struct ide_cmd *cmd,
  80                                   void *buf, unsigned int len)
  81 {
  82         unsigned long data_addr = drive->hwif->io_ports.data_addr;
  83 
  84         if (drive->media == ide_disk && cmd && (cmd->tf_flags & IDE_TFLAG_FS)) {
  85                 __ide_mm_outsw(data_addr, buf, (len + 1) / 2);
  86                 return;
  87         }
  88 
  89         raw_outsw_swapw((u16 *)data_addr, buf, (len + 1) / 2);
  90 }
  91 
  92 /* Atari has a byte-swapped IDE interface */
  93 static const struct ide_tp_ops falconide_tp_ops = {
  94         .exec_command           = ide_exec_command,
  95         .read_status            = ide_read_status,
  96         .read_altstatus         = ide_read_altstatus,
  97         .write_devctl           = ide_write_devctl,
  98 
  99         .dev_select             = ide_dev_select,
 100         .tf_load                = ide_tf_load,
 101         .tf_read                = ide_tf_read,
 102 
 103         .input_data             = falconide_input_data,
 104         .output_data            = falconide_output_data,
 105 };
 106 
 107 static const struct ide_port_info falconide_port_info = {
 108         .get_lock               = falconide_get_lock,
 109         .release_lock           = falconide_release_lock,
 110         .tp_ops                 = &falconide_tp_ops,
 111         .host_flags             = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE |
 112                                   IDE_HFLAG_NO_DMA,
 113         .irq_flags              = IRQF_SHARED,
 114         .chipset                = ide_generic,
 115 };
 116 
 117 static void __init falconide_setup_ports(struct ide_hw *hw)
 118 {
 119         int i;
 120 
 121         memset(hw, 0, sizeof(*hw));
 122 
 123         hw->io_ports.data_addr = ATA_HD_BASE;
 124 
 125         for (i = 1; i < 8; i++)
 126                 hw->io_ports_array[i] = ATA_HD_BASE + 1 + i * 4;
 127 
 128         hw->io_ports.ctl_addr = ATA_HD_BASE + ATA_HD_CONTROL;
 129 
 130         hw->irq = IRQ_MFP_IDE;
 131 }
 132 
 133     /*
 134      *  Probe for a Falcon IDE interface
 135      */
 136 
 137 static int __init falconide_init(void)
 138 {
 139         struct ide_host *host;
 140         struct ide_hw hw, *hws[] = { &hw };
 141         int rc;
 142 
 143         if (!MACH_IS_ATARI || !ATARIHW_PRESENT(IDE))
 144                 return -ENODEV;
 145 
 146         printk(KERN_INFO "ide: Falcon IDE controller\n");
 147 
 148         if (!request_mem_region(ATA_HD_BASE, 0x40, DRV_NAME)) {
 149                 printk(KERN_ERR "%s: resources busy\n", DRV_NAME);
 150                 return -EBUSY;
 151         }
 152 
 153         falconide_setup_ports(&hw);
 154 
 155         host = ide_host_alloc(&falconide_port_info, hws, 1);
 156         if (host == NULL) {
 157                 rc = -ENOMEM;
 158                 goto err;
 159         }
 160 
 161         falconide_get_lock(NULL, NULL);
 162         rc = ide_host_register(host, &falconide_port_info, hws);
 163         falconide_release_lock();
 164 
 165         if (rc)
 166                 goto err_free;
 167 
 168         return 0;
 169 err_free:
 170         ide_host_free(host);
 171 err:
 172         release_mem_region(ATA_HD_BASE, 0x40);
 173         return rc;
 174 }
 175 
 176 module_init(falconide_init);
 177 
 178 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */