VME Device Drivers

Driver registration

As with other subsystems within the Linux kernel, VME device drivers register with the VME subsystem, typically called from the devices init routine. This is achieved via a call to vme_register_driver().

A pointer to a structure of type struct vme_driver must be provided to the registration function. Along with the maximum number of devices your driver is able to support.

At the minimum, the ‘.name’, ‘.match’ and ‘.probe’ elements of struct vme_driver should be correctly set. The ‘.name’ element is a pointer to a string holding the device driver’s name.

The ‘.match’ function allows control over which VME devices should be registered with the driver. The match function should return 1 if a device should be probed and 0 otherwise. This example match function (from vme_user.c) limits the number of devices probed to one:

#define USER_BUS_MAX    1
...
static int vme_user_match(struct vme_dev *vdev)
{
        if (vdev->id.num >= USER_BUS_MAX)
                return 0;
        return 1;
}

The ‘.probe’ element should contain a pointer to the probe routine. The probe routine is passed a struct vme_dev pointer as an argument.

Here, the ‘num’ field refers to the sequential device ID for this specific driver. The bridge number (or bus number) can be accessed using dev->bridge->num.

A function is also provided to unregister the driver from the VME core called vme_unregister_driver() and should usually be called from the device driver’s exit routine.

Resource management

Once a driver has registered with the VME core the provided match routine will be called the number of times specified during the registration. If a match succeeds, a non-zero value should be returned. A zero return value indicates failure. For all successful matches, the probe routine of the corresponding driver is called. The probe routine is passed a pointer to the devices device structure. This pointer should be saved, it will be required for requesting VME resources.

The driver can request ownership of one or more master windows (vme_master_request()), slave windows (vme_slave_request()) and/or dma channels (vme_dma_request()). Rather than allowing the device driver to request a specific window or DMA channel (which may be used by a different driver) the API allows a resource to be assigned based on the required attributes of the driver in question. For slave windows these attributes are split into the VME address spaces that need to be accessed in ‘aspace’ and VME bus cycle types required in ‘cycle’. Master windows add a further set of attributes in ‘width’ specifying the required data transfer widths. These attributes are defined as bitmasks and as such any combination of the attributes can be requested for a single window, the core will assign a window that meets the requirements, returning a pointer of type vme_resource that should be used to identify the allocated resource when it is used. For DMA controllers, the request function requires the potential direction of any transfers to be provided in the route attributes. This is typically VME-to-MEM and/or MEM-to-VME, though some hardware can support VME-to-VME and MEM-to-MEM transfers as well as test pattern generation. If an unallocated window fitting the requirements can not be found a NULL pointer will be returned.

Functions are also provided to free window allocations once they are no longer required. These functions (vme_master_free(), vme_slave_free() and vme_dma_free()) should be passed the pointer to the resource provided during resource allocation.

Master windows

Master windows provide access from the local processor[s] out onto the VME bus. The number of windows available and the available access modes is dependent on the underlying chipset. A window must be configured before it can be used.

Master window configuration

Once a master window has been assigned vme_master_set() can be used to configure it and vme_master_get() to retrieve the current settings. The address spaces, transfer widths and cycle types are the same as described under resource management, however some of the options are mutually exclusive. For example, only one address space may be specified.

Master window access

The function vme_master_read() can be used to read from and vme_master_write() used to write to configured master windows.

In addition to simple reads and writes, vme_master_rmw() is provided to do a read-modify-write transaction. Parts of a VME window can also be mapped into user space memory using vme_master_mmap().

Slave windows

Slave windows provide devices on the VME bus access into mapped portions of the local memory. The number of windows available and the access modes that can be used is dependent on the underlying chipset. A window must be configured before it can be used.

Slave window configuration

Once a slave window has been assigned vme_slave_set() can be used to configure it and vme_slave_get() to retrieve the current settings.

The address spaces, transfer widths and cycle types are the same as described under resource management, however some of the options are mutually exclusive. For example, only one address space may be specified.

Slave window buffer allocation

Functions are provided to allow the user to allocate (vme_alloc_consistent()) and free (vme_free_consistent()) contiguous buffers which will be accessible by the VME bridge. These functions do not have to be used, other methods can be used to allocate a buffer, though care must be taken to ensure that they are contiguous and accessible by the VME bridge.

Slave window access

Slave windows map local memory onto the VME bus, the standard methods for accessing memory should be used.

DMA channels

The VME DMA transfer provides the ability to run link-list DMA transfers. The API introduces the concept of DMA lists. Each DMA list is a link-list which can be passed to a DMA controller. Multiple lists can be created, extended, executed, reused and destroyed.

List Management

The function vme_new_dma_list() is provided to create and vme_dma_list_free() to destroy DMA lists. Execution of a list will not automatically destroy the list, thus enabling a list to be reused for repetitive tasks.

List Population

An item can be added to a list using vme_dma_list_add() (the source and destination attributes need to be created before calling this function, this is covered under “Transfer Attributes”).

Note

The detailed attributes of the transfers source and destination are not checked until an entry is added to a DMA list, the request for a DMA channel purely checks the directions in which the controller is expected to transfer data. As a result it is possible for this call to return an error, for example if the source or destination is in an unsupported VME address space.

Transfer Attributes

The attributes for the source and destination are handled separately from adding an item to a list. This is due to the diverse attributes required for each type of source and destination. There are functions to create attributes for PCI, VME and pattern sources and destinations (where appropriate):

The function vme_dma_free_attribute() should be used to free an attribute.

List Execution

The function vme_dma_list_exec() queues a list for execution and will return once the list has been executed.

Interrupts

The VME API provides functions to attach and detach callbacks to specific VME level and status ID combinations and for the generation of VME interrupts with specific VME level and status IDs.

Attaching Interrupt Handlers

The function vme_irq_request() can be used to attach and vme_irq_free() to free a specific VME level and status ID combination. Any given combination can only be assigned a single callback function. A void pointer parameter is provided, the value of which is passed to the callback function, the use of this pointer is user undefined. The callback parameters are as follows. Care must be taken in writing a callback function, callback functions run in interrupt context:

void callback(int level, int statid, void *priv);

Interrupt Generation

The function vme_irq_generate() can be used to generate a VME interrupt at a given VME level and VME status ID.

Location monitors

The VME API provides the following functionality to configure the location monitor.

Location Monitor Management

The function vme_lm_request() is provided to request the use of a block of location monitors and vme_lm_free() to free them after they are no longer required. Each block may provide a number of location monitors, monitoring adjacent locations. The function vme_lm_count() can be used to determine how many locations are provided.

Location Monitor Configuration

Once a bank of location monitors has been allocated, the function vme_lm_set() is provided to configure the location and mode of the location monitor. The function vme_lm_get() can be used to retrieve existing settings.

Location Monitor Use

The function vme_lm_attach() enables a callback to be attached and vme_lm_detach() allows on to be detached from each location monitor location. Each location monitor can monitor a number of adjacent locations. The callback function is declared as follows.

void callback(void *data);

Slot Detection

The function vme_slot_num() returns the slot ID of the provided bridge.

Bus Detection

The function vme_bus_num() returns the bus ID of the provided bridge.

VME API

struct vme_dev

Structure representing a VME device

Definition

struct vme_dev {
  int num;
  struct vme_bridge *bridge;
  struct device dev;
  struct list_head drv_list;
  struct list_head bridge_list;
};

Members

num

The device number

bridge

Pointer to the bridge device this device is on

dev

Internal device structure

drv_list

List of devices (per driver)

bridge_list

List of devices (per bridge)

struct vme_driver

Structure representing a VME driver

Definition

struct vme_driver {
  const char *name;
  int (*match)(struct vme_dev *);
  int (*probe)(struct vme_dev *);
  int (*remove)(struct vme_dev *);
  struct device_driver driver;
  struct list_head devices;
};

Members

name

Driver name, should be unique among VME drivers and usually the same as the module name.

match

Callback used to determine whether probe should be run.

probe

Callback for device binding, called when new device is detected.

remove

Callback, called on device removal.

driver

Underlying generic device driver structure.

devices

List of VME devices (struct vme_dev) associated with this driver.

void *vme_alloc_consistent(struct vme_resource *resource, size_t size, dma_addr_t *dma)

Allocate contiguous memory.

Parameters

struct vme_resource * resource

Pointer to VME resource.

