staging: vme: change static device array to pointers

Change the static array of 'struct device''s in struct vme_bridge
to instead use an array of pointers. This is in accordance with the
requirement that all kobjects be dynamically allocated (see
Documentation/kobject.txt) and never be statically allocated.

Signed-off-by: Manohar Vanga <manohar.vanga@cern.ch>
Acked-by: Martyn Welch <martyn.welch@ge.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Manohar Vanga 2011-09-01 11:15:24 +02:00 committed by Greg Kroah-Hartman
parent 2192e60654
commit f6c39d4f2d
2 changed files with 18 additions and 5 deletions

View File

@ -1338,6 +1338,11 @@ static void vme_remove_bus(struct vme_bridge *bridge)
mutex_unlock(&vme_buses_lock); mutex_unlock(&vme_buses_lock);
} }
static void vme_dev_release(struct device *dev)
{
kfree(dev);
}
int vme_register_bridge(struct vme_bridge *bridge) int vme_register_bridge(struct vme_bridge *bridge)
{ {
struct device *dev; struct device *dev;
@ -1353,11 +1358,17 @@ int vme_register_bridge(struct vme_bridge *bridge)
* specification. * specification.
*/ */
for (i = 0; i < VME_SLOTS_MAX; i++) { for (i = 0; i < VME_SLOTS_MAX; i++) {
dev = &bridge->dev[i]; bridge->dev[i] = kzalloc(sizeof(struct device), GFP_KERNEL);
if (!bridge->dev[i]) {
retval = -ENOMEM;
goto err_devalloc;
}
dev = bridge->dev[i];
memset(dev, 0, sizeof(struct device)); memset(dev, 0, sizeof(struct device));
dev->parent = bridge->parent; dev->parent = bridge->parent;
dev->bus = &vme_bus_type; dev->bus = &vme_bus_type;
dev->release = vme_dev_release;
/* /*
* We save a pointer to the bridge in platform_data so that we * We save a pointer to the bridge in platform_data so that we
* can get to it later. We keep driver_data for use by the * can get to it later. We keep driver_data for use by the
@ -1374,8 +1385,10 @@ int vme_register_bridge(struct vme_bridge *bridge)
return retval; return retval;
err_reg: err_reg:
kfree(dev);
err_devalloc:
while (--i >= 0) { while (--i >= 0) {
dev = &bridge->dev[i]; dev = bridge->dev[i];
device_unregister(dev); device_unregister(dev);
} }
vme_remove_bus(bridge); vme_remove_bus(bridge);
@ -1390,7 +1403,7 @@ void vme_unregister_bridge(struct vme_bridge *bridge)
for (i = 0; i < VME_SLOTS_MAX; i++) { for (i = 0; i < VME_SLOTS_MAX; i++) {
dev = &bridge->dev[i]; dev = bridge->dev[i];
device_unregister(dev); device_unregister(dev);
} }
vme_remove_bus(bridge); vme_remove_bus(bridge);
@ -1427,7 +1440,7 @@ static int vme_calc_slot(struct device *dev)
/* Determine slot number */ /* Determine slot number */
num = 0; num = 0;
while (num < VME_SLOTS_MAX) { while (num < VME_SLOTS_MAX) {
if (&bridge->dev[num] == dev) if (bridge->dev[num] == dev)
break; break;
num++; num++;

View File

@ -114,7 +114,7 @@ struct vme_bridge {
void *driver_priv; /* Private pointer for the bridge driver */ void *driver_priv; /* Private pointer for the bridge driver */
struct list_head bus_list; /* list of VME buses */ struct list_head bus_list; /* list of VME buses */
struct device dev[VME_SLOTS_MAX]; /* Device registered with struct device *dev[VME_SLOTS_MAX]; /* Device registered with
* device model on VME bus * device model on VME bus
*/ */