Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / sound / pci / cs46xx / cs46xx_lib.c
index 5f2ffb7..69dbf54 100644 (file)
@@ -53,6 +53,8 @@
 #include <linux/interrupt.h>
 #include <linux/slab.h>
 #include <linux/gameport.h>
+#include <linux/mutex.h>
+
 
 #include <sound/core.h>
 #include <sound/control.h>
 #include "cs46xx_lib.h"
 #include "dsp_spos.h"
 
-static void amp_voyetra(cs46xx_t *chip, int change);
+static void amp_voyetra(struct snd_cs46xx *chip, int change);
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static snd_pcm_ops_t snd_cs46xx_playback_rear_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_rear_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_clfe_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_clfe_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_iec958_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_iec958_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_rear_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_rear_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_clfe_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_clfe_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_iec958_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_iec958_ops;
 #endif
 
-static snd_pcm_ops_t snd_cs46xx_playback_ops;
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_ops;
-static snd_pcm_ops_t snd_cs46xx_capture_ops;
-static snd_pcm_ops_t snd_cs46xx_capture_indirect_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_ops;
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_ops;
+static struct snd_pcm_ops snd_cs46xx_capture_ops;
+static struct snd_pcm_ops snd_cs46xx_capture_indirect_ops;
 
-static unsigned short snd_cs46xx_codec_read(cs46xx_t *chip,
+static unsigned short snd_cs46xx_codec_read(struct snd_cs46xx *chip,
                                            unsigned short reg,
                                            int codec_index)
 {
@@ -163,7 +165,7 @@ static unsigned short snd_cs46xx_codec_read(cs46xx_t *chip,
                        goto ok1;
        }
 
-       snd_printk("AC'97 read problem (ACCTL_DCV), reg = 0x%x\n", reg);
+       snd_printk(KERN_ERR "AC'97 read problem (ACCTL_DCV), reg = 0x%x\n", reg);
        result = 0xffff;
        goto end;
        
@@ -182,7 +184,7 @@ static unsigned short snd_cs46xx_codec_read(cs46xx_t *chip,
                udelay(10);
        }
        
-       snd_printk("AC'97 read problem (ACSTS_VSTS), codec_index %d, reg = 0x%x\n", codec_index, reg);
+       snd_printk(KERN_ERR "AC'97 read problem (ACSTS_VSTS), codec_index %d, reg = 0x%x\n", codec_index, reg);
        result = 0xffff;
        goto end;
 
@@ -204,10 +206,10 @@ static unsigned short snd_cs46xx_codec_read(cs46xx_t *chip,
        return result;
 }
 
-static unsigned short snd_cs46xx_ac97_read(ac97_t * ac97,
+static unsigned short snd_cs46xx_ac97_read(struct snd_ac97 * ac97,
                                            unsigned short reg)
 {
-       cs46xx_t *chip = ac97->private_data;
+       struct snd_cs46xx *chip = ac97->private_data;
        unsigned short val;
        int codec_index = ac97->num;
 
@@ -221,7 +223,7 @@ static unsigned short snd_cs46xx_ac97_read(ac97_t * ac97,
 }
 
 
-static void snd_cs46xx_codec_write(cs46xx_t *chip,
+static void snd_cs46xx_codec_write(struct snd_cs46xx *chip,
                                   unsigned short reg,
                                   unsigned short val,
                                   int codec_index)
@@ -281,16 +283,16 @@ static void snd_cs46xx_codec_write(cs46xx_t *chip,
                        goto end;
                }
        }
-       snd_printk("AC'97 write problem, codec_index = %d, reg = 0x%x, val = 0x%x\n", codec_index, reg, val);
+       snd_printk(KERN_ERR "AC'97 write problem, codec_index = %d, reg = 0x%x, val = 0x%x\n", codec_index, reg, val);
  end:
        chip->active_ctrl(chip, -1);
 }
 
-static void snd_cs46xx_ac97_write(ac97_t *ac97,
+static void snd_cs46xx_ac97_write(struct snd_ac97 *ac97,
                                   unsigned short reg,
                                   unsigned short val)
 {
-       cs46xx_t *chip = ac97->private_data;
+       struct snd_cs46xx *chip = ac97->private_data;
        int codec_index = ac97->num;
 
        snd_assert(codec_index == CS46XX_PRIMARY_CODEC_INDEX ||
@@ -305,7 +307,7 @@ static void snd_cs46xx_ac97_write(ac97_t *ac97,
  *  Chip initialization
  */
 
-int snd_cs46xx_download(cs46xx_t *chip,
+int snd_cs46xx_download(struct snd_cs46xx *chip,
                        u32 *src,
                         unsigned long offset,
                         unsigned long len)
@@ -334,7 +336,7 @@ int snd_cs46xx_download(cs46xx_t *chip,
 #include "imgs/cwcbinhack.h"
 #include "imgs/cwcdma.h"
 
-int snd_cs46xx_clear_BA1(cs46xx_t *chip,
+int snd_cs46xx_clear_BA1(struct snd_cs46xx *chip,
                          unsigned long offset,
                          unsigned long len) 
 {
@@ -358,7 +360,7 @@ int snd_cs46xx_clear_BA1(cs46xx_t *chip,
 
 #include "cs46xx_image.h"
 
-int snd_cs46xx_download_image(cs46xx_t *chip)
+int snd_cs46xx_download_image(struct snd_cs46xx *chip)
 {
        int idx, err;
        unsigned long offset = 0;
@@ -379,7 +381,7 @@ int snd_cs46xx_download_image(cs46xx_t *chip)
  *  Chip reset
  */
 
-static void snd_cs46xx_reset(cs46xx_t *chip)
+static void snd_cs46xx_reset(struct snd_cs46xx *chip)
 {
        int idx;
 
@@ -408,7 +410,7 @@ static void snd_cs46xx_reset(cs46xx_t *chip)
        snd_cs46xx_poke(chip, BA1_FRMT, 0xadf);
 }
 
-static int cs46xx_wait_for_fifo(cs46xx_t * chip,int retry_timeout) 
+static int cs46xx_wait_for_fifo(struct snd_cs46xx * chip,int retry_timeout) 
 {
        u32 i, status = 0;
        /*
@@ -432,7 +434,7 @@ static int cs46xx_wait_for_fifo(cs46xx_t * chip,int retry_timeout)
        return 0;
 }
 
-static void snd_cs46xx_clear_serial_FIFOs(cs46xx_t *chip)
+static void snd_cs46xx_clear_serial_FIFOs(struct snd_cs46xx *chip)
 {
        int idx, powerdown = 0;
        unsigned int tmp;
@@ -486,7 +488,7 @@ static void snd_cs46xx_clear_serial_FIFOs(cs46xx_t *chip)
                snd_cs46xx_pokeBA0(chip, BA0_CLKCR1, tmp);
 }
 
-static void snd_cs46xx_proc_start(cs46xx_t *chip)
+static void snd_cs46xx_proc_start(struct snd_cs46xx *chip)
 {
        int cnt;
 
@@ -510,10 +512,10 @@ static void snd_cs46xx_proc_start(cs46xx_t *chip)
        }
 
        if (snd_cs46xx_peek(chip, BA1_SPCR) & SPCR_RUNFR)
-               snd_printk("SPCR_RUNFR never reset\n");
+               snd_printk(KERN_ERR "SPCR_RUNFR never reset\n");
 }
 
-static void snd_cs46xx_proc_stop(cs46xx_t *chip)
+static void snd_cs46xx_proc_stop(struct snd_cs46xx *chip)
 {
        /*
         *  Turn off the run, run at frame, and DMA enable bits in the local copy of
@@ -528,7 +530,7 @@ static void snd_cs46xx_proc_stop(cs46xx_t *chip)
 
 #define GOF_PER_SEC 200
 
-static void snd_cs46xx_set_play_sample_rate(cs46xx_t *chip, unsigned int rate)
+static void snd_cs46xx_set_play_sample_rate(struct snd_cs46xx *chip, unsigned int rate)
 {
        unsigned long flags;
        unsigned int tmp1, tmp2;
@@ -574,7 +576,7 @@ static void snd_cs46xx_set_play_sample_rate(cs46xx_t *chip, unsigned int rate)
        spin_unlock_irqrestore(&chip->reg_lock, flags);
 }
 
-static void snd_cs46xx_set_capture_sample_rate(cs46xx_t *chip, unsigned int rate)
+static void snd_cs46xx_set_capture_sample_rate(struct snd_cs46xx *chip, unsigned int rate)
 {
        unsigned long flags;
        unsigned int phiIncr, coeffIncr, tmp1, tmp2;
@@ -684,43 +686,43 @@ static void snd_cs46xx_set_capture_sample_rate(cs46xx_t *chip, unsigned int rate
  *  PCM part
  */
 
-static void snd_cs46xx_pb_trans_copy(snd_pcm_substream_t *substream,
-                                    snd_pcm_indirect_t *rec, size_t bytes)
+static void snd_cs46xx_pb_trans_copy(struct snd_pcm_substream *substream,
+                                    struct snd_pcm_indirect *rec, size_t bytes)
 {
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t * cpcm = runtime->private_data;
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm * cpcm = runtime->private_data;
        memcpy(cpcm->hw_buf.area + rec->hw_data, runtime->dma_area + rec->sw_data, bytes);
 }
 
-static int snd_cs46xx_playback_transfer(snd_pcm_substream_t *substream)
+static int snd_cs46xx_playback_transfer(struct snd_pcm_substream *substream)
 {
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t * cpcm = runtime->private_data;
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm * cpcm = runtime->private_data;
        snd_pcm_indirect_playback_transfer(substream, &cpcm->pcm_rec, snd_cs46xx_pb_trans_copy);
        return 0;
 }
 
-static void snd_cs46xx_cp_trans_copy(snd_pcm_substream_t *substream,
-                                    snd_pcm_indirect_t *rec, size_t bytes)
+static void snd_cs46xx_cp_trans_copy(struct snd_pcm_substream *substream,
+                                    struct snd_pcm_indirect *rec, size_t bytes)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
        memcpy(runtime->dma_area + rec->sw_data,
               chip->capt.hw_buf.area + rec->hw_data, bytes);
 }
 
-static int snd_cs46xx_capture_transfer(snd_pcm_substream_t *substream)
+static int snd_cs46xx_capture_transfer(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        snd_pcm_indirect_capture_transfer(substream, &chip->capt.pcm_rec, snd_cs46xx_cp_trans_copy);
        return 0;
 }
 
-static snd_pcm_uframes_t snd_cs46xx_playback_direct_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_cs46xx_playback_direct_pointer(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        size_t ptr;
-       cs46xx_pcm_t *cpcm = substream->runtime->private_data;
+       struct snd_cs46xx_pcm *cpcm = substream->runtime->private_data;
        snd_assert (cpcm->pcm_channel,return -ENXIO);
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
@@ -732,11 +734,11 @@ static snd_pcm_uframes_t snd_cs46xx_playback_direct_pointer(snd_pcm_substream_t
        return ptr >> cpcm->shift;
 }
 
-static snd_pcm_uframes_t snd_cs46xx_playback_indirect_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_cs46xx_playback_indirect_pointer(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        size_t ptr;
-       cs46xx_pcm_t *cpcm = substream->runtime->private_data;
+       struct snd_cs46xx_pcm *cpcm = substream->runtime->private_data;
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
        snd_assert (cpcm->pcm_channel,return -ENXIO);
@@ -748,29 +750,29 @@ static snd_pcm_uframes_t snd_cs46xx_playback_indirect_pointer(snd_pcm_substream_
        return snd_pcm_indirect_playback_pointer(substream, &cpcm->pcm_rec, ptr);
 }
 
-static snd_pcm_uframes_t snd_cs46xx_capture_direct_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_cs46xx_capture_direct_pointer(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        size_t ptr = snd_cs46xx_peek(chip, BA1_CBA) - chip->capt.hw_buf.addr;
        return ptr >> chip->capt.shift;
 }
 
-static snd_pcm_uframes_t snd_cs46xx_capture_indirect_pointer(snd_pcm_substream_t * substream)
+static snd_pcm_uframes_t snd_cs46xx_capture_indirect_pointer(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        size_t ptr = snd_cs46xx_peek(chip, BA1_CBA) - chip->capt.hw_buf.addr;
        return snd_pcm_indirect_capture_pointer(substream, &chip->capt.pcm_rec, ptr);
 }
 
-static int snd_cs46xx_playback_trigger(snd_pcm_substream_t * substream,
+static int snd_cs46xx_playback_trigger(struct snd_pcm_substream *substream,
                                       int cmd)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       /*snd_pcm_runtime_t *runtime = substream->runtime;*/
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       /*struct snd_pcm_runtime *runtime = substream->runtime;*/
        int result = 0;
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       cs46xx_pcm_t *cpcm = substream->runtime->private_data;
+       struct snd_cs46xx_pcm *cpcm = substream->runtime->private_data;
        if (! cpcm->pcm_channel) {
                return -ENXIO;
        }
@@ -827,10 +829,10 @@ static int snd_cs46xx_playback_trigger(snd_pcm_substream_t * substream,
        return result;
 }
 
-static int snd_cs46xx_capture_trigger(snd_pcm_substream_t * substream,
+static int snd_cs46xx_capture_trigger(struct snd_pcm_substream *substream,
                                      int cmd)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        unsigned int tmp;
        int result = 0;
 
@@ -858,7 +860,7 @@ static int snd_cs46xx_capture_trigger(snd_pcm_substream_t * substream,
 }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static int _cs46xx_adjust_sample_rate (cs46xx_t *chip, cs46xx_pcm_t *cpcm,
+static int _cs46xx_adjust_sample_rate (struct snd_cs46xx *chip, struct snd_cs46xx_pcm *cpcm,
                                       int sample_rate) 
 {
 
@@ -893,14 +895,14 @@ static int _cs46xx_adjust_sample_rate (cs46xx_t *chip, cs46xx_pcm_t *cpcm,
 #endif
 
 
-static int snd_cs46xx_playback_hw_params(snd_pcm_substream_t * substream,
-                                        snd_pcm_hw_params_t * hw_params)
+static int snd_cs46xx_playback_hw_params(struct snd_pcm_substream *substream,
+                                        struct snd_pcm_hw_params *hw_params)
 {
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t *cpcm;
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm *cpcm;
        int err;
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
        int sample_rate = params_rate(hw_params);
        int period_size = params_period_bytes(hw_params);
 #endif
@@ -909,22 +911,22 @@ static int snd_cs46xx_playback_hw_params(snd_pcm_substream_t * substream,
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
        snd_assert (sample_rate != 0, return -ENXIO);
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
 
        if (_cs46xx_adjust_sample_rate (chip,cpcm,sample_rate)) {
-               up (&chip->spos_mutex);
+               mutex_unlock(&chip->spos_mutex);
                return -ENXIO;
        }
 
        snd_assert (cpcm->pcm_channel != NULL);
        if (!cpcm->pcm_channel) {
-               up (&chip->spos_mutex);
+               mutex_unlock(&chip->spos_mutex);
                return -ENXIO;
        }
 
 
        if (cs46xx_dsp_pcm_channel_set_period (chip,cpcm->pcm_channel,period_size)) {
-                up (&chip->spos_mutex);
+                mutex_unlock(&chip->spos_mutex);
                 return -EINVAL;
         }
 
@@ -965,7 +967,7 @@ static int snd_cs46xx_playback_hw_params(snd_pcm_substream_t * substream,
                }
                if ((err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params))) < 0) {
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-                       up (&chip->spos_mutex);
+                       mutex_unlock(&chip->spos_mutex);
 #endif
                        return err;
                }
@@ -989,17 +991,17 @@ static int snd_cs46xx_playback_hw_params(snd_pcm_substream_t * substream,
        }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 #endif
 
        return 0;
 }
 
-static int snd_cs46xx_playback_hw_free(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_hw_free(struct snd_pcm_substream *substream)
 {
-       /*cs46xx_t *chip = snd_pcm_substream_chip(substream);*/
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t *cpcm;
+       /*struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);*/
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm *cpcm;
 
        cpcm = runtime->private_data;
 
@@ -1017,13 +1019,13 @@ static int snd_cs46xx_playback_hw_free(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_playback_prepare(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_prepare(struct snd_pcm_substream *substream)
 {
        unsigned int tmp;
        unsigned int pfie;
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t *cpcm;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm *cpcm;
 
        cpcm = runtime->private_data;
 
@@ -1087,11 +1089,11 @@ static int snd_cs46xx_playback_prepare(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_capture_hw_params(snd_pcm_substream_t * substream,
-                                       snd_pcm_hw_params_t * hw_params)
+static int snd_cs46xx_capture_hw_params(struct snd_pcm_substream *substream,
+                                       struct snd_pcm_hw_params *hw_params)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
        int err;
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
@@ -1118,10 +1120,10 @@ static int snd_cs46xx_capture_hw_params(snd_pcm_substream_t * substream,
        return 0;
 }
 
-static int snd_cs46xx_capture_hw_free(snd_pcm_substream_t * substream)
+static int snd_cs46xx_capture_hw_free(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
 
        if (runtime->dma_area != chip->capt.hw_buf.area)
                snd_pcm_lib_free_pages(substream);
@@ -1132,10 +1134,10 @@ static int snd_cs46xx_capture_hw_free(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_capture_prepare(snd_pcm_substream_t * substream)
+static int snd_cs46xx_capture_prepare(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
 
        snd_cs46xx_poke(chip, BA1_CBA, chip->capt.hw_buf.addr);
        chip->capt.shift = 2;
@@ -1149,13 +1151,13 @@ static int snd_cs46xx_capture_prepare(snd_pcm_substream_t * substream)
 
 static irqreturn_t snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
-       cs46xx_t *chip = dev_id;
+       struct snd_cs46xx *chip = dev_id;
        u32 status1;
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
        u32 status2;
        int i;
-       cs46xx_pcm_t *cpcm = NULL;
+       struct snd_cs46xx_pcm *cpcm = NULL;
 #endif
 
        /*
@@ -1239,12 +1241,12 @@ static irqreturn_t snd_cs46xx_interrupt(int irq, void *dev_id, struct pt_regs *r
        return IRQ_HANDLED;
 }
 
-static snd_pcm_hardware_t snd_cs46xx_playback =
+static struct snd_pcm_hardware snd_cs46xx_playback =
 {
        .info =                 (SNDRV_PCM_INFO_MMAP |
                                 SNDRV_PCM_INFO_INTERLEAVED | 
-                                SNDRV_PCM_INFO_BLOCK_TRANSFER |
-                                SNDRV_PCM_INFO_RESUME),
+                                SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/
+                                /*SNDRV_PCM_INFO_RESUME*/),
        .formats =              (SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_U8 |
                                 SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |
                                 SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE),
@@ -1261,12 +1263,12 @@ static snd_pcm_hardware_t snd_cs46xx_playback =
        .fifo_size =            0,
 };
 
-static snd_pcm_hardware_t snd_cs46xx_capture =
+static struct snd_pcm_hardware snd_cs46xx_capture =
 {
        .info =                 (SNDRV_PCM_INFO_MMAP |
                                 SNDRV_PCM_INFO_INTERLEAVED |
-                                SNDRV_PCM_INFO_BLOCK_TRANSFER |
-                                SNDRV_PCM_INFO_RESUME),
+                                SNDRV_PCM_INFO_BLOCK_TRANSFER /*|*/
+                                /*SNDRV_PCM_INFO_RESUME*/),
        .formats =              SNDRV_PCM_FMTBIT_S16_LE,
        .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
        .rate_min =             5500,
@@ -1285,7 +1287,7 @@ static snd_pcm_hardware_t snd_cs46xx_capture =
 
 static unsigned int period_sizes[] = { 32, 64, 128, 256, 512, 1024, 2048 };
 
-static snd_pcm_hw_constraint_list_t hw_constraints_period_sizes = {
+static struct snd_pcm_hw_constraint_list hw_constraints_period_sizes = {
        .count = ARRAY_SIZE(period_sizes),
        .list = period_sizes,
        .mask = 0
@@ -1293,19 +1295,18 @@ static snd_pcm_hw_constraint_list_t hw_constraints_period_sizes = {
 
 #endif
 
-static void snd_cs46xx_pcm_free_substream(snd_pcm_runtime_t *runtime)
+static void snd_cs46xx_pcm_free_substream(struct snd_pcm_runtime *runtime)
 {
-       cs46xx_pcm_t * cpcm = runtime->private_data;
-       kfree(cpcm);
+       kfree(runtime->private_data);
 }
 
-static int _cs46xx_playback_open_channel (snd_pcm_substream_t * substream,int pcm_channel_id)
+static int _cs46xx_playback_open_channel (struct snd_pcm_substream *substream,int pcm_channel_id)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       cs46xx_pcm_t * cpcm;
-       snd_pcm_runtime_t *runtime = substream->runtime;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx_pcm * cpcm;
+       struct snd_pcm_runtime *runtime = substream->runtime;
 
-       cpcm = kcalloc(1, sizeof(*cpcm), GFP_KERNEL);
+       cpcm = kzalloc(sizeof(*cpcm), GFP_KERNEL);
        if (cpcm == NULL)
                return -ENOMEM;
        if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
@@ -1320,7 +1321,7 @@ static int _cs46xx_playback_open_channel (snd_pcm_substream_t * substream,int pc
 
        cpcm->substream = substream;
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        cpcm->pcm_channel = NULL; 
        cpcm->pcm_channel_id = pcm_channel_id;
 
@@ -1329,7 +1330,7 @@ static int _cs46xx_playback_open_channel (snd_pcm_substream_t * substream,int pc
                                   SNDRV_PCM_HW_PARAM_PERIOD_BYTES, 
                                   &hw_constraints_period_sizes);
 
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 #else
        chip->playback_pcm = cpcm; /* HACK */
 #endif
@@ -1341,62 +1342,62 @@ static int _cs46xx_playback_open_channel (snd_pcm_substream_t * substream,int pc
        return 0;
 }
 
-static int snd_cs46xx_playback_open(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_open(struct snd_pcm_substream *substream)
 {
        snd_printdd("open front channel\n");
        return _cs46xx_playback_open_channel(substream,DSP_PCM_MAIN_CHANNEL);
 }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static int snd_cs46xx_playback_open_rear(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_open_rear(struct snd_pcm_substream *substream)
 {
        snd_printdd("open rear channel\n");
 
        return _cs46xx_playback_open_channel(substream,DSP_PCM_REAR_CHANNEL);
 }
 
-static int snd_cs46xx_playback_open_clfe(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_open_clfe(struct snd_pcm_substream *substream)
 {
        snd_printdd("open center - LFE channel\n");
 
        return _cs46xx_playback_open_channel(substream,DSP_PCM_CENTER_LFE_CHANNEL);
 }
 
-static int snd_cs46xx_playback_open_iec958(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_open_iec958(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
 
        snd_printdd("open raw iec958 channel\n");
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        cs46xx_iec958_pre_open (chip);
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return _cs46xx_playback_open_channel(substream,DSP_IEC958_CHANNEL);
 }
 
-static int snd_cs46xx_playback_close(snd_pcm_substream_t * substream);
+static int snd_cs46xx_playback_close(struct snd_pcm_substream *substream);
 
-static int snd_cs46xx_playback_close_iec958(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_close_iec958(struct snd_pcm_substream *substream)
 {
        int err;
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
   
        snd_printdd("close raw iec958 channel\n");
 
        err = snd_cs46xx_playback_close(substream);
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        cs46xx_iec958_post_close (chip);
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return err;
 }
 #endif
 
-static int snd_cs46xx_capture_open(snd_pcm_substream_t * substream)
+static int snd_cs46xx_capture_open(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
 
        if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
                                PAGE_SIZE, &chip->capt.hw_buf) < 0)
@@ -1417,11 +1418,11 @@ static int snd_cs46xx_capture_open(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_playback_close(snd_pcm_substream_t * substream)
+static int snd_cs46xx_playback_close(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
-       cs46xx_pcm_t * cpcm;
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       struct snd_cs46xx_pcm * cpcm;
 
        cpcm = runtime->private_data;
 
@@ -1429,12 +1430,12 @@ static int snd_cs46xx_playback_close(snd_pcm_substream_t * substream)
        if (!cpcm) return -ENXIO;
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        if (cpcm->pcm_channel) {
                cs46xx_dsp_destroy_pcm_channel(chip,cpcm->pcm_channel);
                cpcm->pcm_channel = NULL;
        }
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 #else
        chip->playback_pcm = NULL;
 #endif
@@ -1446,9 +1447,9 @@ static int snd_cs46xx_playback_close(snd_pcm_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_capture_close(snd_pcm_substream_t * substream)
+static int snd_cs46xx_capture_close(struct snd_pcm_substream *substream)
 {
-       cs46xx_t *chip = snd_pcm_substream_chip(substream);
+       struct snd_cs46xx *chip = snd_pcm_substream_chip(substream);
 
        chip->capt.substream = NULL;
        snd_dma_free_pages(&chip->capt.hw_buf);
@@ -1458,7 +1459,7 @@ static int snd_cs46xx_capture_close(snd_pcm_substream_t * substream)
 }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static snd_pcm_ops_t snd_cs46xx_playback_rear_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_rear_ops = {
        .open =                 snd_cs46xx_playback_open_rear,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1469,7 +1470,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_rear_ops = {
        .pointer =              snd_cs46xx_playback_direct_pointer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_rear_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_rear_ops = {
        .open =                 snd_cs46xx_playback_open_rear,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1481,7 +1482,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_indirect_rear_ops = {
        .ack =                  snd_cs46xx_playback_transfer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_clfe_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_clfe_ops = {
        .open =                 snd_cs46xx_playback_open_clfe,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1492,7 +1493,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_clfe_ops = {
        .pointer =              snd_cs46xx_playback_direct_pointer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_clfe_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_clfe_ops = {
        .open =                 snd_cs46xx_playback_open_clfe,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1504,7 +1505,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_indirect_clfe_ops = {
        .ack =                  snd_cs46xx_playback_transfer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_iec958_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_iec958_ops = {
        .open =                 snd_cs46xx_playback_open_iec958,
        .close =                snd_cs46xx_playback_close_iec958,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1515,7 +1516,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_iec958_ops = {
        .pointer =              snd_cs46xx_playback_direct_pointer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_iec958_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_iec958_ops = {
        .open =                 snd_cs46xx_playback_open_iec958,
        .close =                snd_cs46xx_playback_close_iec958,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1529,7 +1530,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_indirect_iec958_ops = {
 
 #endif
 
-static snd_pcm_ops_t snd_cs46xx_playback_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_ops = {
        .open =                 snd_cs46xx_playback_open,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1540,7 +1541,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_ops = {
        .pointer =              snd_cs46xx_playback_direct_pointer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_playback_indirect_ops = {
+static struct snd_pcm_ops snd_cs46xx_playback_indirect_ops = {
        .open =                 snd_cs46xx_playback_open,
        .close =                snd_cs46xx_playback_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1552,7 +1553,7 @@ static snd_pcm_ops_t snd_cs46xx_playback_indirect_ops = {
        .ack =                  snd_cs46xx_playback_transfer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_capture_ops = {
+static struct snd_pcm_ops snd_cs46xx_capture_ops = {
        .open =                 snd_cs46xx_capture_open,
        .close =                snd_cs46xx_capture_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1563,7 +1564,7 @@ static snd_pcm_ops_t snd_cs46xx_capture_ops = {
        .pointer =              snd_cs46xx_capture_direct_pointer,
 };
 
-static snd_pcm_ops_t snd_cs46xx_capture_indirect_ops = {
+static struct snd_pcm_ops snd_cs46xx_capture_indirect_ops = {
        .open =                 snd_cs46xx_capture_open,
        .close =                snd_cs46xx_capture_close,
        .ioctl =                snd_pcm_lib_ioctl,
@@ -1575,43 +1576,15 @@ static snd_pcm_ops_t snd_cs46xx_capture_indirect_ops = {
        .ack =                  snd_cs46xx_capture_transfer,
 };
 
-static void snd_cs46xx_pcm_free(snd_pcm_t *pcm)
-{
-       cs46xx_t *chip = pcm->private_data;
-       chip->pcm = NULL;
-       snd_pcm_lib_preallocate_free_for_all(pcm);
-}
-
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static void snd_cs46xx_pcm_rear_free(snd_pcm_t *pcm)
-{
-       cs46xx_t *chip = pcm->private_data;
-       chip->pcm_rear = NULL;
-       snd_pcm_lib_preallocate_free_for_all(pcm);
-}
-
-static void snd_cs46xx_pcm_center_lfe_free(snd_pcm_t *pcm)
-{
-       cs46xx_t *chip = pcm->private_data;
-       chip->pcm_center_lfe = NULL;
-       snd_pcm_lib_preallocate_free_for_all(pcm);
-}
-
-static void snd_cs46xx_pcm_iec958_free(snd_pcm_t *pcm)
-{
-       cs46xx_t *chip = pcm->private_data;
-       chip->pcm_iec958 = NULL;
-       snd_pcm_lib_preallocate_free_for_all(pcm);
-}
-
 #define MAX_PLAYBACK_CHANNELS  (DSP_MAX_PCM_CHANNELS - 1)
 #else
 #define MAX_PLAYBACK_CHANNELS  1
 #endif
 
-int __devinit snd_cs46xx_pcm(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
+int __devinit snd_cs46xx_pcm(struct snd_cs46xx *chip, int device, struct snd_pcm ** rpcm)
 {
-       snd_pcm_t *pcm;
+       struct snd_pcm *pcm;
        int err;
 
        if (rpcm)
@@ -1620,7 +1593,6 @@ int __devinit snd_cs46xx_pcm(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
                return err;
 
        pcm->private_data = chip;
-       pcm->private_free = snd_cs46xx_pcm_free;
 
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs46xx_playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cs46xx_capture_ops);
@@ -1641,9 +1613,9 @@ int __devinit snd_cs46xx_pcm(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
 
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-int __devinit snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
+int __devinit snd_cs46xx_pcm_rear(struct snd_cs46xx *chip, int device, struct snd_pcm ** rpcm)
 {
-       snd_pcm_t *pcm;
+       struct snd_pcm *pcm;
        int err;
 
        if (rpcm)
@@ -1653,7 +1625,6 @@ int __devinit snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
                return err;
 
        pcm->private_data = chip;
-       pcm->private_free = snd_cs46xx_pcm_rear_free;
 
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs46xx_playback_rear_ops);
 
@@ -1671,9 +1642,9 @@ int __devinit snd_cs46xx_pcm_rear(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
        return 0;
 }
 
-int __devinit snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
+int __devinit snd_cs46xx_pcm_center_lfe(struct snd_cs46xx *chip, int device, struct snd_pcm ** rpcm)
 {
-       snd_pcm_t *pcm;
+       struct snd_pcm *pcm;
        int err;
 
        if (rpcm)
@@ -1683,7 +1654,6 @@ int __devinit snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t **
                return err;
 
        pcm->private_data = chip;
-       pcm->private_free = snd_cs46xx_pcm_center_lfe_free;
 
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs46xx_playback_clfe_ops);
 
@@ -1701,9 +1671,9 @@ int __devinit snd_cs46xx_pcm_center_lfe(cs46xx_t *chip, int device, snd_pcm_t **
        return 0;
 }
 
-int __devinit snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t ** rpcm)
+int __devinit snd_cs46xx_pcm_iec958(struct snd_cs46xx *chip, int device, struct snd_pcm ** rpcm)
 {
-       snd_pcm_t *pcm;
+       struct snd_pcm *pcm;
        int err;
 
        if (rpcm)
@@ -1713,7 +1683,6 @@ int __devinit snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t ** rpc
                return err;
 
        pcm->private_data = chip;
-       pcm->private_free = snd_cs46xx_pcm_iec958_free;
 
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs46xx_playback_iec958_ops);
 
@@ -1735,16 +1704,16 @@ int __devinit snd_cs46xx_pcm_iec958(cs46xx_t *chip, int device, snd_pcm_t ** rpc
 /*
  *  Mixer routines
  */
-static void snd_cs46xx_mixer_free_ac97_bus(ac97_bus_t *bus)
+static void snd_cs46xx_mixer_free_ac97_bus(struct snd_ac97_bus *bus)
 {
-       cs46xx_t *chip = bus->private_data;
+       struct snd_cs46xx *chip = bus->private_data;
 
        chip->ac97_bus = NULL;
 }
 
-static void snd_cs46xx_mixer_free_ac97(ac97_t *ac97)
+static void snd_cs46xx_mixer_free_ac97(struct snd_ac97 *ac97)
 {
-       cs46xx_t *chip = ac97->private_data;
+       struct snd_cs46xx *chip = ac97->private_data;
 
        snd_assert ((ac97 == chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]) ||
                    (ac97 == chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]),
@@ -1758,8 +1727,8 @@ static void snd_cs46xx_mixer_free_ac97(ac97_t *ac97)
                chip->ac97[CS46XX_SECONDARY_CODEC_INDEX] = NULL;
 }
 
-static int snd_cs46xx_vol_info(snd_kcontrol_t *kcontrol, 
-                              snd_ctl_elem_info_t *uinfo)
+static int snd_cs46xx_vol_info(struct snd_kcontrol *kcontrol, 
+                              struct snd_ctl_elem_info *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
        uinfo->count = 2;
@@ -1768,9 +1737,9 @@ static int snd_cs46xx_vol_info(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_vol_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int reg = kcontrol->private_value;
        unsigned int val = snd_cs46xx_peek(chip, reg);
        ucontrol->value.integer.value[0] = 0xffff - (val >> 16);
@@ -1778,9 +1747,9 @@ static int snd_cs46xx_vol_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t *
        return 0;
 }
 
-static int snd_cs46xx_vol_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int reg = kcontrol->private_value;
        unsigned int val = ((0xffff - ucontrol->value.integer.value[0]) << 16 | 
                            (0xffff - ucontrol->value.integer.value[1]));
@@ -1796,9 +1765,9 @@ static int snd_cs46xx_vol_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t *
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 
-static int snd_cs46xx_vol_dac_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_dac_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
 
        ucontrol->value.integer.value[0] = chip->dsp_spos_instance->dac_volume_left;
        ucontrol->value.integer.value[1] = chip->dsp_spos_instance->dac_volume_right;
@@ -1806,9 +1775,9 @@ static int snd_cs46xx_vol_dac_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
        return 0;
 }
 
-static int snd_cs46xx_vol_dac_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_dac_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int change = 0;
 
        if (chip->dsp_spos_instance->dac_volume_right != ucontrol->value.integer.value[0] ||
@@ -1823,18 +1792,18 @@ static int snd_cs46xx_vol_dac_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_
 }
 
 #if 0
-static int snd_cs46xx_vol_iec958_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_iec958_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
 
        ucontrol->value.integer.value[0] = chip->dsp_spos_instance->spdif_input_volume_left;
        ucontrol->value.integer.value[1] = chip->dsp_spos_instance->spdif_input_volume_right;
        return 0;
 }
 
-static int snd_cs46xx_vol_iec958_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_vol_iec958_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int change = 0;
 
        if (chip->dsp_spos_instance->spdif_input_volume_left  != ucontrol->value.integer.value[0] ||
@@ -1849,8 +1818,8 @@ static int snd_cs46xx_vol_iec958_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_val
 }
 #endif
 
-static int snd_mixer_boolean_info(snd_kcontrol_t *kcontrol, 
-                                 snd_ctl_elem_info_t *uinfo)
+static int snd_mixer_boolean_info(struct snd_kcontrol *kcontrol, 
+                                 struct snd_ctl_elem_info *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
        uinfo->count = 1;
@@ -1859,10 +1828,10 @@ static int snd_mixer_boolean_info(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_iec958_get(snd_kcontrol_t *kcontrol, 
-                                 snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_iec958_get(struct snd_kcontrol *kcontrol, 
+                                 struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int reg = kcontrol->private_value;
 
        if (reg == CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT)
@@ -1873,15 +1842,15 @@ static int snd_cs46xx_iec958_get(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_iec958_put(snd_kcontrol_t *kcontrol, 
-                                  snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_iec958_put(struct snd_kcontrol *kcontrol, 
+                                  struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int change, res;
 
        switch (kcontrol->private_value) {
        case CS46XX_MIXER_SPDIF_OUTPUT_ELEMENT:
-               down (&chip->spos_mutex);
+               mutex_lock(&chip->spos_mutex);
                change = (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED);
                if (ucontrol->value.integer.value[0] && !change) 
                        cs46xx_dsp_enable_spdif_out(chip);
@@ -1889,7 +1858,7 @@ static int snd_cs46xx_iec958_put(snd_kcontrol_t *kcontrol,
                        cs46xx_dsp_disable_spdif_out(chip);
 
                res = (change != (chip->dsp_spos_instance->spdif_status_out & DSP_SPDIF_STATUS_OUTPUT_ENABLED));
-               up (&chip->spos_mutex);
+               mutex_unlock(&chip->spos_mutex);
                break;
        case CS46XX_MIXER_SPDIF_INPUT_ELEMENT:
                change = chip->dsp_spos_instance->spdif_status_in;
@@ -1910,11 +1879,11 @@ static int snd_cs46xx_iec958_put(snd_kcontrol_t *kcontrol,
        return res;
 }
 
-static int snd_cs46xx_adc_capture_get(snd_kcontrol_t *kcontrol, 
-                                      snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_adc_capture_get(struct snd_kcontrol *kcontrol, 
+                                      struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
 
        if (ins->adc_input != NULL) 
                ucontrol->value.integer.value[0] = 1;
@@ -1924,11 +1893,11 @@ static int snd_cs46xx_adc_capture_get(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_adc_capture_put(snd_kcontrol_t *kcontrol, 
-                                      snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_adc_capture_put(struct snd_kcontrol *kcontrol, 
+                                      struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
        int change = 0;
 
        if (ucontrol->value.integer.value[0] && !ins->adc_input) {
@@ -1941,11 +1910,11 @@ static int snd_cs46xx_adc_capture_put(snd_kcontrol_t *kcontrol,
        return change;
 }
 
-static int snd_cs46xx_pcm_capture_get(snd_kcontrol_t *kcontrol, 
-                                      snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_pcm_capture_get(struct snd_kcontrol *kcontrol, 
+                                      struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
 
        if (ins->pcm_input != NULL) 
                ucontrol->value.integer.value[0] = 1;
@@ -1956,11 +1925,11 @@ static int snd_cs46xx_pcm_capture_get(snd_kcontrol_t *kcontrol,
 }
 
 
-static int snd_cs46xx_pcm_capture_put(snd_kcontrol_t *kcontrol, 
-                                      snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_pcm_capture_put(struct snd_kcontrol *kcontrol, 
+                                      struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
        int change = 0;
 
        if (ucontrol->value.integer.value[0] && !ins->pcm_input) {
@@ -1974,10 +1943,10 @@ static int snd_cs46xx_pcm_capture_put(snd_kcontrol_t *kcontrol,
        return change;
 }
 
-static int snd_herc_spdif_select_get(snd_kcontrol_t *kcontrol, 
-                                     snd_ctl_elem_value_t *ucontrol)
+static int snd_herc_spdif_select_get(struct snd_kcontrol *kcontrol, 
+                                     struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
 
        int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
 
@@ -1992,10 +1961,10 @@ static int snd_herc_spdif_select_get(snd_kcontrol_t *kcontrol,
 /*
  *     Game Theatre XP card - EGPIO[0] is used to select SPDIF input optical or coaxial.
  */ 
-static int snd_herc_spdif_select_put(snd_kcontrol_t *kcontrol, 
-                                       snd_ctl_elem_value_t *ucontrol)
+static int snd_herc_spdif_select_put(struct snd_kcontrol *kcontrol, 
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
        int val2 = snd_cs46xx_peekBA0(chip, BA0_EGPIOPTR);
 
@@ -2017,38 +1986,38 @@ static int snd_herc_spdif_select_put(snd_kcontrol_t *kcontrol,
 }
 
 
-static int snd_cs46xx_spdif_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t * uinfo)
+static int snd_cs46xx_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_IEC958;
        uinfo->count = 1;
        return 0;
 }
 
-static int snd_cs46xx_spdif_default_get(snd_kcontrol_t * kcontrol,
-                                       snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_spdif_default_get(struct snd_kcontrol *kcontrol,
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_default >> 24) & 0xff);
        ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_default >> 16) & 0xff);
        ucontrol->value.iec958.status[2] = 0;
        ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_default) & 0xff);
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return 0;
 }
 
-static int snd_cs46xx_spdif_default_put(snd_kcontrol_t * kcontrol,
-                                       snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_spdif_default_put(struct snd_kcontrol *kcontrol,
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t * chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx * chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
        unsigned int val;
        int change;
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) |
                ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[2]) << 16) |
                ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3]))  |
@@ -2062,13 +2031,13 @@ static int snd_cs46xx_spdif_default_put(snd_kcontrol_t * kcontrol,
        if ( !(ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN) )
                cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val);
 
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return change;
 }
 
-static int snd_cs46xx_spdif_mask_get(snd_kcontrol_t * kcontrol,
-                                    snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_spdif_mask_get(struct snd_kcontrol *kcontrol,
+                                    struct snd_ctl_elem_value *ucontrol)
 {
        ucontrol->value.iec958.status[0] = 0xff;
        ucontrol->value.iec958.status[1] = 0xff;
@@ -2077,31 +2046,31 @@ static int snd_cs46xx_spdif_mask_get(snd_kcontrol_t * kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_spdif_stream_get(snd_kcontrol_t * kcontrol,
-                                         snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_spdif_stream_get(struct snd_kcontrol *kcontrol,
+                                         struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        ucontrol->value.iec958.status[0] = _wrap_all_bits((ins->spdif_csuv_stream >> 24) & 0xff);
        ucontrol->value.iec958.status[1] = _wrap_all_bits((ins->spdif_csuv_stream >> 16) & 0xff);
        ucontrol->value.iec958.status[2] = 0;
        ucontrol->value.iec958.status[3] = _wrap_all_bits((ins->spdif_csuv_stream) & 0xff);
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return 0;
 }
 
-static int snd_cs46xx_spdif_stream_put(snd_kcontrol_t * kcontrol,
-                                        snd_ctl_elem_value_t * ucontrol)
+static int snd_cs46xx_spdif_stream_put(struct snd_kcontrol *kcontrol,
+                                        struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t * chip = snd_kcontrol_chip(kcontrol);
-       dsp_spos_instance_t * ins = chip->dsp_spos_instance;
+       struct snd_cs46xx * chip = snd_kcontrol_chip(kcontrol);
+       struct dsp_spos_instance * ins = chip->dsp_spos_instance;
        unsigned int val;
        int change;
 
-       down (&chip->spos_mutex);
+       mutex_lock(&chip->spos_mutex);
        val = ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[0]) << 24) |
                ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[1]) << 16) |
                ((unsigned int)_wrap_all_bits(ucontrol->value.iec958.status[3])) |
@@ -2115,7 +2084,7 @@ static int snd_cs46xx_spdif_stream_put(snd_kcontrol_t * kcontrol,
        if ( ins->spdif_status_out & DSP_SPDIF_STATUS_PLAYBACK_OPEN )
                cs46xx_poke_via_dsp (chip,SP_SPDOUT_CSUV,val);
 
-       up (&chip->spos_mutex);
+       mutex_unlock(&chip->spos_mutex);
 
        return change;
 }
@@ -2124,8 +2093,8 @@ static int snd_cs46xx_spdif_stream_put(snd_kcontrol_t * kcontrol,
 
 
 #ifdef CONFIG_SND_CS46XX_DEBUG_GPIO
-static int snd_cs46xx_egpio_select_info(snd_kcontrol_t *kcontrol, 
-                                        snd_ctl_elem_info_t *uinfo)
+static int snd_cs46xx_egpio_select_info(struct snd_kcontrol *kcontrol, 
+                                        struct snd_ctl_elem_info *uinfo)
 {
        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
        uinfo->count = 1;
@@ -2134,19 +2103,19 @@ static int snd_cs46xx_egpio_select_info(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_egpio_select_get(snd_kcontrol_t *kcontrol, 
-                                       snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_egpio_select_get(struct snd_kcontrol *kcontrol, 
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        ucontrol->value.integer.value[0] = chip->current_gpio;
 
        return 0;
 }
 
-static int snd_cs46xx_egpio_select_put(snd_kcontrol_t *kcontrol, 
-                                       snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_egpio_select_put(struct snd_kcontrol *kcontrol, 
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int change = (chip->current_gpio != ucontrol->value.integer.value[0]);
        chip->current_gpio = ucontrol->value.integer.value[0];
 
@@ -2154,10 +2123,10 @@ static int snd_cs46xx_egpio_select_put(snd_kcontrol_t *kcontrol,
 }
 
 
-static int snd_cs46xx_egpio_get(snd_kcontrol_t *kcontrol, 
-                                       snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_egpio_get(struct snd_kcontrol *kcontrol, 
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int reg = kcontrol->private_value;
 
        snd_printdd ("put: reg = %04x, gpio %02x\n",reg,chip->current_gpio);
@@ -2167,10 +2136,10 @@ static int snd_cs46xx_egpio_get(snd_kcontrol_t *kcontrol,
        return 0;
 }
 
-static int snd_cs46xx_egpio_put(snd_kcontrol_t *kcontrol, 
-                                       snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_egpio_put(struct snd_kcontrol *kcontrol, 
+                                       struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        int reg = kcontrol->private_value;
        int val = snd_cs46xx_peekBA0(chip, reg);
        int oldval = val;
@@ -2188,7 +2157,7 @@ static int snd_cs46xx_egpio_put(snd_kcontrol_t *kcontrol,
 }
 #endif /* CONFIG_SND_CS46XX_DEBUG_GPIO */
 
-static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
+static struct snd_kcontrol_new snd_cs46xx_controls[] __devinitdata = {
 {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "DAC Volume",
@@ -2232,7 +2201,7 @@ static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
 },
 {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-       .name = "IEC958 Output Switch",
+       .name = SNDRV_CTL_NAME_IEC958("Output ",NONE,SWITCH),
        .info = snd_mixer_boolean_info,
        .get = snd_cs46xx_iec958_get,
        .put = snd_cs46xx_iec958_put,
@@ -2240,7 +2209,7 @@ static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
 },
 {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-       .name = "IEC958 Input Switch",
+       .name = SNDRV_CTL_NAME_IEC958("Input ",NONE,SWITCH),
        .info = snd_mixer_boolean_info,
        .get = snd_cs46xx_iec958_get,
        .put = snd_cs46xx_iec958_put,
@@ -2250,7 +2219,7 @@ static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
 /* Input IEC958 volume does not work for the moment. (Benny) */
 {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
-       .name = "IEC958 Input Volume",
+       .name = SNDRV_CTL_NAME_IEC958("Input ",NONE,VOLUME),
        .info = snd_cs46xx_vol_info,
        .get = snd_cs46xx_vol_iec958_get,
        .put = snd_cs46xx_vol_iec958_put,
@@ -2318,26 +2287,26 @@ static snd_kcontrol_new_t snd_cs46xx_controls[] __devinitdata = {
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 /* set primary cs4294 codec into Extended Audio Mode */
-static int snd_cs46xx_front_dup_get(snd_kcontrol_t *kcontrol, 
-                                   snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_front_dup_get(struct snd_kcontrol *kcontrol, 
+                                   struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        unsigned short val;
        val = snd_ac97_read(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX], AC97_CSR_ACMODE);
        ucontrol->value.integer.value[0] = (val & 0x200) ? 0 : 1;
        return 0;
 }
 
-static int snd_cs46xx_front_dup_put(snd_kcontrol_t *kcontrol, 
-                                   snd_ctl_elem_value_t *ucontrol)
+static int snd_cs46xx_front_dup_put(struct snd_kcontrol *kcontrol, 
+                                   struct snd_ctl_elem_value *ucontrol)
 {
-       cs46xx_t *chip = snd_kcontrol_chip(kcontrol);
+       struct snd_cs46xx *chip = snd_kcontrol_chip(kcontrol);
        return snd_ac97_update_bits(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX],
                                    AC97_CSR_ACMODE, 0x200,
                                    ucontrol->value.integer.value[0] ? 0 : 0x200);
 }
 
-static snd_kcontrol_new_t snd_cs46xx_front_dup_ctl = {
+static struct snd_kcontrol_new snd_cs46xx_front_dup_ctl = {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "Duplicate Front",
        .info = snd_mixer_boolean_info,
@@ -2348,7 +2317,7 @@ static snd_kcontrol_new_t snd_cs46xx_front_dup_ctl = {
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
 /* Only available on the Hercules Game Theater XP soundcard */
-static snd_kcontrol_new_t snd_hercules_controls[] __devinitdata = {
+static struct snd_kcontrol_new snd_hercules_controls[] __devinitdata = {
 {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "Optical/Coaxial SPDIF Input Switch",
@@ -2359,7 +2328,7 @@ static snd_kcontrol_new_t snd_hercules_controls[] __devinitdata = {
 };
 
 
-static void snd_cs46xx_codec_reset (ac97_t * ac97)
+static void snd_cs46xx_codec_reset (struct snd_ac97 * ac97)
 {
        unsigned long end_time;
        int err;
@@ -2401,18 +2370,17 @@ static void snd_cs46xx_codec_reset (ac97_t * ac97)
                if ((err = snd_ac97_read(ac97, AC97_REC_GAIN)) == 0x8a05)
                        return;
 
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout(HZ/100);
+               msleep(10);
        } while (time_after_eq(end_time, jiffies));
 
-       snd_printk("CS46xx secondary codec dont respond!\n");  
+       snd_printk(KERN_ERR "CS46xx secondary codec doesn't respond!\n");  
 }
 #endif
 
-static int __devinit cs46xx_detect_codec(cs46xx_t *chip, int codec)
+static int __devinit cs46xx_detect_codec(struct snd_cs46xx *chip, int codec)
 {
        int idx, err;
-       ac97_template_t ac97;
+       struct snd_ac97_template ac97;
 
        memset(&ac97, 0, sizeof(ac97));
        ac97.private_data = chip;
@@ -2436,20 +2404,19 @@ static int __devinit cs46xx_detect_codec(cs46xx_t *chip, int codec)
                        err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97[codec]);
                        return err;
                }
-               set_current_state(TASK_INTERRUPTIBLE);
-               schedule_timeout(HZ/100);
+               msleep(10);
        }
        snd_printdd("snd_cs46xx: codec %d detection timeout\n", codec);
        return -ENXIO;
 }
 
-int __devinit snd_cs46xx_mixer(cs46xx_t *chip)
+int __devinit snd_cs46xx_mixer(struct snd_cs46xx *chip, int spdif_device)
 {
-       snd_card_t *card = chip->card;
-       snd_ctl_elem_id_t id;
+       struct snd_card *card = chip->card;
+       struct snd_ctl_elem_id id;
        int err;
        unsigned int idx;
-       static ac97_bus_ops_t ops = {
+       static struct snd_ac97_bus_ops ops = {
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
                .reset = snd_cs46xx_codec_reset,
 #endif
@@ -2477,8 +2444,10 @@ int __devinit snd_cs46xx_mixer(cs46xx_t *chip)
 
        /* add cs4630 mixer controls */
        for (idx = 0; idx < ARRAY_SIZE(snd_cs46xx_controls); idx++) {
-               snd_kcontrol_t *kctl;
+               struct snd_kcontrol *kctl;
                kctl = snd_ctl_new1(&snd_cs46xx_controls[idx], chip);
+               if (kctl && kctl->id.iface == SNDRV_CTL_ELEM_IFACE_PCM)
+                       kctl->id.device = spdif_device;
                if ((err = snd_ctl_add(card, kctl)) < 0)
                        return err;
        }
@@ -2517,16 +2486,16 @@ int __devinit snd_cs46xx_mixer(cs46xx_t *chip)
  *  RawMIDI interface
  */
 
-static void snd_cs46xx_midi_reset(cs46xx_t *chip)
+static void snd_cs46xx_midi_reset(struct snd_cs46xx *chip)
 {
        snd_cs46xx_pokeBA0(chip, BA0_MIDCR, MIDCR_MRST);
        udelay(100);
        snd_cs46xx_pokeBA0(chip, BA0_MIDCR, chip->midcr);
 }
 
-static int snd_cs46xx_midi_input_open(snd_rawmidi_substream_t * substream)
+static int snd_cs46xx_midi_input_open(struct snd_rawmidi_substream *substream)
 {
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
 
        chip->active_ctrl(chip, 1);
        spin_lock_irq(&chip->reg_lock);
@@ -2542,9 +2511,9 @@ static int snd_cs46xx_midi_input_open(snd_rawmidi_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_midi_input_close(snd_rawmidi_substream_t * substream)
+static int snd_cs46xx_midi_input_close(struct snd_rawmidi_substream *substream)
 {
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
 
        spin_lock_irq(&chip->reg_lock);
        chip->midcr &= ~(MIDCR_RXE | MIDCR_RIE);
@@ -2560,9 +2529,9 @@ static int snd_cs46xx_midi_input_close(snd_rawmidi_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_midi_output_open(snd_rawmidi_substream_t * substream)
+static int snd_cs46xx_midi_output_open(struct snd_rawmidi_substream *substream)
 {
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
 
        chip->active_ctrl(chip, 1);
 
@@ -2579,9 +2548,9 @@ static int snd_cs46xx_midi_output_open(snd_rawmidi_substream_t * substream)
        return 0;
 }
 
-static int snd_cs46xx_midi_output_close(snd_rawmidi_substream_t * substream)
+static int snd_cs46xx_midi_output_close(struct snd_rawmidi_substream *substream)
 {
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
 
        spin_lock_irq(&chip->reg_lock);
        chip->midcr &= ~(MIDCR_TXE | MIDCR_TIE);
@@ -2597,10 +2566,10 @@ static int snd_cs46xx_midi_output_close(snd_rawmidi_substream_t * substream)
        return 0;
 }
 
-static void snd_cs46xx_midi_input_trigger(snd_rawmidi_substream_t * substream, int up)
+static void snd_cs46xx_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
 {
        unsigned long flags;
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
 
        spin_lock_irqsave(&chip->reg_lock, flags);
        if (up) {
@@ -2617,10 +2586,10 @@ static void snd_cs46xx_midi_input_trigger(snd_rawmidi_substream_t * substream, i
        spin_unlock_irqrestore(&chip->reg_lock, flags);
 }
 
-static void snd_cs46xx_midi_output_trigger(snd_rawmidi_substream_t * substream, int up)
+static void snd_cs46xx_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
 {
        unsigned long flags;
-       cs46xx_t *chip = substream->rmidi->private_data;
+       struct snd_cs46xx *chip = substream->rmidi->private_data;
        unsigned char byte;
 
        spin_lock_irqsave(&chip->reg_lock, flags);
@@ -2647,23 +2616,23 @@ static void snd_cs46xx_midi_output_trigger(snd_rawmidi_substream_t * substream,
        spin_unlock_irqrestore(&chip->reg_lock, flags);
 }
 
-static snd_rawmidi_ops_t snd_cs46xx_midi_output =
+static struct snd_rawmidi_ops snd_cs46xx_midi_output =
 {
        .open =         snd_cs46xx_midi_output_open,
        .close =        snd_cs46xx_midi_output_close,
        .trigger =      snd_cs46xx_midi_output_trigger,
 };
 
-static snd_rawmidi_ops_t snd_cs46xx_midi_input =
+static struct snd_rawmidi_ops snd_cs46xx_midi_input =
 {
        .open =         snd_cs46xx_midi_input_open,
        .close =        snd_cs46xx_midi_input_close,
        .trigger =      snd_cs46xx_midi_input_trigger,
 };
 
-int __devinit snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rrawmidi)
+int __devinit snd_cs46xx_midi(struct snd_cs46xx *chip, int device, struct snd_rawmidi **rrawmidi)
 {
-       snd_rawmidi_t *rmidi;
+       struct snd_rawmidi *rmidi;
        int err;
 
        if (rrawmidi)
@@ -2690,7 +2659,7 @@ int __devinit snd_cs46xx_midi(cs46xx_t *chip, int device, snd_rawmidi_t **rrawmi
 
 static void snd_cs46xx_gameport_trigger(struct gameport *gameport)
 {
-       cs46xx_t *chip = gameport_get_port_data(gameport);
+       struct snd_cs46xx *chip = gameport_get_port_data(gameport);
 
        snd_assert(chip, return);
        snd_cs46xx_pokeBA0(chip, BA0_JSPT, 0xFF);  //outb(gameport->io, 0xFF);
@@ -2698,7 +2667,7 @@ static void snd_cs46xx_gameport_trigger(struct gameport *gameport)
 
 static unsigned char snd_cs46xx_gameport_read(struct gameport *gameport)
 {
-       cs46xx_t *chip = gameport_get_port_data(gameport);
+       struct snd_cs46xx *chip = gameport_get_port_data(gameport);
 
        snd_assert(chip, return 0);
        return snd_cs46xx_peekBA0(chip, BA0_JSPT); //inb(gameport->io);
@@ -2706,7 +2675,7 @@ static unsigned char snd_cs46xx_gameport_read(struct gameport *gameport)
 
 static int snd_cs46xx_gameport_cooked_read(struct gameport *gameport, int *axes, int *buttons)
 {
-       cs46xx_t *chip = gameport_get_port_data(gameport);
+       struct snd_cs46xx *chip = gameport_get_port_data(gameport);
        unsigned js1, js2, jst;
 
        snd_assert(chip, return 0);
@@ -2740,7 +2709,7 @@ static int snd_cs46xx_gameport_open(struct gameport *gameport, int mode)
        return 0;
 }
 
-int __devinit snd_cs46xx_gameport(cs46xx_t *chip)
+int __devinit snd_cs46xx_gameport(struct snd_cs46xx *chip)
 {
        struct gameport *gp;
 
@@ -2768,7 +2737,7 @@ int __devinit snd_cs46xx_gameport(cs46xx_t *chip)
        return 0;
 }
 
-static inline void snd_cs46xx_remove_gameport(cs46xx_t *chip)
+static inline void snd_cs46xx_remove_gameport(struct snd_cs46xx *chip)
 {
        if (chip->gameport) {
                gameport_unregister_port(chip->gameport);
@@ -2776,20 +2745,21 @@ static inline void snd_cs46xx_remove_gameport(cs46xx_t *chip)
        }
 }
 #else
-int __devinit snd_cs46xx_gameport(cs46xx_t *chip) { return -ENOSYS; }
-static inline void snd_cs46xx_remove_gameport(cs46xx_t *chip) { }
+int __devinit snd_cs46xx_gameport(struct snd_cs46xx *chip) { return -ENOSYS; }
+static inline void snd_cs46xx_remove_gameport(struct snd_cs46xx *chip) { }
 #endif /* CONFIG_GAMEPORT */
 
+#ifdef CONFIG_PROC_FS
 /*
  *  proc interface
  */
 
-static long snd_cs46xx_io_read(snd_info_entry_t *entry, void *file_private_data,
+static long snd_cs46xx_io_read(struct snd_info_entry *entry, void *file_private_data,
                               struct file *file, char __user *buf,
                               unsigned long count, unsigned long pos)
 {
        long size;
-       snd_cs46xx_region_t *region = (snd_cs46xx_region_t *)entry->private_data;
+       struct snd_cs46xx_region *region = entry->private_data;
        
        size = count;
        if (pos + (size_t)size > region->size)
@@ -2805,13 +2775,13 @@ static struct snd_info_entry_ops snd_cs46xx_proc_io_ops = {
        .read = snd_cs46xx_io_read,
 };
 
-static int __devinit snd_cs46xx_proc_init(snd_card_t * card, cs46xx_t *chip)
+static int __devinit snd_cs46xx_proc_init(struct snd_card *card, struct snd_cs46xx *chip)
 {
-       snd_info_entry_t *entry;
+       struct snd_info_entry *entry;
        int idx;
        
        for (idx = 0; idx < 5; idx++) {
-               snd_cs46xx_region_t *region = &chip->region.idx[idx];
+               struct snd_cs46xx_region *region = &chip->region.idx[idx];
                if (! snd_card_proc_new(card, region->name, &entry)) {
                        entry->content = SNDRV_INFO_CONTENT_DATA;
                        entry->private_data = chip;
@@ -2826,18 +2796,22 @@ static int __devinit snd_cs46xx_proc_init(snd_card_t * card, cs46xx_t *chip)
        return 0;
 }
 
-static int snd_cs46xx_proc_done(cs46xx_t *chip)
+static int snd_cs46xx_proc_done(struct snd_cs46xx *chip)
 {
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
        cs46xx_dsp_proc_done(chip);
 #endif
        return 0;
 }
+#else /* !CONFIG_PROC_FS */
+#define snd_cs46xx_proc_init(card, chip)
+#define snd_cs46xx_proc_done(chip)
+#endif
 
 /*
  * stop the h/w
  */
-static void snd_cs46xx_hw_stop(cs46xx_t *chip)
+static void snd_cs46xx_hw_stop(struct snd_cs46xx *chip)
 {
        unsigned int tmp;
 
@@ -2884,7 +2858,7 @@ static void snd_cs46xx_hw_stop(cs46xx_t *chip)
 }
 
 
-static int snd_cs46xx_free(cs46xx_t *chip)
+static int snd_cs46xx_free(struct snd_cs46xx *chip)
 {
        int idx;
 
@@ -2904,16 +2878,13 @@ static int snd_cs46xx_free(cs46xx_t *chip)
                snd_cs46xx_hw_stop(chip);
 
        for (idx = 0; idx < 5; idx++) {
-               snd_cs46xx_region_t *region = &chip->region.idx[idx];
+               struct snd_cs46xx_region *region = &chip->region.idx[idx];
                if (region->remap_addr)
                        iounmap(region->remap_addr);
-               if (region->resource) {
-                       release_resource(region->resource);
-                       kfree_nocheck(region->resource);
-               }
+               release_and_free_resource(region->resource);
        }
        if (chip->irq >= 0)
-               free_irq(chip->irq, (void *)chip);
+               free_irq(chip->irq, chip);
 
        if (chip->active_ctrl)
                chip->active_ctrl(chip, -chip->amplifier);
@@ -2930,16 +2901,16 @@ static int snd_cs46xx_free(cs46xx_t *chip)
        return 0;
 }
 
-static int snd_cs46xx_dev_free(snd_device_t *device)
+static int snd_cs46xx_dev_free(struct snd_device *device)
 {
-       cs46xx_t *chip = device->device_data;
+       struct snd_cs46xx *chip = device->device_data;
        return snd_cs46xx_free(chip);
 }
 
 /*
  *  initialize chip
  */
-static int snd_cs46xx_chip_init(cs46xx_t *chip)
+static int snd_cs46xx_chip_init(struct snd_cs46xx *chip)
 {
        int timeout;
 
@@ -3019,8 +2990,7 @@ static int snd_cs46xx_chip_init(cs46xx_t *chip)
        /*
          *  Wait until the PLL has stabilized.
         */
-       set_current_state(TASK_UNINTERRUPTIBLE);
-       schedule_timeout(HZ/10); /* 100ms */
+       msleep(100);
 
        /*
         *  Turn on clocking of the core so that we can setup the serial ports.
@@ -3073,13 +3043,12 @@ static int snd_cs46xx_chip_init(cs46xx_t *chip)
                 */
                if (snd_cs46xx_peekBA0(chip, BA0_ACSTS) & ACSTS_CRDY)
                        goto ok1;
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout((HZ+99)/100);
+               msleep(10);
        }
 
 
-       snd_printk("create - never read codec ready from AC'97\n");
-       snd_printk("it is not probably bug, try to use CS4236 driver\n");
+       snd_printk(KERN_ERR "create - never read codec ready from AC'97\n");
+       snd_printk(KERN_ERR "it is not probably bug, try to use CS4236 driver\n");
        return -EIO;
  ok1:
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
@@ -3123,22 +3092,21 @@ static int snd_cs46xx_chip_init(cs46xx_t *chip)
                 */
                if ((snd_cs46xx_peekBA0(chip, BA0_ACISV) & (ACISV_ISV3 | ACISV_ISV4)) == (ACISV_ISV3 | ACISV_ISV4))
                        goto ok2;
-               set_current_state(TASK_UNINTERRUPTIBLE);
-               schedule_timeout((HZ+99)/100);
+               msleep(10);
        }
 
 #ifndef CONFIG_SND_CS46XX_NEW_DSP
-       snd_printk("create - never read ISV3 & ISV4 from AC'97\n");
+       snd_printk(KERN_ERR "create - never read ISV3 & ISV4 from AC'97\n");
        return -EIO;
 #else
        /* This may happen on a cold boot with a Terratec SiXPack 5.1.
           Reloading the driver may help, if there's other soundcards 
           with the same problem I would like to know. (Benny) */
 
-       snd_printk("ERROR: snd-cs46xx: never read ISV3 & ISV4 from AC'97\n");
-       snd_printk("       Try reloading the ALSA driver, if you find something\n");
-        snd_printk("       broken or not working on your soundcard upon\n");
-       snd_printk("       this message please report to alsa-devel@lists.sourceforge.net\n");
+       snd_printk(KERN_ERR "ERROR: snd-cs46xx: never read ISV3 & ISV4 from AC'97\n");
+       snd_printk(KERN_ERR "       Try reloading the ALSA driver, if you find something\n");
+        snd_printk(KERN_ERR "       broken or not working on your soundcard upon\n");
+       snd_printk(KERN_ERR "       this message please report to alsa-devel@lists.sourceforge.net\n");
 
        return -EIO;
 #endif
@@ -3171,7 +3139,7 @@ static int snd_cs46xx_chip_init(cs46xx_t *chip)
 /*
  *  start and load DSP 
  */
-int __devinit snd_cs46xx_start_dsp(cs46xx_t *chip)
+int __devinit snd_cs46xx_start_dsp(struct snd_cs46xx *chip)
 {      
        unsigned int tmp;
        /*
@@ -3219,7 +3187,7 @@ int __devinit snd_cs46xx_start_dsp(cs46xx_t *chip)
 #else
        /* old image */
        if (snd_cs46xx_download_image(chip) < 0) {
-               snd_printk("image download error\n");
+               snd_printk(KERN_ERR "image download error\n");
                return -EIO;
        }
 
@@ -3273,12 +3241,12 @@ int __devinit snd_cs46xx_start_dsp(cs46xx_t *chip)
  *     AMP control - null AMP
  */
  
-static void amp_none(cs46xx_t *chip, int change)
+static void amp_none(struct snd_cs46xx *chip, int change)
 {      
 }
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-static int voyetra_setup_eapd_slot(cs46xx_t *chip)
+static int voyetra_setup_eapd_slot(struct snd_cs46xx *chip)
 {
        
        u32 idx, valid_slots,tmp,powerdown = 0;
@@ -3398,7 +3366,7 @@ static int voyetra_setup_eapd_slot(cs46xx_t *chip)
  *     Crystal EAPD mode
  */
  
-static void amp_voyetra(cs46xx_t *chip, int change)
+static void amp_voyetra(struct snd_cs46xx *chip, int change)
 {
        /* Manage the EAPD bit on the Crystal 4297 
           and the Analog AD1885 */
@@ -3434,7 +3402,7 @@ static void amp_voyetra(cs46xx_t *chip, int change)
 #endif
 }
 
-static void hercules_init(cs46xx_t *chip) 
+static void hercules_init(struct snd_cs46xx *chip) 
 {
        /* default: AMP off, and SPDIF input optical */
        snd_cs46xx_pokeBA0(chip, BA0_EGPIODR, EGPIODR_GPOE0);
@@ -3445,7 +3413,7 @@ static void hercules_init(cs46xx_t *chip)
 /*
  *     Game Theatre XP card - EGPIO[2] is used to enable the external amp.
  */ 
-static void amp_hercules(cs46xx_t *chip, int change)
+static void amp_hercules(struct snd_cs46xx *chip, int change)
 {
        int old = chip->amplifier;
        int val1 = snd_cs46xx_peekBA0(chip, BA0_EGPIODR);
@@ -3466,7 +3434,7 @@ static void amp_hercules(cs46xx_t *chip, int change)
        }
 }
 
-static void voyetra_mixer_init (cs46xx_t *chip)
+static void voyetra_mixer_init (struct snd_cs46xx *chip)
 {
        snd_printdd ("initializing Voyetra mixer\n");
 
@@ -3475,12 +3443,12 @@ static void voyetra_mixer_init (cs46xx_t *chip)
        snd_cs46xx_pokeBA0(chip, BA0_EGPIOPTR, EGPIODR_GPOE0);
 }
 
-static void hercules_mixer_init (cs46xx_t *chip)
+static void hercules_mixer_init (struct snd_cs46xx *chip)
 {
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
        unsigned int idx;
        int err;
-       snd_card_t *card = chip->card;
+       struct snd_card *card = chip->card;
 #endif
 
        /* set EGPIO to default */
@@ -3490,7 +3458,7 @@ static void hercules_mixer_init (cs46xx_t *chip)
 
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
        for (idx = 0 ; idx < ARRAY_SIZE(snd_hercules_controls); idx++) {
-               snd_kcontrol_t *kctl;
+               struct snd_kcontrol *kctl;
 
                kctl = snd_ctl_new1(&snd_hercules_controls[idx], chip);
                if ((err = snd_ctl_add(card, kctl)) < 0) {
@@ -3507,7 +3475,7 @@ static void hercules_mixer_init (cs46xx_t *chip)
  *     Untested
  */
  
-static void amp_voyetra_4294(cs46xx_t *chip, int change)
+static void amp_voyetra_4294(struct snd_cs46xx *chip, int change)
 {
        chip->amplifier += change;
 
@@ -3528,17 +3496,6 @@ static void amp_voyetra_4294(cs46xx_t *chip, int change)
 #endif
 
 
-/*
- * piix4 pci ids
- */
-#ifndef PCI_VENDOR_ID_INTEL
-#define PCI_VENDOR_ID_INTEL 0x8086
-#endif /* PCI_VENDOR_ID_INTEL */
-
-#ifndef PCI_DEVICE_ID_INTEL_82371AB_3
-#define PCI_DEVICE_ID_INTEL_82371AB_3 0x7113
-#endif /* PCI_DEVICE_ID_INTEL_82371AB_3 */
-
 /*
  *     Handle the CLKRUN on a thinkpad. We must disable CLKRUN support
  *     whenever we need to beat on the chip.
@@ -3548,11 +3505,11 @@ static void amp_voyetra_4294(cs46xx_t *chip, int change)
  *     enough to make them useful.
  */
  
-static void clkrun_hack(cs46xx_t *chip, int change)
+static void clkrun_hack(struct snd_cs46xx *chip, int change)
 {
        u16 control, nval;
        
-       if (chip->acpi_dev == NULL)
+       if (!chip->acpi_port)
                return;
 
        chip->amplifier += change;
@@ -3573,17 +3530,22 @@ static void clkrun_hack(cs46xx_t *chip, int change)
 /*
  * detect intel piix4
  */
-static void clkrun_init(cs46xx_t *chip)
+static void clkrun_init(struct snd_cs46xx *chip)
 {
+       struct pci_dev *pdev;
        u8 pp;
 
-       chip->acpi_dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
-       if (chip->acpi_dev == NULL)
+       chip->acpi_port = 0;
+       
+       pdev = pci_get_device(PCI_VENDOR_ID_INTEL,
+               PCI_DEVICE_ID_INTEL_82371AB_3, NULL);
+       if (pdev == NULL)
                return;         /* Not a thinkpad thats for sure */
 
        /* Find the control port */             
-       pci_read_config_byte(chip->acpi_dev, 0x41, &pp);
+       pci_read_config_byte(pdev, 0x41, &pp);
        chip->acpi_port = pp << 8;
+       pci_dev_put(pdev);
 }
 
 
@@ -3596,10 +3558,10 @@ struct cs_card_type
        u16 vendor;
        u16 id;
        char *name;
-       void (*init)(cs46xx_t *);
-       void (*amp)(cs46xx_t *, int);
-       void (*active)(cs46xx_t *, int);
-       void (*mixer_init)(cs46xx_t *);
+       void (*init)(struct snd_cs46xx *);
+       void (*amp)(struct snd_cs46xx *, int);
+       void (*active)(struct snd_cs46xx *, int);
+       void (*mixer_init)(struct snd_cs46xx *);
 };
 
 static struct cs_card_type __devinitdata cards[] = {
@@ -3699,18 +3661,19 @@ static struct cs_card_type __devinitdata cards[] = {
  * APM support
  */
 #ifdef CONFIG_PM
-static int snd_cs46xx_suspend(snd_card_t *card, pm_message_t state)
+int snd_cs46xx_suspend(struct pci_dev *pci, pm_message_t state)
 {
-       cs46xx_t *chip = card->pm_private_data;
+       struct snd_card *card = pci_get_drvdata(pci);
+       struct snd_cs46xx *chip = card->private_data;
        int amp_saved;
 
+       snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
        snd_pcm_suspend_all(chip->pcm);
        // chip->ac97_powerdown = snd_cs46xx_codec_read(chip, AC97_POWER_CONTROL);
        // chip->ac97_general_purpose = snd_cs46xx_codec_read(chip, BA0_AC97_GENERAL_PURPOSE);
 
        snd_ac97_suspend(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]);
-       if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX])
-               snd_ac97_suspend(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
+       snd_ac97_suspend(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
 
        amp_saved = chip->amplifier;
        /* turn off amp */
@@ -3719,17 +3682,20 @@ static int snd_cs46xx_suspend(snd_card_t *card, pm_message_t state)
        /* disable CLKRUN */
        chip->active_ctrl(chip, -chip->amplifier);
        chip->amplifier = amp_saved; /* restore the status */
-       pci_disable_device(chip->pci);
+       pci_disable_device(pci);
+       pci_save_state(pci);
        return 0;
 }
 
-static int snd_cs46xx_resume(snd_card_t *card)
+int snd_cs46xx_resume(struct pci_dev *pci)
 {
-       cs46xx_t *chip = card->pm_private_data;
+       struct snd_card *card = pci_get_drvdata(pci);
+       struct snd_cs46xx *chip = card->private_data;
        int amp_saved;
 
-       pci_enable_device(chip->pci);
-       pci_set_master(chip->pci);
+       pci_restore_state(pci);
+       pci_enable_device(pci);
+       pci_set_master(pci);
        amp_saved = chip->amplifier;
        chip->amplifier = 0;
        chip->active_ctrl(chip, 1); /* force to on */
@@ -3748,14 +3714,14 @@ static int snd_cs46xx_resume(snd_card_t *card)
 #endif
 
        snd_ac97_resume(chip->ac97[CS46XX_PRIMARY_CODEC_INDEX]);
-       if (chip->ac97[CS46XX_SECONDARY_CODEC_INDEX])
-               snd_ac97_resume(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
+       snd_ac97_resume(chip->ac97[CS46XX_SECONDARY_CODEC_INDEX]);
 
        if (amp_saved)
                chip->amplifier_ctrl(chip, 1); /* turn amp on */
        else
                chip->active_ctrl(chip, -1); /* disable CLKRUN */
        chip->amplifier = amp_saved;
+       snd_power_change_state(card, SNDRV_CTL_POWER_D0);
        return 0;
 }
 #endif /* CONFIG_PM */
@@ -3764,17 +3730,17 @@ static int snd_cs46xx_resume(snd_card_t *card)
 /*
  */
 
-int __devinit snd_cs46xx_create(snd_card_t * card,
+int __devinit snd_cs46xx_create(struct snd_card *card,
                      struct pci_dev * pci,
                      int external_amp, int thinkpad,
-                     cs46xx_t ** rchip)
+                     struct snd_cs46xx ** rchip)
 {
-       cs46xx_t *chip;
+       struct snd_cs46xx *chip;
        int err, idx;
-       snd_cs46xx_region_t *region;
+       struct snd_cs46xx_region *region;
        struct cs_card_type *cp;
        u16 ss_card, ss_vendor;
-       static snd_device_ops_t ops = {
+       static struct snd_device_ops ops = {
                .dev_free =     snd_cs46xx_dev_free,
        };
        
@@ -3784,14 +3750,14 @@ int __devinit snd_cs46xx_create(snd_card_t * card,
        if ((err = pci_enable_device(pci)) < 0)
                return err;
 
-       chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
+       chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (chip == NULL) {
                pci_disable_device(pci);
                return -ENOMEM;
        }
        spin_lock_init(&chip->reg_lock);
 #ifdef CONFIG_SND_CS46XX_NEW_DSP
-       init_MUTEX(&chip->spos_mutex);
+       mutex_init(&chip->spos_mutex);
 #endif
        chip->card = card;
        chip->pci = pci;
@@ -3800,7 +3766,8 @@ int __devinit snd_cs46xx_create(snd_card_t * card,
        chip->ba1_addr = pci_resource_start(pci, 1);
        if (chip->ba0_addr == 0 || chip->ba0_addr == (unsigned long)~0 ||
            chip->ba1_addr == 0 || chip->ba1_addr == (unsigned long)~0) {
-               snd_printk("wrong address(es) - ba0 = 0x%lx, ba1 = 0x%lx\n", chip->ba0_addr, chip->ba1_addr);
+               snd_printk(KERN_ERR "wrong address(es) - ba0 = 0x%lx, ba1 = 0x%lx\n",
+                          chip->ba0_addr, chip->ba1_addr);
                snd_cs46xx_free(chip);
                return -ENOMEM;
        }
@@ -3849,12 +3816,12 @@ int __devinit snd_cs46xx_create(snd_card_t * card,
        }
 
        if (external_amp) {
-               snd_printk("Crystal EAPD support forced on.\n");
+               snd_printk(KERN_INFO "Crystal EAPD support forced on.\n");
                chip->amplifier_ctrl = amp_voyetra;
        }
 
        if (thinkpad) {
-               snd_printk("Activating CLKRUN hack for Thinkpad.\n");
+               snd_printk(KERN_INFO "Activating CLKRUN hack for Thinkpad.\n");
                chip->active_ctrl = clkrun_hack;
                clkrun_init(chip);
        }
@@ -3870,21 +3837,24 @@ int __devinit snd_cs46xx_create(snd_card_t * card,
 
        for (idx = 0; idx < 5; idx++) {
                region = &chip->region.idx[idx];
-               if ((region->resource = request_mem_region(region->base, region->size, region->name)) == NULL) {
-                       snd_printk("unable to request memory region 0x%lx-0x%lx\n", region->base, region->base + region->size - 1);
+               if ((region->resource = request_mem_region(region->base, region->size,
+                                                          region->name)) == NULL) {
+                       snd_printk(KERN_ERR "unable to request memory region 0x%lx-0x%lx\n",
+                                  region->base, region->base + region->size - 1);
                        snd_cs46xx_free(chip);
                        return -EBUSY;
                }
                region->remap_addr = ioremap_nocache(region->base, region->size);
                if (region->remap_addr == NULL) {
-                       snd_printk("%s ioremap problem\n", region->name);
+                       snd_printk(KERN_ERR "%s ioremap problem\n", region->name);
                        snd_cs46xx_free(chip);
                        return -ENOMEM;
                }
        }
 
-       if (request_irq(pci->irq, snd_cs46xx_interrupt, SA_INTERRUPT|SA_SHIRQ, "CS46XX", (void *) chip)) {
-               snd_printk("unable to grab IRQ %d\n", pci->irq);
+       if (request_irq(pci->irq, snd_cs46xx_interrupt, SA_INTERRUPT|SA_SHIRQ,
+                       "CS46XX", chip)) {
+               snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
                snd_cs46xx_free(chip);
                return -EBUSY;
        }
@@ -3911,8 +3881,6 @@ int __devinit snd_cs46xx_create(snd_card_t * card,
        
        snd_cs46xx_proc_init(card, chip);
 
-       snd_card_set_pm_callback(card, snd_cs46xx_suspend, snd_cs46xx_resume, chip);
-
        chip->active_ctrl(chip, -1); /* disable CLKRUN */
 
        snd_card_set_dev(card, &pci->dev);