PageRenderTime 28ms CodeModel.GetById 16ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/drivers/staging/vme/boards/vme_vmivme7805.c

https://bitbucket.org/wisechild/galaxy-nexus
C | 123 lines | 82 code | 23 blank | 18 comment | 3 complexity | 59bb2fba450c5233adca3f1866b1a8a8 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  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 char driver_name[] = "vmivme_7805";
 31
 32static struct pci_device_id 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