size_t size

Size of allocation required.

dma_addr_t * dma

Pointer to variable to store physical address of allocation.

Description

Allocate a contiguous block of memory for use by the driver. This is used to create the buffers for the slave windows.

Return

Virtual address of allocation on success, NULL on failure.

void vme_free_consistent(struct vme_resource *resource, size_t size, void *vaddr, dma_addr_t dma)

Free previously allocated memory.

Parameters

struct vme_resource * resource

Pointer to VME resource.

size_t size

Size of allocation to free.

void * vaddr

Virtual address of allocation.

dma_addr_t dma

Physical address of allocation.

Description

Free previously allocated block of contiguous memory.

size_t vme_get_size(struct vme_resource *resource)

Helper function returning size of a VME window

Parameters

struct vme_resource * resource

Pointer to VME slave or master resource.

Description

Determine the size of the VME window provided. This is a helper function, wrappering the call to vme_master_get or vme_slave_get depending on the type of window resource handed to it.

Return

Size of the window on success, zero on failure.

struct vme_resource *vme_slave_request(struct vme_dev *vdev, u32 address, u32 cycle)

Request a VME slave window resource.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

u32 address

Required VME address space.

u32 cycle

Required VME data transfer cycle type.

Description

Request use of a VME window resource capable of being set for the requested address space and data transfer cycle.

Return

Pointer to VME resource on success, NULL on failure.

int vme_slave_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, dma_addr_t buf_base, u32 aspace, u32 cycle)

Set VME slave window configuration.

Parameters

struct vme_resource * resource

Pointer to VME slave resource.

int enabled

State to which the window should be configured.

unsigned long long vme_base

Base address for the window.

unsigned long long size

Size of the VME window.

dma_addr_t buf_base

Based address of buffer used to provide VME slave window storage.

u32 aspace

VME address space for the VME window.

u32 cycle

VME data transfer cycle type for the VME window.

Description

Set configuration for provided VME slave window.

Return

Zero on success, -EINVAL if operation is not supported on this

device, if an invalid resource has been provided or invalid attributes are provided. Hardware specific errors may also be returned.

int vme_slave_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, dma_addr_t *buf_base, u32 *aspace, u32 *cycle)

Retrieve VME slave window configuration.

Parameters

struct vme_resource * resource

Pointer to VME slave resource.

int * enabled

Pointer to variable for storing state.

unsigned long long * vme_base

Pointer to variable for storing window base address.

unsigned long long * size

Pointer to variable for storing window size.

dma_addr_t * buf_base

Pointer to variable for storing slave buffer base address.

u32 * aspace

Pointer to variable for storing VME address space.

u32 * cycle

Pointer to variable for storing VME data transfer cycle type.

Description

Return configuration for provided VME slave window.

Return

Zero on success, -EINVAL if operation is not supported on this

device or if an invalid resource has been provided.

void vme_slave_free(struct vme_resource *resource)

Free VME slave window

Parameters

struct vme_resource * resource

Pointer to VME slave resource.

Description

Free the provided slave resource so that it may be reallocated.

struct vme_resource *vme_master_request(struct vme_dev *vdev, u32 address, u32 cycle, u32 dwidth)

Request a VME master window resource.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

u32 address

Required VME address space.

u32 cycle

Required VME data transfer cycle type.

u32 dwidth

Required VME data transfer width.

Description

Request use of a VME window resource capable of being set for the requested address space, data transfer cycle and width.

Return

Pointer to VME resource on success, NULL on failure.

int vme_master_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, u32 aspace, u32 cycle, u32 dwidth)

Set VME master window configuration.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

int enabled

State to which the window should be configured.

unsigned long long vme_base

Base address for the window.

unsigned long long size

Size of the VME window.

u32 aspace

VME address space for the VME window.

u32 cycle

VME data transfer cycle type for the VME window.

u32 dwidth

VME data transfer width for the VME window.

Description

Set configuration for provided VME master window.

Return

Zero on success, -EINVAL if operation is not supported on this

device, if an invalid resource has been provided or invalid attributes are provided. Hardware specific errors may also be returned.

int vme_master_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, u32 *aspace, u32 *cycle, u32 *dwidth)

Retrieve VME master window configuration.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

int * enabled

