aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2007-06-19 00:37:39 -0400
committerPaul Mackerras <paulus@samba.org>2007-06-19 00:54:56 -0400
commit41e904dee22066ae7ac3a7f695b2c8bd43ce4e04 (patch)
tree8ca1aed7100da0f683cea3155a092c5252e2e8eb
parentfa490cfd15d7ce0900097cc4e60cfd7a76381138 (diff)
[POWERPC] Fix snd-powermac refcounting bugs
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>
-rw-r--r--sound/ppc/pmac.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sound/ppc/pmac.c b/sound/ppc/pmac.c
index 5a2bef44a2f5..7a22f0f3784a 100644
--- a/sound/ppc/pmac.c
+++ b/sound/ppc/pmac.c
@@ -775,7 +775,8 @@ static int snd_pmac_free(struct snd_pmac *chip)
775 out_le32(&chip->awacs->control, in_le32(&chip->awacs->control) & 0xfff); 775 out_le32(&chip->awacs->control, in_le32(&chip->awacs->control) & 0xfff);
776 } 776 }
777 777
778 snd_pmac_sound_feature(chip, 0); 778 if (chip->node)
779 snd_pmac_sound_feature(chip, 0);
779 780
780 /* clean up mixer if any */ 781 /* clean up mixer if any */
781 if (chip->mixer_free) 782 if (chip->mixer_free)
@@ -925,6 +926,7 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
925 } 926 }
926 if (! sound) { 927 if (! sound) {
927 of_node_put(chip->node); 928 of_node_put(chip->node);
929 chip->node = NULL;
928 return -ENODEV; 930 return -ENODEV;
929 } 931 }
930 prop = of_get_property(sound, "sub-frame", NULL); 932 prop = of_get_property(sound, "sub-frame", NULL);
@@ -937,7 +939,9 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
937 printk(KERN_INFO "snd-powermac no longer handles any " 939 printk(KERN_INFO "snd-powermac no longer handles any "
938 "machines with a layout-id property " 940 "machines with a layout-id property "
939 "in the device-tree, use snd-aoa.\n"); 941 "in the device-tree, use snd-aoa.\n");
942 of_node_put(sound);
940 of_node_put(chip->node); 943 of_node_put(chip->node);
944 chip->node = NULL;
941 return -ENODEV; 945 return -ENODEV;
942 } 946 }
943 /* This should be verified on older screamers */ 947 /* This should be verified on older screamers */
@@ -1297,8 +1301,6 @@ int __init snd_pmac_new(struct snd_card *card, struct snd_pmac **chip_return)
1297 return 0; 1301 return 0;
1298 1302
1299 __error: 1303 __error:
1300 if (chip->pdev)
1301 pci_dev_put(chip->pdev);
1302 snd_pmac_free(chip); 1304 snd_pmac_free(chip);
1303 return err; 1305 return err;
1304} 1306}