.. | .. |
---|
346 | 346 | return -ENOMEM; |
---|
347 | 347 | kobject_init(kobj, &widget_ktype); |
---|
348 | 348 | err = kobject_add(kobj, parent, "%02x", nid); |
---|
349 | | - if (err < 0) |
---|
| 349 | + if (err < 0) { |
---|
| 350 | + kobject_put(kobj); |
---|
350 | 351 | return err; |
---|
| 352 | + } |
---|
351 | 353 | err = sysfs_create_group(kobj, group); |
---|
352 | 354 | if (err < 0) { |
---|
353 | 355 | kobject_put(kobj); |
---|
.. | .. |
---|
395 | 397 | return 0; |
---|
396 | 398 | } |
---|
397 | 399 | |
---|
| 400 | +/* call with codec->widget_lock held */ |
---|
398 | 401 | int hda_widget_sysfs_init(struct hdac_device *codec) |
---|
399 | 402 | { |
---|
400 | 403 | int err; |
---|
.. | .. |
---|
411 | 414 | return 0; |
---|
412 | 415 | } |
---|
413 | 416 | |
---|
| 417 | +/* call with codec->widget_lock held */ |
---|
414 | 418 | void hda_widget_sysfs_exit(struct hdac_device *codec) |
---|
415 | 419 | { |
---|
416 | 420 | widget_tree_free(codec); |
---|
417 | 421 | } |
---|
418 | 422 | |
---|
| 423 | +/* call with codec->widget_lock held */ |
---|
419 | 424 | int hda_widget_sysfs_reinit(struct hdac_device *codec, |
---|
420 | 425 | hda_nid_t start_nid, int num_nodes) |
---|
421 | 426 | { |
---|
.. | .. |
---|
425 | 430 | int i; |
---|
426 | 431 | |
---|
427 | 432 | if (!codec->widgets) |
---|
428 | | - return hda_widget_sysfs_init(codec); |
---|
| 433 | + return 0; |
---|
429 | 434 | |
---|
430 | 435 | tree = kmemdup(codec->widgets, sizeof(*tree), GFP_KERNEL); |
---|
431 | 436 | if (!tree) |
---|