Pointer to variable for storing state.

unsigned long long * vme_base

Pointer to variable for storing window base address.

unsigned long long * size

Pointer to variable for storing window size.

u32 * aspace

Pointer to variable for storing VME address space.

u32 * cycle

Pointer to variable for storing VME data transfer cycle type.

u32 * dwidth

Pointer to variable for storing VME data transfer width.

Description

Return configuration for provided VME master window.

Return

Zero on success, -EINVAL if operation is not supported on this

device or if an invalid resource has been provided.

ssize_t vme_master_read(struct vme_resource *resource, void *buf, size_t count, loff_t offset)

Read data from VME space into a buffer.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

void * buf

Pointer to buffer where data should be transferred.

size_t count

Number of bytes to transfer.

loff_t offset

Offset into VME master window at which to start transfer.

Description

Perform read of count bytes of data from location on VME bus which maps into the VME master window at offset to buf.

Return

Number of bytes read, -EINVAL if resource is not a VME master

resource or read operation is not supported. -EFAULT returned if invalid offset is provided. Hardware specific errors may also be returned.

ssize_t vme_master_write(struct vme_resource *resource, void *buf, size_t count, loff_t offset)

Write data out to VME space from a buffer.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

void * buf

Pointer to buffer holding data to transfer.

size_t count

Number of bytes to transfer.

loff_t offset

Offset into VME master window at which to start transfer.

Description

Perform write of count bytes of data from buf to location on VME bus which maps into the VME master window at offset.

Return

Number of bytes written, -EINVAL if resource is not a VME master

resource or write operation is not supported. -EFAULT returned if invalid offset is provided. Hardware specific errors may also be returned.

unsigned int vme_master_rmw(struct vme_resource *resource, unsigned int mask, unsigned int compare, unsigned int swap, loff_t offset)

Perform read-modify-write cycle.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

unsigned int mask

Bits to be compared and swapped in operation.

unsigned int compare

Bits to be compared with data read from offset.

unsigned int swap

Bits to be swapped in data read from offset.

loff_t offset

Offset into VME master window at which to perform operation.

Description

Perform read-modify-write cycle on provided location: - Location on VME bus is read. - Bits selected by mask are compared with compare. - Where a selected bit matches that in compare and are selected in swap, the bit is swapped. - Result written back to location on VME bus.

Return

Bytes written on success, -EINVAL if resource is not a VME master

resource or RMW operation is not supported. Hardware specific errors may also be returned.

int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma)

Mmap region of VME master window.

Parameters

struct vme_resource * resource

Pointer to VME master resource.

struct vm_area_struct * vma

Pointer to definition of user mapping.

Description

Memory map a region of the VME master window into user space.

Return

Zero on success, -EINVAL if resource is not a VME master

resource or -EFAULT if map exceeds window size. Other generic mmap errors may also be returned.

void vme_master_free(struct vme_resource *resource)

Free VME master window

Parameters

struct vme_resource * resource

Pointer to VME master resource.

Description

Free the provided master resource so that it may be reallocated.

struct vme_resource *vme_dma_request(struct vme_dev *vdev, u32 route)

Request a DMA controller.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

u32 route

Required src/destination combination.

Description

Request a VME DMA controller with capability to perform transfers bewteen requested source/destination combination.

Return

Pointer to VME DMA resource on success, NULL on failure.

struct vme_dma_list *vme_new_dma_list(struct vme_resource *resource)

Create new VME DMA list.

Parameters

struct vme_resource * resource

Pointer to VME DMA resource.

Description

Create a new VME DMA list. It is the responsibility of the user to free the list once it is no longer required with vme_dma_list_free().

Return

Pointer to new VME DMA list, NULL on allocation failure or invalid

VME DMA resource.

struct vme_dma_attr *vme_dma_pattern_attribute(u32 pattern, u32 type)

Create “Pattern” type VME DMA list attribute.

Parameters

u32 pattern

Value to use used as pattern

u32 type

Type of pattern to be written.

Description

Create VME DMA list attribute for pattern generation. It is the responsibility of the user to free used attributes using vme_dma_free_attribute().

Return

Pointer to VME DMA attribute, NULL on failure.

struct vme_dma_attr *vme_dma_pci_attribute(dma_addr_t address)

