98 lines · c
1// SPDX-License-Identifier: (GPL-2.0 OR MPL-1.1)2/*3 * Driver for Future Domain-compatible PCMCIA SCSI cards4 * Copyright 2019 Ondrej Zary5 *6 * The initial developer of the original code is David A. Hinds7 * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds8 * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.9 */10 11#include <linux/module.h>12#include <linux/init.h>13#include <scsi/scsi_host.h>14#include <pcmcia/cistpl.h>15#include <pcmcia/ds.h>16#include "fdomain.h"17 18MODULE_AUTHOR("Ondrej Zary, David Hinds");19MODULE_DESCRIPTION("Future Domain PCMCIA SCSI driver");20MODULE_LICENSE("Dual MPL/GPL");21 22static int fdomain_config_check(struct pcmcia_device *p_dev, void *priv_data)23{24 p_dev->io_lines = 10;25 p_dev->resource[0]->end = FDOMAIN_REGION_SIZE;26 p_dev->resource[0]->flags &= ~IO_DATA_PATH_WIDTH;27 p_dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_AUTO;28 return pcmcia_request_io(p_dev);29}30 31static int fdomain_probe(struct pcmcia_device *link)32{33 int ret;34 struct Scsi_Host *sh;35 36 link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO;37 link->config_regs = PRESENT_OPTION;38 39 ret = pcmcia_loop_config(link, fdomain_config_check, NULL);40 if (ret)41 return ret;42 43 ret = pcmcia_enable_device(link);44 if (ret)45 goto fail_disable;46 47 if (!request_region(link->resource[0]->start, FDOMAIN_REGION_SIZE,48 "fdomain_cs")) {49 ret = -EBUSY;50 goto fail_disable;51 }52 53 sh = fdomain_create(link->resource[0]->start, link->irq, 7, &link->dev);54 if (!sh) {55 dev_err(&link->dev, "Controller initialization failed");56 ret = -ENODEV;57 goto fail_release;58 }59 60 link->priv = sh;61 62 return 0;63 64fail_release:65 release_region(link->resource[0]->start, FDOMAIN_REGION_SIZE);66fail_disable:67 pcmcia_disable_device(link);68 return ret;69}70 71static void fdomain_remove(struct pcmcia_device *link)72{73 fdomain_destroy(link->priv);74 release_region(link->resource[0]->start, FDOMAIN_REGION_SIZE);75 pcmcia_disable_device(link);76}77 78static const struct pcmcia_device_id fdomain_ids[] = {79 PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "SCSI PCMCIA Card", 0xe3736c88,80 0x859cad20),81 PCMCIA_DEVICE_PROD_ID1("SCSI PCMCIA Adapter Card", 0x8dacb57e),82 PCMCIA_DEVICE_PROD_ID12(" SIMPLE TECHNOLOGY Corporation",83 "SCSI PCMCIA Credit Card Controller",84 0x182bdafe, 0xc80d106f),85 PCMCIA_DEVICE_NULL,86};87MODULE_DEVICE_TABLE(pcmcia, fdomain_ids);88 89static struct pcmcia_driver fdomain_cs_driver = {90 .owner = THIS_MODULE,91 .name = "fdomain_cs",92 .probe = fdomain_probe,93 .remove = fdomain_remove,94 .id_table = fdomain_ids,95};96 97module_pcmcia_driver(fdomain_cs_driver);98