Example #1
0
static inline void aic33_configure()
{
	DPRINTK(" CONFIGURING AIC33\n");

	/* Page select register */
	audio_aic33_write(REGISTER_ADDR0, 0x0);

	/* audio_aic33_write(REGISTER_ADDR38, 0x10); */
	davinci_set_mono_stereo(aic33_local.nochan);
#ifdef AIC33_MASTER
	/* Enable bit and word clock as Master mode, 3-d disabled */
	audio_aic33_write(REGISTER_ADDR8, 0xc0 /*0xc4 */ );
#endif

	aic33_update(SET_LINE, aic33_local.line);
	aic33_update(SET_VOLUME, aic33_local.volume);
	aic33_update(SET_RECSRC, aic33_local.recsrc);
	aic33_update(SET_IGAIN, aic33_local.igain);
	aic33_update(SET_OGAIN, aic33_local.ogain);
	aic33_update(SET_MICBIAS, aic33_local.micbias);
}
Example #2
0
static int
mixer_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
{
	int val;
	int ret = 0;
	int nr = _IOC_NR(cmd);

	/*
	 * We only accept mixer (type 'M') ioctls.
	 */
	if (_IOC_TYPE(cmd) != 'M')
		return -EINVAL;

	DPRINTK(" 0x%08x\n", cmd);

	if (cmd == SOUND_MIXER_INFO) {
		struct mixer_info mi;

		strncpy(mi.id, "AIC33", sizeof(mi.id));
		strncpy(mi.name, "TI AIC33", sizeof(mi.name));
		mi.modify_counter = aic33_local.mod_cnt;

		return copy_to_user((void *)arg, &mi, sizeof(mi));
	}

	if (_IOC_DIR(cmd) & _IOC_WRITE) {
		ret = get_user(val, (int *)arg);
		if (ret)
			goto out;

		switch (nr) {
		case SOUND_MIXER_VOLUME:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_VOLUME, val);
			if (!ret)
				aic33_local.volume = val;
			break;

		case SOUND_MIXER_LINE:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_LINE, val);
			if (!ret)
				aic33_local.line = val;
			break;

		case SOUND_MIXER_MIC:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_MIC, val);
			if (!ret)
				aic33_local.mic = val;
			break;

		case SOUND_MIXER_RECSRC:
			if ((val & SOUND_MASK_LINE) ||
			    (val & SOUND_MASK_MIC)) {
				if (aic33_local.recsrc != val) {
					aic33_local.mod_cnt++;
					aic33_update(SET_RECSRC, val);
				}
			}
			else {
				ret = -EINVAL;
			}
			break;

		case SOUND_MIXER_BASS:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_BASS, val);
			if (!ret)
				aic33_local.bass = val;
			break;

		case SOUND_MIXER_TREBLE:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_TREBLE, val);
			if (!ret)
				aic33_local.treble = val;
			break;

		case SOUND_MIXER_IGAIN:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_IGAIN, val);
			if (!ret)
				aic33_local.igain = val;
			break;

		case SOUND_MIXER_OGAIN:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_OGAIN, val);
			if (!ret)
				aic33_local.ogain = val;
			break;

		case SOUND_MIXER_MICBIAS:
			aic33_local.mod_cnt++;
			ret = aic33_update(SET_MICBIAS, val);
			if (!ret)
				aic33_local.micbias = val;
			break;

		default:
			ret = -EINVAL;
		}
	}

	if (ret == 0 && _IOC_DIR(cmd) & _IOC_READ) {
		ret = 0;

		switch (nr) {
		case SOUND_MIXER_VOLUME:
			val = aic33_local.volume;
			break;
		case SOUND_MIXER_LINE:
			val = aic33_local.line;
			break;
		case SOUND_MIXER_MIC:
			val = aic33_local.mic;
			break;
		case SOUND_MIXER_RECSRC:
			val = aic33_local.recsrc;
			break;
		case SOUND_MIXER_RECMASK:
			val = REC_MASK;
			break;
		case SOUND_MIXER_IGAIN:
			val = aic33_local.igain;
			break;
		case SOUND_MIXER_OGAIN:
			val = aic33_local.ogain;
			break;
		case SOUND_MIXER_DEVMASK:
			val = DEV_MASK;
			break;
		case SOUND_MIXER_BASS:
			val = aic33_local.bass;
			break;
		case SOUND_MIXER_TREBLE:
			val = aic33_local.treble;
			break;
		case SOUND_MIXER_CAPS:
			val = 0;
			break;
		case SOUND_MIXER_STEREODEVS:
			val = SOUND_MASK_VOLUME;
			break;
		case SOUND_MIXER_MICBIAS:
			val = aic33_local.micbias;
			break;
		default:
			val = 0;
			ret = -EINVAL;
			break;
		}

		if (ret == 0)
			ret = put_user(val, (int *)arg);
	}
      out:
	return ret;
}