diff --git a/sound/oss/opl3sa2.c b/sound/oss/opl3sa2.c
index 92f74085d7bee4c1479db57e8ac5904d45f21656..ae5accf992ad44e46a54a9a4d2ca96d4cde463be 100644
--- a/sound/oss/opl3sa2.c
+++ b/sound/oss/opl3sa2.c
@@ -324,15 +324,6 @@ static void opl3sa3_set_treble(opl3sa2_state_t* devc, int left, int right)
 }
 
 
-static void opl3sa3_set_wide(opl3sa2_state_t* devc, int left, int right)
-{	
-	unsigned char wide;
-
-	wide = left ? ((unsigned char) (8 * left / 101)) : 0; 
-	wide |= (right ? ((unsigned char) (8 * right / 101)) : 0) << 4;
-
-	opl3sa2_write(devc->cfg_port, OPL3SA3_WIDE, wide);
-}
 
 
 static void opl3sa2_mixer_reset(opl3sa2_state_t* devc)
@@ -401,7 +392,7 @@ static inline int ret_vol_stereo(int left, int right)
 
 static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
 {
-	int cmdf = cmd & 0xff;
+	int retval, value, cmdf = cmd & 0xff;
 
 	opl3sa2_state_t* devc = &opl3sa2_state[dev];
 	
@@ -422,23 +413,31 @@ static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
 	if (((cmd >> 8) & 0xff) != 'M')
 		return -EINVAL;
 		
+	retval = 0;
 	if (_SIOC_DIR (cmd) & _SIOC_WRITE) {
 		switch (cmdf) {
 			case SOUND_MIXER_VOLUME:
-				arg_to_vol_stereo(*(unsigned int*)arg,
-						  &devc->volume_l, &devc->volume_r); 
+				retval = get_user(value, (unsigned int *) arg);
+				if (retval)
+					break;
+				arg_to_vol_stereo(value, &devc->volume_l, &devc->volume_r);
 				opl3sa2_set_volume(devc, devc->volume_l, devc->volume_r);
-				*(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r);
-				return 0;
+				value = ret_vol_stereo(devc->volume_l, devc->volume_r);
+				retval = put_user(value, (int *) arg);
+				break;
 		  
 			case SOUND_MIXER_MIC:
-				arg_to_vol_mono(*(unsigned int*)arg, &devc->mic);
+				retval = get_user(value, (unsigned int *) arg);
+				if (retval)
+					break;
+				arg_to_vol_mono(value, &devc->mic);
 				opl3sa2_set_mic(devc, devc->mic);
-				*(int*)arg = ret_vol_mono(devc->mic);
-				return 0;
+				value = ret_vol_mono(devc->mic);
+				retval = put_user(value, (int *) arg);
+				break;
 
 			default:
-				return -EINVAL;
+				retval = -EINVAL;
 		}
 	}
 	else {
@@ -447,122 +446,72 @@ static int opl3sa2_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
 		 */
 		switch (cmdf) {
 			case SOUND_MIXER_DEVMASK:
-				*(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_MIC);
-				return 0;
+				retval = put_user(SOUND_MASK_VOLUME | SOUND_MASK_MIC, (int *) arg);
+				break;
 		  
 			case SOUND_MIXER_STEREODEVS:
-				*(int*)arg = SOUND_MASK_VOLUME;
-				return 0;
+				retval = put_user(SOUND_MASK_VOLUME, (int *) arg);
+				break;
 		  
 			case SOUND_MIXER_RECMASK:
 				/* No recording devices */
-				return (*(int*)arg = 0);
+				retval = put_user(0, (int *) arg);
+				break;
 
 			case SOUND_MIXER_CAPS:
-				*(int*)arg = SOUND_CAP_EXCL_INPUT;
-				return 0;
+				retval = put_user(SOUND_CAP_EXCL_INPUT, (int *) arg);
+				break;
 
 			case SOUND_MIXER_RECSRC:
 				/* No recording source */
-				return (*(int*)arg = 0);
+				retval = put_user(0, (int *) arg);
+				break;
 
 			case SOUND_MIXER_VOLUME:
-				*(int*)arg = ret_vol_stereo(devc->volume_l, devc->volume_r);
-				return 0;
+				value = ret_vol_stereo(devc->volume_l, devc->volume_r);
+				retval = put_user(value, (int *) arg);
+				break;
 			  
 			case SOUND_MIXER_MIC:
-				*(int*)arg = ret_vol_mono(devc->mic);
-				return 0;
+				value = ret_vol_mono(devc->mic);
+				put_user(value, (int *) arg);
+				break;
 
 			default:
-				return -EINVAL;
+				retval = -EINVAL;
 		}
 	}
+	return retval;
 }
 /* opl3sa2_mixer_ioctl end */
 
 
 static int opl3sa3_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
 {
-	int cmdf = cmd & 0xff;
+	int value, retval, cmdf = cmd & 0xff;
 
 	opl3sa2_state_t* devc = &opl3sa2_state[dev];
 
 	switch (cmdf) {
-		case SOUND_MIXER_BASS:
-		case SOUND_MIXER_TREBLE:
-		case SOUND_MIXER_DIGITAL1:
-		case SOUND_MIXER_DEVMASK:
-		case SOUND_MIXER_STEREODEVS: 
-			break;
-
-		default:
-			return opl3sa2_mixer_ioctl(dev, cmd, arg);
-	}
-
-	if (((cmd >> 8) & 0xff) != 'M')
-		return -EINVAL;
+	case SOUND_MIXER_BASS:
+		value = ret_vol_stereo(devc->bass_l, devc->bass_r);
+		retval = put_user(value, (int *) arg);
+		break;
 		
-	if (_SIOC_DIR (cmd) & _SIOC_WRITE) {
-		switch (cmdf) {
-			case SOUND_MIXER_BASS:
-				arg_to_vol_stereo(*(unsigned int*)arg,
-						  &devc->bass_l, &devc->bass_r); 
-				opl3sa3_set_bass(devc, devc->bass_l, devc->bass_r);
-				*(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r);
-				return 0;
-		  
-			case SOUND_MIXER_TREBLE:
-				arg_to_vol_stereo(*(unsigned int*)arg,
-						  &devc->treble_l, &devc->treble_r); 
-				opl3sa3_set_treble(devc, devc->treble_l, devc->treble_r);
-				*(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r);
-				return 0;
-
-			case SOUND_MIXER_DIGITAL1:
-				arg_to_vol_stereo(*(unsigned int*)arg,
-						  &devc->wide_l, &devc->wide_r); 
-				opl3sa3_set_wide(devc, devc->wide_l, devc->wide_r);
-				*(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r);
-				return 0;
-
-			default:
-				return -EINVAL;
-		}
-	}
-	else			
-	{
-		/*
-		 * Return parameters
-		 */
-		switch (cmdf) {
-			case SOUND_MIXER_DEVMASK:
-				*(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_MIC |
-					      SOUND_MASK_BASS | SOUND_MASK_TREBLE |
-					      SOUND_MASK_DIGITAL1);
-				return 0;
-		  
-			case SOUND_MIXER_STEREODEVS:
-				*(int*)arg = (SOUND_MASK_VOLUME | SOUND_MASK_BASS |
-					      SOUND_MASK_TREBLE | SOUND_MASK_DIGITAL1);
-				return 0;
-		  
-			case SOUND_MIXER_BASS:
-				*(int*)arg = ret_vol_stereo(devc->bass_l, devc->bass_r);
-				return 0;
-			  
-			case SOUND_MIXER_TREBLE:
-				*(int*)arg = ret_vol_stereo(devc->treble_l, devc->treble_r);
-				return 0;
+	case SOUND_MIXER_TREBLE:
+		value = ret_vol_stereo(devc->treble_l, devc->treble_r);
+		retval = put_user(value, (int *) arg);
+		break;
 
-			case SOUND_MIXER_DIGITAL1:
-				*(int*)arg = ret_vol_stereo(devc->wide_l, devc->wide_r);
-				return 0;
+	case SOUND_MIXER_DIGITAL1:
+		value = ret_vol_stereo(devc->wide_l, devc->wide_r);
+		retval = put_user(value, (int *) arg);
+		break;
 
-			default:
-				return -EINVAL;
-		}
+	default:
+		retval = -EINVAL;
 	}
+	return retval;
 }
 /* opl3sa3_mixer_ioctl end */