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); }
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; }