Your message dated Fri, 14 Nov 2008 18:56:20 +0100
with message-id <[EMAIL PROTECTED]>
and subject line 2.6.8 kernel removed from Debian
has caused the Debian Bug report #270615,
regarding iBook 2.2: Kernel 2.6.8 and beep (PC Speaker)?
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [EMAIL PROTECTED]
immediately.)


-- 
270615: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=270615
Debian Bug Tracking System
Contact [EMAIL PROTECTED] with problems
--- Begin Message ---
Package: kernel-source-2.6.8

Thanks Julien. I now forward this to the kernel-source-2.6.8 package in order
to not lose it in my mail archive.

Friendly,

Sven Luther

On Wed, Sep 08, 2004 at 11:44:56AM +0200, Julien BLACHE wrote:
> Sven Luther <[EMAIL PROTECTED]> wrote:
> 
> Hi Sven,
> 
> >> Use filterdiff (patchutils) to filter the changes made to sound/ppc/*,
> >> and here's your diff.
> >
> > I am over busy with other stuff right now, but would you care to do this and
> > send me the patch (or fill a bug report) ?
> 
> Here it is. beep.patch contains everything related to the beep
> support. chips.patch contains the other changes to the files in
> sound/ppc, which are bugfixes and new features for the awacs, daca,
> tumbler and burgundy chips.
> 
> The changes in chips.patch are minimal, you could apply them too
> without any problem.
> 
> I didn't try to build with the patches applied (lacking time), but
> reading the diff there's nothing that should break.
> 
> JB.
> 
> -- 
>  Julien BLACHE - Debian & GNU/Linux Developer - <[EMAIL PROTECTED]> 
>  
>  Public key available on <http://www.jblache.org> - KeyID: F5D6 5169 
>  GPG Fingerprint : 935A 79F1 C8B3 3521 FD62 7CC7 CD61 4FD7 F5D6 5169 
> 

Content-Description: Beep support for PowerMac
> --- linux-2.5-plain/sound/ppc/beep.c  1970-01-01 01:00:00.000000000 +0100
> +++ linux-sound-plain/sound/ppc/beep.c        2004-08-26 21:17:10.000000000 
> +0200
> @@ -0,0 +1,262 @@
> +/*
> + * Beep using pcm
> + *
> + * Copyright (c) by Takashi Iwai <[EMAIL PROTECTED]>
> + *
> + *   This program is free software; you can redistribute it and/or modify
> + *   it under the terms of the GNU General Public License as published by
> + *   the Free Software Foundation; either version 2 of the License, or
> + *   (at your option) any later version.
> + *
> + *   This program is distributed in the hope that it will be useful,
> + *   but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *   GNU General Public License for more details.
> + *
> + *   You should have received a copy of the GNU General Public License
> + *   along with this program; if not, write to the Free Software
> + *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
> + */
> +
> +#include <sound/driver.h>
> +#include <asm/io.h>
> +#include <asm/irq.h>
> +#include <linux/init.h>
> +#include <linux/slab.h>
> +#include <linux/input.h>
> +#include <sound/core.h>
> +#include <sound/control.h>
> +#include "pmac.h"
> +
> +struct snd_pmac_beep {
> +     int running;    /* boolean */
> +     int volume;     /* mixer volume: 0-100 */
> +     int volume_play;        /* currently playing volume */
> +     int hz;
> +     int nsamples;
> +     short *buf;             /* allocated wave buffer */
> +     unsigned long addr;     /* physical address of buffer */
> +     struct input_dev dev;
> +};
> +
> +/*
> + * stop beep if running
> + */
> +void snd_pmac_beep_stop(pmac_t *chip)
> +{
> +     pmac_beep_t *beep = chip->beep;
> +     if (beep && beep->running) {
> +             beep->running = 0;
> +             snd_pmac_beep_dma_stop(chip);
> +     }
> +}
> +
> +/*
> + * Stuff for outputting a beep.  The values range from -327 to +327
> + * so we can multiply by an amplitude in the range 0..100 to get a
> + * signed short value to put in the output buffer.
> + */
> +static short beep_wform[256] = {
> +     0,      40,     79,     117,    153,    187,    218,    245,
> +     269,    288,    304,    316,    323,    327,    327,    324,
> +     318,    310,    299,    288,    275,    262,    249,    236,
> +     224,    213,    204,    196,    190,    186,    183,    182,
> +     182,    183,    186,    189,    192,    196,    200,    203,
> +     206,    208,    209,    209,    209,    207,    204,    201,
> +     197,    193,    188,    183,    179,    174,    170,    166,
> +     163,    161,    160,    159,    159,    160,    161,    162,
> +     164,    166,    168,    169,    171,    171,    171,    170,
> +     169,    167,    163,    159,    155,    150,    144,    139,
> +     133,    128,    122,    117,    113,    110,    107,    105,
> +     103,    103,    103,    103,    104,    104,    105,    105,
> +     105,    103,    101,    97,     92,     86,     78,     68,
> +     58,     45,     32,     18,     3,      -11,    -26,    -41,
> +     -55,    -68,    -79,    -88,    -95,    -100,   -102,   -102,
> +     -99,    -93,    -85,    -75,    -62,    -48,    -33,    -16,
> +     0,      16,     33,     48,     62,     75,     85,     93,
> +     99,     102,    102,    100,    95,     88,     79,     68,
> +     55,     41,     26,     11,     -3,     -18,    -32,    -45,
> +     -58,    -68,    -78,    -86,    -92,    -97,    -101,   -103,
> +     -105,   -105,   -105,   -104,   -104,   -103,   -103,   -103,
> +     -103,   -105,   -107,   -110,   -113,   -117,   -122,   -128,
> +     -133,   -139,   -144,   -150,   -155,   -159,   -163,   -167,
> +     -169,   -170,   -171,   -171,   -171,   -169,   -168,   -166,
> +     -164,   -162,   -161,   -160,   -159,   -159,   -160,   -161,
> +     -163,   -166,   -170,   -174,   -179,   -183,   -188,   -193,
> +     -197,   -201,   -204,   -207,   -209,   -209,   -209,   -208,
> +     -206,   -203,   -200,   -196,   -192,   -189,   -186,   -183,
> +     -182,   -182,   -183,   -186,   -190,   -196,   -204,   -213,
> +     -224,   -236,   -249,   -262,   -275,   -288,   -299,   -310,
> +     -318,   -324,   -327,   -327,   -323,   -316,   -304,   -288,
> +     -269,   -245,   -218,   -187,   -153,   -117,   -79,    -40,
> +};
> +
> +#define BEEP_SRATE   22050   /* 22050 Hz sample rate */
> +#define BEEP_BUFLEN  512
> +#define BEEP_VOLUME  15      /* 0 - 100 */
> +
> +static int snd_pmac_beep_event(struct input_dev *dev, unsigned int type, 
> unsigned int code, int hz)
> +{
> +     pmac_t *chip;
> +     pmac_beep_t *beep;
> +     unsigned long flags;
> +     int beep_speed = 0;
> +     int srate;
> +     int period, ncycles, nsamples;
> +     int i, j, f;
> +     short *p;
> +
> +     if (type != EV_SND)
> +             return -1;
> +
> +     switch (code) {
> +     case SND_BELL: if (hz) hz = 1000;
> +     case SND_TONE: break;
> +     default: return -1;
> +     }
> +
> +     chip = dev->private;
> +     if (! chip || (beep = chip->beep) == NULL)
> +             return -1;
> +
> +     if (! hz) {
> +             spin_lock_irqsave(&chip->reg_lock, flags);
> +             if (beep->running)
> +                     snd_pmac_beep_stop(chip);
> +             spin_unlock_irqrestore(&chip->reg_lock, flags);
> +             return 0;
> +     }
> +
> +     beep_speed = snd_pmac_rate_index(chip, &chip->playback, BEEP_SRATE);
> +     srate = chip->freq_table[beep_speed];
> +
> +     if (hz <= srate / BEEP_BUFLEN || hz > srate / 2)
> +             hz = 1000;
> +
> +     spin_lock_irqsave(&chip->reg_lock, flags);
> +     if (chip->playback.running || chip->capture.running || beep->running) {
> +             spin_unlock_irqrestore(&chip->reg_lock, flags);
> +             return 0;
> +     }
> +     beep->running = 1;
> +     spin_unlock_irqrestore(&chip->reg_lock, flags);
> +
> +     if (hz == beep->hz && beep->volume == beep->volume_play) {
> +             nsamples = beep->nsamples;
> +     } else {
> +             period = srate * 256 / hz;      /* fixed point */
> +             ncycles = BEEP_BUFLEN * 256 / period;
> +             nsamples = (period * ncycles) >> 8;
> +             f = ncycles * 65536 / nsamples;
> +             j = 0;
> +             p = beep->buf;
> +             for (i = 0; i < nsamples; ++i, p += 2) {
> +                     p[0] = p[1] = beep_wform[j >> 8] * beep->volume;
> +                     j = (j + f) & 0xffff;
> +             }
> +             beep->hz = hz;
> +             beep->volume_play = beep->volume;
> +             beep->nsamples = nsamples;
> +     }
> +
> +     spin_lock_irqsave(&chip->reg_lock, flags);
> +     snd_pmac_beep_dma_start(chip, beep->nsamples * 4, beep->addr, 
> beep_speed);
> +     spin_unlock_irqrestore(&chip->reg_lock, flags);
> +     return 0;
> +}
> +
> +/*
> + * beep volume mixer
> + */
> +
> +#define chip_t pmac_t
> +
> +static int snd_pmac_info_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t 
> *uinfo)
> +{
> +     uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
> +     uinfo->count = 1;
> +     uinfo->value.integer.min = 0;
> +     uinfo->value.integer.max = 100;
> +     return 0;
> +}
> +
> +static int snd_pmac_get_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t 
> *ucontrol)
> +{
> +     pmac_t *chip = snd_kcontrol_chip(kcontrol);
> +     snd_assert(chip->beep, return -ENXIO);
> +     ucontrol->value.integer.value[0] = chip->beep->volume;
> +     return 0;
> +}
> +
> +static int snd_pmac_put_beep(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t 
> *ucontrol)
> +{
> +     pmac_t *chip = snd_kcontrol_chip(kcontrol);
> +     int oval;
> +     snd_assert(chip->beep, return -ENXIO);
> +     oval = chip->beep->volume;
> +     chip->beep->volume = ucontrol->value.integer.value[0];
> +     return oval != chip->beep->volume;
> +}
> +
> +static snd_kcontrol_new_t snd_pmac_beep_mixer = {
> +     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> +     .name = "Beep Playback Volume",
> +     .info = snd_pmac_info_beep,
> +     .get = snd_pmac_get_beep,
> +     .put = snd_pmac_put_beep,
> +};
> +
> +/* Initialize beep stuff */
> +int __init snd_pmac_attach_beep(pmac_t *chip)
> +{
> +     pmac_beep_t *beep;
> +     int err;
> +
> +     beep = kmalloc(sizeof(*beep), GFP_KERNEL);
> +     if (! beep)
> +             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->dev.evbit[0] = BIT(EV_SND);
> +     beep->dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
> +     beep->dev.event = snd_pmac_beep_event;
> +     beep->dev.private = chip;
> +
> +     /* FIXME: set more better values */
> +     beep->dev.name = "PowerMac Beep";
> +     beep->dev.phys = "powermac/beep";
> +     beep->dev.id.bustype = BUS_ADB;
> +     beep->dev.id.vendor = 0x001f;
> +     beep->dev.id.product = 0x0001;
> +     beep->dev.id.version = 0x0100;
> +
> +     beep->volume = BEEP_VOLUME;
> +     beep->running = 0;
> +     if ((err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_pmac_beep_mixer, 
> chip))) < 0) {
> +             kfree(beep->buf);
> +             kfree(beep);
> +             return err;
> +     }
> +
> +     chip->beep = beep;
> +     input_register_device(&beep->dev);
> +
> +     return 0;
> +}
> +
> +void snd_pmac_detach_beep(pmac_t *chip)
> +{
> +     if (chip->beep) {
> +             input_unregister_device(&chip->beep->dev);
> +             kfree(chip->beep->buf);
> +             kfree(chip->beep);
> +             chip->beep = NULL;
> +     }
> +}
> --- linux-2.5-plain/sound/ppc/Kconfig 2004-08-26 21:01:50.000000000 +0200
> +++ linux-sound-plain/sound/ppc/Kconfig       2004-08-26 21:16:11.000000000 
> +0200
> @@ -6,9 +6,12 @@
>  comment "ALSA PowerMac requires I2C"
>       depends on SND && I2C=n
>  
> +comment "ALSA PowerMac requires INPUT"
> +     depends on SND && INPUT=n
> +
>  config SND_POWERMAC
>       tristate "PowerMac (AWACS, DACA, Burgundy, Tumbler, Keywest)"
> -     depends on SND && I2C
> +     depends on SND && I2C && INPUT
>       select SND_PCM
>  
>  endmenu
> --- linux-2.5-plain/sound/ppc/Makefile        2004-08-26 21:01:48.000000000 
> +0200
> +++ linux-sound-plain/sound/ppc/Makefile      2004-08-26 21:16:09.000000000 
> +0200
> @@ -3,7 +3,7 @@
>  # Copyright (c) 2001 by Jaroslav Kysela <[EMAIL PROTECTED]>
>  #
>  
> -snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o 
> keywest.o
> +snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o 
> keywest.o beep.o
>  
>  # Toplevel Module Dependency
>  obj-$(CONFIG_SND_POWERMAC) += snd-powermac.o
> --- linux-2.5-plain/sound/ppc/pmac.c  2004-08-26 21:05:32.000000000 +0200
> +++ linux-sound-plain/sound/ppc/pmac.c        2004-08-26 21:20:59.000000000 
> +0200
> @@ -36,8 +36,6 @@
>  #include <asm/feature.h>
>  #endif
>  
> -#define chip_t pmac_t
> -
>  
>  #if defined(CONFIG_PM) && defined(CONFIG_PMAC_PBOOK)
>  static int snd_pmac_register_sleep_notifier(pmac_t *chip);
> @@ -52,8 +50,8 @@
>       44100, 29400, 22050, 17640, 14700, 11025, 8820, 7350
>  };
>  /* fixed frequency table for tumbler */
> -static int tumbler_freqs[2] = {
> -     48000, 44100
> +static int tumbler_freqs[1] = {
> +     44100
>  };
>  
>  /*
> @@ -86,7 +84,7 @@
>   * look up frequency table
>   */
>  
> -static unsigned int snd_pmac_rate_index(pmac_t *chip, pmac_stream_t *rec, 
> unsigned int rate)
> +unsigned int snd_pmac_rate_index(pmac_t *chip, pmac_stream_t *rec, unsigned 
> int rate)
>  {
>       int i, ok, found;
>  
> @@ -203,7 +201,6 @@
>  {
>       int i;
>       volatile struct dbdma_cmd *cp;
> -     unsigned long flags;
>       snd_pcm_runtime_t *runtime = subs->runtime;
>       int rate_index;
>       long offset;
> @@ -226,15 +223,17 @@
>       /* We really want to execute a DMA stop command, after the AWACS
>        * is initialized.
>        * For reasons I don't understand, it stops the hissing noise
> -      * common to many PowerBook G3 systems (like mine :-).
> +      * common to many PowerBook G3 systems and random noise otherwise
> +      * captured on iBook2's about every third time. -ReneR
>        */
> -     spin_lock_irqsave(&chip->reg_lock, flags);
> +     spin_lock_irq(&chip->reg_lock);
>       snd_pmac_dma_stop(rec);
> -     if (rec->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> -             st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP);
> -             snd_pmac_dma_set_command(rec, &chip->extra_dma);
> -             snd_pmac_dma_run(rec, RUN);
> -     }
> +     st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP);
> +     snd_pmac_dma_set_command(rec, &chip->extra_dma);
> +     snd_pmac_dma_run(rec, RUN);
> +     spin_unlock_irq(&chip->reg_lock);
> +     mdelay(5);
> +     spin_lock_irq(&chip->reg_lock);
>       /* continuous DMA memory type doesn't provide the physical address,
>        * so we need to resolve the address here...
>        */
> @@ -252,7 +251,7 @@
>  
>       snd_pmac_dma_stop(rec);
>       snd_pmac_dma_set_command(rec, &rec->cmd);
> -     spin_unlock_irqrestore(&chip->reg_lock, flags);
> +     spin_unlock_irq(&chip->reg_lock);
>  
>       return 0;
>  }
> @@ -264,7 +263,6 @@
>  static int snd_pmac_pcm_trigger(pmac_t *chip, pmac_stream_t *rec,
>                               snd_pcm_substream_t *subs, int cmd)
>  {
> -     unsigned long flags;
>       volatile struct dbdma_cmd *cp;
>       int i, command;
>  
> @@ -275,7 +273,7 @@
>                       return -EBUSY;
>               command = (subs->stream == SNDRV_PCM_STREAM_PLAYBACK ?
>                          OUTPUT_MORE : INPUT_MORE) + INTR_ALWAYS;
> -             spin_lock_irqsave(&chip->reg_lock, flags);
> +             spin_lock(&chip->reg_lock);
>               snd_pmac_beep_stop(chip);
>               snd_pmac_pcm_set_format(chip);
>               for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++)
> @@ -284,18 +282,18 @@
>               (void)in_le32(&rec->dma->status);
>               snd_pmac_dma_run(rec, RUN|WAKE);
>               rec->running = 1;
> -             spin_unlock_irqrestore(&chip->reg_lock, flags);
> +             spin_unlock(&chip->reg_lock);
>               break;
>  
>       case SNDRV_PCM_TRIGGER_STOP:
>       case SNDRV_PCM_TRIGGER_SUSPEND:
> -             spin_lock_irqsave(&chip->reg_lock, flags);
> +             spin_lock(&chip->reg_lock);
>               rec->running = 0;
>               /*printk("stopped!!\n");*/
>               snd_pmac_dma_stop(rec);
>               for (i = 0, cp = rec->cmd.cmds; i < rec->nperiods; i++, cp++)
>                       out_le16(&cp->command, DBDMA_STOP);
> -             spin_unlock_irqrestore(&chip->reg_lock, flags);
> +             spin_unlock(&chip->reg_lock);
>               break;
>  
>       default:
> @@ -490,14 +488,12 @@
>       snd_pcm_runtime_t *runtime = subs->runtime;
>       int i, j, fflags;
>       static int typical_freqs[] = {
> -             48000,
>               44100,
>               22050,
>               11025,
>               0,
>       };
>       static int typical_freq_flags[] = {
> -             SNDRV_PCM_RATE_48000,
>               SNDRV_PCM_RATE_44100,
>               SNDRV_PCM_RATE_22050,
>               SNDRV_PCM_RATE_11025,
> @@ -651,7 +647,7 @@
>  
>       pcm->private_data = chip;
>       pcm->private_free = pmac_pcm_free;
> -     pcm->info_flags = 0;
> +     pcm->info_flags = SNDRV_PCM_INFO_JOINT_DUPLEX;
>       strcpy(pcm->name, chip->card->shortname);
>       chip->pcm = pcm;
>  
> @@ -683,12 +679,41 @@
>  
>  
>  /*
> + * handling beep
> + */
> +void snd_pmac_beep_dma_start(pmac_t *chip, int bytes, unsigned long addr, 
> int speed)
> +{
> +     pmac_stream_t *rec = &chip->playback;
> +
> +     snd_pmac_dma_stop(rec);
> +     st_le16(&chip->extra_dma.cmds->req_count, bytes);
> +     st_le16(&chip->extra_dma.cmds->xfer_status, 0);
> +     st_le32(&chip->extra_dma.cmds->cmd_dep, chip->extra_dma.addr);
> +     st_le32(&chip->extra_dma.cmds->phy_addr, addr);
> +     st_le16(&chip->extra_dma.cmds->command, OUTPUT_MORE + BR_ALWAYS);
> +     out_le32(&chip->awacs->control,
> +              (in_le32(&chip->awacs->control) & ~0x1f00)
> +              | (speed << 8));
> +     out_le32(&chip->awacs->byteswap, 0);
> +     snd_pmac_dma_set_command(rec, &chip->extra_dma);
> +     snd_pmac_dma_run(rec, RUN);
> +}
> +
> +void snd_pmac_beep_dma_stop(pmac_t *chip)
> +{
> +     snd_pmac_dma_stop(&chip->playback);
> +     st_le16(&chip->extra_dma.cmds->command, DBDMA_STOP);
> +     snd_pmac_pcm_set_format(chip); /* reset format */
> +}
> +
> +
> +/*
>   * interrupt handlers
>   */
>  static irqreturn_t
>  snd_pmac_tx_intr(int irq, void *devid, struct pt_regs *regs)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
> +     pmac_t *chip = devid;
>       snd_pmac_pcm_update(chip, &chip->playback);
>       return IRQ_HANDLED;
>  }
> @@ -697,7 +722,7 @@
>  static irqreturn_t
>  snd_pmac_rx_intr(int irq, void *devid, struct pt_regs *regs)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
> +     pmac_t *chip = devid;
>       snd_pmac_pcm_update(chip, &chip->capture);
>       return IRQ_HANDLED;
>  }
> @@ -706,7 +731,7 @@
>  static irqreturn_t
>  snd_pmac_ctrl_intr(int irq, void *devid, struct pt_regs *regs)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
> +     pmac_t *chip = devid;
>       int ctrl = in_le32(&chip->awacs->control);
>  
>       /*printk("pmac: control interrupt.. 0x%x\n", ctrl);*/
> @@ -776,6 +801,8 @@
>       if (chip->mixer_free)
>               chip->mixer_free(chip);
>  
> +     snd_pmac_detach_beep(chip);
> +
>       /* release resources */
>       if (chip->irq >= 0)
>               free_irq(chip->irq, (void*)chip);
> @@ -802,7 +829,7 @@
>                               release_OF_resource(chip->node, i);
>               }
>       }
> -     snd_magic_kfree(chip);
> +     kfree(chip);
>       return 0;
>  }
>  
> @@ -812,7 +839,7 @@
>   */
>  static int snd_pmac_dev_free(snd_device_t *device)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, device->device_data, return 
> -ENXIO);
> +     pmac_t *chip = device->device_data;
>       return snd_pmac_free(chip);
>  }
>  
> @@ -862,7 +889,7 @@
>       chip->can_byte_swap = 1;
>       chip->can_duplex = 1;
>       chip->can_capture = 1;
> -     chip->num_freqs = 8;
> +     chip->num_freqs = ARRAY_SIZE(awacs_freqs);
>       chip->freq_table = awacs_freqs;
>  
>       chip->control_mask = MASK_IEPC | MASK_IEE | 0x11; /* default */
> @@ -920,14 +947,14 @@
>               chip->can_capture = 0;  /* no capture */
>               chip->can_duplex = 0;
>               // chip->can_byte_swap = 0; /* FIXME: check this */
> -             chip->num_freqs = 2;
> +             chip->num_freqs = ARRAY_SIZE(tumbler_freqs);
>               chip->freq_table = tumbler_freqs;
>               chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
>       }
>       if (device_is_compatible(sound, "snapper")) {
>               chip->model = PMAC_SNAPPER;
>               // chip->can_byte_swap = 0; /* FIXME: check this */
> -             chip->num_freqs = 2;
> +             chip->num_freqs = ARRAY_SIZE(tumbler_freqs);
>               chip->freq_table = tumbler_freqs;
>               chip->control_mask = MASK_IEPC | 0x11; /* disable IEE */
>       }
> @@ -1069,7 +1096,7 @@
>       snd_runtime_check(chip_return, return -EINVAL);
>       *chip_return = NULL;
>  
> -     chip = snd_magic_kcalloc(pmac_t, 0, GFP_KERNEL);
> +     chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
>       if (chip == NULL)
>               return -ENOMEM;
>       chip->card = card;
> @@ -1206,7 +1233,7 @@
>  
>  static int snd_pmac_suspend(snd_card_t *card, unsigned int state)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, card->pm_private_data, return 
> -EINVAL);
> +     pmac_t *chip = card->pm_private_data;
>       unsigned long flags;
>  
>       if (chip->suspend)
> @@ -1228,7 +1255,7 @@
>  
>  static int snd_pmac_resume(snd_card_t *card, unsigned int state)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, card->pm_private_data, return 
> -EINVAL);
> +     pmac_t *chip = card->pm_private_data;
>  
>       snd_pmac_sound_feature(chip, 1);
>       if (chip->resume)
> --- linux-2.5-plain/sound/ppc/pmac.h  2004-08-26 21:03:12.000000000 +0200
> +++ linux-sound-plain/sound/ppc/pmac.h        2004-08-26 21:18:00.000000000 
> +0200
> @@ -84,7 +84,7 @@
>  
>       snd_pcm_substream_t *substream;
>  
> -     unsigned int cur_freqs;         /* currently available frequences */
> +     unsigned int cur_freqs;         /* currently available frequencies */
>       unsigned int cur_formats;       /* currently available formats */
>  };
>  
> @@ -155,6 +155,7 @@
>       void (*mixer_free)(pmac_t *);
>       snd_kcontrol_t *master_sw_ctl;
>       snd_kcontrol_t *speaker_sw_ctl;
> +     snd_kcontrol_t *drc_sw_ctl;     /* only used for tumbler -ReneR */
>       snd_kcontrol_t *hp_detect_ctl;
>  
>       /* lowlevel callbacks */
> @@ -173,6 +174,12 @@
>  int snd_pmac_new(snd_card_t *card, pmac_t **chip_return);
>  int snd_pmac_pcm_new(pmac_t *chip);
>  int snd_pmac_attach_beep(pmac_t *chip);
> +void snd_pmac_detach_beep(pmac_t *chip);
> +void snd_pmac_beep_stop(pmac_t *chip);
> +unsigned int snd_pmac_rate_index(pmac_t *chip, pmac_stream_t *rec, unsigned 
> int rate);
> +
> +void snd_pmac_beep_dma_start(pmac_t *chip, int bytes, unsigned long addr, 
> int speed);
> +void snd_pmac_beep_dma_stop(pmac_t *chip);
>  
>  /* initialize mixer */
>  int snd_pmac_awacs_init(pmac_t *chip);
> @@ -206,9 +213,4 @@
>       schedule_timeout(((msec) * HZ + 999) / 1000);\
>  } while (0)
>  
> -#ifndef PMAC_SUPPORT_PCM_BEEP
> -#define snd_pmac_attach_beep(chip) 0
> -#define snd_pmac_beep_stop(chip)  /**/
> -#endif
> -
>  #endif /* __PMAC_H */
> --- linux-2.5-plain/sound/ppc/powermac.c      2004-08-26 21:05:28.000000000 
> +0200
> +++ linux-sound-plain/sound/ppc/powermac.c    2004-08-26 21:20:52.000000000 
> +0200
> @@ -30,31 +30,19 @@
>  #define CHIP_NAME "PMac"
>  
>  MODULE_DESCRIPTION("PowerMac");
> -MODULE_CLASSES("{sound}");
> -MODULE_DEVICES("{{Apple,PowerMac}}");
> +MODULE_SUPPORTED_DEVICE("{{Apple,PowerMac}}");
>  MODULE_LICENSE("GPL");
>  
>  static int index = SNDRV_DEFAULT_IDX1;               /* Index 0-MAX */
>  static char *id = SNDRV_DEFAULT_STR1;                /* ID for this card */
> -/* static int enable = 1; */
> -#ifdef PMAC_SUPPORT_PCM_BEEP
>  static int enable_beep = 1;
> -#endif
>  
>  module_param(index, int, 0444);
>  MODULE_PARM_DESC(index, "Index value for " CHIP_NAME " soundchip.");
> -MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
>  module_param(id, charp, 0444);
>  MODULE_PARM_DESC(id, "ID string for " CHIP_NAME " soundchip.");
> -MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
> -/* module_param(enable, bool, 0444);
> -   MODULE_PARM_DESC(enable, "Enable this soundchip.");
> -   MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC); */
> -#ifdef PMAC_SUPPORT_PCM_BEEP
>  module_param(enable_beep, bool, 0444);
>  MODULE_PARM_DESC(enable_beep, "Enable beep using PCM.");
> -MODULE_PARM_SYNTAX(enable_beep, SNDRV_ENABLED "," SNDRV_BOOLEAN_TRUE_DESC);
> -#endif
>  
>  
>  /*
> @@ -133,10 +121,8 @@
>               goto __error;
>  
>       chip->initialized = 1;
> -#ifdef PMAC_SUPPORT_PCM_BEEP
>       if (enable_beep)
>               snd_pmac_attach_beep(chip);
> -#endif
>  
>       if ((err = snd_card_register(card)) < 0)
>               goto __error;
> @@ -151,18 +137,14 @@
>  
>  
>  /*
> - * MODULE sutff
> + * MODULE stuff
>   */
>  
>  static int __init alsa_card_pmac_init(void)
>  {
>       int err;
> -     if ((err = snd_pmac_probe()) < 0) {
> -#ifdef MODULE
> -             printk(KERN_ERR "no PMac soundchip found\n");
> -#endif
> +     if ((err = snd_pmac_probe()) < 0)
>               return err;
> -     }
>       return 0;
>  
>  }

