diff options
author | Manohar Vanga | 2011-09-01 11:15:24 +0200 |
---|---|---|
committer | Greg Kroah-Hartman | 2011-09-09 22:26:32 +0200 |
commit | f6c39d4f2d350df049a844b658eb6b08c5833e51 (patch) | |
tree | 3496f6bffafffe081246da0bdcdf0ed9204ac1bd /drivers/staging/vme | |
parent | staging: r8712u: Most return-values changed from -1 to proper errno macros. (diff) | |
download | kernel-qcow2-linux-f6c39d4f2d350df049a844b658eb6b08c5833e51.tar.gz kernel-qcow2-linux-f6c39d4f2d350df049a844b658eb6b08c5833e51.tar.xz kernel-qcow2-linux-f6c39d4f2d350df049a844b658eb6b08c5833e51.zip |
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>
Diffstat (limited to 'drivers/staging/vme')
-rw-r--r-- | drivers/staging/vme/vme.c | 21 | ||||
-rw-r--r-- | drivers/staging/vme/vme_bridge.h | 2 |
2 files changed, 18 insertions, 5 deletions
diff --git a/drivers/staging/vme/vme.c b/drivers/staging/vme/vme.c index b2968f8588ff..63a8fa2ebc07 100644 --- a/drivers/staging/vme/vme.c +++ b/drivers/staging/vme/vme.c @@ -1338,6 +1338,11 @@ static void vme_remove_bus(struct vme_bridge *bridge) mutex_unlock(&vme_buses_lock); } +static void vme_dev_release(struct device *dev) +{ + kfree(dev); +} + int vme_register_bridge(struct vme_bridge *bridge) { struct device *dev; @@ -1353,11 +1358,17 @@ int vme_register_bridge(struct vme_bridge *bridge) * specification. */ 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)); dev->parent = bridge->parent; dev->bus = &vme_bus_type; + dev->release = vme_dev_release; /* * 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 @@ -1374,8 +1385,10 @@ int vme_register_bridge(struct vme_bridge *bridge) return retval; err_reg: + kfree(dev); +err_devalloc: while (--i >= 0) { - dev = &bridge->dev[i]; + dev = bridge->dev[i]; device_unregister(dev); } vme_remove_bus(bridge); @@ -1390,7 +1403,7 @@ void vme_unregister_bridge(struct vme_bridge *bridge) for (i = 0; i < VME_SLOTS_MAX; i++) { - dev = &bridge->dev[i]; + dev = bridge->dev[i]; device_unregister(dev); } vme_remove_bus(bridge); @@ -1427,7 +1440,7 @@ static int vme_calc_slot(struct device *dev) /* Determine slot number */ num = 0; while (num < VME_SLOTS_MAX) { - if (&bridge->dev[num] == dev) + if (bridge->dev[num] == dev) break; num++; diff --git a/drivers/staging/vme/vme_bridge.h b/drivers/staging/vme/vme_bridge.h index 895967058297..4b8566eb7e34 100644 --- a/drivers/staging/vme/vme_bridge.h +++ b/drivers/staging/vme/vme_bridge.h @@ -114,7 +114,7 @@ struct vme_bridge { void *driver_priv; /* Private pointer for the bridge driver */ 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 */ |