int rt5616_update_eqmode( struct snd_soc_codec *codec, int mode) { struct rt_codec_ops *ioctl_ops = rt_codec_get_ioctl_ops(); int i; static int eq_mode=0; if(codec == NULL || mode >= RT5616_HWEQ_LEN) return -EINVAL; dev_dbg(codec->dev, "%s(): mode=%d\n", __func__, mode); if(mode == eq_mode) return 0; for(i = 0; i <= EQ_REG_NUM; i++) { if(hweq_param[mode].reg[i]) ioctl_ops->index_write(codec, hweq_param[mode].reg[i], hweq_param[mode].value[i]); else break; } snd_soc_update_bits(codec, RT5616_EQ_CTRL2, RT5616_EQ_CTRL_MASK, hweq_param[mode].ctrl); snd_soc_update_bits(codec, RT5616_EQ_CTRL1, RT5616_EQ_UPD, RT5616_EQ_UPD); snd_soc_update_bits(codec, RT5616_EQ_CTRL1, RT5616_EQ_UPD, 0); eq_mode = mode; return 0; }
int rt5648_update_eqmode( struct snd_soc_codec *codec, int channel, int mode) { struct rt_codec_ops *ioctl_ops = rt_codec_get_ioctl_ops(); int i, upd_reg, reg, mask; hweq_t *proj_hweq_param; if (codec == NULL || mode >= RT5648_HWEQ_LEN) { pr_err("%s : return error, mode = %d\n", __func__, mode); return -EINVAL; } pr_debug("%s(): mode=%d\n", __func__, mode); PROJ_ID = Read_PROJ_ID(); if (PROJ_ID == PROJ_ID_FE380CG || PROJ_ID == PROJ_ID_FE380CXG) proj_hweq_param = FE380CG_hweq_param; else if (PROJ_ID == PROJ_ID_Z580C || PROJ_ID == PROJ_ID_Z580CA) proj_hweq_param = Z580C_hweq_param; else if (PROJ_ID == PROJ_ID_FE171MG) proj_hweq_param = FE171MG_hweq_param; for (i = 0; i < EQ_REG_NUM; i++) { proj_hweq_param[mode].reg[i] = eqreg[channel][i]; } for (i = 0; i < EQ_REG_NUM; i++) { if (proj_hweq_param[mode].reg[i]) { ioctl_ops->index_write(codec, proj_hweq_param[mode].reg[i], proj_hweq_param[mode].value[i]); } else { break; } } switch (channel) { case EQ_CH_DAC: reg = RT5648_EQ_CTRL2; mask = 0x33fe; upd_reg = RT5648_EQ_CTRL1; break; case EQ_CH_ADC: reg = RT5648_ADC_EQ_CTRL2; mask = 0x01bf; upd_reg = RT5648_ADC_EQ_CTRL1; break; default: printk(KERN_ERR "Invalid EQ channel\n"); return -EINVAL; } snd_soc_update_bits(codec, reg, mask, proj_hweq_param[mode].ctrl); snd_soc_update_bits(codec, upd_reg, RT5648_EQ_UPD, RT5648_EQ_UPD); snd_soc_update_bits(codec, upd_reg, RT5648_EQ_UPD, 0); return 0; }
int rt5647_update_eqmode( struct snd_soc_codec *codec, int channel, int mode) { struct rt_codec_ops *ioctl_ops = rt_codec_get_ioctl_ops(); int i, upd_reg, reg, mask; if (codec == NULL || mode >= RT5647_HWEQ_LEN) return -EINVAL; dev_dbg(codec->dev, "%s(): mode=%d\n", __func__, mode); if (mode != NORMAL) { for(i = 0; i < EQ_REG_NUM; i++) { hweq_param[mode].reg[i] = eqreg[channel][i]; } for(i = 0; i < EQ_REG_NUM; i++) { if(hweq_param[mode].reg[i]) ioctl_ops->index_write(codec, hweq_param[mode].reg[i], hweq_param[mode].value[i]); else break; } } switch (channel) { case EQ_CH_DACL: reg = RT5647_EQ_CTRL2; mask = 0x11fe; upd_reg = RT5647_EQ_CTRL1; break; case EQ_CH_DACR: reg = RT5647_EQ_CTRL2; mask = 0x22fe; upd_reg = RT5647_EQ_CTRL1; break; case EQ_CH_ADC: reg = RT5647_ADC_EQ_CTRL2; mask = 0x01bf; upd_reg = RT5647_ADC_EQ_CTRL1; break; default: printk("Invalid EQ channel\n"); return -EINVAL; } snd_soc_update_bits(codec, reg, mask, hweq_param[mode].ctrl); snd_soc_update_bits(codec, upd_reg, RT5647_EQ_UPD, RT5647_EQ_UPD); snd_soc_update_bits(codec, upd_reg, RT5647_EQ_UPD, 0); return 0; }
int rt5616_ioctl_common(struct snd_hwdep *hw, struct file *file, unsigned int cmd, unsigned long arg) { struct snd_soc_codec *codec = hw->private_data; struct rt_codec_cmd __user *_rt_codec = (struct rt_codec_cmd *)arg; struct rt_codec_cmd rt_codec; struct rt_codec_ops *ioctl_ops = rt_codec_get_ioctl_ops(); int *buf, mask1 = 0, mask2 = 0; static int eq_mode; if (copy_from_user(&rt_codec, _rt_codec, sizeof(rt_codec))) { dev_err(codec->dev,"copy_from_user faild\n"); return -EFAULT; } dev_dbg(codec->dev, "%s(): rt_codec.number=%d, cmd=%d\n", __func__, rt_codec.number, cmd); buf = kmalloc(sizeof(*buf) * rt_codec.number, GFP_KERNEL); if (buf == NULL) return -ENOMEM; if (copy_from_user(buf, rt_codec.buf, sizeof(*buf) * rt_codec.number)) { goto err; } switch (cmd) { case RT_SET_CODEC_HWEQ_IOCTL: if (eq_mode == *buf) break; eq_mode = *buf; rt5616_update_eqmode(codec, eq_mode); break; case RT_GET_CODEC_ID: *buf = snd_soc_read(codec, RT5616_DEVICE_ID); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_SET_CODEC_MIC_GAIN_IOCTL: if(*(buf) <= 0x8) { snd_soc_update_bits(codec, RT5616_IN1_IN2, RT5616_BST_MASK1, *(buf) << RT5616_BST_SFT1); } break; case RT_SET_CODEC_3D_SPK_IOCTL: if(rt_codec.number < 4) break; if (NULL == ioctl_ops->index_update_bits) break; mask1 = 0; if(*buf != -1) mask1 |= RT5616_3D_SPK_MASK; if(*(buf + 1) != -1) mask1 |= RT5616_3D_SPK_M_MASK; if(*(buf + 2) != -1) mask1 |= RT5616_3D_SPK_CG_MASK; if(*(buf + 3) != -1) mask1 |= RT5616_3D_SPK_SG_MASK; ioctl_ops->index_update_bits(codec, RT5616_3D_SPK, mask1, *(buf) << RT5616_3D_SPK_SFT | *(buf + 1) << RT5616_3D_SPK_M_SFT | *(buf + 2) << RT5616_3D_SPK_CG_SFT | *(buf + 3) << RT5616_3D_SPK_SG_SFT); break; case RT_SET_CODEC_MP3PLUS_IOCTL: if(rt_codec.number < 5) break; mask1 = mask2 = 0; if(*buf != -1) mask1 |= RT5616_M_MP3_MASK; if(*(buf + 1) != -1) mask1 |= RT5616_EG_MP3_MASK; if(*(buf + 2) != -1) mask2 |= RT5616_OG_MP3_MASK; if(*(buf + 3) != -1) mask2 |= RT5616_HG_MP3_MASK; if(*(buf + 4) != -1) mask2 |= RT5616_MP3_WT_MASK; snd_soc_update_bits(codec, RT5616_MP3_PLUS1, mask1, *(buf) << RT5616_M_MP3_SFT | *(buf + 1) << RT5616_EG_MP3_SFT); snd_soc_update_bits(codec, RT5616_MP3_PLUS2, mask2, *(buf + 2) << RT5616_OG_MP3_SFT | *(buf + 3) << RT5616_HG_MP3_SFT | *(buf + 4) << RT5616_MP3_WT_SFT); break; case RT_SET_CODEC_BASS_BACK_IOCTL: if(rt_codec.number < 3) break; mask1 = 0; if(*buf != -1) mask1 |= RT5616_BB_MASK; if(*(buf + 1) != -1) mask1 |= RT5616_BB_CT_MASK; if(*(buf + 2) != -1) mask1 |= RT5616_G_BB_BST_MASK; snd_soc_update_bits(codec, RT5616_BASE_BACK, mask1, *(buf) << RT5616_BB_SFT | *(buf + 1) << RT5616_BB_CT_SFT | *(buf + 2) << RT5616_G_BB_BST_SFT); break; case RT_SET_CODEC_DIPOLE_SPK_IOCTL: if(rt_codec.number < 2) break; if (NULL == ioctl_ops->index_update_bits) break; mask1 = 0; if(*buf != -1) mask1 |= RT5616_DP_SPK_MASK; if(*(buf + 1) != -1) mask1 |= RT5616_DP_ATT_MASK; ioctl_ops->index_update_bits(codec, RT5616_DIP_SPK_INF, mask1, *(buf) << RT5616_DP_SPK_SFT | *(buf + 1) << RT5616_DP_ATT_SFT ); break; case RT_SET_CODEC_DRC_AGC_ENABLE_IOCTL: if(rt_codec.number < 2) break; set_drc_agc_enable(codec, *(buf), *(buf + 1)); break; case RT_SET_CODEC_DRC_AGC_PAR_IOCTL: if(rt_codec.number < 4) break; set_drc_agc_parameters(codec, *(buf), *(buf + 1), *(buf + 2), *(buf + 3)); break; case RT_SET_CODEC_DIGI_BOOST_GAIN_IOCTL: if(rt_codec.number < 2) break; set_digital_boost_gain(codec, *(buf), *(buf + 1)); break; case RT_SET_CODEC_NOISE_GATE_IOCTL: if(rt_codec.number < 4) break; set_noise_gate(codec, *(buf), *(buf + 1), *(buf + 2), *(buf + 3)); break; case RT_SET_CODEC_DRC_AGC_COMP_IOCTL: if(rt_codec.number < 2) break; set_drc_agc_compression(codec, *(buf), *(buf + 1)); break; case RT_SET_CODEC_WNR_ENABLE_IOCTL: if (NULL == ioctl_ops->index_update_bits) break; ioctl_ops->index_update_bits(codec, RT5616_WND_1, RT5616_WND_MASK, *(buf) << RT5616_WND_SFT ); break; case RT_GET_CODEC_DRC_AGC_ENABLE_IOCTL: if(rt_codec.number < 2) break; get_drc_agc_enable(codec, (buf), (buf + 1)); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_DRC_AGC_PAR_IOCTL: if(rt_codec.number < 4) break; get_drc_agc_parameters(codec, (buf), (buf + 1), (buf + 2), (buf + 3)); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_DIGI_BOOST_GAIN_IOCTL: if(rt_codec.number < 2) break; get_digital_boost_gain(codec, (buf), (buf + 1)); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_NOISE_GATE_IOCTL: if(rt_codec.number < 4) break; get_noise_gate(codec, (buf), (buf + 1), (buf + 2), (buf + 3)); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_DRC_AGC_COMP_IOCTL: if(rt_codec.number < 2) break; get_drc_agc_compression(codec, (buf), (buf + 1)); if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_MIC_GAIN_IOCTL: *buf = (snd_soc_read(codec, RT5616_IN1_IN2) & RT5616_BST_MASK1) >> RT5616_BST_SFT1; if (copy_to_user(rt_codec.buf, buf, sizeof(*buf) * rt_codec.number)) goto err; break; case RT_GET_CODEC_HWEQ_IOCTL: case RT_GET_CODEC_3D_SPK_IOCTL: case RT_GET_CODEC_MP3PLUS_IOCTL: case RT_GET_CODEC_3D_HEADPHONE_IOCTL: case RT_GET_CODEC_BASS_BACK_IOCTL: case RT_GET_CODEC_DIPOLE_SPK_IOCTL: default: break; } kfree(buf); return 0; err: kfree(buf); return -EFAULT; }