| .. | .. |
|---|
| 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) |
|---|