[SCSI] lpfc 8.3.25: Adapter Interface fixes and changes
[linux-2.6.git] / drivers / scsi / a4000t.c
index 0c758d1..23c76f4 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/platform_device.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
+#include <linux/slab.h>
 #include <asm/amigahw.h>
 #include <asm/amigaints.h>
 #include <scsi/scsi_host.h>
 
 #include "53c700.h"
 
-MODULE_AUTHOR("Alan Hourihane <alanh@fairlite.demon.co.uk> / Kars de Jong <jongk@linux-m68k.org>");
-MODULE_DESCRIPTION("Amiga A4000T NCR53C710 driver");
-MODULE_LICENSE("GPL");
-
 
 static struct scsi_host_template a4000t_scsi_driver_template = {
        .name           = "A4000T builtin SCSI",
@@ -31,57 +28,61 @@ static struct scsi_host_template a4000t_scsi_driver_template = {
        .module         = THIS_MODULE,
 };
 
-static struct platform_device *a4000t_scsi_device;
 
-#define A4000T_SCSI_ADDR 0xdd0040
+#define A4000T_SCSI_OFFSET     0x40
 
-static int __devinit a4000t_probe(struct device *dev)
+static int __init amiga_a4000t_scsi_probe(struct platform_device *pdev)
 {
-       struct Scsi_Host * host = NULL;
+       struct resource *res;
+       phys_addr_t scsi_addr;
        struct NCR_700_Host_Parameters *hostdata;
+       struct Scsi_Host *host;
 
-       if (!(MACH_IS_AMIGA && AMIGAHW_PRESENT(A4000_SCSI)))
-               goto out;
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res)
+               return -ENODEV;
 
-       if (!request_mem_region(A4000T_SCSI_ADDR, 0x1000,
+       if (!request_mem_region(res->start, resource_size(res),
                                "A4000T builtin SCSI"))
-               goto out;
+               return -EBUSY;
 
-       hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
-       if (hostdata == NULL) {
-               printk(KERN_ERR "a4000t-scsi: Failed to allocate host data\n");
+       hostdata = kzalloc(sizeof(struct NCR_700_Host_Parameters),
+                          GFP_KERNEL);
+       if (!hostdata) {
+               dev_err(&pdev->dev, "Failed to allocate host data\n");
                goto out_release;
        }
-       memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters));
+
+       scsi_addr = res->start + A4000T_SCSI_OFFSET;
 
        /* Fill in the required pieces of hostdata */
-       hostdata->base = (void __iomem *)ZTWO_VADDR(A4000T_SCSI_ADDR);
+       hostdata->base = (void __iomem *)ZTWO_VADDR(scsi_addr);
        hostdata->clock = 50;
        hostdata->chip710 = 1;
        hostdata->dmode_extra = DMODE_FC2;
        hostdata->dcntl_extra = EA_710;
 
        /* and register the chip */
-       host = NCR_700_detect(&a4000t_scsi_driver_template, hostdata, dev);
+       host = NCR_700_detect(&a4000t_scsi_driver_template, hostdata,
+                             &pdev->dev);
        if (!host) {
-               printk(KERN_ERR "a4000t-scsi: No host detected; "
-                               "board configuration problem?\n");
+               dev_err(&pdev->dev,
+                       "No host detected; board configuration problem?\n");
                goto out_free;
        }
 
        host->this_id = 7;
-       host->base = A4000T_SCSI_ADDR;
+       host->base = scsi_addr;
        host->irq = IRQ_AMIGA_PORTS;
 
        if (request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "a4000t-scsi",
                        host)) {
-               printk(KERN_ERR "a4000t-scsi: request_irq failed\n");
+               dev_err(&pdev->dev, "request_irq failed\n");
                goto out_put_host;
        }
 
-       dev_set_drvdata(dev, host);
+       platform_set_drvdata(pdev, host);
        scsi_scan_host(host);
-
        return 0;
 
  out_put_host:
@@ -89,56 +90,49 @@ static int __devinit a4000t_probe(struct device *dev)
  out_free:
        kfree(hostdata);
  out_release:
-       release_mem_region(A4000T_SCSI_ADDR, 0x1000);
- out:
+       release_mem_region(res->start, resource_size(res));
        return -ENODEV;
 }
 
-static __devexit int a4000t_device_remove(struct device *dev)
+static int __exit amiga_a4000t_scsi_remove(struct platform_device *pdev)
 {
-       struct Scsi_Host *host = dev_get_drvdata(dev);
+       struct Scsi_Host *host = platform_get_drvdata(pdev);
        struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
+       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 
        scsi_remove_host(host);
-
        NCR_700_release(host);
        kfree(hostdata);
        free_irq(host->irq, host);
-       release_mem_region(A4000T_SCSI_ADDR, 0x1000);
-
+       release_mem_region(res->start, resource_size(res));
        return 0;
 }
 
-static struct device_driver a4000t_scsi_driver = {
-       .name   = "a4000t-scsi",
-       .bus    = &platform_bus_type,
-       .probe  = a4000t_probe,
-       .remove = __devexit_p(a4000t_device_remove),
+static struct platform_driver amiga_a4000t_scsi_driver = {
+       .remove = __exit_p(amiga_a4000t_scsi_remove),
+       .driver   = {
+               .name   = "amiga-a4000t-scsi",
+               .owner  = THIS_MODULE,
+       },
 };
 
-static int __init a4000t_scsi_init(void)
+static int __init amiga_a4000t_scsi_init(void)
 {
-       int err;
-
-       err = driver_register(&a4000t_scsi_driver);
-       if (err)
-               return err;
-
-       a4000t_scsi_device = platform_device_register_simple("a4000t-scsi",
-                       -1, NULL, 0);
-       if (IS_ERR(a4000t_scsi_device)) {
-               driver_unregister(&a4000t_scsi_driver);
-               return PTR_ERR(a4000t_scsi_device);
-       }
-
-       return err;
+       return platform_driver_probe(&amiga_a4000t_scsi_driver,
+                                    amiga_a4000t_scsi_probe);
 }
 
-static void __exit a4000t_scsi_exit(void)
+module_init(amiga_a4000t_scsi_init);
+
+static void __exit amiga_a4000t_scsi_exit(void)
 {
-       platform_device_unregister(a4000t_scsi_device);
-       driver_unregister(&a4000t_scsi_driver);
+       platform_driver_unregister(&amiga_a4000t_scsi_driver);
 }
 
-module_init(a4000t_scsi_init);
-module_exit(a4000t_scsi_exit);
+module_exit(amiga_a4000t_scsi_exit);
+
+MODULE_AUTHOR("Alan Hourihane <alanh@fairlite.demon.co.uk> / "
+             "Kars de Jong <jongk@linux-m68k.org>");
+MODULE_DESCRIPTION("Amiga A4000T NCR53C710 driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:amiga-a4000t-scsi");