Commit 9ae250d1 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds

[PATCH] ppc32: Fix Alsa PowerMac driver on old machines

The g5 support code broke some earlier models unfortunately as those bail
out early from the detect function, before the point where I added the code
to locate the PCI device for use with DMA allocations.

This patch fixes it.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d6649bc7
...@@ -876,7 +876,7 @@ static void __init detect_byte_swap(pmac_t *chip) ...@@ -876,7 +876,7 @@ static void __init detect_byte_swap(pmac_t *chip)
*/ */
static int __init snd_pmac_detect(pmac_t *chip) static int __init snd_pmac_detect(pmac_t *chip)
{ {
struct device_node *sound; struct device_node *sound = NULL;
unsigned int *prop, l; unsigned int *prop, l;
struct macio_chip* macio; struct macio_chip* macio;
...@@ -906,12 +906,13 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -906,12 +906,13 @@ static int __init snd_pmac_detect(pmac_t *chip)
chip->is_pbook_G3 = 1; chip->is_pbook_G3 = 1;
chip->node = find_devices("awacs"); chip->node = find_devices("awacs");
if (chip->node) if (chip->node)
return 0; /* ok */ sound = chip->node;
/* /*
* powermac G3 models have a node called "davbus" * powermac G3 models have a node called "davbus"
* with a child called "sound". * with a child called "sound".
*/ */
if (!chip->node)
chip->node = find_devices("davbus"); chip->node = find_devices("davbus");
/* /*
* if we didn't find a davbus device, try 'i2s-a' since * if we didn't find a davbus device, try 'i2s-a' since
...@@ -919,7 +920,8 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -919,7 +920,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
*/ */
if (! chip->node) { if (! chip->node) {
chip->node = find_devices("i2s-a"); chip->node = find_devices("i2s-a");
if (chip->node && chip->node->parent && chip->node->parent->parent) { if (chip->node && chip->node->parent &&
chip->node->parent->parent) {
if (device_is_compatible(chip->node->parent->parent, if (device_is_compatible(chip->node->parent->parent,
"K2-Keylargo")) "K2-Keylargo"))
chip->is_k2 = 1; chip->is_k2 = 1;
...@@ -928,9 +930,11 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -928,9 +930,11 @@ static int __init snd_pmac_detect(pmac_t *chip)
if (! chip->node) if (! chip->node)
return -ENODEV; return -ENODEV;
if (!sound) {
sound = find_devices("sound"); sound = find_devices("sound");
while (sound && sound->parent != chip->node) while (sound && sound->parent != chip->node)
sound = sound->next; sound = sound->next;
}
if (! sound) if (! sound)
return -ENODEV; return -ENODEV;
prop = (unsigned int *) get_property(sound, "sub-frame", NULL); prop = (unsigned int *) get_property(sound, "sub-frame", NULL);
...@@ -1019,7 +1023,8 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -1019,7 +1023,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
} }
} }
if (chip->pdev == NULL) if (chip->pdev == NULL)
printk(KERN_WARNING "snd-powermac: can't locate macio PCI device !\n"); printk(KERN_WARNING "snd-powermac: can't locate macio PCI"
" device !\n");
detect_byte_swap(chip); detect_byte_swap(chip);
...@@ -1027,7 +1032,8 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -1027,7 +1032,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
are available */ are available */
prop = (unsigned int *) get_property(sound, "sample-rates", &l); prop = (unsigned int *) get_property(sound, "sample-rates", &l);
if (! prop) if (! prop)
prop = (unsigned int *) get_property(sound, "output-frame-rates", &l); prop = (unsigned int *) get_property(sound,
"output-frame-rates", &l);
if (prop) { if (prop) {
int i; int i;
chip->freqs_ok = 0; chip->freqs_ok = 0;
...@@ -1054,7 +1060,8 @@ static int __init snd_pmac_detect(pmac_t *chip) ...@@ -1054,7 +1060,8 @@ static int __init snd_pmac_detect(pmac_t *chip)
/* /*
* exported - boolean info callbacks for ease of programming * exported - boolean info callbacks for ease of programming
*/ */
int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol,
snd_ctl_elem_info_t *uinfo)
{ {
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
uinfo->count = 2; uinfo->count = 2;
...@@ -1063,7 +1070,8 @@ int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * ...@@ -1063,7 +1070,8 @@ int snd_pmac_boolean_stereo_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *
return 0; return 0;
} }
int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo) int snd_pmac_boolean_mono_info(snd_kcontrol_t *kcontrol,
snd_ctl_elem_info_t *uinfo)
{ {
uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
uinfo->count = 1; uinfo->count = 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment