@@ -83,8 +83,8 @@ static int mcb_remove(struct device *dev)
83
83
84
84
static void mcb_shutdown (struct device * dev )
85
85
{
86
+ struct mcb_driver * mdrv = to_mcb_driver (dev -> driver );
86
87
struct mcb_device * mdev = to_mcb_device (dev );
87
- struct mcb_driver * mdrv = mdev -> driver ;
88
88
89
89
if (mdrv && mdrv -> shutdown )
90
90
mdrv -> shutdown (mdev );
@@ -214,6 +214,7 @@ int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev)
214
214
int device_id ;
215
215
216
216
device_initialize (& dev -> dev );
217
+ mcb_bus_get (bus );
217
218
dev -> dev .bus = & mcb_bus_type ;
218
219
dev -> dev .parent = bus -> dev .parent ;
219
220
dev -> dev .release = mcb_release_dev ;
@@ -237,6 +238,15 @@ int mcb_device_register(struct mcb_bus *bus, struct mcb_device *dev)
237
238
}
238
239
EXPORT_SYMBOL_GPL (mcb_device_register );
239
240
241
+ static void mcb_free_bus (struct device * dev )
242
+ {
243
+ struct mcb_bus * bus = to_mcb_bus (dev );
244
+
245
+ put_device (bus -> carrier );
246
+ ida_simple_remove (& mcb_ida , bus -> bus_nr );
247
+ kfree (bus );
248
+ }
249
+
240
250
/**
241
251
* mcb_alloc_bus() - Allocate a new @mcb_bus
242
252
*
@@ -259,12 +269,13 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
259
269
}
260
270
261
271
bus -> bus_nr = bus_nr ;
262
- bus -> carrier = carrier ;
272
+ bus -> carrier = get_device ( carrier ) ;
263
273
264
274
device_initialize (& bus -> dev );
265
275
bus -> dev .parent = carrier ;
266
276
bus -> dev .bus = & mcb_bus_type ;
267
277
bus -> dev .type = & mcb_carrier_device_type ;
278
+ bus -> dev .release = & mcb_free_bus ;
268
279
269
280
dev_set_name (& bus -> dev , "mcb:%d" , bus_nr );
270
281
rc = device_add (& bus -> dev );
@@ -273,6 +284,7 @@ struct mcb_bus *mcb_alloc_bus(struct device *carrier)
273
284
274
285
return bus ;
275
286
err_free :
287
+ put_device (carrier );
276
288
kfree (bus );
277
289
return ERR_PTR (rc );
278
290
}
@@ -297,10 +309,6 @@ static void mcb_devices_unregister(struct mcb_bus *bus)
297
309
void mcb_release_bus (struct mcb_bus * bus )
298
310
{
299
311
mcb_devices_unregister (bus );
300
-
301
- ida_simple_remove (& mcb_ida , bus -> bus_nr );
302
-
303
- kfree (bus );
304
312
}
305
313
EXPORT_SYMBOL_GPL (mcb_release_bus );
306
314
0 commit comments