Staging: vme: VMIVME-7805 board support
authorArthur Benilov <arthur.benilov@iba-group.com>
Tue, 16 Feb 2010 14:41:51 +0000 (15:41 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 4 Mar 2010 00:43:02 +0000 (16:43 -0800)
VMIVME-7805 board has a special control register that has to be used in
order to activate the VME bus access via the Universe II bridge.
This control register also handles endianess convertion.

Signed-off-by: Arthur Benilov <arthur.benilov@iba-group.com>
Signed-off-by: Vincent Bossier <vincent.bossier@iba-group.com>
Acked-by: Martyn Welch <martyn.welch@ge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/vme/Kconfig
drivers/staging/vme/Makefile
drivers/staging/vme/boards/Kconfig [new file with mode: 0644]
drivers/staging/vme/boards/Makefile [new file with mode: 0644]
drivers/staging/vme/boards/vme_vmivme7805.c [new file with mode: 0644]
drivers/staging/vme/boards/vme_vmivme7805.h [new file with mode: 0644]

index ae628a5..6411ae5 100644 (file)
@@ -14,4 +14,6 @@ source "drivers/staging/vme/bridges/Kconfig"
 
 source "drivers/staging/vme/devices/Kconfig"
 
+source "drivers/staging/vme/boards/Kconfig"
+
 endif # VME
index 8c3b90e..b4ea3f8 100644 (file)
@@ -5,3 +5,4 @@ obj-$(CONFIG_VME_BUS)           += vme.o
 
 obj-y                          += bridges/
 obj-y                          += devices/
+obj-y                          += boards/
diff --git a/drivers/staging/vme/boards/Kconfig b/drivers/staging/vme/boards/Kconfig
new file mode 100644 (file)
index 0000000..7616313
--- /dev/null
@@ -0,0 +1,9 @@
+comment "VME Board Drivers"
+
+config VMIVME_7805
+       tristate "VMIVME-7805"
+       help
+         If you say Y here you get support for the VMIVME-7805 board.
+         This board has an additional control interface to the Universe II
+         chip. This driver has to be included if you want to access VME bus
+         with VMIVME-7805 board.
diff --git a/drivers/staging/vme/boards/Makefile b/drivers/staging/vme/boards/Makefile
new file mode 100644 (file)
index 0000000..4365834
--- /dev/null
@@ -0,0 +1,5 @@
+#
+# Makefile for the VME board drivers.
+#
+
+obj-$(CONFIG_VMIVME_7805)      += vme_vmivme7805.o
diff --git a/drivers/staging/vme/boards/vme_vmivme7805.c b/drivers/staging/vme/boards/vme_vmivme7805.c
new file mode 100644 (file)
index 0000000..843c9ed
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * Support for the VMIVME-7805 board access to the Universe II bridge.
+ *
+ * Author: Arthur Benilov <arthur.benilov@iba-group.com>
+ * Copyright 2010 Ion Beam Application, Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <linux/pci.h>
+#include <linux/poll.h>
+#include <linux/io.h>
+
+#include "vme_vmivme7805.h"
+
+static int __init vmic_init(void);
+static int vmic_probe(struct pci_dev *, const struct pci_device_id *);
+static void vmic_remove(struct pci_dev *);
+static void __exit vmic_exit(void);
+
+/** Base address to access FPGA register */
+static void *vmic_base;
+
+static char driver_name[] = "vmivme_7805";
+
+static struct pci_device_id vmic_ids[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_VMIC, PCI_DEVICE_ID_VTIMR) },
+       { },
+};
+
+static struct pci_driver vmic_driver = {
+       .name = driver_name,
+       .id_table = vmic_ids,
+       .probe = vmic_probe,
+       .remove = vmic_remove,
+};
+
+static int __init vmic_init(void)
+{
+       return pci_register_driver(&vmic_driver);
+}
+
+static int vmic_probe(struct pci_dev *pdev, const struct pci_device_id *id)
+{
+       int retval;
+       u32 data;
+
+       /* Enable the device */
+       retval = pci_enable_device(pdev);
+       if (retval) {
+               dev_err(&pdev->dev, "Unable to enable device\n");
+               goto err;
+       }
+
+       /* Map Registers */
+       retval = pci_request_regions(pdev, driver_name);
+       if (retval) {
+               dev_err(&pdev->dev, "Unable to reserve resources\n");
+               goto err_resource;
+       }
+
+       /* Map registers in BAR 0 */
+       vmic_base = ioremap_nocache(pci_resource_start(pdev, 0), 16);
+       if (!vmic_base) {
+               dev_err(&pdev->dev, "Unable to remap CRG region\n");
+               retval = -EIO;
+               goto err_remap;
+       }
+
+       /* Clear the FPGA VME IF contents */
+       iowrite32(0, vmic_base + VME_CONTROL);
+
+       /* Clear any initial BERR  */
+       data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF;
+       data |= BM_VME_CONTROL_BERRST;
+       iowrite32(data, vmic_base + VME_CONTROL);
+
+       /* Enable the vme interface and byte swapping */
+       data = ioread32(vmic_base + VME_CONTROL) & 0x00000FFF;
+       data = data | BM_VME_CONTROL_MASTER_ENDIAN |
+                       BM_VME_CONTROL_SLAVE_ENDIAN |
+                       BM_VME_CONTROL_ABLE |
+                       BM_VME_CONTROL_BERRI |
+                       BM_VME_CONTROL_BPENA |
+                       BM_VME_CONTROL_VBENA;
+       iowrite32(data, vmic_base + VME_CONTROL);
+
+       return 0;
+
+err_remap:
+       pci_release_regions(pdev);
+err_resource:
+       pci_disable_device(pdev);
+err:
+       return retval;
+}
+
+static void vmic_remove(struct pci_dev *pdev)
+{
+       iounmap(vmic_base);
+       pci_release_regions(pdev);
+       pci_disable_device(pdev);
+
+}
+
+static void __exit vmic_exit(void)
+{
+       pci_unregister_driver(&vmic_driver);
+}
+
+MODULE_DESCRIPTION("VMIVME-7805 board support driver");
+MODULE_AUTHOR("Arthur Benilov <arthur.benilov@iba-group.com>");
+MODULE_LICENSE("GPL");
+
+module_init(vmic_init);
+module_exit(vmic_exit);
+
diff --git a/drivers/staging/vme/boards/vme_vmivme7805.h b/drivers/staging/vme/boards/vme_vmivme7805.h
new file mode 100644 (file)
index 0000000..44c2c44
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * vmivme_7805.h
+ *
+ * Support for the VMIVME-7805 board access to the Universe II bridge.
+ *
+ * Author: Arthur Benilov <arthur.benilov@iba-group.com>
+ * Copyright 2010 Ion Beam Application, Inc.
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+
+#ifndef _VMIVME_7805_H
+#define _VMIVME_7805_H
+
+#ifndef PCI_VENDOR_ID_VMIC
+#define PCI_VENDOR_ID_VMIC             0x114A
+#endif
+
+#ifndef PCI_DEVICE_ID_VTIMR
+#define PCI_DEVICE_ID_VTIMR            0x0004
+#endif
+
+#define VME_CONTROL                    0x0000
+#define BM_VME_CONTROL_MASTER_ENDIAN   0x0001
+#define BM_VME_CONTROL_SLAVE_ENDIAN    0x0002
+#define BM_VME_CONTROL_ABLE            0x0004
+#define BM_VME_CONTROL_BERRI           0x0040
+#define BM_VME_CONTROL_BERRST          0x0080
+#define BM_VME_CONTROL_BPENA           0x0400
+#define BM_VME_CONTROL_VBENA           0x0800
+
+#endif /* _VMIVME_7805_H */
+