On 01/09/11 10:15, Manohar Vanga wrote: > 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@xxxxxxx> Acked-by: Martyn Welch <martyn.welch@xxxxxx> > --- > 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 feb2d00..810fe1f 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 8959670..4b8566e 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 > */ > -- Martyn Welch (Principal Software Engineer) | Registered in England and GE Intelligent Platforms | Wales (3828642) at 100 T +44(0)1327322748 | Barbirolli Square, Manchester, E martyn.welch@xxxxxx | M2 3AB VAT:GB 927559189 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel