Index: ak4535.h
===================================================================
RCS file: /cvs/linux/kernel/drivers/sound/ak4535.h,v
retrieving revision 1.3
diff -u -r1.3 ak4535.h
--- ak4535.h	24 Nov 2003 21:14:26 -0000	1.3
+++ ak4535.h	18 Jan 2005 22:36:53 -0000
@@ -51,6 +51,7 @@
 #define I2C_SET_AGC		0x1380015
 
 /* Used internally to select recording source internal/external microphone */
-#define I2C_SET_RECSRC_MIC      0x13800016
-#define I2C_SET_RECSRC_LINE	0x13800017
-#define I2C_SET_HEADPHONE_SWITCH 0x13800018
+#define I2C_SET_RECSRC_MIC		0x13800016
+#define I2C_SET_RECSRC_LINE		0x13800017
+#define I2C_SET_HEADPHONE_SWITCH	0x13800018
+#define I2C_SET_HEADPHONE_OUTPUT	0x13800019
Index: ak4535.c
===================================================================
RCS file: /cvs/linux/kernel/drivers/sound/ak4535.c,v
retrieving revision 1.19
diff -u -r1.19 ak4535.c
--- ak4535.c	15 Sep 2004 13:14:42 -0000	1.19
+++ ak4535.c	18 Jan 2005 22:36:53 -0000
@@ -331,6 +331,15 @@
 			akm->regs[REG_PWR2] |= REG_PWR2_PMSPK;
 		}
 		break;
+	case I2C_SET_HEADPHONE_OUTPUT:
+		if (val) {
+			newregnum = REG_SEL2;
+			akm->regs[REG_SEL2] &= ~(REG_SEL2_HPL | REG_SEL2_HPR);
+		} else {
+			newregnum = REG_SEL2;
+			akm->regs[REG_SEL2] |= REG_SEL2_HPL | REG_SEL2_HPR;
+		}
+		break;
 	case I2C_SET_AGC:
 		break;
 
@@ -389,6 +398,7 @@
 			akm->mic_connected = 0;
 			ak4535_update(clnt, I2C_SET_RECSRC_LINE, arg);
 			ak4535_update(clnt, I2C_SET_HEADPHONE_SWITCH, &akm->line_connected);
+			ak4535_update(clnt, I2C_SET_HEADPHONE_OUTPUT, &akm->line_connected);
 		} else if (val & SOUND_MASK_MIC) {
 			akm->mic_connected = 1;
 			akm->line_connected = 0;
@@ -396,6 +406,7 @@
 /*             do we actually want to do this? disables internal speaker? */
 /*             ak4535_update(clnt, I2C_SET_HEADPHONE_SWITCH, &akm->line_connected); */
 			ak4535_update(clnt, I2C_SET_HEADPHONE_SWITCH, &akm->line_connected);
+			ak4535_update(clnt, I2C_SET_HEADPHONE_OUTPUT, &akm->line_connected);
 		}
 		return put_user(val, (int *)arg);
 	}

