ppc64: very basic desktop g5 sound support (#2)
PATCH 1/1 ppc64: very basic desktop g5 sound support (#2)
Hi !
(Andrew: This is an update of the previous patch, it fixes a problem with headphone beeing incorrectly muted on some models).
This patch hacks the current PowerMac Alsa driver to add some basic support of analog sound output to some desktop G5s. It has severe limitations though:
- Only 44100Khz 16 bits
- Only work on G5 models using a TAS3004 analog code, that is early single CPU desktops and all dual CPU desktops at this date, but none of the more recent ones like iMac G5.
- It does analog only, no digital/SPDIF support at all, no native AC3 support
Better support would require a complete rewrite of the driver (which I am working on, but don't hold your breath), to properly support the diversity of apple sound HW setup, including dual codecs, several i2s busses, all the new codecs used in the new machines, proper clock switching with digital, etc etc etc...
This patch applies on top of the other PowerMac sound patches I posted in the past couple of days (new powerbook support and sleep fixes).
Note: This is a FAQ entry for PowerMac sound support with TI codecs:
They have a feature called "DRC" which is automatically enabled for the internal speaker (at least when auto mute control is enabled) which will cause your sound to fade out to nothing after half a second of playback if you don't set a proper "DRC Range" in the mixer. So if you have a problem like that, check alsamixer and raise your DRC Range to something reasonable.
Note2: This patch will also add auto-mute of the speaker when line-out jack is used on some earlier desktop G4s (and on the G5) in addition to the headphone jack. If that behaviour isn't what you want, just disable auto-muting and use the manual mute controls in alsamixer.
sound/ppc/pmac.c +119 -58
@@ -27,14 +27,13 @@#include <linux/delay.h> #include <linux/slab.h> #include <linux/interrupt.h> +#include <linux/pci.h> +#include <linux/dma-mapping.h> #include <sound/core.h> #include "pmac.h" #include <sound/pcm_params.h> -#ifdef CONFIG_PPC_HAS_FEATURE_CALLS #include <asm/pmac_feature.h> -#else -#include <asm/feature.h> -#endif +#include <asm/pci-bridge.h> #if defined(CONFIG_PM ) && defined(CONFIG_PMAC_PBOOK )
@@ -57,22 +56,29 @@/* * allocate DBDMA command arrays */ -static int snd_pmac_dbdma_alloc (pmac_dbdma_t *rec,int size) +static int snd_pmac_dbdma_alloc (pmac_t *chip,pmac_dbdma_t *rec,int size) { - rec->space =kmalloc (sizeof (struct dbdma_cmd ) * (size +1 ),GFP_KERNEL ); +unsigned int rsize =sizeof (struct dbdma_cmd ) * (size +1 ); + + rec->space =dma_alloc_coherent (&chip->pdev->dev, rsize, + &rec->dma_base,GFP_KERNEL );if (rec->space ==NULL )return -ENOMEM ; rec->size = size; -memset (rec->space,0 ,sizeof (struct dbdma_cmd ) * (size +1 )); +memset (rec->space,0 , rsize); rec->cmds = (void __iomem *)DBDMA_ALIGN (rec->space); - rec->addr =virt_to_bus (rec->cmds); + rec->addr = rec->dma_base + (unsigned long )((char *)rec->cmds - (char *)rec->space); +return 0 ; } -static void snd_pmac_dbdma_free (pmac_dbdma_t *rec) +static void snd_pmac_dbdma_free (pmac_t *chip,pmac_dbdma_t *rec) { -if (rec) -kfree (rec->space); +if (rec) { +unsigned int rsize =sizeof (struct dbdma_cmd ) * (rec->size +1 ); + +dma_free_coherent (&chip->pdev->dev, rsize, rec->space, rec->dma_base); + } }
@@ -237,7 +243,7 @@/* continuous DMA memory type doesn't provide the physical address, * so we need to resolve the address here... */ - offset =virt_to_bus (runtime->dma_area); + offset = runtime->dma_addr;for (i =0 , cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++) {st_le32 (&cp->phy_addr, offset);st_le16 (&cp->req_count, rec->period_size);
@@ -664,8 +670,8 @@ chip->capture.cur_freqs = chip->freqs_ok;/* preallocate 64k buffer */ -snd_pcm_lib_preallocate_pages_for_all (pcm,SNDRV_DMA_TYPE_CONTINUOUS , -snd_dma_continuous_data (GFP_KERNEL ), +snd_pcm_lib_preallocate_pages_for_all (pcm,SNDRV_DMA_TYPE_DEV , + &chip->pdev->dev,64 *1024 ,64 *1024 );return 0 ;
@@ -757,28 +763,10 @@/* * a wrapper to feature call for compatibility */ -#if defined(CONFIG_PM ) && defined(CONFIG_PMAC_PBOOK )static void snd_pmac_sound_feature (pmac_t *chip,int enable) { -#ifdef CONFIG_PPC_HAS_FEATURE_CALLS ppc_md.feature_call (PMAC_FTR_SOUND_CHIP_ENABLE , chip->node,0 , enable); -#else -if (chip->is_pbook_G3) { -pmu_suspend (); -feature_clear (chip->node, FEATURE_Sound_power); -feature_clear (chip->node, FEATURE_Sound_CLK_enable); -big_mdelay (1000 );/* XXX */ -pmu_resume (); - } -if (chip->is_pbook_3400) { -feature_set (chip->node, FEATURE_IOBUS_enable); -udelay (10 ); - } -#endif } -#else /* CONFIG_PM && CONFIG_PMAC_PBOOK */ -#define snd_pmac_sound_feature (chip,enable)/**/ -#endif /* CONFIG_PM && CONFIG_PMAC_PBOOK */ /* * release resources
@@ -786,8 +774,6 @@static int snd_pmac_free (pmac_t *chip) { -int i; -/* stop sounds */ if (chip->initialized) {snd_pmac_dbdma_reset (chip);
@@ -813,9 +799,9 @@free_irq (chip->tx_irq, (void *)chip);if (chip->rx_irq >=0 )free_irq (chip->rx_irq, (void *)chip); -snd_pmac_dbdma_free (&chip->playback.cmd); -snd_pmac_dbdma_free (&chip->capture.cmd); -snd_pmac_dbdma_free (&chip->extra_dma); +snd_pmac_dbdma_free (chip, &chip->playback.cmd); +snd_pmac_dbdma_free (chip, &chip->capture.cmd); +snd_pmac_dbdma_free (chip, &chip->extra_dma);if (chip->macio_base)iounmap (chip->macio_base);if (chip->latch_base)
@@ -826,12 +812,23 @@iounmap (chip->playback.dma);if (chip->capture.dma)iounmap (chip->capture.dma); +#ifndef CONFIG_PPC64 if (chip->node) { +int i; +for (i =0 ; i <3 ; i++) { -if (chip->of_requested & (1 << i)) -release_OF_resource (chip->node, i); +if (chip->of_requested & (1 << i)) { +if (chip->is_k2) +release_OF_resource (chip->node->parent, + i); +else +release_OF_resource (chip->node, i); + } } } +#endif /* CONFIG_PPC64 */ +if (chip->pdev) +pci_dev_put (chip->pdev);kfree (chip);return 0 ; }
@@ -881,6 +878,8 @@ {struct device_node *sound;unsigned int *prop, l; +struct macio_chip * macio; +u32 layout_id =0 ;if (_machine != _MACH_Pmac)
@@ -918,10 +917,17 @@* if we didn't find a davbus device, try 'i2s-a' since * this seems to be what iBooks have */ -if (! chip->node) +if (! chip->node) { chip->node =find_devices ("i2s-a" ); +if (chip->node && chip->node->parent && chip->node->parent->parent) { +if (device_is_compatible (chip->node->parent->parent, +"K2-Keylargo" )) + chip->is_k2 =1 ; + } + }if (! chip->node)return -ENODEV ; + sound =find_devices ("sound" );while (sound && sound->parent != chip->node) sound = sound->next;
@@ -966,7 +972,8 @@ chip->control_mask =MASK_IEPC |0x11 ;/* disable IEE */ }if (device_is_compatible (sound,"AOAKeylargo" ) || -device_is_compatible (sound,"AOAbase" )) { +device_is_compatible (sound,"AOAbase" ) || +device_is_compatible (sound,"AOAK2" )) {/* For now, only support very basic TAS3004 based machines with * single frequency until proper i2s control is implemented */
@@ -975,6 +982,7 @@case 0x46 :case 0x33 :case 0x29 : +case 0x24 : chip->num_freqs =ARRAY_SIZE (tumbler_freqs); chip->model =PMAC_SNAPPER ; chip->can_byte_swap =0 ;/* FIXME: check this */
@@ -987,6 +995,26 @@ chip->device_id = *prop; chip->has_iic = (find_devices ("perch" ) !=NULL ); +/* We need the PCI device for DMA allocations, let's use a crude method +* for now ... +*/ + macio =macio_find (chip->node, macio_unknown); +if (macio ==NULL ) +printk (KERN_WARNING "snd-powermac: can't locate macio !\n" ); +else { +struct pci_dev *pdev =NULL ; + +for_each_pci_dev (pdev) { +struct device_node *np =pci_device_to_OF_node (pdev); +if (np && np == macio->of_node) { + chip->pdev = pdev; +break ; + } + } + } +if (chip->pdev ==NULL ) +printk (KERN_WARNING "snd-powermac: can't locate macio PCI device !\n" ); +detect_byte_swap (chip);/* look for a property saying what sample rates
@@ -1091,8 +1119,10 @@int err; chip->auto_mute =1 ; err =snd_ctl_add (chip->card,snd_ctl_new1 (&auto_mute_controls[0 ], chip)); -if (err <0 ) +if (err <0 ) { +printk (KERN_ERR "snd-powermac: Failed to add automute control\n" );return err; + } chip->hp_detect_ctl =snd_ctl_new1 (&auto_mute_controls[1 ], chip);return snd_ctl_add (chip->card, chip->hp_detect_ctl); }
@@ -1106,6 +1136,7 @@pmac_t *chip;struct device_node *np;int i, err; +unsigned long ctrl_addr, txdma_addr, rxdma_addr;static snd_device_ops_t ops = { .dev_free = snd_pmac_dev_free, };
@@ -1127,32 +1158,59 @@if ((err =snd_pmac_detect (chip)) <0 ) goto __error; -if (snd_pmac_dbdma_alloc (&chip->playback.cmd,PMAC_MAX_FRAGS +1 ) <0 || -snd_pmac_dbdma_alloc (&chip->capture.cmd,PMAC_MAX_FRAGS +1 ) <0 || -snd_pmac_dbdma_alloc (&chip->extra_dma,2 ) <0 ) { +if (snd_pmac_dbdma_alloc (chip, &chip->playback.cmd,PMAC_MAX_FRAGS +1 ) <0 || +snd_pmac_dbdma_alloc (chip, &chip->capture.cmd,PMAC_MAX_FRAGS +1 ) <0 || +snd_pmac_dbdma_alloc (chip, &chip->extra_dma,2 ) <0 ) { err = -ENOMEM ; goto __error; } np = chip->node; -if (np->n_addrs <3 || np->n_intrs <3 ) { - err = -ENODEV ; - goto __error; - } +if (chip->is_k2) { +if (np->parent->n_addrs <2 || np->n_intrs <3 ) { + err = -ENODEV ; + goto __error; + } +for (i =0 ; i <2 ; i++) { +#ifndef CONFIG_PPC64 +static char *name[2 ] = {"- Control" ,"- DMA" }; +if (!request_OF_resource (np->parent, i, name[i])) { +snd_printk (KERN_ERR "pmac: can't request resource %d!\n" , i); + err = -ENODEV ; + goto __error; + } + chip->of_requested |= (1 << i); +#endif /* CONFIG_PPC64 */ + ctrl_addr = np->parent->addrs[0 ].address; + txdma_addr = np->parent->addrs[1 ].address; + rxdma_addr = txdma_addr +0x100 ; + } -for (i =0 ; i <3 ; i++) { -static char *name[3 ] = {NULL ,"- Tx DMA" ,"- Rx DMA" }; -if (!request_OF_resource (np, i, name[i])) { -snd_printk (KERN_ERR "pmac: can't request resource %d!\n" , i); + }else { +if (np->n_addrs <3 || np->n_intrs <3 ) { err = -ENODEV ; goto __error; } - chip->of_requested |= (1 << i); + +for (i =0 ; i <3 ; i++) { +#ifndef CONFIG_PPC64 +static char *name[3 ] = {"- Control" ,"- Tx DMA" ,"- Rx DMA" }; +if (!request_OF_resource (np, i, name[i])) { +snd_printk (KERN_ERR "pmac: can't request resource %d!\n" , i); + err = -ENODEV ; + goto __error; + } + chip->of_requested |= (1 << i); +#endif /* CONFIG_PPC64 */ + ctrl_addr = np->addrs[0 ].address; + txdma_addr = np->addrs[1 ].address; + rxdma_addr = np->addrs[2 ].address; + } } - chip->awacs =ioremap (np->addrs[0 ].address,0x1000 ); - chip->playback.dma =ioremap (np->addrs[1 ].address,0x100 ); - chip->capture.dma =ioremap (np->addrs[2 ].address,0x100 ); + chip->awacs =ioremap (ctrl_addr,0x1000 ); + chip->playback.dma =ioremap (txdma_addr,0x100 ); + chip->capture.dma =ioremap (rxdma_addr,0x100 );if (chip->model <=PMAC_BURGUNDY ) {if (request_irq (np->intrs[0 ].line, snd_pmac_ctrl_intr,0 ,"PMac" , (void *)chip)) {
@@ -1180,7 +1238,8 @@snd_pmac_sound_feature (chip,1 );/* reset */ -out_le32 (&chip->awacs->control,0x11 ); +if (chip->model ==PMAC_AWACS ) +out_le32 (&chip->awacs->control,0x11 );/* Powerbooks have odd ways of enabling inputs such as an expansion-bay CD or sound from an internal modem
@@ -1232,6 +1291,8 @@return 0 ; __error: +if (chip->pdev) +pci_dev_put (chip->pdev);snd_pmac_free (chip);return err; }
sound/ppc/pmac.h +5 -1
@@ -60,7 +60,8 @@* DBDMA space */ struct snd_pmac_dbdma { -unsigned long addr; +dma_addr_t dma_base; +dma_addr_t addr;struct dbdma_cmd __iomem *cmds;void *space;int size;
@@ -101,6 +102,7 @@/* h/w info */ struct device_node *node; +struct pci_dev *pdev;unsigned int revision;unsigned int manufacturer;unsigned int subframe;
@@ -110,6 +112,7 @@ unsigned int has_iic : 1; unsigned int is_pbook_3400 : 1; unsigned int is_pbook_G3 : 1; + unsigned int is_k2 : 1; unsigned int can_byte_swap : 1; unsigned int can_duplex : 1;
@@ -157,6 +160,7 @@snd_kcontrol_t *speaker_sw_ctl;snd_kcontrol_t *drc_sw_ctl;/* only used for tumbler -ReneR */ snd_kcontrol_t *hp_detect_ctl; +snd_kcontrol_t *lineout_sw_ctl;/* lowlevel callbacks */ void (*set_format)(pmac_t *chip);
sound/ppc/tumbler.c +195 -66
471 lines not on this page · raw message
arch/ppc64/kernel/pmac_feature.c +27 -2
@@ -64,8 +64,7 @@*/ struct macio_chip macio_chips[MAX_MACIO_CHIPS] __pmacdata; -struct macio_chip* __pmac -macio_find (struct device_node * child,int type) +struct macio_chip* __pmac macio_find(struct device_node* child, int type) {while (child) {int i;
@@ -78,6 +77,7 @@ }return NULL ; } +EXPORT_SYMBOL_GPL (macio_find); static const char* macio_names[] __pmacdata = {
@@ -250,6 +250,30 @@return 0 ; } +static long __pmac g5_i2s_enable (struct device_node *node,long param,long value) +{ +/* Very crude implementation for now */ +struct macio_chip * macio = &macio_chips[0 ]; +unsigned long flags; + +if (value ==0 ) +return 0 ;/* don't disable yet */ + +LOCK (flags); +MACIO_BIS (KEYLARGO_FCR3 ,KL3_CLK45_ENABLE |KL3_CLK49_ENABLE | +KL3_I2S0_CLK18_ENABLE ); +udelay (10 ); +MACIO_BIS (KEYLARGO_FCR1 ,K2_FCR1_I2S0_CELL_ENABLE | +K2_FCR1_I2S0_CLK_ENABLE_BIT |K2_FCR1_I2S0_ENABLE ); +udelay (10 ); +MACIO_BIC (KEYLARGO_FCR1 ,K2_FCR1_I2S0_RESET ); +UNLOCK (flags); +udelay (10 ); + +return 0 ; +} + +#ifdef CONFIG_SMP static long __pmac g5_reset_cpu (struct device_node * node,long param,long value) {
@@ -337,6 +361,7 @@ { PMAC_FTR_READ_GPIO, g5_read_gpio }, { PMAC_FTR_WRITE_GPIO, g5_write_gpio }, { PMAC_FTR_GMAC_PHY_RESET, g5_eth_phy_reset }, + { PMAC_FTR_SOUND_CHIP_ENABLE, g5_i2s_enable }, #ifdef CONFIG_SMP { PMAC_FTR_RESET_CPU, g5_reset_cpu }, #endif /* CONFIG_SMP */
arch/ppc/platforms/pmac_feature.c +2 -2
@@ -74,8 +74,7 @@*/ struct macio_chip macio_chips[MAX_MACIO_CHIPS] __pmacdata; -struct macio_chip* __pmac -macio_find (struct device_node * child,int type) +struct macio_chip* __pmac macio_find(struct device_node* child, int type) {while (child) {int i;
@@ -88,6 +87,7 @@ }return NULL ; } +EXPORT_SYMBOL_GPL (macio_find); static const char* macio_names[] __pmacdata = {
include/asm-ppc/dbdma.h +1 -1
@@ -88,7 +88,7 @@#define WAIT_ALWAYS 3/* always wait */ /* Align an address for a DBDMA command structure */ -#define DBDMA_ALIGN (x) (((unsigned)(x) + sizeof(struct dbdma_cmd) - 1) \ +#define DBDMA_ALIGN (x) (((unsigned long)(x) + sizeof(struct dbdma_cmd) - 1) \ & -sizeof(struct dbdma_cmd))/* Useful macros */
sound/ppc/beep.c +7 -8
@@ -24,6 +24,8 @@#include <linux/init.h> #include <linux/slab.h> #include <linux/input.h> +#include <linux/pci.h> +#include <linux/dma-mapping.h> #include <sound/core.h> #include <sound/control.h> #include "pmac.h"
@@ -35,7 +37,7 @@int hz;int nsamples;short *buf;/* allocated wave buffer */ -unsigned long addr;/* physical address of buffer */ +dma_addr_t addr;/* physical address of buffer */ struct input_dev dev; };
@@ -217,12 +219,8 @@return -ENOMEM ;memset (beep,0 ,sizeof (*beep)); - beep->buf = (short *)kmalloc (BEEP_BUFLEN *4 ,GFP_KERNEL ); -if (! beep->buf) { -kfree (beep); -return -ENOMEM ; - } - beep->addr =virt_to_bus (beep->buf); + beep->buf =dma_alloc_coherent (&chip->pdev->dev,BEEP_BUFLEN *4 , + &beep->addr,GFP_KERNEL ); beep->dev.evbit[0 ] =BIT (EV_SND ); beep->dev.sndbit[0 ] =BIT (SND_BELL ) |BIT (SND_TONE );
@@ -255,7 +253,8 @@ {if (chip->beep) {input_unregister_device (&chip->beep->dev); -kfree (chip->beep->buf); +dma_free_coherent (&chip->pdev->dev,BEEP_BUFLEN *4 , + chip->beep->buf, chip->beep->addr);kfree (chip->beep); chip->beep =NULL ; }
include/asm-ppc/keylargo.h +5 -0
@@ -228,6 +228,11 @@#define K2_FCR1_PCI1_BUS_RESET_N 0x00000010#define K2_FCR1_PCI1_SLEEP_RESET_EN 0x00000020 +#define K2_FCR1_I2S0_CELL_ENABLE 0x00000400 +#define K2_FCR1_I2S0_RESET 0x00000800 +#define K2_FCR1_I2S0_CLK_ENABLE_BIT 0x00001000 +#define K2_FCR1_I2S0_ENABLE 0x00002000 +#define K2_FCR1_PCI1_CLK_ENABLE 0x00004000#define K2_FCR1_FW_CLK_ENABLE 0x00008000#define K2_FCR1_FW_RESET_N 0x00010000
Quoted 8 lines · Benjamin Herrenschmidt
Hi !
(Andrew: This is an update of the previous patch, it fixes a problem with headphone beeing incorrectly muted on some models).
This patch hacks the current PowerMac Alsa driver to add some basic support of analog sound output to some desktop G5s. It has severe limitations though:
Um... why in the heck are you posting this here instead of alsa-devel?
Lee
Quoted 2 lines · Lee Revell
Um... why in the heck are you posting this here instead of alsa-devel?
Which list do you think has more people interested? ppc64 or alsa?
Pretty much anybody with a G5 will probably be on the ppc lists. And _nobody_ will be on the alsa lists, since it historically has never had any sound at all.
In other words, don't believe that "sound" means that it must be an alsa list. Lists make sense not because of intent, but because of who they reach.
Linus
Quoted 7 lines · Linus Torvalds
Quoted 2 lines · Lee Revell
Um... why in the heck are you posting this here instead of alsa-devel?
Which list do you think has more people interested? ppc64 or alsa?
Quoted 7 lines
Pretty much anybody with a G5 will probably be on the ppc lists. And _nobody_ will be on the alsa lists, since it historically has never had any sound at all.
In other words, don't believe that "sound" means that it must be an alsa list. Lists make sense not because of intent, but because of who they reach.
Yah, that, and i intend to take over this driver, and this is really only platform specific munging in the driver itself, I pretty much don't change anything to the way the driver interfaces to Alsa.
Once I am done rewriting it completely (which I started doing but it will take some time to complete) to get digital, AC3, etc... I will submit the new one to alsa-devel though for comments.
Ben.
Quoted 7 lines · Linus Torvalds
Quoted 2 lines · Lee Revell
Um... why in the heck are you posting this here instead of alsa-devel?
Which list do you think has more people interested? ppc64 or alsa?
OK, makes sense. I still think alsa-devel should be cc'ed, for code review purposes.
Lee
Quoted 10 lines · Benjamin Herrenschmidt
This patch hacks the current PowerMac Alsa driver to add some basic support of analog sound output to some desktop G5s. It has severe limitations though:
- Only 44100Khz 16 bits
- Only work on G5 models using a TAS3004 analog code, that is early single CPU desktops and all dual CPU desktops at this date, but none of the more recent ones like iMac G5.
- It does analog only, no digital/SPDIF support at all, no native AC3 support
On my PowerMac the internal speaker is now working, but unfortunately on the line-out I get nearly no output. I have pushed both the master and pcm control to the maximum and still barely hear anything.
Andreas.
Signature · 4 lines
Andreas Schwab, SuSE Labs, [email protected] SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Quoted 13 lines · Andreas Schwab
Quoted 10 lines · Benjamin Herrenschmidt
This patch hacks the current PowerMac Alsa driver to add some basic support of analog sound output to some desktop G5s. It has severe limitations though:
- Only 44100Khz 16 bits
- Only work on G5 models using a TAS3004 analog code, that is early single CPU desktops and all dual CPU desktops at this date, but none of the more recent ones like iMac G5.
- It does analog only, no digital/SPDIF support at all, no native AC3 support
Quoted 3 lines
On my PowerMac the internal speaker is now working, but unfortunately on the line-out I get nearly no output. I have pushed both the master and pcm control to the maximum and still barely hear anything.
Yes, I noticed that too on some models, not sure what's up at this point. What about the headphone jack on the front ? That one appears to work.
Ben.
Quoted 3 lines · Benjamin Herrenschmidt
Yes, I noticed that too on some models, not sure what's up at this point. What about the headphone jack on the front ? That one appears to work.
Doesn't work either for me. Well, I'll have keep my workaround a bit longer until you are ready with the rewrite. Keep up the good work!
Andreas.
Signature · 4 lines
Andreas Schwab, SuSE Labs, [email protected] SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Quoted 8 lines · Andreas Schwab
Quoted 3 lines · Benjamin Herrenschmidt
Yes, I noticed that too on some models, not sure what's up at this point. What about the headphone jack on the front ? That one appears to work.
Doesn't work either for me. Well, I'll have keep my workaround a bit longer until you are ready with the rewrite. Keep up the good work!
Doesn't work with version 2 of the patch ? neither the headphone nor the line out jack ? hrm... does it properly detect insertion of the jack and mute the speaker in both cases ? Can you send me a tarball of your device-tree ?
Ben.
Quoted 2 lines · Benjamin Herrenschmidt
Doesn't work with version 2 of the patch ? neither the headphone nor the line out jack ?
Yes.
Quoted 2 lines
hrm... does it properly detect insertion of the jack and mute the speaker in both cases ?
Yes, it does.
Quoted 1 line
Can you send me a tarball of your device-tree ?
Will do.
Andreas.
Signature · 4 lines
Andreas Schwab, SuSE Labs, [email protected] SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): 1113347296.5388.121.camel@gaston
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): 1113350355.5387.129.camel@gaston
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 1/1 ppc64: improve g5 sound headphone mute
Hi !
This patch fixes a couple more issues with the management of the GPIOs dealing with headphone and line out mute on the G5. It should fix the remaining problems of people not getting any sound out of the headphone jack.
sound/ppc/tumbler.c +17 -6
@@ -177,11 +177,22 @@if (! gp->addr)return ; active = active ? gp->active_val : gp->inactive_val; -do_gpio_write (gp, active);DBG ("(I) gpio %x write %d\n" , gp->addr, active); } +static int check_audio_gpio (pmac_gpio_t *gp) +{ +int ret; + +if (! gp->addr) +return 0 ; + + ret =do_gpio_read (gp); + +return (ret &0xd ) == (gp->active_val &0xd ); +} +static int read_audio_gpio (pmac_gpio_t *gp) {int ret;
@@ -683,7 +694,7 @@ }if (gp ==NULL )return -EINVAL ; - ucontrol->value.integer.value[0 ] = !read_audio_gpio (gp); + ucontrol->value.integer.value[0 ] = !check_audio_gpio (gp);return 0 ; }
@@ -711,7 +722,7 @@ }if (gp ==NULL )return -EINVAL ; - val = !read_audio_gpio (gp); + val = !check_audio_gpio (gp);if (val != ucontrol->value.integer.value[0 ]) {write_audio_gpio (gp, ! ucontrol->value.integer.value[0 ]);return 1 ;
@@ -897,11 +908,11 @@static void check_mute (pmac_t *chip,pmac_gpio_t *gp,int val,int do_notify,snd_kcontrol_t *sw) { -//pmac_tumbler_t *mix = chip->mixer_data; -if (val !=read_audio_gpio (gp)) { +if (check_audio_gpio (gp) != val) {write_audio_gpio (gp, val);if (do_notify) -snd_ctl_notify (chip->card,SNDRV_CTL_EVENT_MASK_VALUE , &sw->id); +snd_ctl_notify (chip->card,SNDRV_CTL_EVENT_MASK_VALUE , + &sw->id); } }
Re: [PATCH] ppc64: improve g5 sound headphone mute
Quoted 6 lines · Benjamin Herrenschmidt
Hi !
This patch fixes a couple more issues with the management of the GPIOs dealing with headphone and line out mute on the G5. It should fix the remaining problems of people not getting any sound out of the headphone jack.
It works great here with all patches applied, thanks!
Re: [PATCH] ppc64: improve g5 sound headphone mute
In reply to Benjamin HerrenschmidtQuoted 4 lines · Benjamin Herrenschmidt
This patch fixes a couple more issues with the management of the GPIOs dealing with headphone and line out mute on the G5. It should fix the remaining problems of people not getting any sound out of the headphone jack.
There's still a minor problem: when booting with line-out plugged (didn't try headphone yet) the initial volume settings are still not right. Unplugging and plugging again fixes this.
Andreas.
Signature · 4 lines
Andreas Schwab, SuSE Labs, [email protected] SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different."
Re: [PATCH] ppc64: improve g5 sound headphone mute
Quoted 10 lines · Andreas Schwab
Quoted 4 lines · Benjamin Herrenschmidt
This patch fixes a couple more issues with the management of the GPIOs dealing with headphone and line out mute on the G5. It should fix the remaining problems of people not getting any sound out of the headphone jack.
There's still a minor problem: when booting with line-out plugged (didn't try headphone yet) the initial volume settings are still not right. Unplugging and plugging again fixes this.
It can be either alsa not restoring the setup properly, or a bug in the driver I'm still chasing where the headphone detection happens before propoer initialisation of the rest of the driver ...
Quoted 3 lines · Andreas Schwab
On my PowerMac the internal speaker is now working, but unfortunately on the line-out I get nearly no output. I have pushed both the master and pcm control to the maximum and still barely hear anything.
Work fine for me, but I had to turn the volume to the max on the external amplifier, so this is probably the same problem.