Create “PCI” type VME DMA list attribute.

Parameters

dma_addr_t address

PCI base address for DMA transfer.

Description

Create VME DMA list attribute pointing to a location on PCI for DMA transfers. It is the responsibility of the user to free used attributes using vme_dma_free_attribute().

Return

Pointer to VME DMA attribute, NULL on failure.

struct vme_dma_attr *vme_dma_vme_attribute(unsigned long long address, u32 aspace, u32 cycle, u32 dwidth)

Create “VME” type VME DMA list attribute.

Parameters

unsigned long long address

VME base address for DMA transfer.

u32 aspace

VME address space to use for DMA transfer.

u32 cycle

VME bus cycle to use for DMA transfer.

u32 dwidth

VME data width to use for DMA transfer.

Description

Create VME DMA list attribute pointing to a location on the VME bus for DMA transfers. It is the responsibility of the user to free used attributes using vme_dma_free_attribute().

Return

Pointer to VME DMA attribute, NULL on failure.

void vme_dma_free_attribute(struct vme_dma_attr *attributes)

Free DMA list attribute.

Parameters

struct vme_dma_attr * attributes

Pointer to DMA list attribute.

Description

Free VME DMA list attribute. VME DMA list attributes can be safely freed once vme_dma_list_add() has returned.

int vme_dma_list_add(struct vme_dma_list *list, struct vme_dma_attr *src, struct vme_dma_attr *dest, size_t count)

Add enty to a VME DMA list.

Parameters

struct vme_dma_list * list

Pointer to VME list.

struct vme_dma_attr * src

Pointer to DMA list attribute to use as source.

struct vme_dma_attr * dest

Pointer to DMA list attribute to use as destination.

size_t count

Number of bytes to transfer.

Description

Add an entry to the provided VME DMA list. Entry requires pointers to source and destination DMA attributes and a count.

Please note, the attributes supported as source and destinations for transfers are hardware dependent.

Return

Zero on success, -EINVAL if operation is not supported on this

device or if the link list has already been submitted for execution. Hardware specific errors also possible.

int vme_dma_list_exec(struct vme_dma_list *list)

Queue a VME DMA list for execution.

Parameters

struct vme_dma_list * list

Pointer to VME list.

Description

Queue the provided VME DMA list for execution. The call will return once the list has been executed.

Return

Zero on success, -EINVAL if operation is not supported on this

device. Hardware specific errors also possible.

int vme_dma_list_free(struct vme_dma_list *list)

Free a VME DMA list.

Parameters

struct vme_dma_list * list

Pointer to VME list.

Description

Free the provided DMA list and all its entries.

Return

Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource

is still in use. Hardware specific errors also possible.

int vme_dma_free(struct vme_resource *resource)

Free a VME DMA resource.

Parameters

struct vme_resource * resource

Pointer to VME DMA resource.

Description

Free the provided DMA resource so that it may be reallocated.

Return

Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource

is still active.

int vme_irq_request(struct vme_dev *vdev, int level, int statid, void (*callback)(int, int, void*), void *priv_data, )

Request a specific VME interrupt.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

int level

Interrupt priority being requested.

int statid

Interrupt vector being requested.

void (*)(int, int, void *) callback

Pointer to callback function called when VME interrupt/vector received.

void * priv_data

Generic pointer that will be passed to the callback function.

Description

Request callback to be attached as a handler for VME interrupts with provided level and statid.

Return

Zero on success, -EINVAL on invalid vme device, level or if the

function is not supported, -EBUSY if the level/statid combination is already in use. Hardware specific errors also possible.

void vme_irq_free(struct vme_dev *vdev, int level, int statid)

Free a VME interrupt.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

int level

Interrupt priority of interrupt being freed.

int statid

Interrupt vector of interrupt being freed.

Description

Remove previously attached callback from VME interrupt priority/vector.

int vme_irq_generate(struct vme_dev *vdev, int level, int statid)

Generate VME interrupt.

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

int level

Interrupt priority at which to assert the interrupt.

int statid

Interrupt vector to associate with the interrupt.

Description

Generate a VME interrupt of the provided level and with the provided statid.

Return

Zero on success, -EINVAL on invalid vme device, level or if the

function is not supported. Hardware specific errors also possible.

struct vme_resource *vme_lm_request(struct vme_dev *vdev)

Request a VME location monitor

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

Description

Allocate a location monitor resource to the driver. A location monitor allows the driver to monitor accesses to a contiguous number of addresses on the VME bus.

Return

Pointer to a VME resource on success or NULL on failure.

int vme_lm_count(struct vme_resource *resource)

Determine number of VME Addresses monitored

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

Description

The number of contiguous addresses monitored is hardware dependent. Return the number of contiguous addresses monitored by the location monitor.

Return

Count of addresses monitored or -EINVAL when provided with an

invalid location monitor resource.

int vme_lm_set(struct vme_resource *resource, unsigned long long lm_base, u32 aspace, u32 cycle)

Configure location monitor

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

unsigned long long lm_base

Base address to monitor.

u32 aspace

VME address space to monitor.

u32 cycle

VME bus cycle type to monitor.

Description

Set the base address, address space and cycle type of accesses to be monitored by the location monitor.

Return

Zero on success, -EINVAL when provided with an invalid location

monitor resource or function is not supported. Hardware specific errors may also be returned.

int vme_lm_get(struct vme_resource *resource, unsigned long long *lm_base, u32 *aspace, u32 *cycle)

Retrieve location monitor settings

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

unsigned long long * lm_base

Pointer used to output the base address monitored.

u32 * aspace

Pointer used to output the address space monitored.

u32 * cycle

Pointer used to output the VME bus cycle type monitored.

Description

Retrieve the base address, address space and cycle type of accesses to be monitored by the location monitor.

Return

Zero on success, -EINVAL when provided with an invalid location

monitor resource or function is not supported. Hardware specific errors may also be returned.

int vme_lm_attach(struct vme_resource *resource, int monitor, void (*callback)(void*), void *data, )

Provide callback for location monitor address

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

int monitor

Offset to which callback should be attached.

void (*)(void *) callback

Pointer to callback function called when triggered.

void * data

Generic pointer that will be passed to the callback function.

Description

Attach a callback to the specificed offset into the location monitors monitored addresses. A generic pointer is provided to allow data to be passed to the callback when called.

Return

Zero on success, -EINVAL when provided with an invalid location

monitor resource or function is not supported. Hardware specific errors may also be returned.

int vme_lm_detach(struct vme_resource *resource, int monitor)

Remove callback for location monitor address

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

int monitor

Offset to which callback should be removed.

Description

Remove the callback associated with the specificed offset into the location monitors monitored addresses.

Return

Zero on success, -EINVAL when provided with an invalid location

monitor resource or function is not supported. Hardware specific errors may also be returned.

void vme_lm_free(struct vme_resource *resource)

Free allocated VME location monitor

Parameters

struct vme_resource * resource

Pointer to VME location monitor resource.

Description

Free allocation of a VME location monitor.

WARNING: This function currently expects that any callbacks that have

been attached to the location monitor have been removed.

Return

Zero on success, -EINVAL when provided with an invalid location

monitor resource.

int vme_slot_num(struct vme_dev *vdev)

Retrieve slot ID

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

Description

Retrieve the slot ID associated with the provided VME device.

Return

The slot ID on success, -EINVAL if VME bridge cannot be determined

or the function is not supported. Hardware specific errors may also be returned.

int vme_bus_num(struct vme_dev *vdev)

Retrieve bus number

Parameters

struct vme_dev * vdev

Pointer to VME device struct vme_dev assigned to driver instance.

Description

Retrieve the bus enumeration associated with the provided VME device.

Return

The bus number on success, -EINVAL if VME bridge cannot be

determined.

int vme_register_driver(struct vme_driver *drv, unsigned int ndevs)

Register a VME driver

Parameters

struct vme_driver * drv

Pointer to VME driver structure to register.

unsigned int ndevs

Maximum number of devices to allow to be enumerated.

Description

Register a VME device driver with the VME subsystem.

Return

Zero on success, error value on registration failure.

void vme_unregister_driver(struct vme_driver *drv)

Unregister a VME driver

Parameters

struct vme_driver * drv

Pointer to VME driver structure to unregister.

Description

Unregister a VME device driver from the VME subsystem.