summaryrefslogtreecommitdiff
path: root/packages/linux/linux-ezx/ezx_sound.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux/linux-ezx/ezx_sound.patch')
-rw-r--r--packages/linux/linux-ezx/ezx_sound.patch6874
1 files changed, 0 insertions, 6874 deletions
diff --git a/packages/linux/linux-ezx/ezx_sound.patch b/packages/linux/linux-ezx/ezx_sound.patch
deleted file mode 100644
index 7a3b609e51..0000000000
--- a/packages/linux/linux-ezx/ezx_sound.patch
+++ /dev/null
@@ -1,6874 +0,0 @@
-Sound support for EZX platform
-
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-a780.c linux-2.6.16.5-exz/sound/oss/ezx-a780.c
---- linux-2.6.16.5/sound/oss/ezx-a780.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-a780.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,530 @@
-+/*
-+ * linux/drivers/sound/ezx-a780.c
-+ *
-+ *
-+ * Description: Motorola a780 phone specific functions implementation for audio drivers
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Created, Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Jin Lihong(w20076) Jun.22,2004,LIBee24284 mixer power save
-+ * Cheng Xuefeng(a2491c) Jun.24,2004,LIBdd95397 Add EMU PIHF carkit sound path
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-common.h"
-+
-+
-+#ifdef CONFIG_ARCH_EZX_A780
-+
-+extern u32 gpio_hw_attenuate_a780_status;
-+
-+
-+void close_input_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input carkit. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+#if EMU_PIHF_FEATURE
-+void close_input_pihf_carkit(void)
-+{
-+ printk("EMU:%s,%s\n",__FILE__,__FUNCTION__);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+#endif /* EMU_PIHF_FEATURE */
-+
-+
-+void close_input_handset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input handset. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON1);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_MUX);
-+}
-+
-+
-+void close_input_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input headset. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_MUX);
-+}
-+
-+
-+void open_input_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input carkit. \n");
-+#endif
-+
-+ codec_input_path = CARKIT_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+#if EMU_PIHF_FEATURE
-+void open_input_pihf_carkit(void)
-+{
-+ printk("EMU:%s,%s\n",__FILE__,__FUNCTION__);
-+ codec_input_path = PIHF_CARKIT_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+#endif /* EMU_PIHF_FEATURE */
-+
-+
-+void open_input_handset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input handset. \n");
-+#endif
-+
-+ codec_input_path = HANDSET_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON1);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_MUX);
-+}
-+
-+
-+void open_input_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input headset. \n");
-+#endif
-+
-+ codec_input_path = HEADSET_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_MUX);
-+}
-+
-+
-+void close_output_pcap_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap headset. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+}
-+
-+
-+void close_output_pcap_louderspeaker(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap louderspeaker. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A2_EN);
-+}
-+
-+
-+void close_output_pcap_earpiece(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap earpiece. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1_EN);
-+}
-+
-+
-+void close_output_pcap_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap carkit. \n");
-+#endif
-+ EIHF_Mute(EIHF_MUTE); //Mute EIHF
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+
-+ Set_EMU_Mux_Switch(DEFAULT_USB_MODE);
-+}
-+
-+
-+#if EMU_PIHF_FEATURE
-+void close_output_pcap_pihf_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap pihf carkit. \n");
-+ printk("EMU:%s,%s\n",__FILE__,__FUNCTION__);
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+}
-+#endif /* EMU_PIHF_FEATURE */
-+
-+
-+void close_output_pcap_headjack(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap headjack. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+}
-+
-+
-+void close_output_pcap_bluetooth(void)
-+{
-+}
-+
-+
-+int open_output_pcap_headset(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap headset. \n");
-+#endif
-+
-+ if((audioonflag & DSP_DEVICE)==DSP_DEVICE)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ codec_output_path = val;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_louderspeaker(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap louderspeaker. \n");
-+#endif
-+
-+ if((audioonflag & DSP_DEVICE)==DSP_DEVICE)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ codec_output_path = val;
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A2_EN);
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_earpiece(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap earpiece. \n");
-+#endif
-+
-+ if((audioonflag & DSP_DEVICE)==DSP_DEVICE)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ codec_output_path = val;
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1_EN);
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_carkit(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap carkit. \n");
-+#endif
-+
-+ Set_EMU_Mux_Switch(MONO_AUDIO_MODE);
-+
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+
-+ codec_output_path = val;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+
-+ set_output_gain_hw_reg();
-+
-+ EIHF_Mute(EIHF_UNMUTE);
-+
-+ return ret;
-+}
-+
-+
-+#if EMU_PIHF_FEATURE
-+int open_output_pcap_pihf_carkit(long val)
-+{
-+ int ret;
-+
-+ printk("EMU:%s,%s\n",__FILE__,__FUNCTION__);
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+
-+ codec_output_path = val;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+#endif /* EMU_PIHF_FEATURE */
-+
-+
-+int open_output_pcap_headjack(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap headjack. \n");
-+#endif
-+
-+ if((audioonflag & DSP_DEVICE)==DSP_DEVICE)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ codec_output_path = val;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_bluetooth(long val)
-+{
-+ return 0;
-+}
-+
-+
-+void set_output_gain_hw_reg(void)
-+{
-+ SSP_PCAP_AUDOG_set( PCAP_OUTPUT_GAIN_REG_VAL_FROM_LOGIC );
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_output_gain=%d\n", codec_output_gain);
-+ printk(EZXOSS_DEBUG "output gain=%d\n",PCAP_OUTPUT_GAIN_REG_VAL_FROM_LOGIC);
-+#endif
-+}
-+
-+
-+void set_input_gain_hw_reg(void)
-+{
-+ SSP_PCAP_AUDIG_set( PCAP_INPUT_AUDIG_REG_VAL_FROM_LOGIC );
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_input_gain=%d\n", codec_input_gain);
-+#endif
-+}
-+
-+
-+void poweron_mixer( audio_dev_type type )
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device wants to power on the mixer hardware.\n", type);
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device has already powered on the mixer hardware.\n", audioonflag);
-+#endif
-+
-+ audioonflag |= type;
-+ if( audioonflag == type )
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device is powering on the mixer hardware.\n", type);
-+#endif
-+
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+
-+ /* (1) set pcap audio power V2_EN_2(OR WITH V2_EN) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+
-+ /* (6) enable output_path and set gain */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP); /* disable codec bypass */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ST_DAC_SW); /* close stereo switch */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CDC_SW); /* open telephone codec path into right PGA */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW); /* close PGA_INR into PGA */
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN); /* enable right PGA */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN); /* enable left PGA */
-+ }
-+}
-+
-+
-+void shutdown_mixer( audio_dev_type type )
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device wants to shut down the mixer hardware.\n", type);
-+#endif
-+
-+ audioonflag &= ~type;
-+
-+ if( audioonflag == 0 )
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device is shutting down the mixer hardware.\n", type);
-+#endif
-+ /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER, SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ }
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "A780 No. 0x%X device is still using the mixer hardware.\n", audioonflag);
-+#endif
-+}
-+
-+
-+void mixer_not_in_use(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " A780 mixer not in use.\n");
-+#endif
-+
-+ (*mixer_close_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])();
-+ (*mixer_close_input_path[codec_input_path])();
-+
-+ if( micinflag == 0 ) /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER, SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+}
-+
-+
-+u32 gpio_hw_attenuate_a780_status;
-+void use_hw_noise_attenuate(void)
-+{
-+ set_GPIO_mode(GPIO_HW_ATTENUATE_A780 | GPIO_OUT);
-+ clr_GPIO(GPIO_HW_ATTENUATE_A780);
-+ PGSR(GPIO_HW_ATTENUATE_A780) &= ~GPIO_bit(GPIO_HW_ATTENUATE_A780);
-+ gpio_hw_attenuate_a780_status = 0;
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "set a780 hw noise attenuation gpio low. \n");
-+#endif
-+}
-+
-+
-+void bypass_hw_noise_attenuate(void)
-+{
-+ set_GPIO_mode(GPIO_HW_ATTENUATE_A780 | GPIO_OUT);
-+ set_GPIO(GPIO_HW_ATTENUATE_A780);
-+ PGSR(GPIO_HW_ATTENUATE_A780) |= GPIO_bit(GPIO_HW_ATTENUATE_A780);
-+ gpio_hw_attenuate_a780_status = 1;
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "set a780 hw noise attenuation gpio high. \n");
-+#endif
-+}
-+
-+
-+void pcap_use_ap_13m_clock(void)
-+{
-+ OSCC |= 0x00000008;
-+ set_GPIO_mode(AP_13MHZ_OUTPUT_PIN | GPIO_ALT_FN_3_OUT);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_CLK_IN_SEL);
-+}
-+
-+
-+void pcap_use_bp_13m_clock(void)
-+{
-+ OSCC &= ~0x00000008;
-+ set_GPIO_mode(AP_13MHZ_OUTPUT_PIN | GPIO_IN);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_CLK_IN_SEL);
-+}
-+
-+
-+#ifdef CONFIG_PM
-+int mixer_hw_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-+{
-+ switch(req){
-+ case PM_SUSPEND:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " A780 before AP sleep.\n");
-+#endif
-+ if( (audioonflag & PHONE_DEVICE) == 0 )
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+ break;
-+ case PM_RESUME:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " A780 after AP sleep.\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+ set_output_gain_hw_reg();
-+
-+ if(gpio_hw_attenuate_a780_status)
-+ bypass_hw_noise_attenuate();
-+ else
-+ use_hw_noise_attenuate();
-+ if(audioonflag)
-+ (*mixer_open_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])(codec_output_base|codec_output_path);
-+
-+ break;
-+ }
-+ return 0;
-+}
-+#endif
-+
-+
-+void mute_output_to_avoid_pcap_noise(void)
-+{
-+}
-+
-+
-+void undo_mute_output_to_avoid_pcap_noise(void)
-+{
-+}
-+
-+
-+#endif
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-a780.h linux-2.6.16.5-exz/sound/oss/ezx-a780.h
---- linux-2.6.16.5/sound/oss/ezx-a780.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-a780.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,117 @@
-+/*
-+ * linux/drivers/sound/ezx-a780.h
-+ *
-+ *
-+ * Description: header file for ezx-a780.c
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Created, Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Jin Lihong(w20076) Jun.22,2004,LIBee24284 mixer power save
-+ * Cheng Xuefeng(a2491c) Jun.24,2004,LIBdd95397 Add EMU PIHF carkit sound path
-+ *
-+ */
-+
-+#ifndef EZX_A780_H
-+#define EZX_A780_H
-+
-+#include <linux/config.h>
-+
-+#ifdef CONFIG_ARCH_EZX_A780
-+
-+//#define EZX_OSS_DEBUG /* debug switch for all ezx oss src files excluding ezx-audio.c */
-+#undef EZX_OSS_DEBUG
-+//#define EZX_OSS_AUDIO_DEBUG /* debug switch for src file ezx-audio.c */
-+#undef EZX_OSS_AUDIO_DEBUG
-+
-+/*
-+#ifdef EZX_OSS_DBG
-+#define OSSPRINTF(fmt,args...) printf(fmt,##args)
-+#else
-+#define OSSPRINTF(fmt,args...) { }
-+#endif
-+*/
-+
-+
-+typedef enum{
-+ PHONE_DEVICE = 0x01,
-+ DSP_DEVICE = 0x02,
-+ DSP16_DEVICE = 0x04,
-+ AUDIO_DEVICE = 0x08
-+}audio_dev_type;
-+
-+typedef enum{
-+ HW_ATTENUATION_USED,
-+ HW_ATTENUATION_BYPASSED
-+}hw_noise_attenuation;
-+
-+
-+void close_input_carkit(void);
-+void close_input_handset(void);
-+void close_input_headset(void);
-+#if EMU_PIHF_FEATURE
-+void close_input_pihf_carkit(void);
-+#endif
-+
-+void open_input_carkit(void);
-+void open_input_handset(void);
-+void open_input_headset(void);
-+#if EMU_PIHF_FEATURE
-+void open_input_pihf_carkit(void);
-+#endif
-+
-+void close_output_pcap_headset(void);
-+void close_output_pcap_louderspeaker(void);
-+void close_output_pcap_earpiece(void);
-+void close_output_pcap_carkit(void);
-+void close_output_pcap_headjack(void);
-+void close_output_pcap_bluetooth(void);
-+#if EMU_PIHF_FEATURE
-+void close_output_pcap_pihf_carkit(void);
-+#endif
-+
-+int open_output_pcap_headset(long val);
-+int open_output_pcap_louderspeaker(long val);
-+int open_output_pcap_earpiece(long val);
-+int open_output_pcap_carkit(long val);
-+int open_output_pcap_headjack(long val);
-+int open_output_pcap_bluetooth(long val);
-+#if EMU_PIHF_FEATURE
-+int open_output_pcap_pihf_carkit(long val);
-+#endif
-+
-+void set_output_gain_hw_reg(void);
-+void set_input_gain_hw_reg(void);
-+
-+void poweron_mixer( audio_dev_type type );
-+void shutdown_mixer( audio_dev_type type );
-+void mixer_not_in_use(void);
-+
-+void use_hw_noise_attenuate(void);
-+void bypass_hw_noise_attenuate(void);
-+
-+void pcap_use_ap_13m_clock(void);
-+void pcap_use_bp_13m_clock(void);
-+
-+void mute_output_to_avoid_pcap_noise(void);
-+void undo_mute_output_to_avoid_pcap_noise(void);
-+
-+int mixer_hw_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data);
-+
-+#endif
-+
-+
-+#endif
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-asspm.c linux-2.6.16.5-exz/sound/oss/ezx-asspm.c
---- linux-2.6.16.5/sound/oss/ezx-asspm.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-asspm.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,550 @@
-+/*
-+ * linux/drivers/sound/ezx-asspm.c
-+ *
-+ *
-+ * Description: assp interface for the ezx platform
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Jun 20,2002 created
-+ * zhouqiong Sep 19,2002 according code review meeting minutes.
-+ * zhouqiong Oct 30,2002 according new requirement for VA.ASSP interface split to
-+ * /dev/dsp (support stereo playback) and /dev/dsp16 (support
-+ * mono playback and record).this file is for mono playback and record
-+ * zhouqiong Nov 05,2002 according code review meeting minutes.
-+ * zhouqiong Mar 04,2003 (1) don't close headset interrupt;
-+ * (2) when headset in, output gain decrease 6db
-+ * zhouqiong Apr 24,2003 no switch for headset insert and remove
-+ * LiYong Sep 23,2003 Port from EZX
-+ * Jin Lihong(w20076) Jan 02,2004,LIBdd66088 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * lin weiqiang Jun.08,2004,LIBee14656 record noise bug fix.
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/poll.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-audio.h"
-+#include "ezx-common.h"
-+
-+
-+static DECLARE_MUTEX(cotulla_assp_mono_mutex);
-+
-+EXPORT_SYMBOL(set_pcap_telephone_codec);
-+EXPORT_SYMBOL(set_pcap_input_path);
-+EXPORT_SYMBOL(set_pcap_output_path);
-+
-+static int assp_mono_init(void);
-+static void assp_mono_shutdown(void);
-+
-+void set_pcap_telephone_codec(int port)
-+{
-+ unsigned long ssp_pcap_register_val;
-+ SSP_PCAP_BIT_STATUS phoneClkBit;
-+ /* set pcap register, telephone codec */
-+ /* (1) set pcap audio power V2_EN_2(OR WITH V2_EN) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+
-+ /* disable PCAP stereo DAC */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_ST_DAC_REGISTER, 0);
-+ /* (2) set codec sample rate(FS_8K_16K=0) */
-+ /* CDC_CLK(000=13MHZ) bitclk output(SMB=0) audio IO1(DIG_AUD_IN=1) */
-+ ssp_pcap_register_val = PCAP_CDC_CLK_IN_13M0;
-+ phoneClkBit = SSP_PCAP_get_bit_from_PCAP(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_CODEC_REGISTER, ssp_pcap_register_val);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB); /* master */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K); /* 8K sample rate */
-+/*
-+ if( SSP_PCAP_BIT_ONE == phoneClkBit)
-+ {
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ }
-+ else
-+ {
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ }
-+*/
-+ if(port)
-+ {
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DIG_AUD_IN); /* DAI1 */
-+ }
-+ else
-+ {
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_DIG_AUD_IN); /* DAI0 */
-+ }
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDIHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDOHPF);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_INV);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_INV);
-+
-+ /*(3) reset digital filter(DF_RESET=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_ADITH);
-+ /* (4) enable pcap clk(CDC_CLK_EN=1),enable CODEC(CDC_EN=1) */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ mdelay(1); /* specified enable time */
-+}
-+
-+
-+void set_pcap_output_path(void)
-+{
-+ int ret;
-+
-+ /* enable output_path */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ST_DAC_SW); /* close stereo switch */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW); /* close PGA_INR into PGA */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CDC_SW); /* open telephone switch */
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN); /* enable right PGA */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN); /* disable left PGA */
-+
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL); /* right+left output */
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_output_path = %d\n", codec_output_path);
-+ printk(EZXOSS_DEBUG "codec_output_base = %d\n", codec_output_base);
-+#endif
-+ ret = (*mixer_open_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])(codec_output_base|codec_output_path);
-+}
-+
-+
-+void set_pcap_input_path(void)
-+{
-+ unsigned long ssp_pcap_register_val;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_input_path=%d\n", codec_input_path);
-+#endif
-+
-+ (*mixer_open_input_path[codec_input_path])();
-+ set_input_gain_hw_reg();
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+}
-+
-+
-+/*initialize hardware, assp controller and pcap register*/
-+static int assp_mono_init(void)
-+{
-+ unsigned long flags;
-+ unsigned long ssp_pcap_register_val;
-+ unsigned int audiostatus;
-+ unsigned long timeout;
-+
-+/*
-+#ifdef CONFIG_ARCH_EZX_E680
-+ if( audioonflag & FM_DEVICE ){
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 open dsp16 EBUSY because 0x%X device is using the sound hardware.\n",audioonflag );
-+#endif
-+ return -EBUSY;
-+ }
-+#endif
-+*/
-+
-+ audioonflag |= DSP16_DEVICE;
-+
-+ down(&cotulla_assp_mono_mutex);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "setup assp controller register \n");
-+#endif
-+ local_irq_save(flags);
-+ CKEN |= CKEN4_ASSP; /* need enable cken4 */
-+
-+ set_GPIO_mode(GPIO_SYNC_IN_ASSP_MD);
-+ set_GPIO_mode(GPIO_SDATA_OUT_ASSP_MD);
-+ set_GPIO_mode(GPIO_BITCLK_IN_ASSP_MD);
-+ set_GPIO_mode(GPIO_SDATA_IN_ASSP_MD);
-+
-+ /* setup assp port */
-+ ASSCR0 = ASSCR0_FRF_PSP | ASSCR0_DSS_16bit; /* psp mode, 16bit */
-+ ASSCR1 = ASSCR1_TTE | ASSCR1_EBCEI | ASSCR1_SCLKDIR | ASSCR1_SFRMDIR | ASSCR1_RFTH_14 | ASSCR1_TFTH_4;
-+ ASSPSP = ASSPSP_SFRMWDTH_1 | ASSPSP_STRTDLY_1 | ASSPSP_SFRMP_HIGH | ASSPSP_SCMODE;
-+ ASSCR1 |= ASSCR1_RSRE | ASSCR1_TSRE; /* enable transmit and receive dma request */
-+ ASSCR0 |= ASSCR0_SSE; /* enable assp controller */
-+ local_irq_restore(flags);
-+
-+#ifdef EZX_OSS_DEBUG
-+ audiostatus = ASSCR0;
-+ printk(EZXOSS_DEBUG "ASSCR0 = 0x%lx\n", audiostatus);
-+ audiostatus = ASSCR1;
-+ printk(EZXOSS_DEBUG "ASSCR1 = 0x%lx\n", audiostatus);
-+ audiostatus = ASSPSP;
-+ printk(EZXOSS_DEBUG "ASSPSP = 0x%lx\n", audiostatus);
-+#endif
-+
-+ mute_output_to_avoid_pcap_noise();
-+
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+ if( MONODEVOPENED == DSP16_DEVICE )
-+ pcap_use_ap_13m_clock();
-+
-+/* not in phone call, PCAP telephone */
-+ if((audioonflag & PHONE_DEVICE)==0){
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "setup pcap audio register\n");
-+#endif
-+ set_pcap_telephone_codec(1);
-+ set_pcap_output_path();
-+ set_pcap_input_path();
-+ }
-+ else{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "there is phone call\n");
-+#endif
-+ /* set pcap register, stereo DAC */
-+ //SSP_PCAP_read_data_from_PCAP(SSP_PCAP_ADJ_ST_DAC_REGISTER, &ssp_pcap_register_val);
-+ //ssp_pcap_register_val |= PCAP_ST_SAMPLE_RATE_8K | PCAP_ST_BCLK_SLOT_4 | PCAP_ST_CLK_PLL_CLK_IN_BITCLK | PCAP_DIGITAL_AUDIO_INTERFACE_NETWORK; //NETWORK mode
-+ //SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_ST_DAC_REGISTER, ssp_pcap_register_val);
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_8K);
-+ SSP_PCAP_BCLK_set(PCAP_ST_BCLK_SLOT_4);
-+ SSP_PCAP_STCLK_set(PCAP_ST_CLK_PLL_CLK_IN_FSYNC);
-+ SSP_PCAP_DIG_AUD_FS_set(PCAP_DIGITAL_AUDIO_INTERFACE_NETWORK);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_INV);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_FS_INV);
-+
-+ /* (3) reset digital filter(DF_RESET_ST_DAC=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_DF_RESET_ST_DAC);
-+
-+ /* (4)set bitclk output(SMB_ST_DAC=0), audio IO=part1(DIG_AUD_IN_ST_DAC=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_SMB_ST_DAC); /* input, slave mode */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_DIG_AUD_IN_ST_DAC);
-+
-+ /* (5) enable pcap clk(ST_CLK_EN=1),enable dac(ST_DAC_EN=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+ mdelay(1); /* specified enable time according spec */
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ST_DAC_SW); /* close stereo switch */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN); /* enable left PGA */
-+ }
-+
-+ undo_mute_output_to_avoid_pcap_noise();
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0d,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 13 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0c,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 12 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0b,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 11 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = ASSSR) & ASSSR_CSS) !=0){
-+ if((timeout++) > 10000000)
-+ goto err;
-+ }
-+
-+ up(&cotulla_assp_mono_mutex);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " complete all hardware init \n");
-+#endif
-+ return 0;
-+
-+err:
-+ up(&cotulla_assp_mono_mutex);
-+ printk(EZXOSS_DEBUG "audio panic2: ssp don't ready for slave operation!!! ");
-+ return -ENODEV;
-+}
-+
-+
-+static void assp_mono_shutdown(void)
-+{
-+ unsigned long ssp_pcap_register_val;
-+
-+ down(&cotulla_assp_mono_mutex);
-+
-+ /* clear ASSP port */
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close assp port\n");
-+#endif
-+ ASSCR0 = 0;
-+ ASSCR1 = 0;
-+ ASSPSP = 0;
-+ CKEN &= ~CKEN4_ASSP;
-+
-+ set_GPIO_mode(GPIO_ASSP_SCLK3 | GPIO_IN); /* Assp Frame sync */
-+ set_GPIO_mode(GPIO_ASSP_TXD3 | GPIO_IN);
-+ set_GPIO_mode(GPIO_ASSP_RXD3 | GPIO_IN); /* ASSP BitCLK */
-+ set_GPIO_mode(GPIO_ASSP_SFRM3 | GPIO_IN); /* ASsp RX */
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close pcap register\n");
-+#endif
-+
-+ mute_output_to_avoid_pcap_noise(); /* mute hw noise and save power */
-+
-+ if( MONODEVOPENED == DSP16_DEVICE )
-+ pcap_use_bp_13m_clock();
-+
-+ if((audioonflag & PHONE_DEVICE) == 0){
-+ /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER,SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ /* close pcap input path */
-+ if(micinflag)
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_TX_AUD_AMPS_REGISTER,SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ else
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_TX_AUD_AMPS_REGISTER, 0);
-+ /* disable PCAP mono codec */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_DIG_AUD_IN); /* DAI0 */
-+ /* set fsync, tx, bitclk are tri-stated */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CD_TS);
-+ }
-+ else{
-+ /* disable PCAP stereo DAC */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_SMB_ST_DAC);
-+ }
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ e680_boomer_path_mono_lineout(); /* mute hw noise and save power for e680 */
-+#endif
-+
-+ audioonflag &= ~DSP16_DEVICE;
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0d,&ssp_pcap_register_val);
-+ printk("pcap register 13 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0c,&ssp_pcap_register_val);
-+ printk("pcap register 12 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0b,&ssp_pcap_register_val);
-+ printk("pcap register 11 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk("pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+ up(&cotulla_assp_mono_mutex);
-+}
-+
-+
-+/*
-+ * ASSP codec ioctls
-+ */
-+static int codec_adc_rate = PHONE_CODEC_DEFAULT_RATE; /* default 8k sample rate */
-+static int codec_dac_rate = PHONE_CODEC_DEFAULT_RATE; /* default 8k sample rate */
-+
-+static int assp_mono_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ int ret;
-+ long val;
-+ int audiostatus, timeout;
-+
-+ switch(cmd) {
-+ case SNDCTL_DSP_STEREO:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" check if support stereo\n");
-+#endif
-+ ret = get_user(val, (int *) arg);
-+ if (ret)
-+ return ret;
-+
-+ if(val)
-+ ret = -EINVAL; /* not support stereo */
-+ else
-+ ret = 1;
-+ return put_user(ret, (int *) arg);
-+
-+ case SNDCTL_DSP_CHANNELS:
-+ case SOUND_PCM_READ_CHANNELS:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" check if 2 channels \n");
-+#endif
-+ return put_user(1, (long *) arg);
-+
-+ case SNDCTL_DSP_SPEED:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" set sample frequency \n");
-+#endif
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+
-+ down(&cotulla_assp_mono_mutex);
-+ ASSCR0 &= ~ASSCR0_SSE;
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ switch(val)
-+ {
-+ case PHONE_CODEC_16K_RATE:
-+ ret= SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K);
-+ codec_adc_rate = val;
-+ codec_dac_rate = val;
-+ break;
-+ case PHONE_CODEC_DEFAULT_RATE:
-+ ret = SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K);
-+ codec_adc_rate = val;
-+ codec_dac_rate = val;
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ break;
-+ }
-+ /* reset digital filter(DF_RESET=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+
-+ ASSCR0 |= ASSCR0_SSE; /* enable assp controller */
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = ASSSR) & ASSSR_CSS) !=0)
-+ {
-+ if((timeout++) > 10000000)
-+ {
-+ printk("audio panic3: can't be slave mode!!!");
-+ ret = -ENODEV;
-+ break;
-+ }
-+ }
-+#ifdef EZX_OSS_DEBUG
-+ printk("AD sample freq = %d\n", codec_adc_rate);
-+ printk("DA sample freq = %d\n", codec_dac_rate);
-+#endif
-+ up(&cotulla_assp_mono_mutex);
-+ return put_user(codec_adc_rate, (long *) arg);
-+
-+ case SOUND_PCM_READ_RATE:
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("read DA sample freq\n");
-+#endif
-+ val = codec_dac_rate;
-+ }
-+ if (file->f_mode & FMODE_READ)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("read AD sample freq\n");
-+#endif
-+ val = codec_adc_rate;
-+ }
-+ return put_user(val, (long *) arg);
-+
-+ case SNDCTL_DSP_SETFMT:
-+ case SNDCTL_DSP_GETFMTS:
-+ /* SUPPORT little endian signed 16 */
-+#ifdef EZX_OSS_DEBUG
-+ printk("data format is AFMT_S16_LEd\n");
-+#endif
-+ return put_user(AFMT_S16_LE, (long *) arg);
-+
-+ default:
-+ return mixer_ioctl(inode, file, cmd, arg);
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ * Audio stuff
-+ */
-+static audio_stream_t assp_mono_audio_out = {
-+ name: "assp mono audio out",
-+ dcmd: DCMD_TXASSDRM,
-+ drcmr: &DRCMRTXASSDR, /* ASSP dma map register */
-+ dev_addr: __PREG(ASSDR),
-+};
-+
-+static audio_stream_t assp_mono_audio_in = {
-+ name: "assp mono audio in",
-+ dcmd: DCMD_RXASSDR,
-+ drcmr: &DRCMRRXASSDR, /* ASSP dma map register */
-+ dev_addr: __PREG(ASSDR),
-+};
-+
-+static audio_state_t assp_mono_audio_state = {
-+ output_stream: &assp_mono_audio_out,
-+ input_stream: &assp_mono_audio_in,
-+ client_ioctl: assp_mono_ioctl,
-+ hw_init: assp_mono_init,
-+ hw_shutdown: assp_mono_shutdown,
-+ sem: __MUTEX_INITIALIZER(assp_mono_audio_state.sem),
-+};
-+
-+static int assp_mono_audio_open(struct inode *inode, struct file *file)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk("assp mono audio open \n");
-+#endif
-+
-+ return cotulla_audio_attach(inode, file, &assp_mono_audio_state);
-+}
-+
-+/*
-+ * Missing fields of this structure will be patched with the call
-+ * to cotulla_audio_attach().
-+ */
-+
-+static struct file_operations assp_mono_audio_fops = {
-+ open: assp_mono_audio_open,
-+ owner: THIS_MODULE
-+};
-+
-+static int __init cotulla_assp_mono_init(void)
-+{
-+ assp_mono_audio_state.dev_dsp = register_sound_dsp16(&assp_mono_audio_fops, -1);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk("/dev/dsp16 init ok\n");
-+#endif
-+ return 0;
-+}
-+
-+static void __exit cotulla_assp_mono_exit(void)
-+{
-+ unregister_sound_dsp16(assp_mono_audio_state.dev_dsp);
-+#ifdef EZX_OSS_DEBUG
-+ printk("/dev/dsp16 exit ok\n");
-+#endif
-+}
-+
-+module_init(cotulla_assp_mono_init);
-+module_exit(cotulla_assp_mono_exit);
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-assps.c linux-2.6.16.5-exz/sound/oss/ezx-assps.c
---- linux-2.6.16.5/sound/oss/ezx-assps.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-assps.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,1168 @@
-+/*
-+ * linux/drivers/sound/ezx-assps.c
-+ *
-+ *
-+ * Description: assp interface for the ezx platform
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Jun 20,2002 created
-+ * zhouqiong Sep 19,2002 according code review meeting minutes.
-+ * zhouqiong Oct 30,2002 according new requirement for VA.ASSP interface split to
-+ * /dev/dsp (support stereo playback) and /dev/dsp16 (support
-+ * mono playback and record) this file is for stereo playback.
-+ * zhouqiong Nov 05,2002 according code review meeting minutes.
-+ * zhouqiong Jan 13,2003 (1) add audio panic return value
-+ * (2) modify sample frequency to standard
-+ * zhouqiong Mar 03,2003 (1) open headset interrupt
-+ * (2) change gain when headset is in
-+ * (3) add ioctl to get headset status
-+ * zhouqiong Apr 17,2003 (1) according codec_dac_rate init pcap
-+ * zhouqiong Apr 18,2003 (1) change output gain according output path
-+ * zhouqiong Apr 24,2003 (1) no switch when headset insert and remove
-+ * zhouqiong May 21,2003 (1) modify loudspk gain max 0db, for audio-shaping
-+ * LiYong Sep 23,2003 (1)Port from EZX; (2)Modify the ASSP port inital
-+ * Jin Lihong(w20076) Jan 02,2004,Libdd66088 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Make the e680 louder speaker work.
-+ * Jia Tong(w19836) Feb 04,2004,LIBdd67717 haptics feature added
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jia Tong(w19836) Feb 23,2004,LIBdd79841 haptics GPIO initialization change
-+ * Li Yong(w19946) Feb 26,2004 LIBdd80614 Add DAI test
-+ * Add control to switch PCAP CODEC mode from master to slave mode
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jia Tong(w19836) Mar 17,2004,LIBdd87621 GPIO change for haptics filter & boomer mute while setting haptics.
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Li Yong(w19946) Apr.23.2004.LIBee02702 Add EMU Carkit
-+ * Li Yong(w19946) May.23.2004.LIBee12065 Add the EMU audio test
-+ * lin weiqiang Jun.08,2004,LIBee14656 record noise bug fix.
-+ * Jin Lihong(w20076) Jun.22,2004,LIBee24284 mixer power save
-+ * Jin Lihong(w20076) Aug.11,2004,LIBff01482 audio pcap LOW_POWER bit initialize
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-audio.h"
-+#include "ezx-common.h"
-+
-+
-+static DECLARE_MUTEX(cotulla_assp_mutex);
-+
-+static int codec_dac_rate = STEREO_CODEC_44K_RATE; /* default 44k sample rate */
-+static struct timer_list audio_timer,mic_timer;
-+
-+#ifdef CONFIG_PM
-+static struct pm_dev *mixer_hw_pm_dev;
-+#endif
-+
-+
-+EXPORT_SYMBOL(headjack_change_interrupt_routine);
-+EXPORT_SYMBOL(mic_change_interrupt_routine);
-+EXPORT_SYMBOL(mixer_ioctl);
-+
-+static int assp_init(void);
-+static void assp_shutdown(void);
-+static void change_input_output(void);
-+static void open_mic_interrupt(void);
-+
-+void Set_EMU_Mux_Switch(int mode);
-+void EIHF_Mute(int Flag);
-+
-+static int EMU_AUD_test_flag = 0;
-+
-+static struct timer_list EMU_timer;
-+
-+/*initialize hardware, assp controller and pcap register*/
-+static int assp_init(void)
-+{
-+ unsigned long flags;
-+ unsigned long ssp_pcap_register_val;
-+ unsigned long audiostatus;
-+ unsigned long timeout;
-+ int ret;
-+
-+ down(&cotulla_assp_mutex);
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "setup assp controller register \n");
-+#endif
-+ local_irq_save(flags);
-+ CKEN |= CKEN4_ASSP; /* need enable cken4 */
-+
-+ set_GPIO_mode(GPIO_SYNC_IN_ASSP_MD); /* Assp Frame sync */
-+ set_GPIO_mode(GPIO_SDATA_OUT_ASSP_MD); /* Assp TX */
-+ set_GPIO_mode(GPIO_BITCLK_IN_ASSP_MD); /* ASSP BitCLK */
-+ set_GPIO_mode(GPIO_SDATA_IN_ASSP_MD); /* ASsp RX */
-+
-+ /* setup assp port */
-+ ASSCR0 = ASSCR0_FRF_PSP | ASSCR0_EDSS | ASSCR0_DSS_16bit; /* PSP mode, 32bit */
-+ ASSCR1 = ASSCR1_EBCEI | ASSCR1_SCLKDIR | ASSCR1_SFRMDIR | ASSCR1_TFTH_4;
-+ ASSPSP = ASSPSP_SFRMWDTH_16 | ASSPSP_SCMODE;
-+ ASSCR1 |= ASSCR1_TSRE; /* enable transmit dma request */
-+ ASSCR0 |= ASSCR0_SSE; /* enable assp controller */
-+ local_irq_restore(flags);
-+
-+#ifdef EZX_OSS_DEBUG
-+ audiostatus = ASSCR0;
-+ printk(EZXOSS_DEBUG "ASSCR0 = 0x%lx\n", audiostatus);
-+ audiostatus = ASSCR1;
-+ printk(EZXOSS_DEBUG "ASSCR1 = 0x%lx\n", audiostatus);
-+ audiostatus = ASSPSP;
-+ printk(EZXOSS_DEBUG "ASSPSP = 0x%lx\n", audiostatus);
-+#endif
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "setup pcap audio register\n");
-+#endif
-+
-+ mute_output_to_avoid_pcap_noise();
-+ poweron_mixer(DSP_DEVICE);
-+
-+ /* (1) set bitclk(BCK=3, two_time_slot) pll clock(ST_CLK=0, 13M) NORMAL mode(DIG_AUD_FS =00) */
-+ ssp_pcap_register_val = PCAP_ST_BCLK_SLOT_2 | PCAP_ST_CLK_PLL_CLK_IN_13M0 | PCAP_DIGITAL_AUDIO_INTERFACE_NORMAL; //NORMAL mode
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_ST_DAC_REGISTER, ssp_pcap_register_val);
-+ /* here dsp device must use AP 13Mhz clock */
-+ pcap_use_ap_13m_clock();
-+
-+ /* set stereo sample rate */
-+ switch(codec_dac_rate)
-+ {
-+ case STEREO_CODEC_48K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_48K);
-+ break;
-+
-+ case STEREO_CODEC_44K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_44K);
-+ break;
-+
-+ case STEREO_CODEC_32K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_32K);
-+ break;
-+
-+ case STEREO_CODEC_24K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_24K);
-+ break;
-+
-+ case STEREO_CODEC_22K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_22K);
-+ break;
-+
-+ case STEREO_CODEC_16K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_16K);
-+ break;
-+
-+ case STEREO_CODEC_12K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_12K);
-+ break;
-+
-+ case STEREO_CODEC_11K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_11K);
-+ break;
-+
-+ case STEREO_CODEC_8K_RATE:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_8K);
-+ break;
-+ default:
-+ SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_44K);
-+ break;
-+ }
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_dac_rate=%d\n", codec_dac_rate);
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_INV);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_FS_INV);
-+
-+ /* (3) reset digital filter(DF_RESET_ST_DAC=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_DF_RESET_ST_DAC);
-+
-+ /* (4)set bitclk output(SMB_ST_DAC=0), audio IO=part1(DIG_AUD_IN_ST_DAC=1) */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_SMB_ST_DAC);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_DIG_AUD_IN_ST_DAC);
-+
-+ /* (5) enable pcap clk(ST_CLK_EN=1),enable dac(ST_DAC_EN=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+ mdelay(1); /* specified enable time according spec */
-+
-+#ifdef CONFIG_ARCH_EZX_A780
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_output_path=%d\n", codec_output_path);
-+ printk(EZXOSS_DEBUG "codec_output_base=%d\n", codec_output_base);
-+#endif
-+ ret = (*mixer_open_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])(codec_output_base|codec_output_path);
-+#endif
-+
-+ undo_mute_output_to_avoid_pcap_noise();
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0d,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 13 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0c,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 12 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0b,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 11 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = ASSSR) & ASSSR_CSS) !=0) {
-+ if((timeout++) > 10000000)
-+ goto err;
-+ }
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " complete all hardware init \n");
-+#endif
-+ up(&cotulla_assp_mutex);
-+
-+ return 0;
-+err:
-+ up(&cotulla_assp_mutex);
-+ printk(EZXOSS_DEBUG "audio panic: ssp don't ready for slave operation!!! ");
-+ return -ENODEV;
-+}
-+
-+
-+static void assp_shutdown(void)
-+{
-+ down(&cotulla_assp_mutex);
-+
-+ /* clear ASSP port */
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close assp port\n");
-+#endif
-+ ASSCR0 = 0;
-+ ASSCR1 = 0;
-+ ASSPSP = 0;
-+ CKEN &= ~CKEN4_ASSP;
-+
-+ set_GPIO_mode(GPIO_ASSP_SCLK3 | GPIO_IN); /* Assp Frame sync */
-+ set_GPIO_mode(GPIO_ASSP_TXD3 | GPIO_IN);
-+ set_GPIO_mode(GPIO_ASSP_RXD3 | GPIO_IN); /* ASSP BitCLK */
-+ set_GPIO_mode(GPIO_ASSP_SFRM3 | GPIO_IN); /* ASsp RX */
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close pcap register\n");
-+#endif
-+
-+ shutdown_mixer(DSP_DEVICE);
-+
-+ /* disable PCAP stereo DAC */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_SMB_ST_DAC);
-+ pcap_use_bp_13m_clock();
-+
-+ up(&cotulla_assp_mutex);
-+}
-+
-+
-+/*
-+ * for stereo headset and mono headset insert, it will take A1I interrupt
-+ * in A1I interrupt handler, open MB_ON2 to check if mic connect
-+ */
-+void headjack_change_interrupt_routine(int ch, void *dev_id, struct pt_regs *regs)
-+{
-+ int bdelay = 20;
-+
-+ del_timer(&audio_timer);
-+ init_timer(&audio_timer);
-+ audio_timer.function = change_input_output;
-+ audio_timer.expires = (jiffies + bdelay);
-+ add_timer(&audio_timer);
-+}
-+
-+
-+static void open_mic_interrupt(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "Open mic interrupt\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ISR_MB2I );
-+ udelay(10);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_MSR_MB2M);
-+}
-+
-+
-+void Set_EMU_Mux_Switch(int mode)
-+{
-+ set_GPIO_mode(GPIO_EMU_MUX1 | GPIO_OUT);
-+ set_GPIO_mode(GPIO_EMU_MUX2 | GPIO_OUT);
-+
-+ switch(mode)
-+ {
-+ case DEFAULT_USB_MODE:
-+ clr_GPIO(GPIO_EMU_MUX1);
-+ clr_GPIO(GPIO_EMU_MUX2); //default mode
-+ break;
-+
-+ case MONO_AUDIO_MODE:
-+ set_GPIO(GPIO_EMU_MUX1);
-+ clr_GPIO(GPIO_EMU_MUX2); //Mono audio mode
-+ break;
-+
-+ case SETERO_AUDIO_MODE:
-+ set_GPIO(GPIO_EMU_MUX1);
-+ set_GPIO(GPIO_EMU_MUX2); //Setero audio mode
-+ break;
-+
-+ default:
-+ break;
-+ }
-+
-+ printk("::set EMU Mux GPIO.\n");
-+}
-+
-+void EIHF_Mute(int Flag)
-+{
-+
-+ set_GPIO_mode(GPIO_SNP_INT_CTL | GPIO_OUT);
-+ if(EMU_AUD_test_flag) //At the audio EMU test mode
-+ {
-+ clr_GPIO(GPIO_SNP_INT_CTL);
-+ return;
-+ }
-+
-+ if(!Flag)
-+ {
-+ clr_GPIO(GPIO_SNP_INT_CTL);
-+ }
-+ else
-+ {
-+ set_GPIO(GPIO_SNP_INT_CTL); // high is active
-+ }
-+
-+}
-+
-+void Switch_Audio_To_USB()
-+{
-+ set_GPIO_mode(GPIO_SNP_INT_IN | GPIO_IN);
-+
-+ while(1) //If the EMU ID short to GND
-+ {
-+ if(!(GPLR(GPIO_SNP_INT_IN) & GPIO_bit(GPIO_SNP_INT_IN)))
-+ break;
-+ }
-+ EIHF_Mute(EIHF_MUTE);
-+ Set_EMU_Mux_Switch(DEFAULT_USB_MODE); // Switch the MUX to USB mode
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP); // Disable the PCAP loopback
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_BUSCTRL_RS232ENB);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_BUSCTRL_USB_PS);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_BUSCTRL_VUSB_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_BUSCTRL_USB_PU); //Pull up the D+
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB4VI);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_MSR_USB4VM);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ISR_USB1VI);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_MSR_USB1VM);
-+
-+ EMU_AUD_test_flag = 0; // Restore the default value
-+}
-+
-+void Switch_USB_To_Audio()
-+{
-+ EMU_AUD_test_flag = 0xff; // Enter the EMU audio test mode
-+ set_GPIO_mode(GPIO_SNP_INT_IN | GPIO_IN);
-+
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB4VM);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_MSR_USB1VM);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_BUSCTRL_RS232ENB);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_BUSCTRL_USB_PS);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_BUSCTRL_VUSB_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_BUSCTRL_USB_PU);
-+
-+
-+ del_timer(&EMU_timer); //Start one timer
-+ init_timer(&EMU_timer);
-+ EMU_timer.function = Switch_Audio_To_USB;
-+ EMU_timer.expires = (jiffies+500);
-+ add_timer(&EMU_timer);
-+}
-+
-+
-+
-+static void change_input_output(void)
-+{
-+ unsigned long ssp_pcap_bit_status;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "enter headjack change interrupt routine \n");
-+#endif
-+ /* read pcap register to check if headjack is in */
-+ ssp_pcap_bit_status = SSP_PCAP_get_bit_from_PCAP(SSP_PCAP_ADJ_BIT_PSTAT_A1SNS);
-+ if(ssp_pcap_bit_status) /* headset is in */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "headset insert\n");
-+#endif
-+ headset_in_handler(0, NULL, NULL);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ micinflag = 1;
-+ del_timer(&mic_timer);
-+ init_timer(&mic_timer);
-+ mic_timer.function = open_mic_interrupt;
-+ mic_timer.expires = (jiffies+100);
-+ add_timer(&mic_timer);
-+ }
-+ else /* headset is out */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "headset remove\n");
-+#endif
-+ headset_out_handler(0, NULL, NULL);
-+ micinflag = 0;
-+ del_timer(&mic_timer);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ISR_MB2I);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_MSR_MB2M);
-+ }
-+}
-+
-+
-+void mic_change_interrupt_routine(int ch, void *dev_id, struct pt_regs *regs)
-+{
-+ int ssp_pcap_bit_status;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "enter mic change interrupt routine \n");
-+#endif
-+
-+ /* read pcap register to check if headjack is in */
-+ ssp_pcap_bit_status = SSP_PCAP_get_bit_from_PCAP(SSP_PCAP_ADJ_BIT_PSTAT_A1SNS);
-+ if( ssp_pcap_bit_status ) /* headjack is in */
-+ {
-+ answer_button_handler(0, NULL, NULL);
-+ }
-+}
-+
-+
-+/*
-+ * Audio Mixer stuff
-+ */
-+int mixer_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
-+{
-+ int ret;
-+ int i,j;
-+ long val;
-+ unsigned long ssp_pcap_register_val;
-+
-+ switch(cmd)
-+ {
-+#ifdef MAKE_FTR_HAPTICS
-+ case SOUND_MIXER_WRITE_HAPTICS_ON:
-+ Set_Haptics_GPIO();
-+ break;
-+ case SOUND_MIXER_WRITE_HAPTICS_OFF:
-+ Clear_Haptics_GPIO();
-+ break;
-+ case SOUND_MIXER_READ_HAPTICS_FIL:
-+ if( (GPDR(GPIO_FLT_SEL_BUL) & GPIO_bit(GPIO_FLT_SEL_BUL))==0 )
-+ val = 0;
-+ else
-+ val = 1;
-+ return put_user(val, (long *)arg);
-+#endif
-+
-+ case SOUND_MIXER_READ_IGAIN:
-+ val = codec_input_gain;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " read input gain=%d\n", val);
-+#endif
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_IGAIN:
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+
-+ if( (val<EZX_OSS_MIN_LOGICAL_GAIN) || (val>EZX_OSS_MAX_LOGICAL_GAIN) )
-+ ret = -EINVAL;
-+ else{
-+ codec_input_gain = val;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " write input gain=%d\n", codec_input_gain);
-+#endif
-+ set_input_gain_hw_reg();
-+ }
-+
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_READ_OGAIN:
-+ /* read pcap ogain register */
-+ val = codec_output_gain;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " read output gain=%d\n", val);
-+#endif
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_VOLUME:
-+ case SOUND_MIXER_WRITE_OGAIN:
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " write output gain=%d\n", val);
-+#endif
-+
-+ if((val >= EZX_OSS_MIN_LOGICAL_GAIN)&&(val <=EZX_OSS_MAX_LOGICAL_GAIN))
-+ {
-+ codec_output_gain = val;
-+ /* write pcap ogain register */
-+ set_output_gain_hw_reg();
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "value is invalid\n");
-+#endif
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_READ_RECSRC:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " read input path\n");
-+#endif
-+ /* read pcap input status, 0-extmic, 1-A5, 2-A3 */
-+ val = codec_input_path;
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_RECSRC:
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " force write input path=%d\n", val);
-+#endif
-+ /* close old input path */
-+ (*mixer_close_input_path[codec_input_path])();
-+ /* open input path */
-+ if( (val>INPUT_PATH_MAX) || (val<INPUT_PATH_MIN) )
-+ ret = -EINVAL;
-+ else
-+ (*mixer_open_input_path[val])();
-+
-+ if( audioonflag == 0 )
-+ mixer_not_in_use(); /* for power save */
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_READ_OUTSRC:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " read output path\n");
-+#endif
-+ val = codec_output_path | codec_output_base;
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_OUTSRC:
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "force write output path=0x%03X\n", val);
-+#endif
-+ /* close old output path */
-+ (*mixer_close_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])();
-+
-+ /* set pcap output register */
-+ if( (GET_OUTPUT_BASE(val)>OUTPUT_BASE_MAX) || (GET_OUTPUT_PATH(val)>OUTPUT_PATH_MAX) )
-+ ret = -EINVAL;
-+ else
-+ ret = (*mixer_open_output_path[OUTPUT_BASE_TYPE(GET_OUTPUT_BASE(val))][GET_OUTPUT_PATH(val)])(val);
-+
-+ if( audioonflag == 0 )
-+ mixer_not_in_use(); /* for power save */
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0c,&ssp_pcap_register_val);
-+ printk(EZXOSS_DEBUG "pcap register 12 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_MUTE: /* mute output path */
-+ /* 0-unmute, 1-mute */
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+ if(val == 1) /* if mute */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " mute PGA\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN);
-+ }
-+ else if(val == 0) /* unmute */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "unmute PGA\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_INPUTMUTE: /* mute input path for DAI test */
-+ /* 0-unmute, 1-mute */
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+ if(val == 1) /* if mute */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " mute input\n");
-+#endif
-+ (*mixer_close_input_path[codec_input_path])();
-+ }
-+ else if(val == 0) /* unmute */
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "unmute input\n");
-+#endif
-+ (*mixer_open_input_path[codec_input_path])();
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_LOOPBACK: /* set loopback mode for DAI test */
-+ /* 0-unloopback, 1-loopback */
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+ if(val == 1)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "loopback\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP);
-+
-+
-+ }
-+ else if(val ==0)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "unloopback\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_AUDOHPF: /* set audio output High Pass filter for test command */
-+ /* 0-disable filter, 1-enable filter */
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+ if(val == 1)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "enable audio output High Pass filter\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDOHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+
-+ }
-+ else if(val ==0)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "disable audio output High Pass filter\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDOHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_AUDIHPF: /* set audio input High Pass filter for test command */
-+ /* 0-disable filter, 1-enable filter */
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+ if(val == 1)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("enable audio input High Pass filter\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDIHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+
-+ }
-+ else if(val ==0)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("disable audio input High Pass filter\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDIHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_CODEC_SLAVE:
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+ return put_user(ret, (int *) arg);
-+ case SOUND_MIXER_READ_HEADSET_STATUS: /* read if headset is in */
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "read headset status, jiffies=%d\n", jiffies);
-+#endif
-+
-+ j=0;
-+ for(i=0;i<3;i++)
-+ {
-+ val = SSP_PCAP_get_bit_from_PCAP(SSP_PCAP_ADJ_BIT_PSTAT_A1SNS);
-+ if(val)
-+ j++;
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ schedule_timeout(50*HZ/1000);
-+ }
-+ if(j>=2)
-+ {
-+ ret = STEREO_HEADSET;
-+ micinflag=1;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_MSR_MB2M);
-+ }
-+ else
-+ {
-+ ret = NO_HEADSET;
-+ micinflag=0;
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_MSR_MB2M);
-+ }
-+ return put_user(ret, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_EIHF_MUX:
-+ ret = get_user(val, (long *) arg);
-+ if(ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " \n user space is writing MUX status =%d\n", val);
-+#endif
-+ switch(val)
-+ {
-+ case DEFAULT_USB_MODE:
-+ Set_EMU_Mux_Switch(DEFAULT_USB_MODE);
-+ break;
-+ case MONO_AUDIO_MODE:
-+ Set_EMU_Mux_Switch(MONO_AUDIO_MODE);
-+ break;
-+ case SETERO_AUDIO_MODE:
-+ Set_EMU_Mux_Switch(SETERO_AUDIO_MODE);
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SOUND_MIXER_WRITE_EIHF_MUTE:
-+ ret = get_user(val, (long *) arg);
-+ if(ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " \n user space is writing MUTE status =%d\n", val);
-+#endif
-+ if(val)
-+ EIHF_Mute(EIHF_UNMUTE);
-+ else
-+ EIHF_Mute(EIHF_MUTE);
-+
-+ return put_user(ret, (int *) arg);
-+ case SOUND_MIXER_WRITE_EMU_TEST:
-+ ret = get_user(val, (long *) arg);
-+ if(ret)
-+ return ret;
-+ Switch_USB_To_Audio();
-+ return put_user(ret, (int *) arg);
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ case SOUND_MIXER_READ_3D_STATUS:
-+ val = get_boomer_3d_status();
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " read e680 3d status =%d\n", val);
-+#endif
-+ return put_user(val, (long *)arg);
-+
-+ case SOUND_MIXER_WRITE_3D_STATUS:
-+ ret = get_user(val, (long *) arg);
-+ if(ret)
-+ return ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " user space is writing 3d status =%d\n", val);
-+#endif
-+
-+ if( (val<LOUDERSPEAKER_ON_HEADSET_ON_3D) || (val>LOUDERSPEAKER_OFF_HEADSET_OFF_3D) )
-+ ret = -EINVAL;
-+ else
-+ set_boomer_3d_status((boomer_3d_status)val);
-+
-+ return put_user(ret, (int *) arg);
-+#endif
-+
-+#ifdef CONFIG_ARCH_EZX_A780
-+ case SOUND_MIXER_WRITE_HW_ATTENU:
-+ ret = get_user(val, (long *) arg);
-+ if(ret)
-+ return ret;
-+
-+ if(val == HW_ATTENUATION_USED){
-+ use_hw_noise_attenuate();
-+ ret = HW_ATTENUATION_USED;
-+ }
-+ else if(val == HW_ATTENUATION_BYPASSED){
-+ bypass_hw_noise_attenuate();
-+ ret = HW_ATTENUATION_BYPASSED;
-+ }
-+ else
-+ ret = -EINVAL;
-+
-+ return put_user(ret, (int *) arg);
-+#endif
-+
-+ default:
-+ return -EINVAL;
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static struct file_operations mixer_fops = {
-+ ioctl: mixer_ioctl,
-+ owner: THIS_MODULE
-+};
-+
-+/*
-+ * ASSP codec ioctls
-+ */
-+
-+static int assp_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ int ret;
-+ long val;
-+ int audiostatus, timeout;
-+
-+ switch(cmd) {
-+ case SNDCTL_DSP_STEREO:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " check if support stereo\n");
-+#endif
-+ ret = get_user(val, (int *) arg);
-+ if (ret)
-+ return ret;
-+ if(file->f_mode & FMODE_WRITE)
-+ {
-+ if(val) /* write only support stereo mode */
-+ ret = 1;
-+ else /* not support mono mode */
-+ ret = -EINVAL;
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case SNDCTL_DSP_CHANNELS:
-+ case SOUND_PCM_READ_CHANNELS:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " check if 2 channels \n");
-+#endif
-+ if(file->f_mode & FMODE_WRITE)
-+ {
-+ return put_user(2, (long *) arg);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ return put_user(ret, (long *) arg);
-+ }
-+
-+ case SNDCTL_DSP_SPEED:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " set sample frequency \n");
-+#endif
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+
-+ if(file->f_mode & FMODE_WRITE)
-+ {
-+ down(&cotulla_assp_mutex);
-+ ASSCR0 &= ~ASSCR0_SSE;
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+ switch(val)
-+ {
-+ case STEREO_CODEC_48K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_48K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_44K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_44K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_32K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_32K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_24K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_24K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_22K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_22K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_16K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_16K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_12K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_12K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_11K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_11K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+
-+ case STEREO_CODEC_8K_RATE:
-+ ret = SSP_PCAP_CDC_SR_set(PCAP_ST_SAMPLE_RATE_8K);
-+ /* set pcap dac sample rate */
-+ codec_dac_rate = val;
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ break;
-+ }
-+ /* reset digital filter(DF_RESET_ST_DAC=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_DF_RESET_ST_DAC);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_EN);
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "DA sample freq = %d\n", codec_dac_rate);
-+#endif
-+ ASSCR0 |= ASSCR0_SSE; /* enable assp controller */
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = ASSSR) & ASSSR_CSS) !=0)
-+ {
-+ if((timeout++) > 10000000)
-+ {
-+ printk(EZXOSS_DEBUG "audio panic: can't be slave mode!!!");
-+ ret = -ENODEV;
-+ break;
-+ }
-+ }
-+ up(&cotulla_assp_mutex);
-+ }
-+ else
-+ {
-+ ret = -EINVAL;
-+ }
-+ return put_user(codec_dac_rate, (long *) arg);
-+
-+ case SOUND_PCM_READ_RATE:
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "read DA sample freq\n");
-+#endif
-+ val = codec_dac_rate;
-+ }
-+ else
-+ {
-+ val = -EINVAL;
-+ }
-+ return put_user(val, (long *) arg);
-+
-+ case SNDCTL_DSP_SETFMT:
-+ case SNDCTL_DSP_GETFMTS:
-+ /* SUPPORT little endian signed 16 */
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "data format is AFMT_S16_LEd\n");
-+#endif
-+ return put_user(AFMT_S16_LE, (long *) arg);
-+
-+ default:
-+ return mixer_ioctl(inode, file, cmd, arg);
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ * Audio stuff
-+ */
-+static audio_stream_t assp_audio_out = {
-+ name: "assp audio out",
-+ dcmd: DCMD_TXASSDR,
-+ drcmr: &DRCMRTXASSDR, /* ASSP dma map register */
-+ dev_addr: __PREG(ASSDR),
-+};
-+
-+
-+static audio_stream_t assp_audio_in = {
-+ name: "assp audio in",
-+ dcmd: DCMD_RXASSDR,
-+ drcmr: &DRCMRRXASSDR, /* ASSP dma map register */
-+ dev_addr: __PREG(ASSDR),
-+};
-+
-+
-+static audio_state_t assp_audio_state = {
-+ output_stream: &assp_audio_out,
-+ input_stream: &assp_audio_in,
-+ client_ioctl: assp_ioctl,
-+ hw_init: assp_init,
-+ hw_shutdown: assp_shutdown,
-+ sem: __MUTEX_INITIALIZER(assp_audio_state.sem),
-+};
-+
-+
-+static int assp_audio_open(struct inode *inode, struct file *file)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "assp audio open \n");
-+#endif
-+
-+ return cotulla_audio_attach(inode, file, &assp_audio_state);
-+}
-+
-+
-+/*
-+ * Missing fields of this structure will be patched with the call
-+ * to cotulla_audio_attach().
-+ */
-+static struct file_operations assp_audio_fops = {
-+ open: assp_audio_open,
-+ owner: THIS_MODULE
-+};
-+
-+
-+static int mixer_dev_id;
-+
-+static int __init cotulla_assp_init(void)
-+{
-+ assp_audio_state.dev_dsp = register_sound_dsp(&assp_audio_fops, -1);
-+ mixer_dev_id = register_sound_mixer(&mixer_fops, -1);
-+
-+ set_GPIO_mode(GPIO_ASSP_SCLK3 | GPIO_IN); /* Assp Frame sync */
-+ set_GPIO_mode(GPIO_ASSP_TXD3 | GPIO_IN);
-+ set_GPIO_mode(GPIO_ASSP_RXD3 | GPIO_IN); /* ASSP BitCLK */
-+ set_GPIO_mode(GPIO_ASSP_SFRM3 | GPIO_IN); /* ASsp RX */
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ Clear_Haptics_GPIO();
-+ e680_boomer_init();
-+#endif
-+
-+#ifdef CONFIG_PM
-+ mixer_hw_pm_dev = pm_register(PM_UNKNOWN_DEV, 0, mixer_hw_pm_callback);
-+#endif
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "cotulla-assp-init ok\n");
-+#endif
-+ return 0;
-+}
-+
-+
-+static void __exit cotulla_assp_exit(void)
-+{
-+ unregister_sound_dsp(assp_audio_state.dev_dsp);
-+ unregister_sound_mixer(mixer_dev_id);
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ e680_boomer_shutdown();
-+#endif
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+
-+#ifdef CONFIG_PM
-+ pm_unregister(mixer_hw_pm_dev);
-+#endif
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "cotulla-assp-exit ok\n");
-+#endif
-+}
-+
-+
-+module_init(cotulla_assp_init);
-+module_exit(cotulla_assp_exit);
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-audio.c linux-2.6.16.5-exz/sound/oss/ezx-audio.c
---- linux-2.6.16.5/sound/oss/ezx-audio.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-audio.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,1122 @@
-+/*
-+ * linux/drivers/sound/ezx-audio.c
-+ *
-+ *
-+ * Description: audio interface for ezx
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Jun 20,2002 created
-+ * LiYong Sep 23,2003 (1)Port from EZX
-+ * Jin Lihong(w20076) Jan 02,2004,Libdd66088 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_AUDIO_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Jin Lihong(w20076) Jun.15,2004,LIBee21625 boomer's power management
-+ * Jin Lihong(w20076) Aug.11,2004,LIBff01482 DMA channel release bug fix
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-common.h"
-+#include "ezx-audio.h"
-+
-+
-+#define AUDIO_NBFRAGS_DEFAULT 8
-+#define AUDIO_FRAGSIZE_DEFAULT 8192
-+
-+#define MAX_DMA_SIZE 4096
-+#define DMA_DESC_SIZE sizeof(pxa_dma_desc)
-+
-+#define AUDIO_ACTIVE(state) ((state)->rd_ref || (state)->wr_ref)
-+
-+
-+/*
-+ * This function frees all buffers
-+ */
-+static void audio_clear_buf(audio_stream_t *s)
-+{
-+ DECLARE_WAITQUEUE(wait, current);
-+ int frag;
-+
-+ if (!s->buffers)
-+ return;
-+
-+ /* Ensure DMA isn't running */
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("ensure dma isn't running\n");
-+#endif
-+ set_current_state(TASK_UNINTERRUPTIBLE);
-+ add_wait_queue(&s->stop_wq, &wait);
-+ DCSR(s->dma_ch) = DCSR_STOPIRQEN;
-+ schedule();
-+ remove_wait_queue(&s->stop_wq, &wait);
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("free dma buffers\n");
-+#endif
-+ /* free DMA buffers */
-+ for (frag = 0; frag < s->nbfrags; frag++) {
-+ audio_buf_t *b = &s->buffers[frag];
-+ if (!b->master)
-+ continue;
-+ consistent_free(b->data, b->master, b->dma_desc->dsadr);
-+ }
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("free descriptor buffers\n");
-+#endif
-+ /* free descriptor ring */
-+ if (s->buffers->dma_desc)
-+ consistent_free(s->buffers->dma_desc,
-+ s->nbfrags * s->descs_per_frag * DMA_DESC_SIZE,
-+ s->dma_desc_phys);
-+
-+ /* free buffer structure array */
-+ kfree(s->buffers);
-+ s->buffers = NULL;
-+}
-+
-+/*
-+ * This function allocates the DMA descriptor array and buffer data space
-+ * according to the current number of fragments and fragment size.
-+ */
-+static int audio_setup_buf(audio_stream_t *s)
-+{
-+ pxa_dma_desc *dma_desc;
-+ dma_addr_t dma_desc_phys;
-+ int nb_desc, frag, i, buf_size = 0;
-+ char *dma_buf = NULL;
-+ dma_addr_t dma_buf_phys = 0;
-+
-+ if (s->buffers)
-+ return -EBUSY;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("audio setup buffer \n");
-+#endif
-+ /* Our buffer structure array */
-+ s->buffers = kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL);
-+ if (!s->buffers)
-+ goto err;
-+ memzero(s->buffers, sizeof(audio_buf_t) * s->nbfrags);
-+
-+ /*
-+ * Our DMA descriptor array:
-+ * for Each fragment we have one checkpoint descriptor plus one
-+ * descriptor per MAX_DMA_SIZE byte data blocks.
-+ */
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("malloc descriptor memory\n");
-+#endif
-+ nb_desc = (1 + (s->fragsize + MAX_DMA_SIZE - 1)/MAX_DMA_SIZE) * s->nbfrags;
-+ dma_desc = consistent_alloc(GFP_KERNEL,
-+ nb_desc * DMA_DESC_SIZE,
-+ &dma_desc_phys);
-+ if (!dma_desc)
-+ goto err;
-+ s->descs_per_frag = nb_desc / s->nbfrags;
-+ s->buffers->dma_desc = dma_desc;
-+ s->dma_desc_phys = dma_desc_phys;
-+ for (i = 0; i < nb_desc - 1; i++)
-+ dma_desc[i].ddadr = dma_desc_phys + (i + 1) * DMA_DESC_SIZE;
-+ dma_desc[i].ddadr = dma_desc_phys;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("malloc dma memory\n");
-+#endif
-+ /* Our actual DMA buffers */
-+ for (frag = 0; frag < s->nbfrags; frag++) {
-+ audio_buf_t *b = &s->buffers[frag];
-+
-+ /*
-+ * Let's allocate non-cached memory for DMA buffers.
-+ * We try to allocate all memory at once.
-+ * If this fails (a common reason is memory fragmentation),
-+ * then we'll try allocating smaller buffers.
-+ */
-+ if (!buf_size) {
-+ buf_size = (s->nbfrags - frag) * s->fragsize;
-+ do {
-+ dma_buf = consistent_alloc(GFP_KERNEL,
-+ buf_size,
-+ &dma_buf_phys);
-+ if (!dma_buf)
-+ buf_size -= s->fragsize;
-+ } while (!dma_buf && buf_size);
-+ if (!dma_buf)
-+ goto err;
-+ b->master = buf_size;
-+ memzero(dma_buf, buf_size);
-+ }
-+
-+ /*
-+ * Set up our checkpoint descriptor. Since the count
-+ * is always zero, we'll abuse the dsadr and dtadr fields
-+ * just in case this one is picked up by the hardware
-+ * while processing SOUND_DSP_GETPTR.
-+ */
-+ dma_desc->dsadr = dma_buf_phys;
-+ dma_desc->dtadr = dma_buf_phys;
-+ dma_desc->dcmd = DCMD_ENDIRQEN;
-+ if (s->output && !s->mapped)
-+ dma_desc->ddadr |= DDADR_STOP;
-+ b->dma_desc = dma_desc++;
-+
-+ /* set up the actual data descriptors */
-+ for (i = 0; (i * MAX_DMA_SIZE) < s->fragsize; i++) {
-+ dma_desc[i].dsadr = (s->output) ?
-+ (dma_buf_phys + i*MAX_DMA_SIZE) : s->dev_addr;
-+ dma_desc[i].dtadr = (s->output) ?
-+ s->dev_addr : (dma_buf_phys + i*MAX_DMA_SIZE);
-+ dma_desc[i].dcmd = s->dcmd |
-+ ((s->fragsize < MAX_DMA_SIZE) ?
-+ s->fragsize : MAX_DMA_SIZE);
-+ }
-+ dma_desc += i;
-+
-+ /* handle buffer pointers */
-+ b->data = dma_buf;
-+ dma_buf += s->fragsize;
-+ dma_buf_phys += s->fragsize;
-+ buf_size -= s->fragsize;
-+ }
-+
-+ s->usr_frag = s->dma_frag = 0;
-+ s->bytecount = 0;
-+ s->getptrCount = 0;
-+ s->fragcount = 0;
-+ sema_init(&s->sem, (s->output) ? s->nbfrags : 0);
-+ return 0;
-+
-+err:
-+ printk("cotulla-audio: unable to allocate audio memory\n ");
-+ audio_clear_buf(s);
-+ return -ENOMEM;
-+}
-+
-+/*
-+ * Our DMA interrupt handler
-+ */
-+static void audio_dma_irq(int ch, void *dev_id, struct pt_regs *regs)
-+{
-+ audio_stream_t *s = dev_id;
-+ u_int dcsr;
-+
-+ dcsr = DCSR(ch);
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("dcsr=0x%lx\n", dcsr);
-+#endif
-+ DCSR(ch) = dcsr & ~DCSR_STOPIRQEN;
-+
-+ if (!s->buffers) {
-+ printk("SSP DMA: wow... received IRQ for channel %d but no buffer exists\n", ch);
-+ return;
-+ }
-+
-+ if (dcsr & DCSR_BUSERR)
-+ printk("SSP DMA: bus error interrupt on channel %d\n", ch);
-+
-+ if (dcsr & DCSR_ENDINTR)
-+ {
-+ u_long cur_dma_desc;
-+ u_int cur_dma_frag;
-+
-+ /*
-+ * Find out which DMA desc is current. Note that DDADR
-+ * points to the next desc, not the current one.
-+ */
-+ cur_dma_desc = DDADR(ch) - s->dma_desc_phys - DMA_DESC_SIZE;
-+ /*
-+ * Let the compiler nicely optimize constant divisors into
-+ * multiplications for the common cases which is much faster.
-+ * Common cases: x = 1 + (1 << y) for y = [0..3]
-+ */
-+ switch (s->descs_per_frag) {
-+ case 2: cur_dma_frag = cur_dma_desc / (2*DMA_DESC_SIZE); break;
-+ case 3: cur_dma_frag = cur_dma_desc / (3*DMA_DESC_SIZE); break;
-+ case 5: cur_dma_frag = cur_dma_desc / (5*DMA_DESC_SIZE); break;
-+ case 9: cur_dma_frag = cur_dma_desc / (9*DMA_DESC_SIZE); break;
-+ default: cur_dma_frag =
-+ cur_dma_desc / (s->descs_per_frag * DMA_DESC_SIZE);
-+ }
-+
-+ /* Account for possible wrap back of cur_dma_desc above */
-+ if (cur_dma_frag >= s->nbfrags)
-+ cur_dma_frag = s->nbfrags - 1;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("cur_dma_frag=0x%lx\n", cur_dma_frag);
-+ printk("s->dma_frag=0x%lx\n", s->dma_frag);
-+#endif
-+ while (s->dma_frag != cur_dma_frag) {
-+ if (!s->mapped) {
-+ /*
-+ * This fragment is done - set the checkpoint
-+ * descriptor to STOP until it is gets
-+ * processed by the read or write function.
-+ */
-+ s->buffers[s->dma_frag].dma_desc->ddadr |= DDADR_STOP;
-+ up(&s->sem);
-+ }
-+ if (++s->dma_frag >= s->nbfrags)
-+ s->dma_frag = 0;
-+
-+ /* Accounting */
-+ s->bytecount += s->fragsize;
-+ s->fragcount++;
-+ }
-+
-+ /* ... and for polling processes */
-+ wake_up(&s->frag_wq);
-+ }
-+
-+ if ((dcsr & DCSR_STOPIRQEN) && (dcsr & DCSR_STOPSTATE))
-+ wake_up(&s->stop_wq);
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("audio dma irq complete\n");
-+#endif
-+}
-+
-+/*
-+ * Validate and sets up buffer fragments, etc.
-+ */
-+static int audio_set_fragments(audio_stream_t *s, int val)
-+{
-+ if (s->mapped || DCSR(s->dma_ch) & DCSR_RUN)
-+ return -EBUSY;
-+ if (s->buffers)
-+ audio_clear_buf(s);
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("audio set fragments\n");
-+#endif
-+ s->nbfrags = (val >> 16) & 0x7FFF;
-+ val &= 0xffff;
-+ if (val < 5)
-+ val = 5;
-+ if (val > 15)
-+ val = 15;
-+ s->fragsize = 1 << val;
-+ if (s->nbfrags < 2)
-+ s->nbfrags = 2;
-+ if (s->nbfrags * s->fragsize > 256 * 1024)
-+ s->nbfrags = 256 * 1024 / s->fragsize;
-+ if (audio_setup_buf(s))
-+ return -ENOMEM;
-+ return val|(s->nbfrags << 16);
-+}
-+
-+
-+/*
-+ * The fops functions
-+ */
-+
-+static int audio_write(struct file *file, const char *buffer,
-+ size_t count, loff_t *ppos)
-+{
-+ const char *buffer0 = buffer;
-+ audio_state_t *state = (audio_state_t *)file->private_data;
-+ audio_stream_t *s = state->output_stream;
-+ int chunksize, ret = 0;
-+ unsigned int audiostatus;
-+
-+ if (ppos != &file->f_pos)
-+ return -ESPIPE;
-+ if (s->mapped)
-+ return -ENXIO;
-+ if (!s->buffers && audio_setup_buf(s))
-+ return -ENOMEM;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio write \n");
-+ printk("buffer0=0x%lx\n", buffer0);
-+ printk("count=%d\n", count);
-+#endif
-+ while (count > 0) {
-+ audio_buf_t *b = &s->buffers[s->usr_frag];
-+
-+ /* Grab a fragment */
-+ if (file->f_flags & O_NONBLOCK) {
-+ ret = -EAGAIN;
-+ if (down_trylock(&s->sem))
-+ break;
-+ } else {
-+ ret = -ERESTARTSYS;
-+ if (down_interruptible(&s->sem))
-+ break;
-+ }
-+
-+ /* Feed the current buffer */
-+ chunksize = s->fragsize - b->offset;
-+ if (chunksize > count)
-+ chunksize = count;
-+ if (copy_from_user(b->data + b->offset, buffer, chunksize)) {
-+ up(&s->sem);
-+ return -EFAULT;
-+ }
-+ b->offset += chunksize;
-+ buffer += chunksize;
-+
-+ count -= chunksize;
-+ if (b->offset < s->fragsize) {
-+ up(&s->sem);
-+ break;
-+ }
-+
-+ /*
-+ * Activate DMA on current buffer.
-+ * We unlock this fragment's checkpoint descriptor and
-+ * kick DMA if it is idle. Using checkpoint descriptors
-+ * allows for control operations without the need for
-+ * stopping the DMA channel if it is already running.
-+ */
-+ b->offset = 0;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enable dma run\n");
-+#endif
-+ b->dma_desc->ddadr &= ~DDADR_STOP;
-+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) {
-+ DDADR(s->dma_ch) = b->dma_desc->ddadr;
-+ DCSR(s->dma_ch) = DCSR_RUN;
-+ }
-+
-+ /* move the index to the next fragment */
-+ if (++s->usr_frag >= s->nbfrags)
-+ s->usr_frag = 0;
-+ }
-+
-+ if ((buffer - buffer0))
-+ ret = buffer - buffer0;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("write bytes=0x%x \n", ret);
-+#endif
-+ return ret;
-+}
-+
-+
-+static int audio_read(struct file *file, char *buffer,
-+ size_t count, loff_t *ppos)
-+{
-+ char *buffer0 = buffer;
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *s = state->input_stream;
-+ int chunksize, ret = 0;
-+
-+ if (ppos != &file->f_pos)
-+ return -ESPIPE;
-+ if (s->mapped)
-+ return -ENXIO;
-+ if (!s->buffers && audio_setup_buf(s))
-+ return -ENOMEM;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio read \n");
-+ printk("buffer0=0x%lx\n", buffer0);
-+ printk("count=%d\n", count);
-+#endif
-+ while (count > 0) {
-+ audio_buf_t *b = &s->buffers[s->usr_frag];
-+
-+ /* prime DMA */
-+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) {
-+ DDADR(s->dma_ch) =
-+ s->buffers[s->dma_frag].dma_desc->ddadr;
-+ DCSR(s->dma_ch) = DCSR_RUN;
-+ }
-+
-+ /* Wait for a buffer to become full */
-+ if (file->f_flags & O_NONBLOCK) {
-+ ret = -EAGAIN;
-+ if (down_trylock(&s->sem))
-+ break;
-+ } else {
-+ ret = -ERESTARTSYS;
-+ if (down_interruptible(&s->sem))
-+ break;
-+ }
-+
-+ /* Grab data from current buffer */
-+ chunksize = s->fragsize - b->offset;
-+ if (chunksize > count)
-+ chunksize = count;
-+ if (copy_to_user(buffer, b->data + b->offset, chunksize)) {
-+ up(&s->sem);
-+ return -EFAULT;
-+ }
-+ b->offset += chunksize;
-+ buffer += chunksize;
-+ count -= chunksize;
-+ if (b->offset < s->fragsize) {
-+ up(&s->sem);
-+ break;
-+ }
-+
-+ /*
-+ * Make this buffer available for DMA again.
-+ * We unlock this fragment's checkpoint descriptor and
-+ * kick DMA if it is idle. Using checkpoint descriptors
-+ * allows for control operations without the need for
-+ * stopping the DMA channel if it is already running.
-+ */
-+ b->offset = 0;
-+ b->dma_desc->ddadr &= ~DDADR_STOP;
-+
-+ /* move the index to the next fragment */
-+ if (++s->usr_frag >= s->nbfrags)
-+ s->usr_frag = 0;
-+ }
-+
-+ if ((buffer - buffer0))
-+ ret = buffer - buffer0;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("read bytes=0x%x \n", ret);
-+#endif
-+ return ret;
-+}
-+
-+
-+static int audio_sync(struct file *file)
-+{
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *s = state->output_stream;
-+ audio_buf_t *b;
-+ pxa_dma_desc *final_desc;
-+ u_long dcmd_save = 0;
-+ DECLARE_WAITQUEUE(wait, current);
-+
-+ if (!(file->f_mode & FMODE_WRITE) || !s->buffers || s->mapped)
-+ return 0;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio sync \n");
-+#endif
-+ /*
-+ * Send current buffer if it contains data. Be sure to send
-+ * a full sample count.
-+ */
-+ final_desc = NULL;
-+ b = &s->buffers[s->usr_frag];
-+ if (b->offset &= ~3)
-+ {
-+ final_desc = &b->dma_desc[1 + b->offset/MAX_DMA_SIZE];
-+ b->offset &= (MAX_DMA_SIZE-1);
-+ dcmd_save = final_desc->dcmd;
-+ final_desc->dcmd = b->offset | s->dcmd | DCMD_ENDIRQEN;
-+ final_desc->ddadr |= DDADR_STOP;
-+ b->offset = 0;
-+ b->dma_desc->ddadr &= ~DDADR_STOP;
-+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) {
-+ DDADR(s->dma_ch) = b->dma_desc->ddadr;
-+ DCSR(s->dma_ch) = DCSR_RUN;
-+ }
-+ }
-+
-+ /* Wait for DMA to complete. */
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ add_wait_queue(&s->frag_wq, &wait);
-+ while ((DCSR(s->dma_ch) & DCSR_RUN) && !signal_pending(current)) {
-+ schedule();
-+ set_current_state(TASK_INTERRUPTIBLE);
-+ }
-+ set_current_state(TASK_RUNNING);
-+ remove_wait_queue(&s->frag_wq, &wait);
-+
-+ /* Restore the descriptor chain. */
-+ if (final_desc) {
-+ final_desc->dcmd = dcmd_save;
-+ final_desc->ddadr &= ~DDADR_STOP;
-+ b->dma_desc->ddadr |= DDADR_STOP;
-+ }
-+ return 0;
-+}
-+
-+
-+static unsigned int audio_poll(struct file *file,
-+ struct poll_table_struct *wait)
-+{
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *is = state->input_stream;
-+ audio_stream_t *os = state->output_stream;
-+ unsigned int mask = 0;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio poll \n");
-+#endif
-+ if (file->f_mode & FMODE_READ) {
-+ /* Start audio input if not already active */
-+ if (!is->buffers && audio_setup_buf(is))
-+ return -ENOMEM;
-+ if (DCSR(is->dma_ch) & DCSR_STOPSTATE) {
-+ DDADR(is->dma_ch) =
-+ is->buffers[is->dma_frag].dma_desc->ddadr;
-+ DCSR(is->dma_ch) = DCSR_RUN;
-+ }
-+ poll_wait(file, &is->frag_wq, wait);
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE) {
-+ if (!os->buffers && audio_setup_buf(os))
-+ return -ENOMEM;
-+ poll_wait(file, &os->frag_wq, wait);
-+ }
-+
-+ if (file->f_mode & FMODE_READ)
-+ if (( is->mapped && (is->bytecount != is->getptrCount)) ||
-+ (!is->mapped && atomic_read(&is->sem.count) > 0))
-+ mask |= POLLIN | POLLRDNORM;
-+
-+ if (file->f_mode & FMODE_WRITE)
-+ if (( os->mapped && (os->bytecount != os->getptrCount)) ||
-+ (!os->mapped && atomic_read(&os->sem.count) > 0))
-+ mask |= POLLOUT | POLLWRNORM;
-+
-+ return mask;
-+}
-+
-+
-+static int audio_ioctl( struct inode *inode, struct file *file,
-+ uint cmd, ulong arg)
-+{
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *os = state->output_stream;
-+ audio_stream_t *is = state->input_stream;
-+ long val;
-+
-+ switch (cmd) {
-+ case OSS_GETVERSION:
-+ return put_user(SOUND_VERSION, (int *)arg);
-+
-+ case SNDCTL_DSP_GETBLKSIZE:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get block size\n");
-+#endif
-+ if (file->f_mode & FMODE_WRITE)
-+ return put_user(os->fragsize, (int *)arg);
-+ else
-+ return put_user(is->fragsize, (int *)arg);
-+
-+ case SNDCTL_DSP_GETCAPS:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get audio capability \n");
-+#endif
-+ val = DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP;
-+ if (is && os)
-+ val |= DSP_CAP_DUPLEX;
-+ return put_user(val, (int *)arg);
-+
-+ case SNDCTL_DSP_SETFRAGMENT:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("set fragment no\n");
-+#endif
-+ if (get_user(val, (long *) arg))
-+ return -EFAULT;
-+
-+ if (file->f_mode & FMODE_READ)
-+ {
-+ int ret = audio_set_fragments(is, val);
-+ if (ret < 0)
-+ return ret;
-+ ret = put_user(ret, (int *)arg);
-+ if (ret)
-+ return ret;
-+ }
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+ int ret = audio_set_fragments(os, val);
-+ if (ret < 0)
-+ return ret;
-+ ret = put_user(ret, (int *)arg);
-+ if (ret)
-+ return ret;
-+ }
-+ return 0;
-+
-+ case SNDCTL_DSP_SYNC:
-+ return audio_sync(file);
-+
-+ case SNDCTL_DSP_SETDUPLEX:
-+ return 0;
-+
-+ case SNDCTL_DSP_POST:
-+ return 0;
-+
-+ case SNDCTL_DSP_GETTRIGGER:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get trigger\n");
-+#endif
-+ val = 0;
-+ if (file->f_mode & FMODE_READ && DCSR(is->dma_ch) & DCSR_RUN)
-+ val |= PCM_ENABLE_INPUT;
-+ if (file->f_mode & FMODE_WRITE && DCSR(os->dma_ch) & DCSR_RUN)
-+ val |= PCM_ENABLE_OUTPUT;
-+ return put_user(val, (int *)arg);
-+
-+ case SNDCTL_DSP_SETTRIGGER:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("set trigger\n");
-+#endif
-+ if (get_user(val, (int *)arg))
-+ return -EFAULT;
-+ if (file->f_mode & FMODE_READ)
-+ {
-+ if (val & PCM_ENABLE_INPUT)
-+ {
-+ if (!is->buffers && audio_setup_buf(is))
-+ return -ENOMEM;
-+ if (!(DCSR(is->dma_ch) & DCSR_RUN))
-+ {
-+ audio_buf_t *b = &is->buffers[is->dma_frag];
-+ DDADR(is->dma_ch) = b->dma_desc->ddadr;
-+ DCSR(is->dma_ch) = DCSR_RUN;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("start read dma channel\n");
-+#endif
-+ }
-+ } else{
-+ DCSR(is->dma_ch) = 0;
-+ }
-+ }
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+ if (val & PCM_ENABLE_OUTPUT)
-+ {
-+ if (!os->buffers && audio_setup_buf(os))
-+ return -ENOMEM;
-+ if (!(DCSR(os->dma_ch) & DCSR_RUN)) {
-+ audio_buf_t *b = &os->buffers[os->dma_frag];
-+ DDADR(os->dma_ch) = b->dma_desc->ddadr;
-+ DCSR(os->dma_ch) = DCSR_RUN;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("start write dma channel\n");
-+#endif
-+ }
-+ } else{
-+ DCSR(os->dma_ch) = 0;
-+ }
-+ }
-+ return 0;
-+
-+ case SNDCTL_DSP_GETOSPACE:
-+ case SNDCTL_DSP_GETISPACE:
-+ {
-+ audio_buf_info inf = { 0, };
-+ audio_stream_t *s = (cmd == SNDCTL_DSP_GETOSPACE) ? os : is;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get input and output space size\n");
-+#endif
-+ if ((s == is && !(file->f_mode & FMODE_READ)) ||
-+ (s == os && !(file->f_mode & FMODE_WRITE)))
-+ return -EINVAL;
-+ if (!s->buffers && audio_setup_buf(s))
-+ return -ENOMEM;
-+
-+ inf.bytes = atomic_read(&s->sem.count) * s->fragsize;
-+ inf.bytes -= s->buffers[s->usr_frag].offset;
-+ inf.fragments = inf.bytes / s->fragsize;
-+ inf.fragsize = s->fragsize;
-+ inf.fragstotal = s->nbfrags;
-+
-+ return copy_to_user((void *)arg, &inf, sizeof(inf));
-+ }
-+
-+ case SNDCTL_DSP_GETOPTR:
-+ case SNDCTL_DSP_GETIPTR:
-+ {
-+ count_info inf = { 0, };
-+ audio_stream_t *s = (cmd == SNDCTL_DSP_GETOPTR) ? os : is;
-+ dma_addr_t ptr;
-+ int bytecount, offset, flags;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get input and output pointer\n");
-+#endif
-+ if ((s == is && !(file->f_mode & FMODE_READ)) ||
-+ (s == os && !(file->f_mode & FMODE_WRITE)))
-+ return -EINVAL;
-+
-+ if (DCSR(s->dma_ch) & DCSR_RUN)
-+ {
-+ audio_buf_t *b;
-+ save_flags_cli(flags);
-+ ptr = (s->output) ? DSADR(s->dma_ch) : DTADR(s->dma_ch);
-+ b = &s->buffers[s->dma_frag];
-+ offset = ptr - b->dma_desc->dsadr;
-+ if (offset >= s->fragsize)
-+ offset = s->fragsize - 4;
-+ } else
-+ {
-+ save_flags(flags);
-+ offset = 0;
-+ }
-+ inf.ptr = s->dma_frag * s->fragsize + offset;
-+ bytecount = s->bytecount + offset;
-+ s->getptrCount = s->bytecount; /* so poll can tell if it changes */
-+ inf.blocks = s->fragcount;
-+ s->fragcount = 0;
-+ restore_flags(flags);
-+ if (bytecount < 0)
-+ bytecount = 0;
-+ inf.bytes = bytecount;
-+ return copy_to_user((void *)arg, &inf, sizeof(inf));
-+ }
-+
-+ case SNDCTL_DSP_NONBLOCK:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("set device none block mode\n");
-+#endif
-+ file->f_flags |= O_NONBLOCK;
-+ return 0;
-+
-+ case SNDCTL_DSP_GETODELAY:
-+ {
-+ int count = 0, offset;
-+ int i;
-+ int flags;
-+ audio_buf_t *b;
-+ dma_addr_t ptr;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("get output delay\n ");
-+#endif
-+ if(!(file->f_mode & FMODE_WRITE))
-+ return -EINVAL;
-+ if(!os->buffers && audio_setup_buf(os))
-+ return -ENOMEM;
-+
-+ save_flags_cli(flags);
-+ for(i = 0; i < os->nbfrags; i++){
-+ /* if contain data */
-+ if(atomic_read(&os->sem.count) <= 0){
-+ count += os->fragsize;
-+ }
-+ }
-+ if (DCSR(os->dma_ch) & DCSR_RUN)
-+ {
-+ ptr = DSADR(os->dma_ch);
-+ b = &os->buffers[os->dma_frag];
-+ offset = ptr - b->dma_desc->dsadr;
-+ if (offset >= os->fragsize)
-+ offset = os->fragsize - 4;
-+ } else
-+ {
-+ offset = 0;
-+ }
-+ count -= offset;
-+ restore_flags(flags);
-+ return put_user(count,(int *)arg);
-+ }
-+
-+ case SNDCTL_DSP_RESET:
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("reset audio data buffer\n");
-+#endif
-+ if (file->f_mode & FMODE_WRITE)
-+ audio_clear_buf(os);
-+ if (file->f_mode & FMODE_READ)
-+ audio_clear_buf(is);
-+ return 0;
-+
-+ default:
-+ return state->client_ioctl(inode, file, cmd, arg);
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static int audio_mmap(struct file *file, struct vm_area_struct *vma)
-+{
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *s;
-+ unsigned long size, vma_addr;
-+ int i, ret;
-+
-+ if (vma->vm_pgoff != 0)
-+ return -EINVAL;
-+
-+ if (vma->vm_flags & VM_WRITE) {
-+ if (!state->wr_ref)
-+ return -EINVAL;
-+ s = state->output_stream;
-+ } else if (vma->vm_flags & VM_READ) {
-+ if (!state->rd_ref)
-+ return -EINVAL;
-+ s = state->input_stream;
-+ } else return -EINVAL;
-+
-+ if (s->mapped)
-+ return -EINVAL;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio mmap \n");
-+#endif
-+ size = vma->vm_end - vma->vm_start;
-+ if (size != s->fragsize * s->nbfrags)
-+ return -EINVAL;
-+ if (!s->buffers && audio_setup_buf(s))
-+ return -ENOMEM;
-+
-+ vma_addr = vma->vm_start;
-+ for (i = 0; i < s->nbfrags; i++) {
-+ audio_buf_t *buf = &s->buffers[i];
-+ if (!buf->master)
-+ continue;
-+ ret = remap_page_range(vma_addr, buf->dma_desc->dsadr,
-+ buf->master, vma->vm_page_prot);
-+ if (ret)
-+ return ret;
-+ vma_addr += buf->master;
-+ }
-+ for (i = 0; i < s->nbfrags; i++)
-+ s->buffers[i].dma_desc->ddadr &= ~DDADR_STOP;
-+
-+ s->mapped = 1;
-+ return 0;
-+}
-+
-+
-+static int audio_release(struct inode *inode, struct file *file)
-+{
-+ audio_state_t *state = file->private_data;
-+ audio_stream_t *is = state->input_stream;
-+ audio_stream_t *os = state->output_stream;
-+
-+ down(&state->sem);
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("enter audio release \n");
-+#endif
-+ if (file->f_mode & FMODE_READ)
-+ {
-+ audio_clear_buf(state->input_stream);
-+ *is->drcmr = 0;
-+ pxa_free_dma(is->dma_ch);
-+ state->rd_ref = 0;
-+ }
-+
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+ audio_sync(file);
-+ audio_clear_buf(state->output_stream);
-+ *os->drcmr = 0;
-+ pxa_free_dma(os->dma_ch);
-+ state->wr_ref = 0;
-+ }
-+
-+ if (!AUDIO_ACTIVE(state)) {
-+ if (state->hw_shutdown)
-+ state->hw_shutdown();
-+#ifdef CONFIG_PM
-+ pm_unregister(state->pm_dev);
-+#endif
-+ }
-+
-+ up(&state->sem);
-+ return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+static int audio_dma_sleep(audio_stream_t *s)
-+{
-+ dmach_t channel;
-+
-+ channel = s->dma_ch;
-+ DCSR(channel)=DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("DINT=0x%lx\n", DINT);
-+ printk("DCSR(%d)=0x%lx\n", channel, DCSR(channel));
-+ printk("s->dcmd=0x%lx\n", s->dcmd);
-+ printk("*s->drcmr=0x%lx\n", *s->drcmr);
-+ printk("DDADR(%d)=0x%lx\n", channel, DDADR(channel));
-+#endif
-+ return 0;
-+}
-+
-+static int audio_dma_wakeup(audio_stream_t *s)
-+{
-+ dmach_t channel;
-+
-+ channel = s->dma_ch;
-+ DCSR(channel)=DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR;
-+ *s->drcmr = s->dma_ch | DRCMR_MAPVLD;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("DINT=0x%lx\n", DINT);
-+ printk("DCSR(%d)=0x%lx\n", channel, DCSR(channel));
-+ printk("s->dcmd=0x%lx\n", s->dcmd);
-+ printk("*s->drcmr=0x%lx\n", *s->drcmr);
-+ printk("DDADR(%d)=0x%lx\n", channel, DDADR(channel));
-+#endif
-+ return 0;
-+}
-+
-+static int audio_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-+{
-+ audio_state_t *state = (audio_state_t *)pm_dev->data;
-+
-+ switch (req) {
-+ case PM_SUSPEND: /* enter D1-D3 */
-+ if (state->output_stream)
-+ audio_dma_sleep(state->output_stream);
-+ if (state->input_stream)
-+ audio_dma_sleep(state->input_stream);
-+ if (AUDIO_ACTIVE(state) && state->hw_shutdown)
-+ state->hw_shutdown();
-+ break;
-+ case PM_RESUME: /* enter D0 */
-+ if (AUDIO_ACTIVE(state) && state->hw_init)
-+ state->hw_init();
-+ if (state->output_stream)
-+ audio_dma_wakeup(state->output_stream);
-+ if (state->input_stream)
-+ audio_dma_wakeup(state->input_stream);
-+ break;
-+ }
-+ return 0;
-+}
-+#endif
-+
-+
-+int cotulla_audio_attach(struct inode *inode, struct file *file,
-+ audio_state_t *state)
-+{
-+ audio_stream_t *is = state->input_stream;
-+ audio_stream_t *os = state->output_stream;
-+ int err;
-+
-+ down(&state->sem);
-+
-+ /* access control */
-+ err = -ENODEV;
-+ if ((file->f_mode & FMODE_WRITE) && !os)
-+ goto out;
-+ if ((file->f_mode & FMODE_READ) && !is)
-+ goto out;
-+
-+ err = -EBUSY;
-+ if ((file->f_mode & FMODE_WRITE) && state->wr_ref)
-+ goto out;
-+ if ((file->f_mode & FMODE_READ) && state->rd_ref)
-+ goto out;
-+
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("request dma channels \n");
-+#endif
-+ /* request DMA channels */
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+ err = pxa_request_dma(os->name, DMA_PRIO_LOW, audio_dma_irq, os);
-+ if (err < 0)
-+ goto out;
-+ os->dma_ch = err;
-+ }
-+
-+ if (file->f_mode & FMODE_READ)
-+ {
-+ err = pxa_request_dma(is->name, DMA_PRIO_LOW, audio_dma_irq, is);
-+ if (err < 0){
-+ if(file->f_mode & FMODE_WRITE){
-+ *os->drcmr = 0;
-+ pxa_free_dma(os->dma_ch);
-+ }
-+ goto out;
-+ }
-+ is->dma_ch = err;
-+ }
-+
-+ err = -ENODEV;
-+ /* now complete initialisation */
-+ if(!AUDIO_ACTIVE(state)){
-+ if(state->hw_init){
-+ err = state->hw_init();
-+ if(err<0){
-+ if(file->f_mode & FMODE_WRITE){
-+ *os->drcmr = 0;
-+ pxa_free_dma(os->dma_ch);
-+ }
-+ if(file->f_mode & FMODE_READ){
-+ *is->drcmr = 0;
-+ pxa_free_dma(is->dma_ch);
-+ }
-+ goto out;
-+ }
-+ }
-+
-+#ifdef CONFIG_PM
-+ state->pm_dev = pm_register(PM_SYS_DEV, 0, audio_pm_callback);
-+ if (state->pm_dev)
-+ state->pm_dev->data = state;
-+#endif
-+ }
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("init data structure \n");
-+#endif
-+ file->private_data = state;
-+ file->f_op->release = audio_release;
-+ file->f_op->write = audio_write;
-+ file->f_op->read = audio_read;
-+ file->f_op->mmap = audio_mmap;
-+ file->f_op->poll = audio_poll;
-+ file->f_op->ioctl = audio_ioctl;
-+ file->f_op->llseek = no_llseek;
-+
-+ if ((file->f_mode & FMODE_WRITE))
-+ {
-+ state->wr_ref = 1;
-+ os->fragsize = AUDIO_FRAGSIZE_DEFAULT;
-+ os->nbfrags = AUDIO_NBFRAGS_DEFAULT;
-+ os->output = 1;
-+ os->mapped = 0;
-+ init_waitqueue_head(&os->frag_wq);
-+ init_waitqueue_head(&os->stop_wq);
-+ *os->drcmr = os->dma_ch | DRCMR_MAPVLD;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("*os->drcmr=0x%lx\n", *os->drcmr);
-+#endif
-+ }
-+ if (file->f_mode & FMODE_READ)
-+ {
-+ state->rd_ref = 1;
-+ is->fragsize = AUDIO_FRAGSIZE_DEFAULT;
-+ is->nbfrags = AUDIO_NBFRAGS_DEFAULT;
-+ is->output = 0;
-+ is->mapped = 0;
-+ init_waitqueue_head(&is->frag_wq);
-+ init_waitqueue_head(&is->stop_wq);
-+ *is->drcmr = is->dma_ch | DRCMR_MAPVLD;
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("*is->drcmr=0x%lx\n", *is->drcmr);
-+#endif
-+ }
-+ err = 0;
-+ up(&state->sem);
-+#ifdef EZX_OSS_AUDIO_DEBUG
-+ printk("audio device open success\n");
-+#endif
-+ return err;
-+out:
-+ up(&state->sem);
-+ printk("audio device is busy or there is no audio device\n");
-+ return err;
-+}
-+
-+EXPORT_SYMBOL(cotulla_audio_attach);
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-audio.h linux-2.6.16.5-exz/sound/oss/ezx-audio.h
---- linux-2.6.16.5/sound/oss/ezx-audio.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-audio.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,120 @@
-+/*
-+ * linux/drivers/sound/ezx-audio.h
-+ *
-+ *
-+ * Description: audio interface for ezx
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhou qiong June,2002 Created
-+ * LiYong Sep 23,2003 Port from EZX
-+ * Jin Lihong(w20076) Jan 02,2004,Libdd66088 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move all audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG/EZX_OSS_AUDIO_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ *
-+ */
-+
-+#ifndef EZX_AUDIO_H
-+#define EZX_AUDIO_H
-+
-+
-+#define NO_HEADSET 0
-+#define MONO_HEADSET 1
-+#define STEREO_HEADSET 2
-+
-+#define OUT_ADJUST_GAIN 2
-+#define IN_ADJUST_GAIN 12
-+
-+#define ASSP_CLK (1<<20)
-+#define ASSP_PINS (7<<17)
-+
-+
-+#define PHONE_CODEC_DEFAULT_RATE 8000
-+#define PHONE_CODEC_16K_RATE 16000
-+
-+
-+#define STEREO_CODEC_8K_RATE 8000
-+#define STEREO_CODEC_11K_RATE 11025
-+#define STEREO_CODEC_12K_RATE 12000
-+#define STEREO_CODEC_16K_RATE 16000
-+#define STEREO_CODEC_22K_RATE 22050
-+#define STEREO_CODEC_24K_RATE 24000
-+#define STEREO_CODEC_32K_RATE 32000
-+#define STEREO_CODEC_44K_RATE 44100
-+#define STEREO_CODEC_48K_RATE 48000
-+
-+
-+typedef struct {
-+ int offset; /* current buffer position */
-+ char *data; /* actual buffer */
-+ pxa_dma_desc *dma_desc; /* pointer to the starting desc */
-+ int master; /* owner for buffer allocation, contain size whn true */
-+}audio_buf_t;
-+
-+typedef struct {
-+ char *name; /* stream identifier */
-+ audio_buf_t *buffers; /* pointer to audio buffer array */
-+ u_int usr_frag; /* user fragment index */
-+ u_int dma_frag; /* DMA fragment index */
-+ u_int fragsize; /* fragment size */
-+ u_int nbfrags; /* number of fragments */
-+ u_int dma_ch; /* DMA channel number */
-+ dma_addr_t dma_desc_phys; /* phys addr of descriptor ring */
-+ u_int descs_per_frag; /* nbr descriptors per fragment */
-+ int bytecount; /* nbr of processed bytes */
-+ int getptrCount; /* value of bytecount last time anyone asked via GETxPTR*/
-+ int fragcount; /* nbr of fragment transitions */
-+ struct semaphore sem; /* account for fragment usage */
-+ wait_queue_head_t frag_wq; /* for poll(), etc. */
-+ wait_queue_head_t stop_wq; /* for users of DCSR_STOPIRQEN */
-+ u_long dcmd; /* DMA descriptor dcmd field */
-+ volatile u32 *drcmr; /* the DMA request channel to use */
-+ u_long dev_addr; /* device physical address for DMA */
-+ int mapped:1; /* mmap()'ed buffers */
-+ int output:1; /* 0 for input, 1 for output */
-+}audio_stream_t;
-+
-+typedef struct {
-+ audio_stream_t *output_stream;
-+ audio_stream_t *input_stream;
-+ int dev_dsp; /* audio device handle */
-+ int rd_ref:1; /* open reference for recording */
-+ int wr_ref:1; /* open reference for playback */
-+ int (*hw_init)(void);
-+ void (*hw_shutdown)(void);
-+ int (*client_ioctl)(struct inode *, struct file *, uint, ulong);
-+ struct pm_dev *pm_dev;
-+ struct semaphore sem; /* prevent races in attach/release */
-+}audio_state_t;
-+
-+
-+extern int cotulla_audio_attach(struct inode *inode, struct file *file, audio_state_t *state);
-+
-+/* for headset and mic interrupt routine*/
-+extern void headjack_change_interrupt_routine(int ch, void *dev_id, struct pt_regs *regs);
-+extern void mic_change_interrupt_routine(int ch, void *dev_id, struct pt_regs *regs);
-+extern int mixer_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
-+
-+extern void set_pcap_telephone_codec(int port);
-+extern void set_pcap_output_path(void);
-+extern void set_pcap_input_path(void);
-+
-+
-+extern void bluetoothaudio_open(void);
-+extern void bluetoothaudio_close(void);
-+
-+
-+#endif
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-common.c linux-2.6.16.5-exz/sound/oss/ezx-common.c
---- linux-2.6.16.5/sound/oss/ezx-common.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-common.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,216 @@
-+/*
-+ * linux/drivers/sound/ezx-common.c
-+ *
-+ *
-+ * Description: common functions implementation for ezx audio drivers
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Created, Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.24,2004,LIBee03164 reduce music noise, add new pathes for haptics
-+ * Cheng Xuefeng(a2491c) June.24,2004,LIBdd95397 Add sound path for EMU PIHF
-+ *
-+ */
-+
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-common.h"
-+
-+
-+int codec_output_gain = EZX_OSS_DEFAULT_OUTPUT_LOGICAL_GAIN; /* A2,loudspeaker, gain level */
-+output_enum codec_output_path = LOUDERSPEAKER_OUT;
-+output_base_enum codec_output_base = PCAP_BASE;
-+
-+int codec_input_gain = EZX_OSS_DEFAULT_AUDIG_LOGICAL_GAIN; /* A5,mic,gain=+17db */
-+input_enum codec_input_path = HANDSET_INPUT;
-+int audioonflag = 0;
-+int micinflag = 0;
-+
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+
-+void (*mixer_close_input_path[INPUT_TOTAL_TYPES])(void) =
-+{
-+ close_input_carkit,
-+ close_input_handset,
-+ close_input_headset,
-+ close_input_funlight
-+};
-+
-+void (*mixer_open_input_path[INPUT_TOTAL_TYPES])(void) =
-+{
-+ open_input_carkit,
-+ open_input_handset,
-+ open_input_headset,
-+ open_input_funlight
-+};
-+
-+void (*mixer_close_output_path[][OUTPUT_TOTAL_TYPES])(void) =
-+{
-+ {
-+ close_output_pcap_headset,
-+ close_output_pcap_louderspeaker,
-+ close_output_pcap_earpiece,
-+ close_output_pcap_carkit,
-+ close_output_pcap_headjack,
-+ close_output_pcap_bluetooth,
-+ close_output_pcap_louderspeaker_mixed
-+ },
-+ {
-+ close_output_ma3_headset,
-+ close_output_ma3_louderspeaker,
-+ close_output_ma3_earpiece,
-+ close_output_ma3_carkit,
-+ close_output_ma3_headjack,
-+ close_output_ma3_bluetooth,
-+ close_output_ma3_louderspeaker_mixed
-+ },
-+ {
-+ close_output_fm_headset,
-+ close_output_fm_louderspeaker,
-+ close_output_fm_earpiece,
-+ close_output_fm_carkit,
-+ close_output_fm_headjack,
-+ close_output_fm_bluetooth,
-+ close_output_fm_louderspeaker_mixed
-+ },
-+ {
-+ close_output_mixed_headset,
-+ close_output_mixed_louderspeaker,
-+ close_output_mixed_earpiece,
-+ close_output_mixed_carkit,
-+ close_output_mixed_headjack,
-+ close_output_mixed_bluetooth,
-+ close_output_mixed_louderspeaker_mixed
-+ }
-+};
-+
-+int (*mixer_open_output_path[][OUTPUT_TOTAL_TYPES])(long val) =
-+{
-+ {
-+ open_output_pcap_headset,
-+ open_output_pcap_louderspeaker,
-+ open_output_pcap_earpiece,
-+ open_output_pcap_carkit,
-+ open_output_pcap_headjack,
-+ open_output_pcap_bluetooth,
-+ open_output_pcap_louderspeaker_mixed
-+ },
-+ {
-+ open_output_ma3_headset,
-+ open_output_ma3_louderspeaker,
-+ open_output_ma3_earpiece,
-+ open_output_ma3_carkit,
-+ open_output_ma3_headjack,
-+ open_output_ma3_bluetooth,
-+ open_output_ma3_louderspeaker_mixed
-+ },
-+ {
-+ open_output_fm_headset,
-+ open_output_fm_louderspeaker,
-+ open_output_fm_earpiece,
-+ open_output_fm_carkit,
-+ open_output_fm_headjack,
-+ open_output_fm_bluetooth,
-+ open_output_fm_louderspeaker_mixed
-+ },
-+ {
-+ open_output_mixed_headset,
-+ open_output_mixed_louderspeaker,
-+ open_output_mixed_earpiece,
-+ open_output_mixed_carkit,
-+ open_output_mixed_headjack,
-+ open_output_mixed_bluetooth,
-+ open_output_mixed_louderspeaker_mixed
-+ }
-+};
-+#endif /* CONFIG_ARCH_EZX_E680 */
-+
-+
-+#ifdef CONFIG_ARCH_EZX_A780
-+void (*mixer_close_input_path[INPUT_TOTAL_TYPES])(void) =
-+{
-+ close_input_carkit,
-+ close_input_handset,
-+#if EMU_PIHF_FEATURE
-+ close_input_headset,
-+ close_input_pihf_carkit
-+#else
-+ close_input_headset
-+#endif
-+
-+};
-+
-+void (*mixer_open_input_path[INPUT_TOTAL_TYPES])(void) =
-+{
-+ open_input_carkit,
-+ open_input_handset,
-+#if EMU_PIHF_FEATURE
-+ open_input_headset,
-+ open_input_pihf_carkit
-+#else
-+ open_input_headset
-+#endif
-+};
-+
-+void (*mixer_close_output_path[][OUTPUT_TOTAL_TYPES])(void) =
-+{
-+ {
-+ close_output_pcap_headset,
-+ close_output_pcap_louderspeaker,
-+ close_output_pcap_earpiece,
-+ close_output_pcap_carkit,
-+ close_output_pcap_headjack,
-+#if EMU_PIHF_FEATURE
-+ close_output_pcap_bluetooth,
-+ close_output_pcap_pihf_carkit
-+#else
-+ close_output_pcap_bluetooth
-+#endif
-+ }
-+};
-+
-+int (*mixer_open_output_path[][OUTPUT_TOTAL_TYPES])(long val) =
-+{
-+ {
-+ open_output_pcap_headset,
-+ open_output_pcap_louderspeaker,
-+ open_output_pcap_earpiece,
-+ open_output_pcap_carkit,
-+ open_output_pcap_headjack,
-+#if EMU_PIHF_FEATURE
-+ open_output_pcap_bluetooth,
-+ open_output_pcap_pihf_carkit
-+#else
-+ open_output_pcap_bluetooth
-+#endif
-+ }
-+};
-+#endif
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-common.h linux-2.6.16.5-exz/sound/oss/ezx-common.h
---- linux-2.6.16.5/sound/oss/ezx-common.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-common.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,161 @@
-+/*
-+ * linux/drivers/sound/ezx-common.h
-+ *
-+ *
-+ * Description: header file for ezx-common.c
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 12,2004,LIBdd68327 Created,Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.24,2004,LIBee03164 reduce music noise, add new pathes for haptics
-+ * Li Yong(w19946) Apr.22.2004.LIBee02702 Add EMU carKit
-+ * Cheng Xuefeng(a2491c) Jun.15.2004,LIBdd95397 Support EMU PIHF feature
-+ *
-+ */
-+
-+#ifndef EZX_COMMON_H
-+#define EZX_COMMON_H
-+
-+#include "ezx-e680.h"
-+#include "ezx-a780.h"
-+#include "../../drivers/misc/ezx/ssp_pcap.h"
-+
-+#define EZXOSS_EMERG "Snd driver w20076 <0 EMERG>: " /* system is unusable */
-+#define EZXOSS_ALERT "Snd driver w20076 <1 ALERT>: " /* action must be taken immediately */
-+#define EZXOSS_CRIT "Snd driver w20076 <2 CRIT>: " /* critical conditions */
-+#define EZXOSS_ERR "Snd driver w20076 <3 ERR>: " /* error conditions */
-+#define EZXOSS_WARNING "Snd driver w20076 <4 WARNING>: " /* warning conditions */
-+#define EZXOSS_NOTICE "Snd driver w20076 <5 NOTICE>: " /* normal but significant condition */
-+#define EZXOSS_INFO "Snd driver w20076 <6 INFO>: " /* informational */
-+#define EZXOSS_DEBUG "Snd driver w20076 <7 DEBUG>: " /* debug-level messages */
-+
-+#define MONODEVOPENED ( audioonflag & (PHONE_DEVICE|DSP16_DEVICE|AUDIO_DEVICE) )
-+#define PHONEDEVOPENED ( audioonflag & PHONE_DEVICE )
-+
-+#define EZX_OSS_MIN_LOGICAL_GAIN 0
-+#define EZX_OSS_MAX_LOGICAL_GAIN 100
-+#define EZX_OSS_DEFAULT_OUTPUT_LOGICAL_GAIN 74 /* +9db, same as a760 */
-+#define EZX_OSS_DEFAULT_AUDIG_LOGICAL_GAIN 55 /* +17db, same as a760 */
-+#define EZX_OSS_DEFAULT_MIC2IG_LOGICAL_GAIN 55 /* +17db, same as a760 */
-+
-+#define PCAP_OUTPUT_GAIN_MIN_REG_VAL 0
-+#define PCAP_OUTPUT_GAIN_MAX_REG_VAL 15
-+#define PCAP_INPUT_GAIN_MIN_REG_VAL 0
-+#define PCAP_INPUT_GAIN_MAX_REG_VAL 31
-+/*EMU CarKit Mute control signal */
-+#define EIHF_UNMUTE 0x01
-+#define EIHF_MUTE 0x00
-+
-+#define DEFAULT_USB_MODE 0x00
-+#define MONO_AUDIO_MODE 0x02
-+#define SETERO_AUDIO_MODE 0x03
-+
-+#define PCAP_OUTPUT_GAIN_REG_VAL_FROM_LOGIC (codec_output_gain*PCAP_OUTPUT_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+#define PCAP_INPUT_AUDIG_REG_VAL_FROM_LOGIC (codec_input_gain*PCAP_INPUT_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+#define PCAP_INPUT_MIC2IG_REG_VAL_FROM_LOGIC (codec_input_gain*PCAP_INPUT_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+
-+#ifdef EMU_PIHF_FEATURE
-+typedef enum{
-+ HEADSET_OUT, /* ear-phone : stereo headset */
-+ LOUDERSPEAKER_OUT, /* A2_OUTPUT in a760 */
-+ EARPIECE_OUT, /* A1_OUTPUT in a760 */
-+ CARKIT_OUT, /* A4_OUTPUT in a760 */
-+ HEADJACK_OUT, /* mono headjack, HEADJACK_OUTPUT in a760 */
-+ BLUETOOTH_OUT, /* bluetooth headset */
-+ PIHF_CARKIT_OUT /* A4_OUTPUT in a760 */
-+}output_enum;
-+#else /* EMU_PIHF_FEATURE */
-+typedef enum{
-+ HEADSET_OUT, /* ear-phone : stereo headset */
-+ LOUDERSPEAKER_OUT, /* A2_OUTPUT in a760 */
-+ EARPIECE_OUT, /* A1_OUTPUT in a760 */
-+ CARKIT_OUT, /* A4_OUTPUT in a760 */
-+ HEADJACK_OUT, /* mono headjack, HEADJACK_OUTPUT in a760 */
-+ BLUETOOTH_OUT, /* bluetooth headset */
-+ LOUDERSPEAKER_MIXED_OUT /* e680 louderspeaker out, boomer input is stereo+mono, mono is aimed for haptics signals */
-+}output_enum;
-+#endif /* EMU_PIHF_FEAURE */
-+
-+typedef enum{
-+ PCAP_BASE = 0x0000 , /* used to tell that we are setting the PCAP */
-+ MA3_BASE = 0x0100 , /* MA3 Midi device */
-+ FM_BASE = 0x0200 , /* FM radio device */
-+ MIXED_BASE = 0x0300 /* Both MA3 device and PCAP device are used */
-+}output_base_enum;
-+
-+#ifdef EMU_PIHF_FEATURE
-+typedef enum{
-+ CARKIT_INPUT, /* EXT_MIC */
-+ HANDSET_INPUT , /* A5 */
-+ HEADSET_INPUT , /* A3 */
-+ PIHF_CARKIT_INPUT /* EXT_MIC */
-+}input_enum;
-+#else /* EMU_PIHF_FEATURE */
-+typedef enum{
-+ CARKIT_INPUT, /* EXT_MIC */
-+ HANDSET_INPUT , /* A5 */
-+ HEADSET_INPUT , /* A3 */
-+ FUNLIGHT_INPUT /* E680 funlight */
-+}input_enum;
-+#endif /* EMU_PIHF_FEATURE */
-+
-+
-+#define INPUT_PATH_MIN CARKIT_INPUT
-+
-+#ifdef CONFIG_PXA_EZX_A780
-+#ifdef EMU_PIHF_FEATURE
-+#define INPUT_PATH_MAX PIHF_CARKIT_INPUT
-+#define INPUT_TOTAL_TYPES 4 /* = HEADSET_INPUT+1 */
-+#define OUTPUT_PATH_MAX PIHF_CARKIT_OUT
-+#define OUTPUT_BASE_MAX PCAP_BASE
-+#define OUTPUT_TOTAL_TYPES 7 /* = BLUETOOTH_OUT+1 */
-+#else /* EMU_PIHF_FEATURE */
-+#define INPUT_PATH_MAX HEADSET_INPUT
-+#define INPUT_TOTAL_TYPES 3 /* = HEADSET_INPUT+1 */
-+#define OUTPUT_PATH_MAX BLUETOOTH_OUT
-+#define OUTPUT_BASE_MAX PCAP_BASE
-+#define OUTPUT_TOTAL_TYPES 6 /* = BLUETOOTH_OUT+1 */
-+#endif /* EMU_PIHF_FEATURE */
-+#endif
-+
-+#ifdef CONFIG_PXA_EZX_E680
-+#define INPUT_PATH_MAX FUNLIGHT_INPUT
-+#define INPUT_TOTAL_TYPES 4 /* = FUNLIGHT_INPUT + 1 */
-+#define OUTPUT_PATH_MAX LOUDERSPEAKER_MIXED_OUT
-+#define OUTPUT_BASE_MAX MIXED_BASE
-+#define OUTPUT_TOTAL_TYPES 7 /* = LOUDERSPEAKER_MIXED_OUT+1 */
-+#endif
-+
-+#define OUTPUT_BASE_MEANINGFUL_START_BIT 8
-+#define OUTPUT_BASE_TYPE(x) (x >>OUTPUT_BASE_MEANINGFUL_START_BIT)
-+#define OUTPUT_BASE_TOTAL_TYPES (OUTPUT_BASE_MAX>>OUTPUT_BASE_MEANINGFUL_START_BIT +1)
-+#define GET_OUTPUT_BASE(x) (x&0xFF00)
-+#define GET_OUTPUT_PATH(x) (x&0x00FF)
-+
-+
-+extern int codec_output_gain, codec_input_gain;
-+extern output_enum codec_output_path;
-+extern input_enum codec_input_path;
-+extern output_base_enum codec_output_base;
-+extern int audioonflag;
-+extern int micinflag;
-+
-+extern void (*mixer_close_output_path[][OUTPUT_TOTAL_TYPES])(void);
-+extern int (*mixer_open_output_path[][OUTPUT_TOTAL_TYPES])(long val);
-+extern void (*mixer_close_input_path[INPUT_TOTAL_TYPES])(void);
-+extern void (*mixer_open_input_path[INPUT_TOTAL_TYPES])(void);
-+
-+
-+#endif
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-e680.c linux-2.6.16.5-exz/sound/oss/ezx-e680.c
---- linux-2.6.16.5/sound/oss/ezx-e680.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-e680.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,1733 @@
-+/*
-+ * linux/drivers/sound/ezx-e680.c
-+ *
-+ *
-+ * Description: Motorola e680 phone specific functions implementation for audio drivers
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Created, Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90336 play music noise tmp solution
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Jin Lihong(w20076) Apr.20,2004,LIBee01165 reduce noise
-+ * Jin Lihong(w20076) Apr.24,2004,LIBee03164 reduce music noise, add new pathes for haptics
-+ * Li Yong(w19946) Apr.23.2004.LIBee02702 Add EMU Carkit
-+ * Jin Lihong(w20076) Jun.08,2004,libee14656 change boomer input path for mono sound
-+ * Jin Lihong(w20076) Jun.15,2004,LIBee21625 boomer's power management
-+ * Jin Lihong(w20076) Jun.22,2004,LIBee24284 mixer power save
-+ * Wu Hongxing(w20691)Jul.07,2004 LIBee29664 ap 13m clock usage.
-+ * Jin Lihong(w20076) Aug.11,2004,LIBff01482 mixer power on/off sequence optimize
-+ *
-+ */
-+
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+#include <linux/delay.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-common.h"
-+
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+
-+EXPORT_SYMBOL(poweron_mixer);
-+EXPORT_SYMBOL(shutdown_mixer);
-+EXPORT_SYMBOL(kernel_clr_oscc_13m_clock);
-+EXPORT_SYMBOL(kernel_set_oscc_13m_clock);
-+
-+static DECLARE_MUTEX(ezx_mixer_mutex);
-+
-+
-+
-+#define BOOMER_MONO_VOL_REG_PREFIX 0x00
-+#define BOOMER_STEREO_LEFT_VOL_REG_PREFIX 0x40
-+#define BOOMER_STEREO_RIGHT_VOL_REG_PREFIX 0x80
-+#define BOOMER_MODE_CONTROL_REG_PREFIX 0xC0
-+
-+#define BOOMER_MONO_GAIN_MIN_REG_VAL 0
-+#define BOOMER_MONO_GAIN_MAX_REG_VAL 31
-+#define BOOMER_MONO_GAIN_DEFAULT_REG_VAL 15
-+#define BOOMER_MONO_GAIN_DEFAULT_FIXED_REG_VAL 23
-+#define BOOMER_MONO_GAIN_MIXED_INPUT_CASE_REG_VAL 15 /* when in a special use case: mono input for haptics,
-+ stereo input for audio signals */
-+
-+#define BOOMER_STEREO_LEFT_GAIN_MIN_REG_VAL 0
-+#define BOOMER_STEREO_LEFT_GAIN_MAX_REG_VAL 31
-+#define BOOMER_STEREO_LEFT_GAIN_DEFAULT_REG_VAL 15
-+#define BOOMER_STEREO_LEFT_GAIN_DEFAULT_FIXED_REG_VAL 27
-+#define BOOMER_STEREO_LEFT_GAIN_MIXED_INPUT_CASE_REG_VAL 27 /* when in a special use case: mono input for haptics,
-+ stereo input for audio signals */
-+
-+#define BOOMER_STEREO_RIGHT_GAIN_MIN_REG_VAL 0
-+#define BOOMER_STEREO_RIGHT_GAIN_MAX_REG_VAL 31
-+#define BOOMER_STEREO_RIGHT_GAIN_DEFAULT_REG_VAL 15
-+#define BOOMER_STEREO_RIGHT_GAIN_DEFAULT_FIXED_REG_VAL 27
-+#define BOOMER_STEREO_RIGHT_GAIN_MIXED_INPUT_CASE_REG_VAL 27 /* when in a special use case: mono input for haptics,
-+ stereo input for audio signals */
-+
-+#define BOOMER_OUTPUT_GAIN_MONO_REG_VAL_FROM_LOGIC (codec_output_gain*BOOMER_MONO_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+#define BOOMER_OUTPUT_GAIN_STEREO_LEFT_REG_VAL_FROM_LOGIC (codec_output_gain*BOOMER_STEREO_LEFT_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+#define BOOMER_OUTPUT_GAIN_STEREO_RIGHT_REG_VAL_FROM_LOGIC (codec_output_gain*BOOMER_STEREO_RIGHT_GAIN_MAX_REG_VAL/EZX_OSS_MAX_LOGICAL_GAIN)
-+
-+#define BOOMER_LOUDER_SPEAKER_3D_OFF 0X00 /* bit LD5 */
-+#define BOOMER_LOUDER_SPEAKER_3D_ON 0X20
-+#define BOOMER_HEADPHONE_3D_OFF 0X00 /* bit RD5 */
-+#define BOOMER_HEADPHONE_3D_ON 0X20
-+
-+#define BOOMER_SHUTDOWN 0X00 /* bit CD3 ~ CD0 */
-+#define BOOMER_IN_MONO_OUT_MONO_EARPIECE 0X01
-+#define BOOMER_IN_MONO_OUT_LOUDER_SPEAKER 0X02
-+#define BOOMER_IN_MONO_OUT_LOUDER_SPEAKER_AND_HEADPHONE 0X03
-+#define BOOMER_IN_MONO_OUT_HEADPHONE 0X04
-+#define BOOMER_IN_MONO_OUT_MONO_LINEOUT 0X05
-+#define BOOMER_IN_STEREO_OUT_MONO_EARPIECE 0X06
-+#define BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER 0X07
-+#define BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER_AND_HEADPHONE 0X08
-+#define BOOMER_IN_STEREO_OUT_HEADPHONE 0X09
-+#define BOOMER_IN_STEREO_OUT_MONO_LINEOUT 0X0a
-+#define BOOMER_IN_MONO_AND_STEREO_OUT_MONO_EARPIECE 0X0b
-+#define BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER 0X0c
-+#define BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER_AND_HEADPHONE 0X0d
-+#define BOOMER_IN_MONO_AND_STEREO_OUT_HEADPHONE 0X0e
-+#define BOOMER_IN_MONO_AND_STEREO_OUT_MONO_LINEOUT 0X0f
-+
-+#define BOOMER_FAST_WAKEUP 0X00 /* bit CD5 */
-+#define BOOMER_SLOW_WAKEUP 0X20
-+
-+#define BOOMER_EARPIECE_GAIN_SMALL_OPTION 0X00 /* bit CD4 */
-+#define BOOMER_EARPIECE_GAIN_LARGE_OPTION 0X10
-+
-+
-+typedef struct {
-+ u8 monovol; /* mono volume */
-+ u8 leftvol; /* stereo left volume */
-+ u8 rightvol; /* stereo right volume */
-+ u8 path; /* boomer path setup */
-+ u8 speaker3d;
-+ u8 headphone3d;
-+ u8 wakeuptime; /* fast or slow wakeup setting */
-+ u8 earpiecegaintable; /* earpiece gain table select */
-+} e680_boomer;
-+
-+
-+static e680_boomer e680boomer;
-+static u32 gpio_flt_sel_status;
-+u32 gpio_va_sel_status;
-+
-+static void set_boomer_mono_vol_reg( void );
-+static void set_boomer_stereo_left_vol_reg(void);
-+static void set_boomer_stereo_right_vol_reg(void);
-+static void set_boomer_mode_control_reg(void);
-+
-+static void write_boomer(const char *buf, size_t count);
-+extern int mixer_write(const char *buf, size_t count);
-+
-+
-+void e680_boomer_init(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "e680 boomer init\n");
-+#endif
-+
-+ e680boomer.monovol = BOOMER_MONO_GAIN_DEFAULT_REG_VAL;
-+ e680boomer.leftvol = BOOMER_STEREO_LEFT_GAIN_DEFAULT_REG_VAL;
-+ e680boomer.rightvol = BOOMER_STEREO_RIGHT_GAIN_DEFAULT_REG_VAL;
-+ e680boomer.path = BOOMER_IN_MONO_OUT_MONO_LINEOUT;
-+ e680boomer.speaker3d = BOOMER_LOUDER_SPEAKER_3D_ON;
-+ e680boomer.headphone3d = BOOMER_HEADPHONE_3D_ON;
-+ e680boomer.wakeuptime = BOOMER_FAST_WAKEUP;
-+ e680boomer.earpiecegaintable = BOOMER_EARPIECE_GAIN_LARGE_OPTION;
-+
-+ set_boomer_mode_control_reg();
-+ set_boomer_mono_vol_reg();
-+ set_boomer_stereo_left_vol_reg();
-+ set_boomer_stereo_right_vol_reg();
-+}
-+
-+
-+void e680_boomer_shutdown(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "e680 boomer shutdown.\n");
-+#endif
-+
-+ e680boomer.path = BOOMER_SHUTDOWN;
-+ set_boomer_mode_control_reg();
-+}
-+
-+
-+void e680_boomer_path_mono_lineout(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " set E680 boomer path to mono input mono lineout.\n");
-+#endif
-+
-+ e680boomer.path = BOOMER_IN_MONO_OUT_MONO_LINEOUT;
-+ set_boomer_mode_control_reg();
-+}
-+
-+
-+void e680_boomer_path_tmp_mono_lineout(void)
-+{
-+ u8 mode;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " mute E680 boomer.\n");
-+#endif
-+
-+ mode = BOOMER_MODE_CONTROL_REG_PREFIX | BOOMER_IN_MONO_OUT_MONO_LINEOUT
-+ | e680boomer.wakeuptime | e680boomer.earpiecegaintable;
-+
-+ write_boomer(&mode, 1);
-+}
-+
-+
-+void e680_boomer_path_tmp_shutdown(void)
-+{
-+ u8 mode;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " E680 boomer path set to tmp shutdown..\n");
-+#endif
-+
-+ mode = BOOMER_MODE_CONTROL_REG_PREFIX | BOOMER_SHUTDOWN
-+ | e680boomer.wakeuptime | e680boomer.earpiecegaintable;
-+
-+ write_boomer(&mode, 1);
-+}
-+
-+
-+void e680_boomer_path_restore(void)
-+{
-+ u8 mode;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " E680 boomer path restore: path = 0X%X \n", e680boomer.path);
-+#endif
-+ mode = BOOMER_MODE_CONTROL_REG_PREFIX | e680boomer.path | e680boomer.wakeuptime | e680boomer.earpiecegaintable;
-+ write_boomer(&mode, 1);
-+}
-+
-+
-+static void set_boomer_mono_vol_reg( void )
-+{
-+ u8 vol;
-+
-+ vol = BOOMER_MONO_VOL_REG_PREFIX | e680boomer.monovol;
-+ write_boomer(&vol, 1);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "set e680 boomer mono volume register,vol=0x%2X \n", vol);
-+#endif
-+}
-+
-+
-+static void set_boomer_stereo_left_vol_reg(void)
-+{
-+ u8 vol;
-+
-+ vol = BOOMER_STEREO_LEFT_VOL_REG_PREFIX | e680boomer.leftvol | e680boomer.speaker3d;
-+ write_boomer(&vol, 1);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "set e680 boomer stereo left volume register,vol=0x%2X \n", vol);
-+#endif
-+}
-+
-+
-+static void set_boomer_stereo_right_vol_reg(void)
-+{
-+ u8 vol;
-+
-+ vol = BOOMER_STEREO_RIGHT_VOL_REG_PREFIX | e680boomer.rightvol | e680boomer.headphone3d;
-+ write_boomer(&vol, 1);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "set e680 boomer stereo right volume register,vol=0x%2X \n", vol);
-+#endif
-+}
-+
-+
-+static void set_boomer_mode_control_reg(void)
-+{
-+ u8 mode;
-+
-+ mode = BOOMER_MODE_CONTROL_REG_PREFIX | e680boomer.path | e680boomer.wakeuptime | e680boomer.earpiecegaintable;
-+ write_boomer(&mode, 1);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "set e680 boomer mode control register,mode=0x%2X \n", mode);
-+#endif
-+}
-+
-+
-+static void write_boomer(const char *buf, size_t count)
-+{
-+ int ret, i = 0;
-+ size_t written = 0;
-+
-+ while(written<count)
-+ {
-+ ret = mixer_write(buf+written, count-written);
-+ written+=ret;
-+ i++;
-+ if( i>2 )
-+ break;
-+ }
-+ if( written < count )
-+ printk(EZXOSS_ERR "write boomer failed.\n");
-+}
-+
-+
-+void poweron_mixer( audio_dev_type type )
-+{
-+ down(&ezx_mixer_mutex);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device wants to power on the mixer hardware.\n", type);
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device has already powered on the mixer hardware.\n", audioonflag);
-+#endif
-+
-+ audioonflag |= type;
-+
-+ if( MIXERISSTEREO == type ){
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device is powering on the mixer hardware.\n", type);
-+#endif
-+
-+ if( (type==MIDI_DEVICE) || (type==FM_DEVICE) )
-+ mute_output_to_avoid_pcap_noise();
-+
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+
-+ /* (1) set pcap audio power V2_EN_2(OR WITH V2_EN) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_V2_EN_2);
-+
-+ /* (6) enable output_path and set gain */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP); /* disable codec bypass */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ST_DAC_SW); /* close stereo switch */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CDC_SW); /* open telephone codec path into right PGA */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW); /* close PGA_INR into PGA */
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN); /* enable right PGA */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN); /* enable left PGA */
-+
-+ if( (type==MIDI_DEVICE) || (type==FM_DEVICE) )
-+ undo_mute_output_to_avoid_pcap_noise();
-+ }
-+
-+ up(&ezx_mixer_mutex);
-+}
-+
-+
-+void shutdown_mixer( audio_dev_type type )
-+{
-+ down(&ezx_mixer_mutex);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device wants to shut down the mixer hardware.\n", type);
-+#endif
-+
-+ if( audioonflag == type ){
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device is shutting down the mixer hardware.\n", type);
-+#endif
-+
-+ e680_boomer_path_mono_lineout(); /* mute hw noise and save power for e680 */
-+
-+ /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER, SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ }
-+
-+ audioonflag &= ~type;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 No. 0x%X device is still using the mixer hardware.\n", audioonflag);
-+#endif
-+
-+ up(&ezx_mixer_mutex);
-+}
-+
-+
-+void mixer_not_in_use(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " E680 mixer not in use.\n");
-+#endif
-+
-+ (*mixer_close_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])();
-+ (*mixer_close_input_path[codec_input_path])();
-+
-+ if( micinflag == 0 ) /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER, SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+
-+ e680_boomer_path_mono_lineout();
-+}
-+
-+
-+void set_output_gain_hw_reg(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "set output gain hw register. \n");
-+#endif
-+
-+ SSP_PCAP_AUDOG_set( PCAP_OUTPUT_GAIN_REG_VAL_FROM_LOGIC );
-+
-+ if( e680boomer.path == BOOMER_SHUTDOWN ){
-+ ;
-+ }
-+ else if( e680boomer.path <= BOOMER_IN_MONO_OUT_MONO_LINEOUT ){
-+ e680boomer.monovol = BOOMER_MONO_GAIN_DEFAULT_FIXED_REG_VAL;
-+ set_boomer_mono_vol_reg();
-+ }
-+ else if( e680boomer.path <= BOOMER_IN_STEREO_OUT_MONO_LINEOUT ){
-+ e680boomer.leftvol = BOOMER_STEREO_LEFT_GAIN_DEFAULT_FIXED_REG_VAL;
-+ e680boomer.rightvol = BOOMER_STEREO_RIGHT_GAIN_DEFAULT_FIXED_REG_VAL;
-+ set_boomer_stereo_left_vol_reg();
-+ set_boomer_stereo_right_vol_reg();
-+ }
-+ else{
-+ if( e680boomer.path == BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER ){
-+ e680boomer.monovol = BOOMER_MONO_GAIN_MIXED_INPUT_CASE_REG_VAL;
-+ e680boomer.leftvol = BOOMER_STEREO_LEFT_GAIN_MIXED_INPUT_CASE_REG_VAL;
-+ e680boomer.rightvol = BOOMER_STEREO_RIGHT_GAIN_MIXED_INPUT_CASE_REG_VAL;
-+ }
-+ else{
-+ e680boomer.monovol = BOOMER_MONO_GAIN_DEFAULT_FIXED_REG_VAL;
-+ e680boomer.leftvol = BOOMER_STEREO_LEFT_GAIN_DEFAULT_FIXED_REG_VAL;
-+ e680boomer.rightvol = BOOMER_STEREO_RIGHT_GAIN_DEFAULT_FIXED_REG_VAL;
-+ }
-+ set_boomer_mono_vol_reg();
-+ set_boomer_stereo_left_vol_reg();
-+ set_boomer_stereo_right_vol_reg();
-+ }
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "codec_output_gain=%d\n", codec_output_gain);
-+#endif
-+}
-+
-+
-+void set_input_gain_hw_reg(void)
-+{
-+ SSP_PCAP_AUDIG_set( PCAP_INPUT_AUDIG_REG_VAL_FROM_LOGIC );
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "codec_input_gain=%d\n", codec_input_gain );
-+#endif
-+}
-+
-+
-+void set_boomer_3d_status(boomer_3d_status status)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "set boomer 3d status.\n");
-+#endif
-+
-+ switch(status)
-+ {
-+ case LOUDERSPEAKER_ON_HEADSET_OFF_3D:
-+ e680boomer.speaker3d = BOOMER_LOUDER_SPEAKER_3D_ON;
-+ e680boomer.headphone3d = BOOMER_HEADPHONE_3D_OFF;
-+ break;
-+
-+ case LOUDERSPEAKER_OFF_HEADSET_ON_3D:
-+ e680boomer.speaker3d = BOOMER_LOUDER_SPEAKER_3D_OFF;
-+ e680boomer.headphone3d = BOOMER_HEADPHONE_3D_ON;
-+ break;
-+
-+ case LOUDERSPEAKER_OFF_HEADSET_OFF_3D:
-+ e680boomer.speaker3d = BOOMER_LOUDER_SPEAKER_3D_OFF;
-+ e680boomer.headphone3d = BOOMER_HEADPHONE_3D_OFF;
-+ break;
-+
-+ case LOUDERSPEAKER_ON_HEADSET_ON_3D:
-+ default:
-+ e680boomer.speaker3d = BOOMER_LOUDER_SPEAKER_3D_ON;
-+ e680boomer.headphone3d = BOOMER_HEADPHONE_3D_ON;
-+ }
-+
-+ set_boomer_stereo_left_vol_reg();
-+ set_boomer_stereo_right_vol_reg();
-+}
-+
-+
-+boomer_3d_status get_boomer_3d_status(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "get boomer 3d status.\n");
-+#endif
-+
-+ if(e680boomer.speaker3d == BOOMER_LOUDER_SPEAKER_3D_ON){
-+ if(e680boomer.headphone3d == BOOMER_HEADPHONE_3D_ON)
-+ return LOUDERSPEAKER_ON_HEADSET_ON_3D;
-+ else
-+ return LOUDERSPEAKER_ON_HEADSET_OFF_3D;
-+ }
-+ else{
-+ if(e680boomer.headphone3d == BOOMER_HEADPHONE_3D_ON)
-+ return LOUDERSPEAKER_OFF_HEADSET_ON_3D;
-+ else
-+ return LOUDERSPEAKER_OFF_HEADSET_OFF_3D;
-+ }
-+}
-+
-+
-+void set_gpio_va_sel_out_high(void)
-+{
-+ set_GPIO_mode(GPIO_VA_SEL_BUL | GPIO_OUT);
-+ set_GPIO(GPIO_VA_SEL_BUL);
-+ PGSR(GPIO_VA_SEL_BUL) |= GPIO_bit(GPIO_VA_SEL_BUL);
-+ gpio_va_sel_status = 1;
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "set VA_SEL high. \n");
-+#endif
-+}
-+
-+
-+void set_gpio_va_sel_out_low(void)
-+{
-+ set_GPIO_mode(GPIO_VA_SEL_BUL | GPIO_OUT);
-+ clr_GPIO(GPIO_VA_SEL_BUL);
-+ PGSR(GPIO_VA_SEL_BUL) &= ~GPIO_bit(GPIO_VA_SEL_BUL);
-+ gpio_va_sel_status = 0;
-+#ifdef EZX_OSS_DEBUG
-+ printk( EZXOSS_DEBUG "set VA_SEL low. \n");
-+#endif
-+}
-+
-+
-+void close_input_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input carkit. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+void close_input_handset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input handset. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON1);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_MUX);
-+}
-+
-+
-+void close_input_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input headset. \n");
-+#endif
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_MUX);
-+}
-+
-+
-+void close_input_funlight(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close input funlight. \n");
-+#endif
-+
-+ /* disable PCAP codec */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB);
-+ /* set fsync, tx, bitclk are tri-stated */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CD_TS);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+void open_input_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input carkit. \n");
-+#endif
-+ codec_input_path = CARKIT_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+void open_input_handset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input handset. \n");
-+#endif
-+
-+ codec_input_path = HANDSET_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON1);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A5_MUX);
-+}
-+
-+
-+void open_input_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input headset. \n");
-+#endif
-+
-+ codec_input_path = HEADSET_INPUT;
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_A3_MUX);
-+}
-+
-+
-+void open_input_funlight(void)
-+{
-+ unsigned long ssp_pcap_register_val;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open input funlight. \n");
-+#endif
-+
-+ codec_input_path = FUNLIGHT_INPUT;
-+
-+ set_gpio_va_sel_out_high();
-+
-+ /* (2) set codec sample rate(FS_8K_16K=0) */
-+ /* CDC_CLK(000=13MHZ) bitclk output(SMB=0) audio IO1(DIG_AUD_IN=1) */
-+ ssp_pcap_register_val = PCAP_CDC_CLK_IN_13M0;
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_CODEC_REGISTER, ssp_pcap_register_val);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB); /* codec master */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K); /* 8K sample rate */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_DIG_AUD_IN); /* DAI0 */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDIHPF);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_AUDOHPF);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_INV);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_INV);
-+
-+ /*(3) reset digital filter(DF_RESET=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_ADITH);
-+ /* (4) enable pcap clk(CDC_CLK_EN=1),enable CODEC(CDC_EN=1) */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_CD_BYP);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ mdelay(1); /* specified enable time */
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_EXT_MIC_MUX);
-+}
-+
-+
-+void close_output_pcap_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap headset. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+}
-+
-+
-+void close_output_pcap_louderspeaker(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap louderspeaker. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+}
-+
-+
-+void close_output_pcap_earpiece(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap earpiece. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1_EN);
-+}
-+
-+
-+void close_output_pcap_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap carkit. \n");
-+#endif
-+ e680_boomer_path_mono_lineout();
-+ EIHF_Mute(EIHF_MUTE); //Mute EIHF
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+
-+ Set_EMU_Mux_Switch(DEFAULT_USB_MODE);
-+}
-+
-+
-+void close_output_pcap_headjack(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap headjack. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+}
-+
-+
-+void close_output_pcap_bluetooth(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap bluetooth. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_pcap_louderspeaker_mixed(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output pcap louderspeaker mixed. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+}
-+
-+
-+void close_output_ma3_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 headset. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_ma3_louderspeaker(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 louderspeaker. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_ma3_earpiece(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 earpiece. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_ma3_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 carkit. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_ma3_headjack(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 headjack. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_ma3_bluetooth(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 bluetooth. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_ma3_louderspeaker_mixed(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output ma3 louderspeaker mixed. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_fm_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm headset. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_fm_louderspeaker(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm louderspeaker. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_fm_earpiece(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm earpiece. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_fm_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm carkit. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_fm_headjack(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm headjack. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_fm_bluetooth(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm bluetooth. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_fm_louderspeaker_mixed(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output fm louderspeaker mixed. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_mixed_headset(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed headset. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_mixed_louderspeaker(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed louderspeaker. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_mixed_earpiece(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed earpiece. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_mixed_carkit(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed carkit. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_mixed_headjack(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed headjack. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+void close_output_mixed_bluetooth(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed bluetooth. \n");
-+#endif
-+
-+}
-+
-+
-+void close_output_mixed_louderspeaker_mixed(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "close output mixed louderspeaker mixed. \n");
-+#endif
-+
-+ e680_boomer_path_mono_lineout();
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+}
-+
-+
-+int open_output_pcap_headset(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap headset. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_louderspeaker(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap louderspeaker. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_earpiece(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap earpiece. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_MONO_OUT_MONO_LINEOUT;
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1_EN);
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_carkit(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap carkit. \n");
-+#endif
-+
-+ Set_EMU_Mux_Switch(MONO_AUDIO_MODE);
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path=BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ EIHF_Mute(EIHF_UNMUTE);
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_headjack(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap headjack. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_pcap_bluetooth(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap bluetooth. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_pcap_louderspeaker_mixed(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output pcap louderspeaker mixed. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ set_boomer_mode_control_reg();
-+
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_ma3_headset(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 headset. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_ma3_louderspeaker(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 louderspeaker. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_ma3_earpiece(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 earpiece. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_ma3_carkit(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 carkit. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_ma3_headjack(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 headjack. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_ma3_bluetooth(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 bluetooth. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_ma3_louderspeaker_mixed(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output ma3 louderspeaker mixed. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_fm_headset(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm headset. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_fm_louderspeaker(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm louderspeaker. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_fm_earpiece(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm earpiece. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_fm_carkit(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm carkit. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_fm_headjack(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm headjack. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_fm_bluetooth(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm bluetooth. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_fm_louderspeaker_mixed(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output fm louderspeaker mixed. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_mixed_headset(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed headset. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_mixed_louderspeaker(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed louderspeaker. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_mixed_earpiece(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed earpiece. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_mixed_carkit(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed carkit. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_mixed_headjack(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed headjack. \n");
-+#endif
-+
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL_6DB);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_STEREO_OUT_HEADPHONE;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+int open_output_mixed_bluetooth(long val)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed bluetooth. \n");
-+#endif
-+
-+ return 0;
-+}
-+
-+
-+int open_output_mixed_louderspeaker_mixed(long val)
-+{
-+ int ret;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open output mixed louderspeaker mixed. \n");
-+#endif
-+
-+ /* set pcap output path register AR_EN=1, AL_EN=1 */
-+ if(MIXERISSTEREO)
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_R_L_STEREO);
-+ else
-+ SSP_PCAP_MONO_set(PCAP_MONO_PGA_RL);
-+ e680boomer.path = BOOMER_IN_MONO_AND_STEREO_OUT_LOUDER_SPEAKER;
-+
-+ codec_output_path = GET_OUTPUT_PATH(val);
-+ codec_output_base = GET_OUTPUT_BASE(val);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AHS_CONFIG);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ARIGHT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_ALEFT_EN);
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_IN_SW);
-+
-+ set_boomer_mode_control_reg();
-+ set_output_gain_hw_reg();
-+
-+ return ret;
-+}
-+
-+
-+void kernel_set_oscc_13m_clock(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "midi set oscc 13m clock \n" );
-+#endif
-+
-+ if( DSPUSE13MCLK == 0 )
-+ OSCC |= 0x00000008;
-+}
-+
-+
-+void kernel_clr_oscc_13m_clock(void)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "midi clr oscc 13m clock \n");
-+#endif
-+
-+ if( (DSPUSE13MCLK == 0 ) && (DSP16USE13MCLK == 0) ) /* for app will close midi after dsp16 opened under some cases */
-+ OSCC &= ~0x00000008;
-+}
-+
-+
-+void pcap_use_ap_13m_clock(void)
-+{
-+ if( MIDIUSE13MCLK == 0 )
-+ OSCC |= 0x00000008;
-+ set_GPIO_mode(AP_13MHZ_OUTPUT_PIN | GPIO_ALT_FN_3_OUT);
-+
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_CLK_IN_SEL);
-+}
-+
-+
-+void pcap_use_bp_13m_clock(void)
-+{
-+ if( MIDIUSE13MCLK == 0 )
-+ OSCC &= ~0x00000008;
-+ set_GPIO_mode(AP_13MHZ_OUTPUT_PIN | GPIO_IN);
-+
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CLK_IN_SEL);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_ST_DAC_ST_DAC_CLK_IN_SEL);
-+}
-+
-+
-+#ifdef CONFIG_PM
-+int mixer_hw_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-+{
-+ switch(req){
-+ case PM_SUSPEND:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " E680 boomer path = 0X%X before AP sleep. \n", e680boomer.path);
-+#endif
-+ if( (audioonflag & (PHONE_DEVICE|FM_DEVICE)) == 0 ){
-+ e680_boomer_path_tmp_shutdown();
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+ }
-+ break;
-+ case PM_RESUME:
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " E680 after AP sleep.\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_AUDIO_LOWPWR);
-+ set_output_gain_hw_reg();
-+ if( gpio_flt_sel_status )
-+ Clear_Haptics_GPIO();
-+ else
-+ Set_Haptics_GPIO();
-+ if(audioonflag)
-+ (*mixer_open_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])(codec_output_base|codec_output_path);
-+ e680_boomer_path_restore();
-+ break;
-+ }
-+ return 0;
-+}
-+#endif
-+
-+
-+void mute_output_to_avoid_pcap_noise(void)
-+{
-+ e680_boomer_path_tmp_mono_lineout();
-+}
-+
-+
-+void undo_mute_output_to_avoid_pcap_noise(void)
-+{
-+ e680_boomer_path_restore();
-+}
-+
-+
-+void Set_Haptics_GPIO(void)
-+{
-+ e680_boomer_path_tmp_mono_lineout();
-+
-+ set_GPIO_mode(GPIO_FLT_SEL_BUL | GPIO_OUT);
-+ clr_GPIO(GPIO_FLT_SEL_BUL);
-+ PGSR(GPIO_FLT_SEL_BUL) &= ~GPIO_bit(GPIO_FLT_SEL_BUL);
-+ gpio_flt_sel_status = 0;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " set haptics GPIO \n");
-+#endif
-+
-+ e680_boomer_path_restore();
-+}
-+
-+
-+void Clear_Haptics_GPIO(void)
-+{
-+ e680_boomer_path_tmp_mono_lineout();
-+
-+ set_GPIO_mode(GPIO_FLT_SEL_BUL | GPIO_OUT);
-+ set_GPIO(GPIO_FLT_SEL_BUL);
-+ PGSR(GPIO_FLT_SEL_BUL) |= GPIO_bit(GPIO_FLT_SEL_BUL);
-+ gpio_flt_sel_status = 1;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG " clear haptics GPIO \n");
-+#endif
-+
-+ e680_boomer_path_restore();
-+}
-+
-+
-+#endif /* CONFIG_ARCH_EZX_E680 */
-+
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-e680.h linux-2.6.16.5-exz/sound/oss/ezx-e680.h
---- linux-2.6.16.5/sound/oss/ezx-e680.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-e680.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,183 @@
-+/*
-+ * linux/drivers/sound/ezx-e680.h
-+ *
-+ *
-+ * Description: header file for ezx-e680.c
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * Jin Lihong(w20076) Jan 12,2004,LIBdd68327 Created,Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 close dsp protection,and add 3d control interface for app
-+ * Jin Lihong(w20076) Apr.24,2004,LIBee03164 reduce music noise, add new pathes for haptics
-+ * Jin Lihong(w20076) Jun.15,2004,LIBee21625 boomer's power management
-+ * Jin Lihong(w20076) Jun.22,2004,LIBee24284 mixer power save
-+ * Wu Hongxing(w20691)Jul.07,2004 LIBee29664 ap 13m clock usage.
-+ *
-+ */
-+
-+#ifndef EZX_E680_H
-+#define EZX_E680_H
-+
-+#include <linux/config.h>
-+#include <linux/pm.h>
-+
-+#ifdef CONFIG_PXA_EZX_E680
-+
-+//#define EZX_OSS_DEBUG /* debug switch for all ezx oss src files excluding ezx-audio.c */
-+#undef EZX_OSS_DEBUG
-+//#define EZX_OSS_AUDIO_DEBUG /* debug switch for src file ezx-audio.c */
-+#undef EZX_OSS_AUDIO_DEBUG
-+
-+/*
-+#ifdef EZX_OSS_DBG
-+#define OSSPRINTF(fmt,args...) printf(fmt,##args)
-+#else
-+#define OSSPRINTF(fmt,args...) { }
-+#endif
-+*/
-+
-+
-+#define MIXERISSTEREO ( audioonflag & (DSP_DEVICE|MIDI_DEVICE|FM_DEVICE) )
-+#define MIDIUSE13MCLK ( audioonflag & MIDI_DEVICE )
-+#define DSPUSE13MCLK ( audioonflag & DSP_DEVICE )
-+#define DSP16USE13MCLK ( audioonflag & DSP16_DEVICE )
-+
-+
-+typedef enum{
-+ PHONE_DEVICE = 0x01,
-+ DSP_DEVICE = 0x02,
-+ DSP16_DEVICE = 0x04,
-+ AUDIO_DEVICE = 0x08,
-+ MIDI_DEVICE = 0x10,
-+ FM_DEVICE = 0x20
-+}audio_dev_type;
-+
-+typedef enum{
-+ LOUDERSPEAKER_ON_HEADSET_ON_3D,
-+ LOUDERSPEAKER_ON_HEADSET_OFF_3D,
-+ LOUDERSPEAKER_OFF_HEADSET_ON_3D,
-+ LOUDERSPEAKER_OFF_HEADSET_OFF_3D
-+}boomer_3d_status;
-+
-+
-+void e680_boomer_init(void);
-+void e680_boomer_shutdown(void);
-+void e680_boomer_path_mono_lineout(void);
-+void e680_boomer_path_tmp_mono_lineout(void);
-+void e680_boomer_path_tmp_shutdown(void);
-+void e680_boomer_path_restore(void);
-+
-+void poweron_mixer( audio_dev_type type );
-+void shutdown_mixer( audio_dev_type type );
-+void mixer_not_in_use(void);
-+
-+void set_output_gain_hw_reg(void);
-+void set_input_gain_hw_reg(void);
-+
-+void set_boomer_3d_status(boomer_3d_status status);
-+boomer_3d_status get_boomer_3d_status(void);
-+
-+void set_gpio_va_sel_out_high(void);
-+void set_gpio_va_sel_out_low(void);
-+
-+void close_input_carkit(void);
-+void close_input_handset(void);
-+void close_input_headset(void);
-+void close_input_funlight(void);
-+
-+void open_input_carkit(void);
-+void open_input_handset(void);
-+void open_input_headset(void);
-+void open_input_funlight(void);
-+
-+void close_output_pcap_headset(void);
-+void close_output_pcap_louderspeaker(void);
-+void close_output_pcap_earpiece(void);
-+void close_output_pcap_carkit(void);
-+void close_output_pcap_headjack(void);
-+void close_output_pcap_bluetooth(void);
-+void close_output_pcap_louderspeaker_mixed(void);
-+
-+void close_output_ma3_headset(void);
-+void close_output_ma3_louderspeaker(void);
-+void close_output_ma3_earpiece(void);
-+void close_output_ma3_carkit(void);
-+void close_output_ma3_headjack(void);
-+void close_output_ma3_bluetooth(void);
-+void close_output_ma3_louderspeaker_mixed(void);
-+
-+void close_output_fm_headset(void);
-+void close_output_fm_louderspeaker(void);
-+void close_output_fm_earpiece(void);
-+void close_output_fm_carkit(void);
-+void close_output_fm_headjack(void);
-+void close_output_fm_bluetooth(void);
-+void close_output_fm_louderspeaker_mixed(void);
-+
-+void close_output_mixed_headset(void);
-+void close_output_mixed_louderspeaker(void);
-+void close_output_mixed_earpiece(void);
-+void close_output_mixed_carkit(void);
-+void close_output_mixed_headjack(void);
-+void close_output_mixed_bluetooth(void);
-+void close_output_mixed_louderspeaker_mixed(void);
-+
-+int open_output_pcap_headset(long val);
-+int open_output_pcap_louderspeaker(long val);
-+int open_output_pcap_earpiece(long val);
-+int open_output_pcap_carkit(long val);
-+int open_output_pcap_headjack(long val);
-+int open_output_pcap_bluetooth(long val);
-+int open_output_pcap_louderspeaker_mixed(long val);
-+
-+int open_output_ma3_headset(long val);
-+int open_output_ma3_louderspeaker(long val);
-+int open_output_ma3_earpiece(long val);
-+int open_output_ma3_carkit(long val);
-+int open_output_ma3_headjack(long val);
-+int open_output_ma3_bluetooth(long val);
-+int open_output_ma3_louderspeaker_mixed(long val);
-+
-+int open_output_fm_headset(long val);
-+int open_output_fm_louderspeaker(long val);
-+int open_output_fm_earpiece(long val);
-+int open_output_fm_carkit(long val);
-+int open_output_fm_headjack(long val);
-+int open_output_fm_bluetooth(long val);
-+int open_output_fm_louderspeaker_mixed(long val);
-+
-+int open_output_mixed_headset(long val);
-+int open_output_mixed_louderspeaker(long val);
-+int open_output_mixed_earpiece(long val);
-+int open_output_mixed_carkit(long val);
-+int open_output_mixed_headjack(long val);
-+int open_output_mixed_bluetooth(long val);
-+int open_output_mixed_louderspeaker_mixed(long val);
-+
-+void kernel_set_oscc_13m_clock(void);
-+void kernel_clr_oscc_13m_clock(void);
-+void pcap_use_ap_13m_clock(void);
-+void pcap_use_bp_13m_clock(void);
-+
-+int mixer_hw_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data);
-+void mute_output_to_avoid_pcap_noise(void);
-+void undo_mute_output_to_avoid_pcap_noise(void);
-+
-+void Set_Haptics_GPIO(void);
-+void Clear_Haptics_GPIO(void);
-+
-+
-+#endif /* CONFIG_ARCH_EZX_E680 */
-+
-+
-+#endif
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-nssp.c linux-2.6.16.5-exz/sound/oss/ezx-nssp.c
---- linux-2.6.16.5/sound/oss/ezx-nssp.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-nssp.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,358 @@
-+/*
-+ * linux/drivers/sound/ezx-nssp.c
-+ *
-+ *
-+ * Description: nssp interface for the ezx platform
-+ *
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong, Motorola Jun 20,2002 created
-+ * zhouqiong, Motorola Sep 19,2002 according code review meeting minutes.
-+ * zhouqiong, Motorola Oct 30,2002 according new requirement for VA.
-+ * zhouqiong, Motorola Nov 05,2002 according code review meeting minutes.
-+ * zhouqiong, Motorola Mar 04,2003 (1) don't close headset interrupt;
-+ * (2) when headset in, output gain decrease 6db
-+ * LiYong, Motorola Sep 23,2003 (1)Port from EZX; (2)Modify the NSSP port inital
-+ * Jin Lihong(w20076), Motorola Jan 02,2004 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076),Motorola Feb.23,2004,LIBdd79747 add e680 audio path switch and gain setting funcs
-+ * Jin Lihong(w20076),Motorola Mar.15,2004,LIBdd86574 mixer bug fix
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/poll.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-audio.h"
-+#include "ezx-common.h"
-+
-+
-+static DECLARE_MUTEX(cotulla_nssp_mutex);
-+
-+static int nssp_init(void);
-+static void nssp_shutdown(void);
-+
-+
-+/*initialize hardware, nssp controller and pcap register*/
-+static int nssp_init(void)
-+{
-+ unsigned long flags;
-+ unsigned long ssp_pcap_register_val;
-+ unsigned int ssp_pcap_bit_status;
-+ volatile unsigned long audiostatus;
-+ unsigned long timeout;
-+
-+ down(&cotulla_nssp_mutex);
-+
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+ if( MONODEVOPENED == 0 )
-+ pcap_use_ap_13m_clock();
-+ audioonflag |= AUDIO_DEVICE;
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk("setup nssp controller register \n");
-+#endif
-+ local_irq_save(flags);
-+ CKEN |= CKEN3_NSSP; /* need enable cken3 */
-+
-+ set_GPIO_mode(GPIO_BITCLK_IN_NSSP_MD); /* BitCLK */
-+ set_GPIO_mode(GPIO_SYNC_IN_NSSP_MD); /* FS */
-+ /*At E680,the NSSP TX and RX pins are single direction */
-+// set_GPIO_mode(GPIO_SDATA_OUT_NSSP_MD); /* TXD ssp2 ALF out 2 */
-+ set_GPIO_mode(GPIO_SDATA_IN_NSSP_MD); /* RXD ssp2 ALF in 1*/
-+ /* setup nssp port */
-+ NSSCR0 = NSSCR0_FRF_PSP | NSSCR0_DSS_16bit; /* PSP mode, 16bit */
-+ NSSCR1 = NSSCR1_TTE | NSSCR1_EBCEI | NSSCR1_SCLKDIR | NSSCR1_SFRMDIR | NSSCR1_TFTH_4 | NSSCR1_RFTH_14;
-+ NSSPSP = NSSPSP_SFRMWDTH_1 | NSSPSP_STRTDLY_1 | NSSPSP_SFRMP_HIGH | NSSPSP_SCMODE;
-+ NSSCR1 |= NSSCR1_TSRE | NSSCR1_RSRE; /* enable dma request */
-+ NSSCR0 |= NSSCR0_SSE; /* enable nssp controller */
-+ local_irq_restore(flags);
-+
-+#ifdef EZX_OSS_DEBUG
-+ audiostatus = NSSCR0;
-+ printk("NSSCR0 = 0x%lx\n", audiostatus);
-+ audiostatus = NSSCR1;
-+ printk("NSSCR1 = 0x%lx\n", audiostatus);
-+ audiostatus = NSSPSP;
-+ printk("NSSPSP = 0x%lx\n", audiostatus);
-+#endif
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0d,&ssp_pcap_register_val);
-+ printk("pcap register 13 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0c,&ssp_pcap_register_val);
-+ printk("pcap register 12 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0b,&ssp_pcap_register_val);
-+ printk("pcap register 11 = 0x%lx\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x1a,&ssp_pcap_register_val);
-+ printk("pcap register 26 = 0x%lx\n", ssp_pcap_register_val);
-+#endif
-+
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = NSSSR) & NSSSR_CSS) !=0){
-+ if((timeout++) > 10000000)
-+ goto err;
-+ }
-+#ifdef EZX_OSS_DEBUG
-+ printk(" complete all hardware init \n");
-+#endif
-+ up(&cotulla_nssp_mutex);
-+ return 0;
-+
-+err:
-+ up(&cotulla_nssp_mutex);
-+ printk("audio panic: ssp don't ready for slave operation!!! ");
-+ return -ENODEV;
-+}
-+
-+
-+static void nssp_shutdown(void)
-+{
-+ down(&cotulla_nssp_mutex);
-+
-+ audioonflag &= ~AUDIO_DEVICE;
-+ if( MONODEVOPENED == 0 )
-+ pcap_use_bp_13m_clock();
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk("close nssp port\n");
-+#endif
-+ NSSCR0 = 0;
-+ NSSCR1 = 0;
-+ NSSPSP = 0;
-+ CKEN &= ~CKEN3_NSSP; /* SSP2 need control the CKEN3 */
-+
-+ set_GPIO_mode(GPIO_NSSP_SCLK2 | GPIO_IN); /* BitCLK */
-+ set_GPIO_mode(GPIO_NSSP_SFRM2 | GPIO_IN); /* FS */
-+ set_GPIO_mode(GPIO_NSSP_TXD2 | GPIO_IN);
-+ set_GPIO_mode(GPIO_NSSP_RXD2 | GPIO_IN);
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk("close pcap register\n");
-+#endif
-+
-+ up(&cotulla_nssp_mutex);
-+}
-+
-+
-+/*
-+ * nssp codec ioctls
-+ */
-+static int codec_adc_rate = PHONE_CODEC_DEFAULT_RATE; /* default 8k sample rate */
-+static int codec_dac_rate = PHONE_CODEC_DEFAULT_RATE; /* default 8k sample rate */
-+
-+static int nssp_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ int ret;
-+ long val;
-+ int audiostatus, timeout;
-+
-+ switch(cmd) {
-+ case SNDCTL_DSP_STEREO:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" check if support stereo\n");
-+#endif
-+ ret = get_user(val, (int *) arg);
-+ if (ret)
-+ return ret;
-+ if(val) /* not support stereo mode */
-+ ret = -EINVAL;
-+ else
-+ ret = 1;
-+ return put_user(ret, (int *) arg);
-+
-+ case SNDCTL_DSP_CHANNELS:
-+ case SOUND_PCM_READ_CHANNELS:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" check if 2 channels \n");
-+#endif
-+ return put_user(1, (long *) arg);
-+
-+ case SNDCTL_DSP_SPEED:
-+#ifdef EZX_OSS_DEBUG
-+ printk(" set sample frequency \n");
-+#endif
-+ ret = get_user(val, (long *) arg);
-+ if (ret)
-+ return ret;
-+
-+ down(&cotulla_nssp_mutex);
-+ NSSCR0 &= ~NSSCR0_SSE;
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ switch(val)
-+ {
-+ case PHONE_CODEC_16K_RATE: /*16K sample rate */
-+ ret = SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K);
-+ codec_adc_rate = val;
-+ codec_dac_rate = val;
-+ break;
-+ case PHONE_CODEC_DEFAULT_RATE: /*8K sample rate */
-+ ret = SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_FS_8K_16K);
-+ codec_adc_rate = val;
-+ codec_dac_rate = val;
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ break;
-+ }
-+ /* reset digital filter(DF_RESET=1) */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_DF_RESET);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+
-+ NSSCR0 |= NSSCR0_SSE; /* enable nssp controller */
-+ timeout = 0;
-+ /* check if ssp is ready for slave operation */
-+ while(((audiostatus = NSSSR) & NSSSR_CSS) !=0)
-+ {
-+ if((timeout++) > 10000000)
-+ {
-+ printk("audio panic: can't be slave mode!!!");
-+ ret =-ENODEV;
-+ break;
-+ }
-+ }
-+ up(&cotulla_nssp_mutex);
-+#ifdef EZX_OSS_DEBUG
-+ printk("AD sample freq = %d\n", codec_adc_rate);
-+ printk("DA sample freq = %d\n", codec_dac_rate);
-+#endif
-+ return put_user(codec_adc_rate, (long *) arg);
-+
-+ case SOUND_PCM_READ_RATE:
-+ if (file->f_mode & FMODE_WRITE)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("read DA sample freq\n");
-+#endif
-+ val = codec_dac_rate;
-+ }
-+ if (file->f_mode & FMODE_READ)
-+ {
-+#ifdef EZX_OSS_DEBUG
-+ printk("read AD sample freq\n");
-+#endif
-+ val = codec_adc_rate;
-+ }
-+ return put_user(val, (long *) arg);
-+
-+ case SNDCTL_DSP_SETFMT:
-+ case SNDCTL_DSP_GETFMTS:
-+ /* SUPPORT little endian signed 16 */
-+#ifdef EZX_OSS_DEBUG
-+ printk("data format is AFMT_S16_LEd\n");
-+#endif
-+ return put_user(AFMT_S16_LE, (long *) arg);
-+
-+ default:
-+ return mixer_ioctl(inode, file, cmd, arg);
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ * Audio stuff
-+ */
-+
-+static audio_stream_t nssp_audio_out = {
-+ name: "nssp audio out",
-+ dcmd: DCMD_TXNSSDR,
-+ drcmr: &DRCMRTXNSSDR, /* nssp dma map register */
-+ dev_addr: __PREG(NSSDR),
-+};
-+
-+static audio_stream_t nssp_audio_in = {
-+ name: "nssp audio in",
-+ dcmd: DCMD_RXNSSDR,
-+ drcmr: &DRCMRRXNSSDR, /* nssp dma map register */
-+ dev_addr: __PREG(NSSDR),
-+};
-+
-+static audio_state_t nssp_audio_state = {
-+ output_stream: &nssp_audio_out,
-+ input_stream: &nssp_audio_in,
-+ client_ioctl: nssp_ioctl,
-+ hw_init: nssp_init,
-+ hw_shutdown: nssp_shutdown,
-+ sem: __MUTEX_INITIALIZER(nssp_audio_state.sem),
-+};
-+
-+
-+static int nssp_audio_open(struct inode *inode, struct file *file)
-+{
-+#ifdef EZX_OSS_DEBUG
-+ printk("nssp audio open \n");
-+#endif
-+ return cotulla_audio_attach(inode, file, &nssp_audio_state);
-+}
-+
-+
-+/*
-+ * Missing fields of this structure will be patched with the call
-+ * to cotulla_audio_attach().
-+ */
-+
-+
-+static struct file_operations nssp_audio_fops = {
-+ open: nssp_audio_open,
-+ owner: THIS_MODULE
-+};
-+
-+
-+static int __init cotulla_nssp_init(void)
-+{
-+ nssp_audio_state.dev_dsp = register_sound_audio(&nssp_audio_fops, -1);
-+
-+ set_GPIO_mode(GPIO_NSSP_SCLK2 | GPIO_IN); /* BitCLK */
-+ set_GPIO_mode(GPIO_NSSP_SFRM2 | GPIO_IN); /* FS */
-+ set_GPIO_mode(GPIO_NSSP_TXD2 | GPIO_IN);
-+ set_GPIO_mode(GPIO_NSSP_RXD2 | GPIO_IN); /* RXD ssp2 ALF in 1*/
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk("cotulla-nssp-init ok\n");
-+#endif
-+ return 0;
-+}
-+
-+
-+static void __exit cotulla_nssp_exit(void)
-+{
-+ unregister_sound_audio(nssp_audio_state.dev_dsp);
-+#ifdef EZX_OSS_DEBUG
-+ printk("cotulla-nssp-exit ok\n");
-+#endif
-+}
-+
-+
-+module_init(cotulla_nssp_init);
-+module_exit(cotulla_nssp_exit);
-+
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-phone.c linux-2.6.16.5-exz/sound/oss/ezx-phone.c
---- linux-2.6.16.5/sound/oss/ezx-phone.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-phone.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,280 @@
-+/*
-+ * linux/drivers/sound/ezx-phone
-+ *
-+ *
-+ * Description: phone interface for EZX. for application can't direct call interface in kernel space from
-+ * user space.so phone controll realize a char device.
-+ *
-+ *
-+ * copyright: Motorola
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Aug 02,2002 created
-+ * zhouqiong Mar 03,2003 (1) don't close headset interrupt;
-+ * (2) move bluetooth to phone device ioctl
-+ * LiYong Sep 23,2003 Port from EZX
-+ * Jin Lihong(w20076) Jan 02,2004,LIBdd66088 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Jan 13,2004,LIBdd68327 Make the e680 louder speaker work.
-+ * Jin Lihong(w20076) Mar.15,2004,LIBdd86574 mixer bug fix
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90336 play music noise tmp solution
-+ * Jin Lihong(w20076) Mar.25,2004,LIBdd90846 a780 new gain setting interface
-+ * Jin Lihong(w20076) Apr.20,2004,LIBee01165 va of a phone call for e680
-+ * Jin Lihong(w20076) Apr.24,2004,LIBee03164 a780 bitclock restore to normal because pcap2 upgraded
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/fs.h>
-+#include <linux/major.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/sound.h>
-+#include <linux/soundcard.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "ezx-common.h"
-+
-+
-+#ifdef CONFIG_PM
-+static struct pm_dev *pm_dev;
-+#endif
-+
-+static DECLARE_MUTEX(phone_mutex);
-+
-+#ifdef CONFIG_PM
-+#ifdef CONFIG_ARCH_EZX_E680
-+extern u32 gpio_va_sel_status;
-+#endif
-+
-+
-+static int phone_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-+{
-+ switch(req)
-+ {
-+ case PM_SUSPEND:
-+ break;
-+ case PM_RESUME:
-+#ifdef CONFIG_ARCH_EZX_E680
-+ set_GPIO_mode(GPIO_VA_SEL_BUL | GPIO_OUT);
-+ if(gpio_va_sel_status)
-+ {
-+ set_GPIO(GPIO_VA_SEL_BUL);
-+ }
-+ else
-+ {
-+ clr_GPIO(GPIO_VA_SEL_BUL);
-+ }
-+#endif
-+ break;
-+ }
-+ return 0;
-+}
-+#endif
-+
-+
-+void bluetoothaudio_open(void)
-+{}
-+void bluetoothaudio_close(void)
-+{}
-+
-+static int phone_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ unsigned long ssp_pcap_register_val;
-+
-+ switch(cmd) {
-+ case BLUETOOTH_AUDIO_ON:
-+#ifdef EZX_OSS_DEBUG
-+ printk("bluetooth audio on\n");
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(SSP_PCAP_ADJ_AUD_CODEC_REGISTER, &ssp_pcap_register_val);
-+ printk("AUD_CODEC=0x%x\n", ssp_pcap_register_val);
-+#endif
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN);
-+ (*mixer_close_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])();
-+ break;
-+
-+ case BLUETOOTH_AUDIO_OFF:
-+#ifdef EZX_OSS_DEBUG
-+ printk("bluetooth audio off\n");
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(SSP_PCAP_ADJ_AUD_CODEC_REGISTER, &ssp_pcap_register_val);
-+ printk("AUD_CODEC=0x%x\n", ssp_pcap_register_val);
-+#endif
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_R_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_PGA_L_EN);
-+ (*mixer_open_output_path[OUTPUT_BASE_TYPE(codec_output_base)][codec_output_path])(codec_output_base|codec_output_path );
-+ break;
-+
-+ default:
-+ return mixer_ioctl(inode, file, cmd, arg);
-+ }
-+ return 0;
-+}
-+
-+
-+/*
-+ * there is a supposition:
-+ * when run phone_open, other audio device is stopped, pcap is free
-+ */
-+static int count = 0;
-+static int phone_open(struct inode *inode, struct file *file)
-+{
-+ unsigned int ssp_pcap_register_val;
-+
-+/*
-+#ifdef CONFIG_ARCH_EZX_E680
-+ if( audioonflag & FM_DEVICE ){
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "E680 open phone EBUSY because 0x%X device is using the sound hardware.\n",audioonflag );
-+#endif
-+ return -EBUSY;
-+ }
-+#endif
-+*/
-+
-+ if(!count){
-+ count ++;
-+
-+ down(&phone_mutex);
-+
-+ mute_output_to_avoid_pcap_noise();
-+ audioonflag |= PHONE_DEVICE;
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+ pcap_use_bp_13m_clock();
-+
-+
-+#ifdef EZX_OSS_DEBUG
-+ printk(EZXOSS_DEBUG "open phone device, init pcap register\n");
-+#endif
-+ set_pcap_telephone_codec(0);
-+ set_pcap_output_path();
-+ set_pcap_input_path();
-+
-+ undo_mute_output_to_avoid_pcap_noise();
-+
-+#ifdef EZX_OSS_DEBUG
-+ SSP_PCAP_read_data_from_PCAP(0x0b, &ssp_pcap_register_val);
-+ printk("reg 11=0x%x\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0d, &ssp_pcap_register_val);
-+ printk("reg 13=0x%x\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x0c, &ssp_pcap_register_val);
-+ printk("reg 12=0x%x\n", ssp_pcap_register_val);
-+ SSP_PCAP_read_data_from_PCAP(0x1a, &ssp_pcap_register_val);
-+ printk("reg 26=0x%x\n", ssp_pcap_register_val);
-+#endif
-+ up(&phone_mutex);
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ set_gpio_va_sel_out_low();
-+#endif
-+
-+#ifdef CONFIG_PM
-+ pm_dev = pm_register(PM_SYS_DEV, 0, phone_pm_callback);
-+#endif
-+ return 0;
-+ }
-+ else
-+ return -EBUSY;
-+}
-+
-+
-+static int phone_release(struct inode *inode, struct file *file)
-+{
-+ count --;
-+ if(!count){
-+ down(&phone_mutex);
-+
-+ mute_output_to_avoid_pcap_noise();
-+
-+ /* close pcap input path */
-+ if(micinflag)
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_TX_AUD_AMPS_REGISTER,SSP_PCAP_ADJ_BIT_TX_AUD_AMPS_MB_ON2);
-+ else
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_TX_AUD_AMPS_REGISTER, 0);
-+ /* close pcap output path */
-+ SSP_PCAP_write_data_to_PCAP(SSP_PCAP_ADJ_AUD_RX_AMPS_REGISTER,SSP_PCAP_ADJ_BIT_AUD_RX_AMPS_A1CTRL);
-+ /* disable PCAP mono codec */
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_CLK_EN);
-+ SSP_PCAP_bit_clean(SSP_PCAP_ADJ_BIT_AUD_CODEC_CDC_EN);
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_SMB);
-+
-+ /* set fsync, tx, bitclk are tri-stated */
-+ SSP_PCAP_bit_set(SSP_PCAP_ADJ_BIT_AUD_CODEC_CD_TS);
-+
-+ up(&phone_mutex);
-+
-+#ifdef CONFIG_ARCH_EZX_E680
-+ set_gpio_va_sel_out_high();
-+ e680_boomer_path_mono_lineout(); /* mute hw noise and save power for e680 */
-+#endif
-+
-+ pcap_use_bp_13m_clock();
-+ audioonflag &= ~PHONE_DEVICE;
-+
-+#ifdef CONFIG_PM
-+ pm_unregister(pm_dev);
-+#endif
-+ }
-+
-+ return 0;
-+}
-+
-+
-+static struct file_operations device_fops = {
-+ owner: THIS_MODULE,
-+ open: phone_open,
-+ release: phone_release,
-+ ioctl: phone_ioctl,
-+};
-+
-+static int __init phone_init(void)
-+{
-+ int ret;
-+ ret = register_chrdev(MYPHONE_MAJOR,"phone", &device_fops);
-+ if(ret)
-+ {
-+ printk("can't register phone device with kernel");
-+ }
-+#ifdef EZX_OSS_DEBUG
-+ printk("register phone device with kernel ok \n");
-+#endif
-+ return 0;
-+}
-+
-+static void __exit phone_exit(void)
-+{
-+ unregister_chrdev(MYPHONE_MAJOR, "phone");
-+#ifdef EZX_OSS_DEBUG
-+ printk("unregister phone device \n");
-+#endif
-+}
-+
-+
-+module_init(phone_init);
-+module_exit(phone_exit);
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-vibrator.c linux-2.6.16.5-exz/sound/oss/ezx-vibrator.c
---- linux-2.6.16.5/sound/oss/ezx-vibrator.c 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-vibrator.c 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,245 @@
-+/*
-+ * linux/drivers/sound/vibrator.c
-+ *
-+ *
-+ * Description: vibrator interface for EZX. for application can't direct call interface in kernel space from
-+ * user space.so vibrator still realize a char device.
-+ *
-+ *
-+ * (c) Copyright Motorola 2003, All rights reserved.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Jun 20,2002 created
-+ * Kin Wong Nov 05,2003 Renamed ezx-vibrator.h to vibrator.h
-+ * Jin Lihong(w20076) Jan 02,2004 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) Move audio driver DEBUG macro definition to ezx-audio.h
-+ * header file,and redefine DEBUG to EZX_OSS_DEBUG
-+ * (3) reorganize file header
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 reorganise file header
-+ *
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/completion.h>
-+#include <linux/delay.h>
-+#include <linux/poll.h>
-+#include <linux/pm.h>
-+#include <linux/fs.h>
-+
-+#include <asm/hardware.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <asm/semaphore.h>
-+#include <asm/dma.h>
-+
-+#include "../misc/ssp_pcap.h"
-+#include "ezx-vibrator.h"
-+
-+
-+#ifdef CONFIG_PM
-+static struct pm_dev *pm_dev;
-+#endif
-+
-+static int active=0;
-+static int voltage=0;
-+
-+static int vibrator_ioctl(struct inode *inode, struct file *file,
-+ unsigned int cmd, unsigned long arg)
-+{
-+ int ret;
-+ long val;
-+
-+ switch(cmd)
-+ {
-+ case VIBRATOR_ENABLE:
-+#ifdef EZX_OSS_DEBUG
-+ printk("enable vibrator \n");
-+#endif
-+ ret = get_user(val, (int *) arg);
-+ if (ret)
-+ return ret;
-+ switch(val)
-+ {
-+ case 0:
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator level 0 \n");
-+#endif
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL0);
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL0);
-+ active = 1;
-+ voltage = 0;
-+ SSP_vibrate_start_command();
-+ break;
-+ case 1:
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator level 1 \n");
-+#endif
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL1);
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL1);
-+ active = 1;
-+ voltage = 1;
-+ SSP_vibrate_start_command();
-+ break;
-+ case 2:
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator level 2 \n");
-+#endif
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL2);
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL2);
-+ active = 1;
-+ voltage = 2;
-+ SSP_vibrate_start_command();
-+ break;
-+ case 3:
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator level 3 \n");
-+#endif
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL3);
-+ ret = SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL3);
-+ active = 1;
-+ voltage = 3;
-+ SSP_vibrate_start_command();
-+ break;
-+ default:
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator level error \n");
-+#endif
-+ return -EINVAL;
-+ }
-+ return put_user(ret, (int *) arg);
-+
-+ case VIBRATOR_DISABLE:
-+#ifdef EZX_OSS_DEBUG
-+ printk("disable vibrator \n");
-+#endif
-+ ret = 0;
-+ active = 0;
-+ SSP_vibrate_stop_command();
-+ return put_user(ret, (int *) arg);
-+ default:
-+ return -EINVAL;
-+ }
-+ return 0;
-+}
-+
-+#ifdef CONFIG_PM
-+static int vibrator_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data)
-+{
-+ switch(req)
-+ {
-+ case PM_SUSPEND:
-+ if(active)
-+ {
-+ SSP_vibrate_stop_command();
-+ }
-+ break;
-+ case PM_RESUME:
-+ if(active)
-+ {
-+ switch(voltage)
-+ {
-+ case 0:
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL0);
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL0);
-+ break;
-+ case 1:
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL1);
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL1);
-+ break;
-+ case 2:
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL2);
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL2);
-+ break;
-+ case 3:
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL3);
-+ SSP_PCAP_V_VIB_level_set(PCAP_VIBRATOR_VOLTAGE_LEVEL3);
-+ break;
-+ default:
-+ break;
-+ }
-+ SSP_vibrate_start_command();
-+ }
-+ break;
-+ }
-+ return 0;
-+}
-+#endif
-+
-+static int count=0;
-+static int vibrator_open(struct inode *inode, struct file *file)
-+{
-+ if(!count)
-+ {
-+ count ++;
-+ //ssp_pcap_init();
-+ ssp_pcap_open(SSP_PCAP_AUDIO_OPEN);
-+#ifdef CONFIG_PM
-+ pm_dev = pm_register(PM_SYS_DEV, 0, vibrator_pm_callback);
-+#endif
-+#ifdef EZX_OSS_DEBUG
-+ printk("open vibrator \n");
-+#endif
-+ return 0;
-+ }
-+ else
-+ return -EBUSY;
-+}
-+
-+static int vibrator_release(struct inode *inode, struct file *file)
-+{
-+ count --;
-+ if(!count)
-+ {
-+#ifdef CONFIG_PM
-+ pm_unregister(pm_dev);
-+#endif
-+#ifdef EZX_OSS_DEBUG
-+ printk("close vibrator \n");
-+#endif
-+ }
-+ return 0;
-+}
-+
-+
-+static struct file_operations device_fops = {
-+ owner: THIS_MODULE,
-+ open: vibrator_open,
-+ release: vibrator_release,
-+ ioctl: vibrator_ioctl,
-+};
-+
-+static int __init vibrator_init(void)
-+{
-+ int ret;
-+#ifdef EZX_OSS_DEBUG
-+ printk("enter vibrator init...\n");
-+#endif
-+ ret = register_chrdev(VIBRATOR_MAJOR,"vibrator", &device_fops);
-+ if(ret){
-+ printk("can't register vibrator device with kernel");
-+ }
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator init ok\n");
-+#endif
-+ return 0;
-+}
-+
-+static void __exit vibrator_exit(void)
-+{
-+ unregister_chrdev(VIBRATOR_MAJOR, "vibrator");
-+#ifdef EZX_OSS_DEBUG
-+ printk("vibrator exit ok\n");
-+#endif
-+ return;
-+}
-+
-+
-+module_init(vibrator_init);
-+module_exit(vibrator_exit);
-+
-+
-diff -Nru --exclude-from=/sunbeam/home/laforge/scripts/dontdiff linux-2.6.16.5/sound/oss/ezx-vibrator.h linux-2.6.16.5-exz/sound/oss/ezx-vibrator.h
---- linux-2.6.16.5/sound/oss/ezx-vibrator.h 1970-01-01 01:00:00.000000000 +0100
-+++ linux-2.6.16.5-exz/sound/oss/ezx-vibrator.h 2006-04-16 18:49:29.000000000 +0200
-@@ -0,0 +1,33 @@
-+/*
-+ * linux/drivers/sound/ezx-vibrator.h
-+ *
-+ * Copyright: BJDC motorola.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ *
-+ *
-+ * History:
-+ * zhouqiong Jun 20,2002 created
-+ * Jin Lihong(w20076) Jan 02,2004 (1) Port from UDC e680 kernel of jem vob.
-+ * (2) reorganize file header
-+ * Jin Lihong(w20076) Apr.13,2004,LIBdd96876 reorganise file header
-+ *
-+ */
-+
-+#ifndef EZX_VIBRATOR_H
-+#define EZX_VIBRATOR_H
-+
-+#include <linux/ioctl.h>
-+
-+
-+#define VIBRATOR_MAJOR 108
-+#define VIBRATOR_IOCTL_BASE 0xbb
-+#define VIBRATOR_ENABLE _IOW (VIBRATOR_IOCTL_BASE,1,int)
-+#define VIBRATOR_DISABLE _IO (VIBRATOR_IOCTL_BASE,2)
-+
-+
-+#endif
-+
-+