summaryrefslogtreecommitdiff
path: root/sound/ppc/tumbler.c
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2005-04-17 02:24:31 +0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-17 02:24:31 +0400
commitb75550e1bc6b3b2c80b628e68628fca015634071 (patch)
treec5de5583d713c4cd682cb253fd74bd031d810f9c /sound/ppc/tumbler.c
parent16b817579fb61050f1abcc0e81089974328a9c27 (diff)
downloadlinux-b75550e1bc6b3b2c80b628e68628fca015634071.tar.xz
[PATCH] pmac: sound support for latest laptops
This patch hacks the current Alsa snd-powermac driver to add support for recent machine models with the tas3004 chip, that is basically new laptop models. The Mac Mini is _NOT_ yet supported by this patch (soon soon ...). The G5s (iMac or Desktop) will need the rewritten sound driver on which I'm working on (I _might_ get a hack for analog only on some G5s on the current driver, but no promise). Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'sound/ppc/tumbler.c')
-rw-r--r--sound/ppc/tumbler.c46
1 files changed, 33 insertions, 13 deletions
diff --git a/sound/ppc/tumbler.c b/sound/ppc/tumbler.c
index 7d10385f0a76..72a2219f56b5 100644
--- a/sound/ppc/tumbler.c
+++ b/sound/ppc/tumbler.c
@@ -37,6 +37,8 @@
#include <asm/irq.h>
#ifdef CONFIG_PPC_HAS_FEATURE_CALLS
#include <asm/pmac_feature.h>
+#else
+#error old crap
#endif
#include "pmac.h"
#include "tumbler_volume.h"
@@ -950,10 +952,10 @@ static struct device_node *find_compatible_audio_device(const char *name)
}
/* find an audio device and get its address */
-static unsigned long tumbler_find_device(const char *device, pmac_gpio_t *gp, int is_compatible)
+static long tumbler_find_device(const char *device, pmac_gpio_t *gp, int is_compatible)
{
struct device_node *node;
- u32 *base;
+ u32 *base, addr;
if (is_compatible)
node = find_compatible_audio_device(device);
@@ -966,21 +968,31 @@ static unsigned long tumbler_find_device(const char *device, pmac_gpio_t *gp, in
base = (u32 *)get_property(node, "AAPL,address", NULL);
if (! base) {
- snd_printd("cannot find address for device %s\n", device);
- return -ENODEV;
- }
+ base = (u32 *)get_property(node, "reg", NULL);
+ if (!base) {
+ snd_printd("cannot find address for device %s\n", device);
+ return -ENODEV;
+ }
+ /* this only work if PPC_HAS_FEATURE_CALLS is set as we
+ * are only getting the low part of the address
+ */
+ addr = *base;
+ if (addr < 0x50)
+ addr += 0x50;
+ } else
+ addr = *base;
#ifdef CONFIG_PPC_HAS_FEATURE_CALLS
- gp->addr = (*base) & 0x0000ffff;
+ gp->addr = addr & 0x0000ffff;
#else
- gp->addr = ioremap((unsigned long)(*base), 1);
+ gp->addr = ioremap((unsigned long)addr, 1);
#endif
+ /* Try to find the active state, default to 0 ! */
base = (u32 *)get_property(node, "audio-gpio-active-state", NULL);
if (base)
gp->active_state = *base;
else
- gp->active_state = 1;
-
+ gp->active_state = 0;
return (node->n_intrs > 0) ? node->intrs[0].line : 0;
}
@@ -1039,11 +1051,16 @@ static int __init tumbler_init(pmac_t *chip)
pmac_tumbler_t *mix = chip->mixer_data;
snd_assert(mix, return -EINVAL);
- tumbler_find_device("audio-hw-reset", &mix->audio_reset, 0);
- tumbler_find_device("amp-mute", &mix->amp_mute, 0);
- tumbler_find_device("headphone-mute", &mix->hp_mute, 0);
+ if (tumbler_find_device("audio-hw-reset", &mix->audio_reset, 0) < 0)
+ tumbler_find_device("hw-reset", &mix->audio_reset, 1);
+ if (tumbler_find_device("amp-mute", &mix->amp_mute, 0) < 0)
+ tumbler_find_device("amp-mute", &mix->amp_mute, 1);
+ if (tumbler_find_device("headphone-mute", &mix->hp_mute, 0) < 0)
+ tumbler_find_device("headphone-mute", &mix->hp_mute, 1);
irq = tumbler_find_device("headphone-detect", &mix->hp_detect, 0);
if (irq < 0)
+ irq = tumbler_find_device("headphone-detect", &mix->hp_detect, 1);
+ if (irq < 0)
irq = tumbler_find_device("keywest-gpio15", &mix->hp_detect, 1);
tumbler_reset_audio(chip);
@@ -1109,9 +1126,13 @@ int __init snd_pmac_tumbler_init(pmac_t *chip)
/* set up TAS */
tas_node = find_devices("deq");
if (tas_node == NULL)
+ tas_node = find_devices("codec");
+ if (tas_node == NULL)
return -ENODEV;
paddr = (u32 *)get_property(tas_node, "i2c-address", NULL);
+ if (paddr == NULL)
+ paddr = (u32 *)get_property(tas_node, "reg", NULL);
if (paddr)
mix->i2c.addr = (*paddr) >> 1;
else
@@ -1156,7 +1177,6 @@ int __init snd_pmac_tumbler_init(pmac_t *chip)
if ((err = snd_ctl_add(chip->card, chip->drc_sw_ctl)) < 0)
return err;
-
#ifdef CONFIG_PMAC_PBOOK
chip->resume = tumbler_resume;
#endif