Skip to content

Commit

Permalink
[POWERPC] Fix snd-powermac refcounting bugs
Browse files Browse the repository at this point in the history
The old snd-powermac driver has some serious refcounting issues when
initialisation fails, which is the case on all new machines with
a layout-id since those are handled by the new snd-aoa driver.

Some of those bugs seem to have been under the radar for some time
(like double pci_dev_put), but one was actually added in 2.6.22 with
Stephen attempt at teaching refcounting to the driver which didn't
do it at all.

This patch fixes both, thus removing all sort of kref errors that
would happen if that driver gets loaded on a G5 machine or a recent
PowerBook due to OF nodes left around with a 0 refcount.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
ozbenh authored and paulusmack committed Jun 19, 2007
1 parent fa490cf commit 41e904d
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions sound/ppc/pmac.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,7 +775,8 @@ static int snd_pmac_free(struct snd_pmac *chip)
out_le32(&chip->awacs->control, in_le32(&chip->awacs->control) & 0xfff);
}

snd_pmac_sound_feature(chip, 0);
if (chip->node)
snd_pmac_sound_feature(chip, 0);

/* clean up mixer if any */
if (chip->mixer_free)
Expand Down Expand Up @@ -925,6 +926,7 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
}
if (! sound) {
of_node_put(chip->node);
chip->node = NULL;
return -ENODEV;
}
prop = of_get_property(sound, "sub-frame", NULL);
Expand All @@ -937,7 +939,9 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
printk(KERN_INFO "snd-powermac no longer handles any "
"machines with a layout-id property "
"in the device-tree, use snd-aoa.\n");
of_node_put(sound);
of_node_put(chip->node);
chip->node = NULL;
return -ENODEV;
}
/* This should be verified on older screamers */
Expand Down Expand Up @@ -1297,8 +1301,6 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return)
return 0;

__error:
if (chip->pdev)
pci_dev_put(chip->pdev);
snd_pmac_free(chip);
return err;
}
Expand Down

0 comments on commit 41e904d

Please sign in to comment.