Content-Description: hardware support updates for awacs, daca, tumbler, burgundy
> --- linux-2.5-plain/sound/ppc/awacs.c 2004-08-26 21:02:24.000000000 +0200
> +++ linux-sound-plain/sound/ppc/awacs.c       2004-08-26 21:16:57.000000000 
> +0200
> @@ -29,8 +29,6 @@
>  #include <sound/core.h>
>  #include "pmac.h"
>  
> -#define chip_t pmac_t
> -
>  
>  #ifdef CONFIG_ADB_CUDA
>  #define PMAC_AMP_AVAIL
> @@ -574,11 +572,22 @@
>       AWACS_VOLUME("Master Playback Volume", 2, 6, 1),
>       AWACS_SWITCH("Master Capture Switch", 1, SHIFT_LOOPTHRU, 0),
>       AWACS_VOLUME("Capture Volume", 0, 4, 0),
> -     AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
>       AWACS_SWITCH("CD Capture Switch", 0, SHIFT_MUX_CD, 0),
> +};
> +
> +/* FIXME: is this correct order?
> + * screamer (powerbook G3 pismo) seems to have different bits...
> + */
> +static snd_kcontrol_new_t snd_pmac_awacs_mixers2[] __initdata = {
> +     AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_LINE, 0),
>       AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_MIC, 0),
>  };
>  
> +static snd_kcontrol_new_t snd_pmac_screamer_mixers2[] __initdata = {
> +     AWACS_SWITCH("Line Capture Switch", 0, SHIFT_MUX_MIC, 0),
> +     AWACS_SWITCH("Mic Capture Switch", 0, SHIFT_MUX_LINE, 0),
> +};
> +
>  static snd_kcontrol_new_t snd_pmac_awacs_master_sw __initdata =
>  AWACS_SWITCH("Master Playback Switch", 1, SHIFT_HDMUTE, 1);
>  
> @@ -602,8 +611,6 @@
>  AWACS_SWITCH("PC Speaker Playback Switch", 1, SHIFT_SPKMUTE, 1);
>  
>  
> -#define num_controls(ary) (sizeof(ary) / sizeof(snd_kcontrol_new_t))
> -
>  /*
>   * add new mixer elements to the card
>   */
> @@ -818,9 +825,17 @@
>        */
>       strcpy(chip->card->mixername, "PowerMac AWACS");
>  
> -     if ((err = build_mixers(chip, num_controls(snd_pmac_awacs_mixers),
> +     if ((err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers),
>                               snd_pmac_awacs_mixers)) < 0)
>               return err;
> +     if (chip->model == PMAC_SCREAMER)
> +             err = build_mixers(chip, ARRAY_SIZE(snd_pmac_screamer_mixers2),
> +                                snd_pmac_screamer_mixers2);
> +     else
> +             err = build_mixers(chip, ARRAY_SIZE(snd_pmac_awacs_mixers2),
> +                                snd_pmac_awacs_mixers2);
> +     if (err < 0)
> +             return err;
>       chip->master_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_master_sw, chip);
>       if ((err = snd_ctl_add(chip->card, chip->master_sw_ctl)) < 0)
>               return err;
> @@ -832,7 +847,7 @@
>                * screamer registers.
>                * in this case, it seems the route C is not used.
>                */
> -             if ((err = build_mixers(chip, 
> num_controls(snd_pmac_awacs_amp_vol),
> +             if ((err = build_mixers(chip, 
> ARRAY_SIZE(snd_pmac_awacs_amp_vol),
>                                       snd_pmac_awacs_amp_vol)) < 0)
>                       return err;
>               /* overwrite */
> @@ -846,7 +861,7 @@
>  #endif /* PMAC_AMP_AVAIL */
>       {
>               /* route A = headphone, route C = speaker */
> -             if ((err = build_mixers(chip, 
> num_controls(snd_pmac_awacs_speaker_vol),
> +             if ((err = build_mixers(chip, 
> ARRAY_SIZE(snd_pmac_awacs_speaker_vol),
>                                       snd_pmac_awacs_speaker_vol)) < 0)
>                       return err;
>               chip->speaker_sw_ctl = snd_ctl_new1(&snd_pmac_awacs_speaker_sw, 
> chip);
> @@ -855,11 +870,11 @@
>       }
>  
>       if (chip->model == PMAC_SCREAMER) {
> -             if ((err = build_mixers(chip, 
> num_controls(snd_pmac_screamer_mic_boost),
> +             if ((err = build_mixers(chip, 
> ARRAY_SIZE(snd_pmac_screamer_mic_boost),
>                                       snd_pmac_screamer_mic_boost)) < 0)
>                       return err;
>       } else {
> -             if ((err = build_mixers(chip, 
> num_controls(snd_pmac_awacs_mic_boost),
> +             if ((err = build_mixers(chip, 
> ARRAY_SIZE(snd_pmac_awacs_mic_boost),
>                                       snd_pmac_awacs_mic_boost)) < 0)
>                       return err;
>       }
> --- linux-2.5-plain/sound/ppc/burgundy.c      2004-08-26 21:01:31.000000000 
> +0200
> +++ linux-sound-plain/sound/ppc/burgundy.c    2004-08-26 21:15:31.000000000 
> +0200
> @@ -28,8 +28,6 @@
>  #include "pmac.h"
>  #include "burgundy.h"
>  
> -#define chip_t pmac_t
> -
>  
>  /* Waits for busy flag to clear */
>  inline static void
> @@ -324,8 +322,6 @@
>  static snd_kcontrol_new_t snd_pmac_burgundy_speaker_sw __initdata = 
>  BURGUNDY_OUTPUT_SWITCH("PC Speaker Playback Switch", 0, 
> BURGUNDY_OUTPUT_INTERN, 0, 0);
>  
> -#define num_controls(ary) (sizeof(ary) / sizeof(snd_kcontrol_new_t))
> -
>  
>  #ifdef PMAC_SUPPORT_AUTOMUTE
>  /*
> @@ -420,7 +416,7 @@
>        */
>       strcpy(chip->card->mixername, "PowerMac Burgundy");
>  
> -     for (i = 0; i < num_controls(snd_pmac_burgundy_mixers); i++) {
> +     for (i = 0; i < ARRAY_SIZE(snd_pmac_burgundy_mixers); i++) {
>               if ((err = snd_ctl_add(chip->card, 
> snd_ctl_new1(&snd_pmac_burgundy_mixers[i], chip))) < 0)
>                       return err;
>       }
> --- linux-2.5-plain/sound/ppc/daca.c  2004-08-26 21:01:02.000000000 +0200
> +++ linux-sound-plain/sound/ppc/daca.c        2004-08-26 21:14:44.000000000 
> +0200
> @@ -28,8 +28,6 @@
>  #include <sound/core.h>
>  #include "pmac.h"
>  
> -#define chip_t pmac_t
> -
>  /* i2c address */
>  #define DACA_I2C_ADDR        0x4d
>  
> @@ -217,8 +215,6 @@
>       },
>  };
>  
> -#define num_controls(ary) (sizeof(ary) / sizeof(snd_kcontrol_new_t))
> -
>  
>  #ifdef CONFIG_PMAC_PBOOK
>  static void daca_resume(pmac_t *chip)
> @@ -272,7 +268,7 @@
>        */
>       strcpy(chip->card->mixername, "PowerMac DACA");
>  
> -     for (i = 0; i < num_controls(daca_mixers); i++) {
> +     for (i = 0; i < ARRAY_SIZE(daca_mixers); i++) {
>               if ((err = snd_ctl_add(chip->card, 
> snd_ctl_new1(&daca_mixers[i], chip))) < 0)
>                       return err;
>       }
> --- linux-2.5-plain/sound/ppc/tumbler.c       2004-08-26 21:00:41.000000000 
> +0200
> +++ linux-sound-plain/sound/ppc/tumbler.c     2004-08-26 21:14:00.000000000 
> +0200
> @@ -16,6 +16,11 @@
>   *   You should have received a copy of the GNU General Public License
>   *   along with this program; if not, write to the Free Software
>   *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
> + *
> + *   Rene Rebe <[EMAIL PROTECTED]>:
> + *     * update from shadow registers on wakeup and headphone plug
> + *     * automatically toggle DRC on headphone plug
> + *   
>   */
>  
>  
> @@ -36,8 +41,6 @@
>  #include "pmac.h"
>  #include "tumbler_volume.h"
>  
> -#define chip_t pmac_t
> -
>  /* i2c address for tumbler */
>  #define TAS_I2C_ADDR 0x34
>  
> @@ -759,12 +762,6 @@
>       DEFINE_MONO("Tone Control - Treble", treble),
>       DEFINE_MONO("PCM Playback Volume", pcm),
>       { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> -       .name = "DRC Switch",
> -       .info = snd_pmac_boolean_mono_info,
> -       .get = tumbler_get_drc_switch,
> -       .put = tumbler_put_drc_switch
> -     },
> -     { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
>         .name = "DRC Range",
>         .info = tumbler_info_drc_value,
>         .get = tumbler_get_drc_value,
> @@ -791,12 +788,6 @@
>       DEFINE_SNAPPER_MONO("Tone Control - Bass", bass),
>       DEFINE_SNAPPER_MONO("Tone Control - Treble", treble),
>       { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> -       .name = "DRC Switch",
> -       .info = snd_pmac_boolean_mono_info,
> -       .get = tumbler_get_drc_switch,
> -       .put = tumbler_put_drc_switch
> -     },
> -     { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
>         .name = "DRC Range",
>         .info = tumbler_info_drc_value,
>         .get = tumbler_get_drc_value,
> @@ -826,6 +817,14 @@
>       .put = tumbler_put_mute_switch,
>       .private_value = TUMBLER_MUTE_AMP,
>  };
> +static snd_kcontrol_new_t tumbler_drc_sw __initdata = {
> +     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> +     .name = "DRC Switch",
> +     .info = snd_pmac_boolean_mono_info,
> +     .get = tumbler_get_drc_switch,
> +     .put = tumbler_put_drc_switch
> +};
> +
>  
>  #ifdef PMAC_SUPPORT_AUTOMUTE
>  /*
> @@ -847,6 +846,29 @@
>       }
>  }
>  
> +static struct work_struct device_change;
> +
> +static void
> +device_change_handler(void *self)
> +{
> +     pmac_t *chip = (pmac_t*) self;
> +     pmac_tumbler_t *mix;
> +
> +     if (!chip)
> +             return;
> +
> +     mix = chip->mixer_data;
> +
> +     /* first set the DRC so the speaker do not explode -ReneR */
> +     if (chip->model == PMAC_TUMBLER)
> +             tumbler_set_drc(mix);
> +     else
> +             snapper_set_drc(mix);
> +
> +     /* reset the master volume so the correct amplification is applied */
> +     tumbler_set_master_volume(mix);
> +}
> +
>  static void tumbler_update_automute(pmac_t *chip, int do_notify)
>  {
>       if (chip->auto_mute) {
> @@ -856,14 +878,25 @@
>                       /* mute speaker */
>                       check_mute(chip, &mix->amp_mute, 1, do_notify, 
> chip->speaker_sw_ctl);
>                       check_mute(chip, &mix->hp_mute, 0, do_notify, 
> chip->master_sw_ctl);
> +                     mix->drc_enable = 0;
> +
>               } else {
>                       /* unmute speaker */
>                       check_mute(chip, &mix->amp_mute, 0, do_notify, 
> chip->speaker_sw_ctl);
>                       check_mute(chip, &mix->hp_mute, 1, do_notify, 
> chip->master_sw_ctl);
> +                     mix->drc_enable = 1;
>               }
> -             if (do_notify)
> +             if (do_notify) {
>                       snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
>                                      &chip->hp_detect_ctl->id);
> +                     snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
> +                                    &chip->drc_sw_ctl->id);
> +             }
> +
> +             /* finally we need to schedule an update of the mixer values
> +                (master and DRC are enough for now) -ReneR */
> +             schedule_work(&device_change);
> +
>       }
>  }
>  #endif /* PMAC_SUPPORT_AUTOMUTE */
> @@ -872,7 +905,7 @@
>  /* interrupt - headphone plug changed */
>  static irqreturn_t headphone_intr(int irq, void *devid, struct pt_regs *regs)
>  {
> -     pmac_t *chip = snd_magic_cast(pmac_t, devid, return IRQ_NONE);
> +     pmac_t *chip = devid;
>       if (chip->update_automute && chip->initialized) {
>               chip->update_automute(chip, 1);
>               return IRQ_HANDLED;
> @@ -1114,11 +1147,17 @@
>       chip->speaker_sw_ctl = snd_ctl_new1(&tumbler_speaker_sw, chip);
>       if ((err = snd_ctl_add(chip->card, chip->speaker_sw_ctl)) < 0)
>               return err;
> +     chip->drc_sw_ctl = snd_ctl_new1(&tumbler_drc_sw, chip);
> +     if ((err = snd_ctl_add(chip->card, chip->drc_sw_ctl)) < 0)
> +             return err;
> +
>  
>  #ifdef CONFIG_PMAC_PBOOK
>       chip->resume = tumbler_resume;
>  #endif
>  
> +     INIT_WORK(&device_change, device_change_handler, (void *)chip);
> +
>  #ifdef PMAC_SUPPORT_AUTOMUTE
>       if (mix->headphone_irq >=0 && (err = snd_pmac_add_automute(chip)) < 0)
>               return err;



--- End Message ---
--- Begin Message ---
The 2.6.8 kernel is no longer supported by Debian so I'm closing
your bug report.  Please try the 2.6.26 kernel from Debian lenny.
If this issue is still present, let me know.

Thanks.

-- 
Martin Michlmayr
http://www.cyrius.com/


--- End Message ---

Reply via email to