Commit 978f47d6 authored by Martyn Welch's avatar Martyn Welch Committed by Greg Kroah-Hartman

VME: Provide access to VME bus enumeration and fix vme_user match function

The match function for vme_user is completely wrong. It will blindly bind
against the first VME slot on each bus (at this point that would be just the
first bus as the driver can only handle one bus).

The original intention (before some major subsystem changes) was that the
driver bind against the slot to which the bridge was attached in the VME
system and to the bus(es) provided via the "bus" module parameter.

To do this cleanly (i.e. without poking arround in the subsystems internal
stuctures) a functionality has been added to provide access to the bus
enumeration.
Signed-off-by: default avatarMartyn Welch <martyn.welch@ge.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 49cf10c6
...@@ -394,3 +394,13 @@ Slot Detection ...@@ -394,3 +394,13 @@ Slot Detection
This function returns the slot ID of the provided bridge. This function returns the slot ID of the provided bridge.
int vme_slot_get(struct vme_dev *dev); int vme_slot_get(struct vme_dev *dev);
Bus Detection
=============
This function returns the bus ID of the provided bridge.
int vme_bus_num(struct vme_dev *dev);
...@@ -663,9 +663,16 @@ static int __init vme_user_init(void) ...@@ -663,9 +663,16 @@ static int __init vme_user_init(void)
static int vme_user_match(struct vme_dev *vdev) static int vme_user_match(struct vme_dev *vdev)
{ {
if (vdev->num >= VME_USER_BUS_MAX) int i;
return 0;
return 1; int cur_bus = vme_bus_num(vdev);
int cur_slot = vme_slot_get(vdev);
for (i = 0; i < bus_num; i++)
if ((cur_bus == bus[i]) && (cur_slot == vdev->num))
return 1;
return 0;
} }
/* /*
......
...@@ -1293,6 +1293,19 @@ int vme_slot_get(struct vme_dev *vdev) ...@@ -1293,6 +1293,19 @@ int vme_slot_get(struct vme_dev *vdev)
} }
EXPORT_SYMBOL(vme_slot_get); EXPORT_SYMBOL(vme_slot_get);
int vme_bus_num(struct vme_dev *vdev)
{
struct vme_bridge *bridge;
bridge = vdev->bridge;
if (bridge == NULL) {
pr_err("Can't find VME bus\n");
return -EINVAL;
}
return bridge->num;
}
EXPORT_SYMBOL(vme_bus_num);
/* - Bridge Registration --------------------------------------------------- */ /* - Bridge Registration --------------------------------------------------- */
......
...@@ -165,6 +165,7 @@ int vme_lm_detach(struct vme_resource *, int); ...@@ -165,6 +165,7 @@ int vme_lm_detach(struct vme_resource *, int);
void vme_lm_free(struct vme_resource *); void vme_lm_free(struct vme_resource *);
int vme_slot_get(struct vme_dev *); int vme_slot_get(struct vme_dev *);
int vme_bus_num(struct vme_dev *);
int vme_register_driver(struct vme_driver *, unsigned int); int vme_register_driver(struct vme_driver *, unsigned int);
void vme_unregister_driver(struct vme_driver *); void vme_unregister_driver(struct vme_driver *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment