Merge branch 'fix/hda' into topic/hda
This commit is contained in:
commit
9eb6e9b16f
20 changed files with 168 additions and 76 deletions
|
@ -5648,7 +5648,6 @@ F: drivers/media/video/*7146*
|
|||
F: include/media/*7146*
|
||||
|
||||
SAMSUNG AUDIO (ASoC) DRIVERS
|
||||
M: Jassi Brar <jassisinghbrar@gmail.com>
|
||||
M: Sangbeom Kim <sbkim73@samsung.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
|
|
|
@ -2507,7 +2507,6 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
|
|||
SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1458, 0xa022, "ga-ma770-ud3", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1462, 0x1002, "MSI Wind U115", POS_FIX_LPIB),
|
||||
|
|
|
@ -1278,7 +1278,7 @@ static const char * const cs420x_models[CS420X_MODELS] = {
|
|||
[CS420X_MBP53] = "mbp53",
|
||||
[CS420X_MBP55] = "mbp55",
|
||||
[CS420X_IMAC27] = "imac27",
|
||||
[CS420X_IMAC27] = "apple",
|
||||
[CS420X_APPLE] = "apple",
|
||||
[CS420X_AUTO] = "auto",
|
||||
};
|
||||
|
||||
|
|
|
@ -4441,7 +4441,9 @@ static int stac92xx_init(struct hda_codec *codec)
|
|||
int pinctl, def_conf;
|
||||
|
||||
/* power on when no jack detection is available */
|
||||
if (!spec->hp_detect) {
|
||||
/* or when the VREF is used for controlling LED */
|
||||
if (!spec->hp_detect ||
|
||||
(spec->gpio_led > 8 && spec->gpio_led == nid)) {
|
||||
stac_toggle_power_map(codec, nid, 1);
|
||||
continue;
|
||||
}
|
||||
|
@ -5055,20 +5057,6 @@ static int stac92xx_pre_resume(struct hda_codec *codec)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int stac92xx_post_suspend(struct hda_codec *codec)
|
||||
{
|
||||
struct sigmatel_spec *spec = codec->spec;
|
||||
if (spec->gpio_led > 8) {
|
||||
/* with vref-out pin used for mute led control
|
||||
* codec AFG is prevented from D3 state, but on
|
||||
* system suspend it can (and should) be used
|
||||
*/
|
||||
snd_hda_codec_read(codec, codec->afg, 0,
|
||||
AC_VERB_SET_POWER_STATE, AC_PWRST_D3);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void stac92xx_set_power_state(struct hda_codec *codec, hda_nid_t fg,
|
||||
unsigned int power_state)
|
||||
{
|
||||
|
@ -5668,8 +5656,6 @@ again:
|
|||
} else {
|
||||
codec->patch_ops.set_power_state =
|
||||
stac92xx_set_power_state;
|
||||
codec->patch_ops.post_suspend =
|
||||
stac92xx_post_suspend;
|
||||
}
|
||||
codec->patch_ops.pre_resume = stac92xx_pre_resume;
|
||||
codec->patch_ops.check_power_status =
|
||||
|
@ -5983,8 +5969,6 @@ again:
|
|||
} else {
|
||||
codec->patch_ops.set_power_state =
|
||||
stac92xx_set_power_state;
|
||||
codec->patch_ops.post_suspend =
|
||||
stac92xx_post_suspend;
|
||||
}
|
||||
codec->patch_ops.pre_resume = stac92xx_pre_resume;
|
||||
codec->patch_ops.check_power_status =
|
||||
|
|
|
@ -208,6 +208,7 @@ struct via_spec {
|
|||
/* work to check hp jack state */
|
||||
struct hda_codec *codec;
|
||||
struct delayed_work vt1708_hp_work;
|
||||
int hp_work_active;
|
||||
int vt1708_jack_detect;
|
||||
int vt1708_hp_present;
|
||||
|
||||
|
@ -305,27 +306,35 @@ enum {
|
|||
static void analog_low_current_mode(struct hda_codec *codec);
|
||||
static bool is_aa_path_mute(struct hda_codec *codec);
|
||||
|
||||
static void vt1708_start_hp_work(struct via_spec *spec)
|
||||
{
|
||||
if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
|
||||
return;
|
||||
snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81,
|
||||
!spec->vt1708_jack_detect);
|
||||
if (!delayed_work_pending(&spec->vt1708_hp_work))
|
||||
schedule_delayed_work(&spec->vt1708_hp_work,
|
||||
msecs_to_jiffies(100));
|
||||
}
|
||||
#define hp_detect_with_aa(codec) \
|
||||
(snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1 && \
|
||||
!is_aa_path_mute(codec))
|
||||
|
||||
static void vt1708_stop_hp_work(struct via_spec *spec)
|
||||
{
|
||||
if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
|
||||
return;
|
||||
if (snd_hda_get_bool_hint(spec->codec, "analog_loopback_hp_detect") == 1
|
||||
&& !is_aa_path_mute(spec->codec))
|
||||
if (spec->hp_work_active) {
|
||||
snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 1);
|
||||
cancel_delayed_work_sync(&spec->vt1708_hp_work);
|
||||
spec->hp_work_active = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void vt1708_update_hp_work(struct via_spec *spec)
|
||||
{
|
||||
if (spec->codec_type != VT1708 || spec->autocfg.hp_pins[0] == 0)
|
||||
return;
|
||||
snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81,
|
||||
!spec->vt1708_jack_detect);
|
||||
cancel_delayed_work_sync(&spec->vt1708_hp_work);
|
||||
if (spec->vt1708_jack_detect &&
|
||||
(spec->active_streams || hp_detect_with_aa(spec->codec))) {
|
||||
if (!spec->hp_work_active) {
|
||||
snd_hda_codec_write(spec->codec, 0x1, 0, 0xf81, 0);
|
||||
schedule_delayed_work(&spec->vt1708_hp_work,
|
||||
msecs_to_jiffies(100));
|
||||
spec->hp_work_active = 1;
|
||||
}
|
||||
} else if (!hp_detect_with_aa(spec->codec))
|
||||
vt1708_stop_hp_work(spec);
|
||||
}
|
||||
|
||||
static void set_widgets_power_state(struct hda_codec *codec)
|
||||
|
@ -343,12 +352,7 @@ static int analog_input_switch_put(struct snd_kcontrol *kcontrol,
|
|||
|
||||
set_widgets_power_state(codec);
|
||||
analog_low_current_mode(snd_kcontrol_chip(kcontrol));
|
||||
if (snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") == 1) {
|
||||
if (is_aa_path_mute(codec))
|
||||
vt1708_start_hp_work(codec->spec);
|
||||
else
|
||||
vt1708_stop_hp_work(codec->spec);
|
||||
}
|
||||
vt1708_update_hp_work(codec->spec);
|
||||
return change;
|
||||
}
|
||||
|
||||
|
@ -1154,7 +1158,7 @@ static int via_playback_multi_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||
spec->cur_dac_stream_tag = stream_tag;
|
||||
spec->cur_dac_format = format;
|
||||
mutex_unlock(&spec->config_mutex);
|
||||
vt1708_start_hp_work(spec);
|
||||
vt1708_update_hp_work(spec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1174,7 +1178,7 @@ static int via_playback_hp_pcm_prepare(struct hda_pcm_stream *hinfo,
|
|||
spec->cur_hp_stream_tag = stream_tag;
|
||||
spec->cur_hp_format = format;
|
||||
mutex_unlock(&spec->config_mutex);
|
||||
vt1708_start_hp_work(spec);
|
||||
vt1708_update_hp_work(spec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1188,7 +1192,7 @@ static int via_playback_multi_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|||
snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
|
||||
spec->active_streams &= ~STREAM_MULTI_OUT;
|
||||
mutex_unlock(&spec->config_mutex);
|
||||
vt1708_stop_hp_work(spec);
|
||||
vt1708_update_hp_work(spec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1203,7 +1207,7 @@ static int via_playback_hp_pcm_cleanup(struct hda_pcm_stream *hinfo,
|
|||
snd_hda_codec_setup_stream(codec, spec->hp_dac_nid, 0, 0, 0);
|
||||
spec->active_streams &= ~STREAM_INDEP_HP;
|
||||
mutex_unlock(&spec->config_mutex);
|
||||
vt1708_stop_hp_work(spec);
|
||||
vt1708_update_hp_work(spec);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1645,7 +1649,8 @@ static void via_hp_automute(struct hda_codec *codec)
|
|||
int nums;
|
||||
struct via_spec *spec = codec->spec;
|
||||
|
||||
if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0])
|
||||
if (!spec->hp_independent_mode && spec->autocfg.hp_pins[0] &&
|
||||
(spec->codec_type != VT1708 || spec->vt1708_jack_detect))
|
||||
present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
||||
|
||||
if (spec->smart51_enabled)
|
||||
|
@ -2612,8 +2617,6 @@ static int vt1708_jack_detect_get(struct snd_kcontrol *kcontrol,
|
|||
|
||||
if (spec->codec_type != VT1708)
|
||||
return 0;
|
||||
spec->vt1708_jack_detect =
|
||||
!((snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8) & 0x1);
|
||||
ucontrol->value.integer.value[0] = spec->vt1708_jack_detect;
|
||||
return 0;
|
||||
}
|
||||
|
@ -2623,18 +2626,22 @@ static int vt1708_jack_detect_put(struct snd_kcontrol *kcontrol,
|
|||
{
|
||||
struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct via_spec *spec = codec->spec;
|
||||
int change;
|
||||
int val;
|
||||
|
||||
if (spec->codec_type != VT1708)
|
||||
return 0;
|
||||
spec->vt1708_jack_detect = ucontrol->value.integer.value[0];
|
||||
change = (0x1 & (snd_hda_codec_read(codec, 0x1, 0, 0xf84, 0) >> 8))
|
||||
== !spec->vt1708_jack_detect;
|
||||
if (spec->vt1708_jack_detect) {
|
||||
val = !!ucontrol->value.integer.value[0];
|
||||
if (spec->vt1708_jack_detect == val)
|
||||
return 0;
|
||||
spec->vt1708_jack_detect = val;
|
||||
if (spec->vt1708_jack_detect &&
|
||||
snd_hda_get_bool_hint(codec, "analog_loopback_hp_detect") != 1) {
|
||||
mute_aa_path(codec, 1);
|
||||
notify_aa_path_ctls(codec);
|
||||
}
|
||||
return change;
|
||||
via_hp_automute(codec);
|
||||
vt1708_update_hp_work(spec);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const struct snd_kcontrol_new vt1708_jack_detect_ctl = {
|
||||
|
@ -2771,6 +2778,7 @@ static int via_init(struct hda_codec *codec)
|
|||
via_auto_init_unsol_event(codec);
|
||||
|
||||
via_hp_automute(codec);
|
||||
vt1708_update_hp_work(spec);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -2787,7 +2795,9 @@ static void vt1708_update_hp_jack_state(struct work_struct *work)
|
|||
spec->vt1708_hp_present ^= 1;
|
||||
via_hp_automute(spec->codec);
|
||||
}
|
||||
vt1708_start_hp_work(spec);
|
||||
if (spec->vt1708_jack_detect)
|
||||
schedule_delayed_work(&spec->vt1708_hp_work,
|
||||
msecs_to_jiffies(100));
|
||||
}
|
||||
|
||||
static int get_mux_nids(struct hda_codec *codec)
|
||||
|
|
|
@ -245,7 +245,7 @@ static const char *adau1373_bass_hpf_cutoff_text[] = {
|
|||
};
|
||||
|
||||
static const unsigned int adau1373_bass_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(4),
|
||||
TLV_DB_RANGE_HEAD(3),
|
||||
0, 2, TLV_DB_SCALE_ITEM(-600, 600, 1),
|
||||
3, 4, TLV_DB_SCALE_ITEM(950, 250, 0),
|
||||
5, 7, TLV_DB_SCALE_ITEM(1400, 150, 0),
|
||||
|
|
|
@ -434,7 +434,8 @@ static int cs4271_soc_suspend(struct snd_soc_codec *codec, pm_message_t mesg)
|
|||
{
|
||||
int ret;
|
||||
/* Set power-down bit */
|
||||
ret = snd_soc_update_bits(codec, CS4271_MODE2, 0, CS4271_MODE2_PDN);
|
||||
ret = snd_soc_update_bits(codec, CS4271_MODE2, CS4271_MODE2_PDN,
|
||||
CS4271_MODE2_PDN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return 0;
|
||||
|
@ -501,8 +502,9 @@ static int cs4271_probe(struct snd_soc_codec *codec)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = snd_soc_update_bits(codec, CS4271_MODE2, 0,
|
||||
CS4271_MODE2_PDN | CS4271_MODE2_CPEN);
|
||||
ret = snd_soc_update_bits(codec, CS4271_MODE2,
|
||||
CS4271_MODE2_PDN | CS4271_MODE2_CPEN,
|
||||
CS4271_MODE2_PDN | CS4271_MODE2_CPEN);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = snd_soc_update_bits(codec, CS4271_MODE2, CS4271_MODE2_PDN, 0);
|
||||
|
|
|
@ -177,7 +177,7 @@ static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -95625, 375, 0);
|
|||
static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
|
||||
/* {0, +20, +24, +30, +35, +40, +44, +50, +52}dB */
|
||||
static unsigned int mic_bst_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(6),
|
||||
TLV_DB_RANGE_HEAD(7),
|
||||
0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
|
||||
1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
|
||||
2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
|
||||
|
|
|
@ -365,7 +365,7 @@ static const DECLARE_TLV_DB_SCALE(capture_6db_attenuate, -600, 600, 0);
|
|||
|
||||
/* tlv for mic gain, 0db 20db 30db 40db */
|
||||
static const unsigned int mic_gain_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(4),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
|
||||
1, 3, TLV_DB_SCALE_ITEM(2000, 1000, 0),
|
||||
};
|
||||
|
|
|
@ -76,6 +76,8 @@ struct sta32x_priv {
|
|||
|
||||
unsigned int mclk;
|
||||
unsigned int format;
|
||||
|
||||
u32 coef_shadow[STA32X_COEF_COUNT];
|
||||
};
|
||||
|
||||
static const DECLARE_TLV_DB_SCALE(mvol_tlv, -12700, 50, 1);
|
||||
|
@ -227,6 +229,7 @@ static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol,
|
|||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
|
||||
struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec);
|
||||
int numcoef = kcontrol->private_value >> 16;
|
||||
int index = kcontrol->private_value & 0xffff;
|
||||
unsigned int cfud;
|
||||
|
@ -239,6 +242,11 @@ static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol,
|
|||
snd_soc_write(codec, STA32X_CFUD, cfud);
|
||||
|
||||
snd_soc_write(codec, STA32X_CFADDR2, index);
|
||||
for (i = 0; i < numcoef && (index + i < STA32X_COEF_COUNT); i++)
|
||||
sta32x->coef_shadow[index + i] =
|
||||
(ucontrol->value.bytes.data[3 * i] << 16)
|
||||
| (ucontrol->value.bytes.data[3 * i + 1] << 8)
|
||||
| (ucontrol->value.bytes.data[3 * i + 2]);
|
||||
for (i = 0; i < 3 * numcoef; i++)
|
||||
snd_soc_write(codec, STA32X_B1CF1 + i,
|
||||
ucontrol->value.bytes.data[i]);
|
||||
|
@ -252,6 +260,48 @@ static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int sta32x_sync_coef_shadow(struct snd_soc_codec *codec)
|
||||
{
|
||||
struct sta32x_priv *sta32x = snd_soc_codec_get_drvdata(codec);
|
||||
unsigned int cfud;
|
||||
int i;
|
||||
|
||||
/* preserve reserved bits in STA32X_CFUD */
|
||||
cfud = snd_soc_read(codec, STA32X_CFUD) & 0xf0;
|
||||
|
||||
for (i = 0; i < STA32X_COEF_COUNT; i++) {
|
||||
snd_soc_write(codec, STA32X_CFADDR2, i);
|
||||
snd_soc_write(codec, STA32X_B1CF1,
|
||||
(sta32x->coef_shadow[i] >> 16) & 0xff);
|
||||
snd_soc_write(codec, STA32X_B1CF2,
|
||||
(sta32x->coef_shadow[i] >> 8) & 0xff);
|
||||
snd_soc_write(codec, STA32X_B1CF3,
|
||||
(sta32x->coef_shadow[i]) & 0xff);
|
||||
/* chip documentation does not say if the bits are
|
||||
* self-clearing, so do it explicitly */
|
||||
snd_soc_write(codec, STA32X_CFUD, cfud);
|
||||
snd_soc_write(codec, STA32X_CFUD, cfud | 0x01);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sta32x_cache_sync(struct snd_soc_codec *codec)
|
||||
{
|
||||
unsigned int mute;
|
||||
int rc;
|
||||
|
||||
if (!codec->cache_sync)
|
||||
return 0;
|
||||
|
||||
/* mute during register sync */
|
||||
mute = snd_soc_read(codec, STA32X_MMUTE);
|
||||
snd_soc_write(codec, STA32X_MMUTE, mute | STA32X_MMUTE_MMUTE);
|
||||
sta32x_sync_coef_shadow(codec);
|
||||
rc = snd_soc_cache_sync(codec);
|
||||
snd_soc_write(codec, STA32X_MMUTE, mute);
|
||||
return rc;
|
||||
}
|
||||
|
||||
#define SINGLE_COEF(xname, index) \
|
||||
{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
|
||||
.info = sta32x_coefficient_info, \
|
||||
|
@ -661,7 +711,7 @@ static int sta32x_set_bias_level(struct snd_soc_codec *codec,
|
|||
return ret;
|
||||
}
|
||||
|
||||
snd_soc_cache_sync(codec);
|
||||
sta32x_cache_sync(codec);
|
||||
}
|
||||
|
||||
/* Power up to mute */
|
||||
|
@ -790,6 +840,17 @@ static int sta32x_probe(struct snd_soc_codec *codec)
|
|||
STA32X_CxCFG_OM_MASK,
|
||||
2 << STA32X_CxCFG_OM_SHIFT);
|
||||
|
||||
/* initialize coefficient shadow RAM with reset values */
|
||||
for (i = 4; i <= 49; i += 5)
|
||||
sta32x->coef_shadow[i] = 0x400000;
|
||||
for (i = 50; i <= 54; i++)
|
||||
sta32x->coef_shadow[i] = 0x7fffff;
|
||||
sta32x->coef_shadow[55] = 0x5a9df7;
|
||||
sta32x->coef_shadow[56] = 0x7fffff;
|
||||
sta32x->coef_shadow[59] = 0x7fffff;
|
||||
sta32x->coef_shadow[60] = 0x400000;
|
||||
sta32x->coef_shadow[61] = 0x400000;
|
||||
|
||||
sta32x_set_bias_level(codec, SND_SOC_BIAS_STANDBY);
|
||||
/* Bias level configuration will have done an extra enable */
|
||||
regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
/* STA326 register addresses */
|
||||
|
||||
#define STA32X_REGISTER_COUNT 0x2d
|
||||
#define STA32X_COEF_COUNT 62
|
||||
|
||||
#define STA32X_CONFA 0x00
|
||||
#define STA32X_CONFB 0x01
|
||||
|
|
|
@ -453,6 +453,7 @@ static int wm8731_set_bias_level(struct snd_soc_codec *codec,
|
|||
snd_soc_write(codec, WM8731_PWR, 0xffff);
|
||||
regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies),
|
||||
wm8731->supplies);
|
||||
codec->cache_sync = 1;
|
||||
break;
|
||||
}
|
||||
codec->dapm.bias_level = level;
|
||||
|
|
|
@ -190,6 +190,9 @@ static int wm8753_set_dai(struct snd_kcontrol *kcontrol,
|
|||
struct wm8753_priv *wm8753 = snd_soc_codec_get_drvdata(codec);
|
||||
u16 ioctl;
|
||||
|
||||
if (wm8753->dai_func == ucontrol->value.integer.value[0])
|
||||
return 0;
|
||||
|
||||
if (codec->active)
|
||||
return -EBUSY;
|
||||
|
||||
|
|
|
@ -1973,7 +1973,7 @@ static int wm8962_reset(struct snd_soc_codec *codec)
|
|||
static const DECLARE_TLV_DB_SCALE(inpga_tlv, -2325, 75, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(mixin_tlv, -1500, 300, 0);
|
||||
static const unsigned int mixinpga_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(7),
|
||||
TLV_DB_RANGE_HEAD(5),
|
||||
0, 1, TLV_DB_SCALE_ITEM(0, 600, 0),
|
||||
2, 2, TLV_DB_SCALE_ITEM(1300, 1300, 0),
|
||||
3, 4, TLV_DB_SCALE_ITEM(1800, 200, 0),
|
||||
|
@ -1988,7 +1988,7 @@ static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
|
|||
static const DECLARE_TLV_DB_SCALE(out_tlv, -12100, 100, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(hp_tlv, -700, 100, 0);
|
||||
static const unsigned int classd_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(7),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
|
||||
7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
|
||||
};
|
||||
|
|
|
@ -512,7 +512,7 @@ static const DECLARE_TLV_DB_SCALE(drc_comp_threash, -4500, 75, 0);
|
|||
static const DECLARE_TLV_DB_SCALE(drc_comp_amp, -2250, 75, 0);
|
||||
static const DECLARE_TLV_DB_SCALE(drc_min_tlv, -1800, 600, 0);
|
||||
static const unsigned int drc_max_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(4),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 2, TLV_DB_SCALE_ITEM(1200, 600, 0),
|
||||
3, 3, TLV_DB_SCALE_ITEM(3600, 0, 0),
|
||||
};
|
||||
|
|
|
@ -807,7 +807,6 @@ static int wm9081_set_bias_level(struct snd_soc_codec *codec,
|
|||
mdelay(100);
|
||||
|
||||
/* Normal bias enable & soft start off */
|
||||
reg |= WM9081_BIAS_ENA;
|
||||
reg &= ~WM9081_VMID_RAMP;
|
||||
snd_soc_write(codec, WM9081_VMID_CONTROL, reg);
|
||||
|
||||
|
@ -818,7 +817,7 @@ static int wm9081_set_bias_level(struct snd_soc_codec *codec,
|
|||
}
|
||||
|
||||
/* VMID 2*240k */
|
||||
reg = snd_soc_read(codec, WM9081_BIAS_CONTROL_1);
|
||||
reg = snd_soc_read(codec, WM9081_VMID_CONTROL);
|
||||
reg &= ~WM9081_VMID_SEL_MASK;
|
||||
reg |= 0x04;
|
||||
snd_soc_write(codec, WM9081_VMID_CONTROL, reg);
|
||||
|
@ -830,14 +829,15 @@ static int wm9081_set_bias_level(struct snd_soc_codec *codec,
|
|||
break;
|
||||
|
||||
case SND_SOC_BIAS_OFF:
|
||||
/* Startup bias source */
|
||||
/* Startup bias source and disable bias */
|
||||
reg = snd_soc_read(codec, WM9081_BIAS_CONTROL_1);
|
||||
reg |= WM9081_BIAS_SRC;
|
||||
reg &= ~WM9081_BIAS_ENA;
|
||||
snd_soc_write(codec, WM9081_BIAS_CONTROL_1, reg);
|
||||
|
||||
/* Disable VMID and biases with soft ramping */
|
||||
/* Disable VMID with soft ramping */
|
||||
reg = snd_soc_read(codec, WM9081_VMID_CONTROL);
|
||||
reg &= ~(WM9081_VMID_SEL_MASK | WM9081_BIAS_ENA);
|
||||
reg &= ~WM9081_VMID_SEL_MASK;
|
||||
reg |= WM9081_VMID_RAMP;
|
||||
snd_soc_write(codec, WM9081_VMID_CONTROL, reg);
|
||||
|
||||
|
|
|
@ -177,19 +177,19 @@ static void wait_for_dc_servo(struct snd_soc_codec *codec)
|
|||
}
|
||||
|
||||
static const unsigned int in_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(6),
|
||||
TLV_DB_RANGE_HEAD(3),
|
||||
0, 0, TLV_DB_SCALE_ITEM(-600, 0, 0),
|
||||
1, 3, TLV_DB_SCALE_ITEM(-350, 350, 0),
|
||||
4, 6, TLV_DB_SCALE_ITEM(600, 600, 0),
|
||||
};
|
||||
static const unsigned int mix_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(4),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 2, TLV_DB_SCALE_ITEM(-1200, 300, 0),
|
||||
3, 3, TLV_DB_SCALE_ITEM(0, 0, 0),
|
||||
};
|
||||
static const DECLARE_TLV_DB_SCALE(out_tlv, -5700, 100, 0);
|
||||
static const unsigned int spkboost_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(7),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
|
||||
7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
|
||||
};
|
||||
|
|
|
@ -40,7 +40,7 @@ static const DECLARE_TLV_DB_SCALE(outmix_tlv, -2100, 300, 0);
|
|||
static const DECLARE_TLV_DB_SCALE(spkmixout_tlv, -1800, 600, 1);
|
||||
static const DECLARE_TLV_DB_SCALE(outpga_tlv, -5700, 100, 0);
|
||||
static const unsigned int spkboost_tlv[] = {
|
||||
TLV_DB_RANGE_HEAD(7),
|
||||
TLV_DB_RANGE_HEAD(2),
|
||||
0, 6, TLV_DB_SCALE_ITEM(0, 150, 0),
|
||||
7, 7, TLV_DB_SCALE_ITEM(1200, 0, 0),
|
||||
};
|
||||
|
|
|
@ -694,6 +694,7 @@ static int __devinit fsl_ssi_probe(struct platform_device *pdev)
|
|||
|
||||
/* Initialize the the device_attribute structure */
|
||||
dev_attr = &ssi_private->dev_attr;
|
||||
sysfs_attr_init(&dev_attr->attr);
|
||||
dev_attr->attr.name = "statistics";
|
||||
dev_attr->attr.mode = S_IRUGO;
|
||||
dev_attr->show = fsl_sysfs_ssi_show;
|
||||
|
|
|
@ -1632,6 +1632,37 @@ YAMAHA_DEVICE(0x7010, "UB99"),
|
|||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
/* Roland GAIA SH-01 */
|
||||
USB_DEVICE(0x0582, 0x0111),
|
||||
.driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
|
||||
.vendor_name = "Roland",
|
||||
.product_name = "GAIA",
|
||||
.ifnum = QUIRK_ANY_INTERFACE,
|
||||
.type = QUIRK_COMPOSITE,
|
||||
.data = (const struct snd_usb_audio_quirk[]) {
|
||||
{
|
||||
.ifnum = 0,
|
||||
.type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
},
|
||||
{
|
||||
.ifnum = 1,
|
||||
.type = QUIRK_AUDIO_STANDARD_INTERFACE
|
||||
},
|
||||
{
|
||||
.ifnum = 2,
|
||||
.type = QUIRK_MIDI_FIXED_ENDPOINT,
|
||||
.data = &(const struct snd_usb_midi_endpoint_info) {
|
||||
.out_cables = 0x0003,
|
||||
.in_cables = 0x0003
|
||||
}
|
||||
},
|
||||
{
|
||||
.ifnum = -1
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
USB_DEVICE(0x0582, 0x0113),
|
||||
.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
|
||||
|
|
Reference in a new issue