Index: drivers/sound/ak4535.c
===================================================================
RCS file: /cvs/linux/kernel/drivers/sound/ak4535.c,v
retrieving revision 1.20
diff -u -r1.20 ak4535.c
--- drivers/sound/ak4535.c	31 Jan 2005 14:05:41 -0000	1.20
+++ drivers/sound/ak4535.c	25 Feb 2005 18:14:06 -0000
@@ -302,10 +302,6 @@
 
 	case I2C_SET_LINE_GAIN:
 		newregnum = REG_LATT;
-		if (val > 63) {
-			printk("line_gain=%d must be in range [0,63]", val);
-			val = 63;
-		}
 		akm->regs[REG_LATT] = (unsigned char)val;
 		altregnum = REG_RATT;
 		akm->regs[REG_RATT] = (unsigned char)val;
@@ -313,9 +309,9 @@
 
 	case I2C_SET_MIC_GAIN:
 		newregnum = REG_PGA;
-		if (val > 127) {
-			printk("mic_gain=%d must be in range [0,127]", val);
-			val = 127;
+		if (val > 71) {
+			printk("mic_gain=%d must be in range [0,71]", val);
+			val = 71;
 		}
 		akm->regs[REG_PGA] = (unsigned char)val;
 		break;
@@ -464,18 +460,21 @@
 		case SOUND_MIXER_LINE:
 			akm->line = val;
 			akm->mod_cnt++;
-			/* input value [0,100], ak4535 uses [0,63] */
+			/* input value [0,100], ak4535 uses [0,255] */
+			/* the ak4535 treats this as an attenuation */
+			/* so we flip the value (and mask just in   */
+			/* case).                                   */
 			val = gain.left;
-			val = 63 * val / 100;
+			val = 0xff & ~(255 * val / 100);
 			ak4535_update(clnt, I2C_SET_LINE_GAIN, &val);
 			break;
 
 		case SOUND_MIXER_MIC:
 			akm->mic = val;
 			akm->mod_cnt++;
-			/* input value [0,100], ak4535 uses [0,127] */
+			/* input value [0,100], ak4535 uses [0,71] */
 			val = gain.left;
-			val = 127 * val / 100;
+			val = 71 * val / 100;
 
 			ak4535_update(clnt, I2C_SET_MIC_GAIN, &val);
 			break;

