linux/drivers/staging/vme/boards/vme_vmivme7805.c
<<
>>
Prefs
   1/*
   2 * Support for the VMIVME-7805 board access to the Universe II bridge.
   3 *
   4 * Author: Arthur Benilov <arthur.benilov@iba-group.com>
   5 * Copyright 2010 Ion Beam Application, Inc.
   6 *
   7 * This program is free software; you can redistribute  it and/or modify it
   8 * under  the terms of  the GNU General  Public License as published by the
   9 * Free Software Foundation;  either version 2 of the  License, or (at your
  10 * option) any later version.
  11 */
  12
  13#include <linux/module.h>
  14#include <linux/types.h>
  15#include <linux/errno.h>
  16#include <linux/pci.h>
  17#include <linux/poll.h>
  18#include <linux/io.h>
  19
  20#include "vme_vmivme7805.h"
  21
  22static int __init vmic_init(void);
  23static int vmic_probe(struct pci_dev *, const struct pci_device_id *);
  24static void vmic_remove(struct pci_dev *);
  25static void __exit vmic_exit(void);
  26
  27/** Base address to access FPGA register */
  28static void *vmic_base;
  29
  30static const char driver_name[] = "vmivme_7805";
  31
  32static DEFINE_PCI_DEVICE_TABLE(vmic_ids) = {
  33        { PCI_DEVICE(PCI_VENDOR_ID_VMIC, PCI_DEVICE_ID_VTIMR) },
  34        { },
  35};
  36
  37static struct pci_driver vmic_driver = {
  38        .name = driver_name,
  39        .id_table = vmic_ids,
  40        .probe = vmic_probe,
  41        .remove = vmic_remove,
  42};
  43
  44static int __init vmic_init(void)
  45{
  46        return pci_register_driver(&vmic_driver);
  47}
  48
  49static int vmic_probe(struct pci_dev *pdev, const struct pci_device_id *id)
  50{
  51        int retval;
  52        u32 data;
  53
  54        /* Enable the device */
  55        retval = pci_enable_device(pdev);
  56        if (retval) {
  57                dev_err(&pdev->dev, "Unable to enable device\n");
  58                goto err;
  59        }
  60
  61        /* Map Registers */
  62        retval = pci_request_regions(pdev, driver_name);
  63        if (retval) {
  64                dev_err(&pdev->dev, "Unable to reserve resources\n");
  65                goto err_resource;
  66        }
  67
  68        /* Map registers in BAR 0 */
  69        vmic_base = ioremap_nocache(pci_resource_start(pdev, 0), 16);
  70        if (!vmic_base) {
  71                dev_err(&pdev->dev, "Unable to remap CRG region\n");
  72                retval = -EIO;
  73                goto err_remap;
  74        }
  75
  76        /* Clear the FPGA VME IF contents */
  77        iowrite32(0, vmic_base + VME_CONTROL);
  78
  79        /* Clear any initial BERR  */
  80        data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF;
  81        data |= BM_VME_CONTROL_BERRST;
  82        iowrite32(data, vmic_base + VME_CONTROL);
  83
  84        /* Enable the vme interface and byte swapping */
  85        data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF;
  86        data = data | BM_VME_CONTROL_MASTER_ENDIAN |
  87                        BM_VME_CONTROL_SLAVE_ENDIAN |
  88                        BM_VME_CONTROL_ABLE |
  89                        BM_VME_CONTROL_BERRI |
  90                        BM_VME_CONTROL_BPENA |
  91                        BM_VME_CONTROL_VBENA;
  92        iowrite32(data, vmic_base + VME_CONTROL);
  93
  94        return 0;
  95
  96err_remap:
  97        pci_release_regions(pdev);
  98err_resource:
  99        pci_disable_device(pdev);
 100err:
 101        return retval;
 102}
 103
 104static void vmic_remove(struct pci_dev *pdev)
 105{
 106        iounmap(vmic_base);
 107        pci_release_regions(pdev);
 108        pci_disable_device(pdev);
 109
 110}
 111
 112static void __exit vmic_exit(void)
 113{
 114        pci_unregister_driver(&vmic_driver);
 115}
 116
 117MODULE_DESCRIPTION("VMIVME-7805 board support driver");
 118MODULE_AUTHOR("Arthur Benilov <arthur.benilov@iba-group.com>");
 119MODULE_LICENSE("GPL");
 120
 121module_init(vmic_init);
 122module_exit(vmic_exit);
 123
 124
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.