fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / scsi / arm / arxescsi.c
index cd5a63c..4385e9e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/arch/arm/drivers/scsi/arxescsi.c
+ * linux/drivers/scsi/arm/arxescsi.c
  *
  * Copyright (C) 1997-2000 Russell King, Stefan Hanske
  *
@@ -33,7 +33,6 @@
 
 #include <asm/dma.h>
 #include <asm/io.h>
-#include <asm/irq.h>
 #include <asm/ecard.h>
 
 #include "../scsi.h"
@@ -43,6 +42,7 @@
 struct arxescsi_info {
        FAS216_Info             info;
        struct expansion_card   *ec;
+       void __iomem            *base;
 };
 
 #define DMADATA_OFFSET (0x200)
@@ -64,7 +64,7 @@ struct arxescsi_info {
  * Returns : 0 if we should not set CMD_WITHDMA for transfer info command
  */
 static fasdmatype_t
-arxescsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
+arxescsi_dma_setup(struct Scsi_Host *host, struct scsi_pointer *SCp,
                       fasdmadir_t direction, fasdmatype_t min_type)
 {
        /*
@@ -73,7 +73,7 @@ arxescsi_dma_setup(struct Scsi_Host *host, Scsi_Pointer *SCp,
        return fasdma_pseudo;
 }
 
-static void arxescsi_pseudo_dma_write(unsigned char *addr, unsigned char *base)
+static void arxescsi_pseudo_dma_write(unsigned char *addr, void __iomem *base)
 {
        __asm__ __volatile__(
        "               stmdb   sp!, {r0-r12}\n"
@@ -110,12 +110,12 @@ static void arxescsi_pseudo_dma_write(unsigned char *addr, unsigned char *base)
  *          transfer  - minimum number of bytes we expect to transfer
  */
 static void
-arxescsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
+arxescsi_dma_pseudo(struct Scsi_Host *host, struct scsi_pointer *SCp,
                    fasdmadir_t direction, int transfer)
 {
        struct arxescsi_info *info = (struct arxescsi_info *)host->hostdata;
        unsigned int length, error = 0;
-       unsigned char *base = info->info.scsi.io_base;
+       void __iomem *base = info->info.scsi.io_base;
        unsigned char *addr;
 
        length = SCp->this_residual;
@@ -196,7 +196,7 @@ arxescsi_dma_pseudo(struct Scsi_Host *host, Scsi_Pointer *SCp,
  * Params  : host  - host
  *          SCpnt - command
  */
-static void arxescsi_dma_stop(struct Scsi_Host *host, Scsi_Pointer *SCp)
+static void arxescsi_dma_stop(struct Scsi_Host *host, struct scsi_pointer *SCp)
 {
        /*
         * no DMA to stop
@@ -260,7 +260,7 @@ arxescsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t off
        return pos;
 }
 
-static Scsi_Host_Template arxescsi_template = {
+static struct scsi_host_template arxescsi_template = {
        .proc_info                      = arxescsi_proc_info,
        .name                           = "ARXE SCSI card",
        .info                           = arxescsi_info,
@@ -283,17 +283,15 @@ arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
        struct Scsi_Host *host;
        struct arxescsi_info *info;
        unsigned long resbase, reslen;
-       unsigned char *base;
+       void __iomem *base;
        int ret;
 
-       resbase = ecard_resource_start(ec, ECARD_RES_MEMC);
-       reslen = ecard_resource_len(ec, ECARD_RES_MEMC);
-
-       if (!request_mem_region(resbase, reslen, "arxescsi")) {
-               ret = -EBUSY;
+       ret = ecard_request_resources(ec);
+       if (ret)
                goto out;
-       }
 
+       resbase = ecard_resource_start(ec, ECARD_RES_MEMC);
+       reslen = ecard_resource_len(ec, ECARD_RES_MEMC);
        base = ioremap(resbase, reslen);
        if (!base) {
                ret = -ENOMEM;
@@ -306,15 +304,13 @@ arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
                goto out_unmap;
        }
 
-       host->base = (unsigned long)base;
-       host->irq = NO_IRQ;
-       host->dma_channel = NO_DMA;
-
        info = (struct arxescsi_info *)host->hostdata;
        info->ec = ec;
+       info->base = base;
 
        info->info.scsi.io_base         = base + 0x2000;
-       info->info.scsi.irq             = host->irq;
+       info->info.scsi.irq             = NO_IRQ;
+       info->info.scsi.dma             = NO_DMA;
        info->info.scsi.io_shift        = 5;
        info->info.ifcfg.clockrate      = 24; /* MHz */
        info->info.ifcfg.select_timeout = 255;
@@ -345,7 +341,7 @@ arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
  out_unmap:
        iounmap(base);
  out_region:
-       release_mem_region(resbase, reslen);
+       ecard_release_resources(ec);
  out:
        return ret;
 }
@@ -353,20 +349,16 @@ arxescsi_probe(struct expansion_card *ec, const struct ecard_id *id)
 static void __devexit arxescsi_remove(struct expansion_card *ec)
 {
        struct Scsi_Host *host = ecard_get_drvdata(ec);
-       unsigned long resbase, reslen;
+       struct arxescsi_info *info = (struct arxescsi_info *)host->hostdata;
 
        ecard_set_drvdata(ec, NULL);
        fas216_remove(host);
 
-       iounmap((void *)host->base);
-
-       resbase = ecard_resource_start(ec, ECARD_RES_MEMC);
-       reslen = ecard_resource_len(ec, ECARD_RES_MEMC);
-
-       release_mem_region(resbase, reslen);
+       iounmap(info->base);
 
        fas216_release(host);
        scsi_host_put(host);
+       ecard_release_resources(ec);
 }
 
 static const struct ecard_id arxescsi_cids[] = {