From f6c39d4f2d350df049a844b658eb6b08c5833e51 Mon Sep 17 00:00:00 2001 From: Manohar Vanga Date: Thu, 1 Sep 2011 11:15:24 +0200 Subject: [PATCH] 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 Acked-by: Martyn Welch Signed-off-by: Greg Kroah-Hartman --- drivers/staging/vme/vme.c | 21 +++++++++++++++++---- 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 b2968f8588f..63a8fa2ebc0 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 89596705829..4b8566eb7e3 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 */ -- 2.39.5