| // SPDX-License-Identifier: GPL-2.0 |
| |
| #include <linux/module.h> |
| #include <linux/pci.h> |
| #include "fdomain.h" |
| |
| static int fdomain_pci_probe(struct pci_dev *pdev, |
| const struct pci_device_id *d) |
| { |
| int err; |
| struct Scsi_Host *sh; |
| |
| err = pci_enable_device(pdev); |
| if (err) |
| goto fail; |
| |
| err = pci_request_regions(pdev, "fdomain_pci"); |
| if (err) |
| goto disable_device; |
| |
| err = -ENODEV; |
| if (pci_resource_len(pdev, 0) == 0) |
| goto release_region; |
| |
| sh = fdomain_create(pci_resource_start(pdev, 0), pdev->irq, 7, |
| &pdev->dev); |
| if (!sh) |
| goto release_region; |
| |
| pci_set_drvdata(pdev, sh); |
| return 0; |
| |
| release_region: |
| pci_release_regions(pdev); |
| disable_device: |
| pci_disable_device(pdev); |
| fail: |
| return err; |
| } |
| |
| static void fdomain_pci_remove(struct pci_dev *pdev) |
| { |
| struct Scsi_Host *sh = pci_get_drvdata(pdev); |
| |
| fdomain_destroy(sh); |
| pci_release_regions(pdev); |
| pci_disable_device(pdev); |
| } |
| |
| static struct pci_device_id fdomain_pci_table[] = { |
| { PCI_DEVICE(PCI_VENDOR_ID_FD, PCI_DEVICE_ID_FD_36C70) }, |
| {} |
| }; |
| MODULE_DEVICE_TABLE(pci, fdomain_pci_table); |
| |
| static struct pci_driver fdomain_pci_driver = { |
| .name = "fdomain_pci", |
| .id_table = fdomain_pci_table, |
| .probe = fdomain_pci_probe, |
| .remove = fdomain_pci_remove, |
| .driver.pm = FDOMAIN_PM_OPS, |
| }; |
| |
| module_pci_driver(fdomain_pci_driver); |
| |
| MODULE_AUTHOR("Ondrej Zary, Rickard E. Faith"); |
| MODULE_DESCRIPTION("Future Domain TMC-3260 PCI SCSI driver"); |
| MODULE_LICENSE("GPL"); |