brintos

brintos / linux-shallow public Read only

0
0
Text · 3.3 KiB · f893e97 Raw
138 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Detection routine for the NCR53c710 based BVME6000 SCSI Controllers for Linux.4 *5 * Based on work by Alan Hourihane and Kars de Jong6 *7 * Rewritten to use 53c700.c by Richard Hirst <richard@sleepie.demon.co.uk>8 */9 10#include <linux/module.h>11#include <linux/blkdev.h>12#include <linux/device.h>13#include <linux/platform_device.h>14#include <linux/init.h>15#include <linux/interrupt.h>16#include <linux/slab.h>17#include <asm/bvme6000hw.h>18#include <scsi/scsi_host.h>19#include <scsi/scsi_device.h>20#include <scsi/scsi_transport.h>21#include <scsi/scsi_transport_spi.h>22 23#include "53c700.h"24 25MODULE_AUTHOR("Richard Hirst <richard@sleepie.demon.co.uk>");26MODULE_DESCRIPTION("BVME6000 NCR53C710 driver");27MODULE_LICENSE("GPL");28 29static struct scsi_host_template bvme6000_scsi_driver_template = {30	.name			= "BVME6000 NCR53c710 SCSI",31	.proc_name		= "BVME6000",32	.this_id		= 7,33	.module			= THIS_MODULE,34};35 36static struct platform_device *bvme6000_scsi_device;37 38static int39bvme6000_probe(struct platform_device *dev)40{41	struct Scsi_Host *host;42	struct NCR_700_Host_Parameters *hostdata;43 44	if (!MACH_IS_BVME6000)45		goto out;46 47	hostdata = kzalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);48	if (!hostdata) {49		printk(KERN_ERR "bvme6000-scsi: "50				"Failed to allocate host data\n");51		goto out;52	}53 54	/* Fill in the required pieces of hostdata */55	hostdata->base = (void __iomem *)BVME_NCR53C710_BASE;56	hostdata->clock = 40;	/* XXX - depends on the CPU clock! */57	hostdata->chip710 = 1;58	hostdata->dmode_extra = DMODE_FC2;59	hostdata->dcntl_extra = EA_710;60	hostdata->ctest7_extra = CTEST7_TT1;61 62	/* and register the chip */63	host = NCR_700_detect(&bvme6000_scsi_driver_template, hostdata,64			      &dev->dev);65	if (!host) {66		printk(KERN_ERR "bvme6000-scsi: No host detected; "67				"board configuration problem?\n");68		goto out_free;69	}70	host->base = BVME_NCR53C710_BASE;71	host->this_id = 7;72	host->irq = BVME_IRQ_SCSI;73	if (request_irq(BVME_IRQ_SCSI, NCR_700_intr, 0, "bvme6000-scsi",74			host)) {75		printk(KERN_ERR "bvme6000-scsi: request_irq failed\n");76		goto out_put_host;77	}78 79	platform_set_drvdata(dev, host);80	scsi_scan_host(host);81 82	return 0;83 84 out_put_host:85	scsi_host_put(host);86 out_free:87	kfree(hostdata);88 out:89	return -ENODEV;90}91 92static void93bvme6000_device_remove(struct platform_device *dev)94{95	struct Scsi_Host *host = platform_get_drvdata(dev);96	struct NCR_700_Host_Parameters *hostdata = shost_priv(host);97 98	scsi_remove_host(host);99	NCR_700_release(host);100	kfree(hostdata);101	free_irq(host->irq, host);102}103 104static struct platform_driver bvme6000_scsi_driver = {105	.driver = {106		.name		= "bvme6000-scsi",107	},108	.probe		= bvme6000_probe,109	.remove_new	= bvme6000_device_remove,110};111 112static int __init bvme6000_scsi_init(void)113{114	int err;115 116	err = platform_driver_register(&bvme6000_scsi_driver);117	if (err)118		return err;119 120	bvme6000_scsi_device = platform_device_register_simple("bvme6000-scsi",121							       -1, NULL, 0);122	if (IS_ERR(bvme6000_scsi_device)) {123		platform_driver_unregister(&bvme6000_scsi_driver);124		return PTR_ERR(bvme6000_scsi_device);125	}126 127	return 0;128}129 130static void __exit bvme6000_scsi_exit(void)131{132	platform_device_unregister(bvme6000_scsi_device);133	platform_driver_unregister(&bvme6000_scsi_driver);134}135 136module_init(bvme6000_scsi_init);137module_exit(bvme6000_scsi_exit);138