diff --git a/arch/arm/mach-msm/htc_hw.c b/arch/arm/mach-msm/htc_hw.c
index 7bb3a13..7ed64d1 100644
--- a/arch/arm/mach-msm/htc_hw.c
+++ b/arch/arm/mach-msm/htc_hw.c
@@ -21,14 +21,186 @@
 
 #include "htc_hw.h"
 
+#include "AudioPara.c"
+
 #if 1
  #define DHTC(fmt, arg...) printk(KERN_DEBUG "[HTC] %s: " fmt "\n", __FUNCTION__, ## arg)
 #else
  #define DHTC(fmt, arg...) do {} while (0)
 #endif
 
+int in_call = 0;
+
 static htc_hw_pdata_t *htc_hw_pdata;
 
+static void set_audio_parameters(char *name1, char *name2, char *name3) {
+	/* taken from htc-vogue tree, vogue-hw */
+	/* modified for cdma touch pro */
+
+	int i;
+
+	for(i=0;i<ARRAY_SIZE(audioparams1_raphcdma);i++)
+		if(!strcmp(name1,audioparams1_raphcdma[i].name))
+		break;
+	if(i==ARRAY_SIZE(audioparams1_raphcdma)) {
+		printk("Unknown audio parameter: %s\n", name3);
+		return;
+	};
+	memcpy((void *)(MSM_SHARED_RAM_BASE+0xfc200), audioparams1_raphcdma[i].data, 0x84);
+	for(i=0;i<ARRAY_SIZE(audioparams2_raphcdma);i++)
+		if(!strcmp(name2,audioparams2_raphcdma[i].name))
+			break;
+	if(i==ARRAY_SIZE(audioparams2_raphcdma)) {
+		printk("Unknown audio parameter: %s\n", name2);
+		return;
+	};
+	memcpy((void *)(MSM_SHARED_RAM_BASE+0xfc600),audioparams2_raphcdma[i].data, 0xa0);
+	for(i=0;i<ARRAY_SIZE(audioparams3_raphcdma);i++)
+		if(!strcmp(name3,audioparams3_raphcdma[i].name))
+			break;
+	if(i==ARRAY_SIZE(audioparams3_raphcdma)) {
+		printk("Unknown audio parameters: %s\n", name3);
+		return;
+	};
+/*	memcpy((void *)(MSM_SHARED_RAM_BASE+0xfc300),audioparams3_raphcdma[i].data, 0x140);	*/
+	memcpy((void *)(MSM_SHARED_RAM_BASE+0xfc300),audioparams3_raphcdma[i].data, 0x99);
+};
+
+int msm_audio_path(int i) {
+	/* taken from htc-vogue tree, vogue-hw	*/
+	/* modified for cdma touch pro		*/
+
+	struct msm_dex_command dex;
+
+	if (machine_is_htcraphael_cdma()) {
+		switch (i) {
+			case 0: // Audio off
+				/* TODO: add in call detection */ 
+					printk("750xA Audio: Idle\n");
+/*					set_audio_parameters("IDLE", "CE_SYS", "CE_PLAYBACK_HANDSFREE");	*/
+					set_audio_parameters("EARCUPLE_VOICE", "CE_SYS", "CE_PLAYBACK_HEADSET");
+					//msm_proc_comm(0x119, 0x62, 0);
+					//gpio_set_value(98,0);		//TODO: find the gpio for amp
+
+					dex.cmd = PCOM_SET_AUDIO_PATH;
+					dex.data = 0x62;
+					msm_proc_comm_wince(&dex, 0);
+			break;
+			case 1: // Play Sound
+				/* TODO: add headset detect */
+				if (/*headset_in*/ 0) {
+					printk("750xA Audio: Playsound through headset\n");
+					set_audio_parameters("CE_PLAYBACK_HEADSET", "CE_SYS", "CE_PLAYBACK_HEADSET");
+					//msm_proc_comm(0x119, 0x16, 0);
+				} else {
+					printk("750xA Audio: Play sound through handsfree\n");
+					set_audio_parameters("CE_PLAYBACK_HANDSFREE", "CE_SYS", "CE_PLAYBACK_HANDSFREE");
+					//msm_proc_comm(0x119, 0x17, 0);
+				};
+			break;
+			case 2: // Phone audio start
+			in_call = 1;
+				/* TODO: add headset detect */
+				if (/*headset_in*/ 0) {
+					printk("750xA Audio: Phone call through headset\n");
+					set_audio_parameters("CE_PLAYBACK_HEADSET", "CE_SYS", "CE_PLAYBACK_HEADSET");
+					//msm_proc_comm(0x119, 0x16, 0);
+				} else {
+					printk("750xA Audio: Phone call through earcouple\n");
+/*					set_audio_parameters("PHONE_EARCUPLE", "CE_SYS", "PHONE_EARCUPLE_VOL4");	*/
+					set_audio_parameters("EARCUPLE_VOICE", "CE_SYS", "PHONE_EARCUPLE_VOL4");
+					//msm_proc_comm(0x119, 0x2, 0);
+//					dex.cmd = PCOM_SET_AUDIO_PATH;
+					dex.cmd = PCOM_UPDATE_AUDIO;
+					dex.has_data = 1;
+					dex.data = 0x2;
+					msm_proc_comm_wince(&dex, 0);
+				};
+			break;
+
+			case 3:
+				printk("750xA Audio: case 3 is not implemented\n");
+			break;
+			case 4:
+				printk("750xA Audio: case 3 is not implemented\n");
+			break;
+			case 5:
+				in_call = 0;
+				printk("750xA Audio: Phone call end\n");
+				set_audio_parameters("IDLE", "CE_SYS", "CE_PLAYBACK_HANDSFREE");
+				//msm_proc_comm(0x119, 0x62, 0);
+				//gpio_set_value(98, 0);
+			break;
+			case 6: // Headset in (connect)
+				printk("750xA Audio: headset connected\n");
+			break;
+			case 7: // Headset out (disconnect)
+				printk("750xA Audio: headset disconnected\n");
+							
+			default:
+			printk("\n750xA Audio: Invalid msm_audio_path case.\n");
+			break;
+		};
+	};
+};
+
+static ssize_t audio_store(struct class *class, const char *buf, size_t count)
+{
+	// taken from htc-vogue tree, vogue-hw
+	// these values are taken from the htc-vogue tree, vogue-hw
+
+	uint32_t audio;
+
+	if (sscanf(buf, "%d", &audio) != 1)
+		return -EINVAL;
+	printk("Sound: %d\n", audio);
+	msm_audio_path(audio);
+	return count;
+};
+
+static ssize_t audiopath_store(struct class *class, const char *buf, size_t count)
+{
+	// taken from htc-vogue tree, vogue-hw
+	// these values are taken from the htc-vogue tree, vogue-hw
+
+	uint32_t audiopath;
+
+	struct msm_dex_command dex;
+
+	if (sscanf(buf, "%d", &audiopath) != 1)
+		return -EINVAL;
+	printk("Audio path (PCOM_UPDATE_AUDIO): %d\n", audiopath);
+//	msm_audio_path(audio);
+	dex.cmd = PCOM_UPDATE_AUDIO;
+	dex.has_data = 1;
+	dex.data = audiopath;
+	msm_proc_comm_wince(&dex, 0);
+
+	return count;
+};
+
+static ssize_t setaudiopath_store(struct class *class, const char *buf, size_t count)
+{
+	// taken from htc-vogue tree, vogue-hw
+	// these values are taken from the htc-vogue tree, vogue-hw
+
+	uint32_t setaudiopath;
+
+	struct msm_dex_command dex;
+
+	if (sscanf(buf, "%d", &setaudiopath) != 1)
+		return -EINVAL;
+	printk("Set Audio path (PCOM_SET_AUDIO_PATH): %d\n", setaudiopath);
+//	msm_audio_path(audio);
+	dex.cmd = PCOM_SET_AUDIO_PATH;
+	dex.has_data = 1;
+	dex.data = setaudiopath;
+	msm_proc_comm_wince(&dex, 0);
+
+	return count;
+};
+
+
 static ssize_t vibrate_store(struct class *class, const char *buf, size_t count)
 {
 	uint32_t vibrate;
@@ -90,6 +262,9 @@ static struct class_attribute htc_hw_class_attrs[] = {
 	__ATTR_RO(radio),
 	__ATTR_RO(machtype),
 	__ATTR(vibrate, 0222, NULL, vibrate_store),
+	__ATTR(audio, 0222, NULL, audio_store),
+	__ATTR(audiopath, 0222, NULL, audiopath_store),
+	__ATTR(setaudiopath, 0222, NULL, setaudiopath_store),
 	__ATTR_NULL,
 };

