Loading sound/soc/codecs/twl4030.c +189 −188 Original line number Diff line number Diff line Loading @@ -298,30 +298,107 @@ static const struct soc_enum twl4030_handsfreer_enum = static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control = SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); static int outmixer_event(struct snd_soc_dapm_widget *w, /* Left analog microphone selection */ static const char *twl4030_analoglmic_texts[] = {"Off", "Main mic", "Headset mic", "Invalid", "AUXL", "Invalid", "Invalid", "Invalid", "Carkit mic"}; static const struct soc_enum twl4030_analoglmic_enum = SOC_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, ARRAY_SIZE(twl4030_analoglmic_texts), twl4030_analoglmic_texts); static const struct snd_kcontrol_new twl4030_dapm_analoglmic_control = SOC_DAPM_ENUM("Route", twl4030_analoglmic_enum); /* Right analog microphone selection */ static const char *twl4030_analogrmic_texts[] = {"Off", "Sub mic", "Invalid", "Invalid", "AUXR"}; static const struct soc_enum twl4030_analogrmic_enum = SOC_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, ARRAY_SIZE(twl4030_analogrmic_texts), twl4030_analogrmic_texts); static const struct snd_kcontrol_new twl4030_dapm_analogrmic_control = SOC_DAPM_ENUM("Route", twl4030_analogrmic_enum); /* TX1 L/R Analog/Digital microphone selection */ static const char *twl4030_micpathtx1_texts[] = {"Analog", "Digimic0"}; static const struct soc_enum twl4030_micpathtx1_enum = SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 0, ARRAY_SIZE(twl4030_micpathtx1_texts), twl4030_micpathtx1_texts); static const struct snd_kcontrol_new twl4030_dapm_micpathtx1_control = SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum); /* TX2 L/R Analog/Digital microphone selection */ static const char *twl4030_micpathtx2_texts[] = {"Analog", "Digimic1"}; static const struct soc_enum twl4030_micpathtx2_enum = SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 2, ARRAY_SIZE(twl4030_micpathtx2_texts), twl4030_micpathtx2_texts); static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control = SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum); /* * This function filters out the non valid mux settings, named as "Invalid" * in the enum texts. * Just refuse to set an invalid mux mode. */ static int twl4030_enum_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; int ret = 0; int val; switch (e->reg) { case TWL4030_REG_PREDL_CTL: case TWL4030_REG_PREDR_CTL: case TWL4030_REG_EAR_CTL: val = w->value >> e->shift_l; if (val == 3) { printk(KERN_WARNING "Invalid MUX setting for register 0x%02x (%d)\n", if (!strcmp("Invalid", e->texts[val])) { printk(KERN_WARNING "Invalid MUX setting on 0x%02x (%d)\n", e->reg, val); ret = -1; } break; } return ret; } static int micpath_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct soc_enum *e = (struct soc_enum *)w->kcontrols->private_value; unsigned char adcmicsel, micbias_ctl; adcmicsel = twl4030_read_reg_cache(w->codec, TWL4030_REG_ADCMICSEL); micbias_ctl = twl4030_read_reg_cache(w->codec, TWL4030_REG_MICBIAS_CTL); /* Prepare the bits for the given TX path: * shift_l == 0: TX1 microphone path * shift_l == 2: TX2 microphone path */ if (e->shift_l) { /* TX2 microphone path */ if (adcmicsel & TWL4030_TX2IN_SEL) micbias_ctl |= TWL4030_MICBIAS2_CTL; /* digimic */ else micbias_ctl &= ~TWL4030_MICBIAS2_CTL; } else { /* TX1 microphone path */ if (adcmicsel & TWL4030_TX1IN_SEL) micbias_ctl |= TWL4030_MICBIAS1_CTL; /* digimic */ else micbias_ctl &= ~TWL4030_MICBIAS1_CTL; } twl4030_write(w->codec, TWL4030_REG_MICBIAS_CTL, micbias_ctl); return 0; } static int handsfree_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -503,162 +580,6 @@ static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, return err; } static int twl4030_get_left_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); int result = 0; /* one bit must be set a time */ reg &= TWL4030_CKMIC_EN | TWL4030_AUXL_EN | TWL4030_HSMIC_EN | TWL4030_MAINMIC_EN; if (reg != 0) { result++; while ((reg & 1) == 0) { result++; reg >>= 1; } } ucontrol->value.integer.value[0] = result; return 0; } static int twl4030_put_left_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; int value = ucontrol->value.integer.value[0]; u8 anamicl, micbias, avadc_ctl; anamicl = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); anamicl &= ~(TWL4030_CKMIC_EN | TWL4030_AUXL_EN | TWL4030_HSMIC_EN | TWL4030_MAINMIC_EN); micbias = twl4030_read_reg_cache(codec, TWL4030_REG_MICBIAS_CTL); micbias &= ~(TWL4030_HSMICBIAS_EN | TWL4030_MICBIAS1_EN); avadc_ctl = twl4030_read_reg_cache(codec, TWL4030_REG_AVADC_CTL); switch (value) { case 1: anamicl |= TWL4030_MAINMIC_EN; micbias |= TWL4030_MICBIAS1_EN; break; case 2: anamicl |= TWL4030_HSMIC_EN; micbias |= TWL4030_HSMICBIAS_EN; break; case 3: anamicl |= TWL4030_AUXL_EN; break; case 4: anamicl |= TWL4030_CKMIC_EN; break; default: break; } /* If some input is selected, enable amp and ADC */ if (value != 0) { anamicl |= TWL4030_MICAMPL_EN; avadc_ctl |= TWL4030_ADCL_EN; } else { anamicl &= ~TWL4030_MICAMPL_EN; avadc_ctl &= ~TWL4030_ADCL_EN; } twl4030_write(codec, TWL4030_REG_ANAMICL, anamicl); twl4030_write(codec, TWL4030_REG_MICBIAS_CTL, micbias); twl4030_write(codec, TWL4030_REG_AVADC_CTL, avadc_ctl); return 1; } static int twl4030_get_right_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICR); int value = 0; reg &= TWL4030_SUBMIC_EN|TWL4030_AUXR_EN; switch (reg) { case TWL4030_SUBMIC_EN: value = 1; break; case TWL4030_AUXR_EN: value = 2; break; default: break; } ucontrol->value.integer.value[0] = value; return 0; } static int twl4030_put_right_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; int value = ucontrol->value.integer.value[0]; u8 anamicr, micbias, avadc_ctl; anamicr = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICR); anamicr &= ~(TWL4030_SUBMIC_EN|TWL4030_AUXR_EN); micbias = twl4030_read_reg_cache(codec, TWL4030_REG_MICBIAS_CTL); micbias &= ~TWL4030_MICBIAS2_EN; avadc_ctl = twl4030_read_reg_cache(codec, TWL4030_REG_AVADC_CTL); switch (value) { case 1: anamicr |= TWL4030_SUBMIC_EN; micbias |= TWL4030_MICBIAS2_EN; break; case 2: anamicr |= TWL4030_AUXR_EN; break; default: break; } if (value != 0) { anamicr |= TWL4030_MICAMPR_EN; avadc_ctl |= TWL4030_ADCR_EN; } else { anamicr &= ~TWL4030_MICAMPR_EN; avadc_ctl &= ~TWL4030_ADCR_EN; } twl4030_write(codec, TWL4030_REG_ANAMICR, anamicr); twl4030_write(codec, TWL4030_REG_MICBIAS_CTL, micbias); twl4030_write(codec, TWL4030_REG_AVADC_CTL, avadc_ctl); return 1; } static const char *twl4030_left_in_sel[] = { "None", "Main Mic", "Headset Mic", "Line In", "Carkit Mic", }; static const char *twl4030_right_in_sel[] = { "None", "Sub Mic", "Line In", }; static const struct soc_enum twl4030_left_input_mux = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(twl4030_left_in_sel), twl4030_left_in_sel); static const struct soc_enum twl4030_right_input_mux = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(twl4030_right_in_sel), twl4030_right_in_sel); /* * FGAIN volume control: * from -62 to 0 dB in 1 dB steps (mute instead of -63 dB) Loading Loading @@ -741,18 +662,15 @@ static const struct snd_kcontrol_new twl4030_snd_controls[] = { TWL4030_REG_EAR_CTL, 4, 3, 0, output_tvl), /* Common capture gain controls */ SOC_DOUBLE_R_TLV("Capture Volume", SOC_DOUBLE_R_TLV("TX1 Digital Capture Volume", TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, 0, 0x1f, 0, digital_capture_tlv), SOC_DOUBLE_R_TLV("TX2 Digital Capture Volume", TWL4030_REG_AVTXL2PGA, TWL4030_REG_AVTXR2PGA, 0, 0x1f, 0, digital_capture_tlv), SOC_DOUBLE_TLV("Input Boost Volume", TWL4030_REG_ANAMIC_GAIN, SOC_DOUBLE_TLV("Analog Capture Volume", TWL4030_REG_ANAMIC_GAIN, 0, 3, 5, 0, input_gain_tlv), /* Input source controls */ SOC_ENUM_EXT("Left Input Source", twl4030_left_input_mux, twl4030_get_left_input, twl4030_put_left_input), SOC_ENUM_EXT("Right Input Source", twl4030_right_input_mux, twl4030_get_right_input, twl4030_put_right_input), }; /* add non dapm controls */ Loading @@ -772,9 +690,19 @@ static int twl4030_add_controls(struct snd_soc_codec *codec) } static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { SND_SOC_DAPM_INPUT("INL"), SND_SOC_DAPM_INPUT("INR"), /* Left channel inputs */ SND_SOC_DAPM_INPUT("MAINMIC"), SND_SOC_DAPM_INPUT("HSMIC"), SND_SOC_DAPM_INPUT("AUXL"), SND_SOC_DAPM_INPUT("CARKITMIC"), /* Right channel inputs */ SND_SOC_DAPM_INPUT("SUBMIC"), SND_SOC_DAPM_INPUT("AUXR"), /* Digital microphones (Stereo) */ SND_SOC_DAPM_INPUT("DIGIMIC0"), SND_SOC_DAPM_INPUT("DIGIMIC1"), /* Outputs */ SND_SOC_DAPM_OUTPUT("OUTL"), SND_SOC_DAPM_OUTPUT("OUTR"), SND_SOC_DAPM_OUTPUT("EARPIECE"), Loading Loading @@ -810,14 +738,14 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { /* Output MUX controls */ /* Earpiece */ SND_SOC_DAPM_MUX_E("Earpiece Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_earpiece_control, outmixer_event, &twl4030_dapm_earpiece_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), /* PreDrivL/R */ SND_SOC_DAPM_MUX_E("PredriveL Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_predrivel_control, outmixer_event, &twl4030_dapm_predrivel_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_MUX_E("PredriveR Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_predriver_control, outmixer_event, &twl4030_dapm_predriver_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), /* HeadsetL/R */ SND_SOC_DAPM_MUX("HeadsetL Mux", SND_SOC_NOPM, 0, 0, Loading @@ -837,8 +765,50 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { &twl4030_dapm_handsfreer_control, handsfree_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_ADC("ADCL", "Left Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADCR", "Right Capture", SND_SOC_NOPM, 0, 0), /* Introducing four virtual ADC, since TWL4030 have four channel for capture */ SND_SOC_DAPM_ADC("ADC Virtual Left1", "Left Front Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Right1", "Right Front Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Left2", "Left Rear Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Right2", "Right Rear Capture", SND_SOC_NOPM, 0, 0), /* Analog/Digital mic path selection. TX1 Left/Right: either analog Left/Right or Digimic0 TX2 Left/Right: either analog Left/Right or Digimic1 */ SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx1_control, micpath_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx2_control, micpath_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), /* Analog input muxes with power switch for the physical ADCL/R */ SND_SOC_DAPM_MUX_E("Analog Left Capture Route", TWL4030_REG_AVADC_CTL, 3, 0, &twl4030_dapm_analoglmic_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_MUX_E("Analog Right Capture Route", TWL4030_REG_AVADC_CTL, 1, 0, &twl4030_dapm_analogrmic_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_PGA("Analog Left Amplifier", TWL4030_REG_ANAMICL, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("Analog Right Amplifier", TWL4030_REG_ANAMICR, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("Digimic0 Enable", TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0), SND_SOC_DAPM_PGA("Digimic1 Enable", TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), SND_SOC_DAPM_MICBIAS("Headset Mic Bias", TWL4030_REG_MICBIAS_CTL, 2, 0), }; static const struct snd_soc_dapm_route intercon[] = { Loading Loading @@ -894,9 +864,39 @@ static const struct snd_soc_dapm_route intercon[] = { {"HFL", NULL, "HandsfreeL Mux"}, {"HFR", NULL, "HandsfreeR Mux"}, /* inputs */ {"ADCL", NULL, "INL"}, {"ADCR", NULL, "INR"}, /* Capture path */ {"Analog Left Capture Route", "Main mic", "MAINMIC"}, {"Analog Left Capture Route", "Headset mic", "HSMIC"}, {"Analog Left Capture Route", "AUXL", "AUXL"}, {"Analog Left Capture Route", "Carkit mic", "CARKITMIC"}, {"Analog Right Capture Route", "Sub mic", "SUBMIC"}, {"Analog Right Capture Route", "AUXR", "AUXR"}, {"Analog Left Amplifier", NULL, "Analog Left Capture Route"}, {"Analog Right Amplifier", NULL, "Analog Right Capture Route"}, {"Digimic0 Enable", NULL, "DIGIMIC0"}, {"Digimic1 Enable", NULL, "DIGIMIC1"}, /* TX1 Left capture path */ {"TX1 Capture Route", "Analog", "Analog Left Amplifier"}, {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"}, /* TX1 Right capture path */ {"TX1 Capture Route", "Analog", "Analog Right Amplifier"}, {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"}, /* TX2 Left capture path */ {"TX2 Capture Route", "Analog", "Analog Left Amplifier"}, {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"}, /* TX2 Right capture path */ {"TX2 Capture Route", "Analog", "Analog Right Amplifier"}, {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"}, {"ADC Virtual Left1", NULL, "TX1 Capture Route"}, {"ADC Virtual Right1", NULL, "TX1 Capture Route"}, {"ADC Virtual Left2", NULL, "TX2 Capture Route"}, {"ADC Virtual Right2", NULL, "TX2 Capture Route"}, }; static int twl4030_add_widgets(struct snd_soc_codec *codec) Loading @@ -923,6 +923,7 @@ static void twl4030_power_up(struct snd_soc_codec *codec) twl4030_write(codec, TWL4030_REG_ANAMICL, anamicl | TWL4030_CNCL_OFFSET_START); /* wait for offset cancellation to complete */ do { /* this takes a little while, so don't slam i2c */ Loading sound/soc/codecs/twl4030.h +7 −0 Original line number Diff line number Diff line Loading @@ -147,6 +147,13 @@ #define TWL4030_AVADC_CLK_PRIORITY 0x04 #define TWL4030_ADCR_EN 0x02 /* TWL4030_REG_ADCMICSEL (0x08) Fields */ #define TWL4030_DIGMIC1_EN 0x08 #define TWL4030_TX2IN_SEL 0x04 #define TWL4030_DIGMIC0_EN 0x02 #define TWL4030_TX1IN_SEL 0x01 /* AUDIO_IF (0x0E) Fields */ #define TWL4030_AIF_SLAVE_EN 0x80 Loading sound/soc/pxa/pxa2xx-pcm.c +2 −2 Original line number Diff line number Diff line Loading @@ -61,9 +61,9 @@ static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream) __pxa2xx_pcm_hw_free(substream); if (prtd->dma_ch) { if (prtd->dma_ch >= 0) { pxa_free_dma(prtd->dma_ch); prtd->dma_ch = 0; prtd->dma_ch = -1; } return 0; Loading sound/soc/soc-core.c +24 −22 Original line number Diff line number Diff line Loading @@ -1300,6 +1300,8 @@ EXPORT_SYMBOL_GPL(snd_soc_test_bits); /** * snd_soc_new_pcms - create new sound card and pcms * @socdev: the SoC audio device * @idx: ALSA card index * @xid: card identification * * Create a new sound card based upon the codec and interface pcms. * Loading Loading @@ -1472,7 +1474,7 @@ EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams); * snd_soc_cnew - create new control * @_template: control template * @data: control private data * @lnng_name: control long name * @long_name: control long name * * Create a new mixer control from a template control. * Loading Loading @@ -1522,7 +1524,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_enum_double); /** * snd_soc_get_enum_double - enumerated double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a double enumerated mixer. * Loading Loading @@ -1551,7 +1553,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_enum_double); /** * snd_soc_put_enum_double - enumerated double mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a double enumerated mixer. * Loading Loading @@ -1668,7 +1670,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw); /** * snd_soc_get_volsw - single mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a single mixer control. * Loading Loading @@ -1707,7 +1709,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw); /** * snd_soc_put_volsw - single mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a single mixer control. * Loading Loading @@ -1775,7 +1777,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r); /** * snd_soc_get_volsw_2r - double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a double mixer control that spans 2 registers. * Loading Loading @@ -1812,7 +1814,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r); /** * snd_soc_put_volsw_2r - double mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a double mixer control that spans 2 registers. * Loading Loading @@ -1882,7 +1884,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_s8); /** * snd_soc_get_volsw_s8 - signed mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a signed mixer control. * Loading @@ -1909,7 +1911,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_s8); /** * snd_soc_put_volsw_sgn - signed mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a signed mixer control. * Loading Loading @@ -1954,7 +1956,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); /** * snd_soc_dai_set_clkdiv - configure DAI clock dividers. * @dai: DAI * @clk_id: DAI specific clock divider ID * @div_id: DAI specific clock divider ID * @div: new clock divisor. * * Configures the clock dividers. This is used to derive the best DAI bit and Loading Loading @@ -2060,7 +2062,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute); /** * snd_soc_register_card - Register a card with the ASoC core * * @param card Card to register * @card: Card to register * * Note that currently this is an internal only function: it will be * exposed to machine drivers after further backporting of ASoC v2 Loading @@ -2087,7 +2089,7 @@ static int snd_soc_register_card(struct snd_soc_card *card) /** * snd_soc_unregister_card - Unregister a card with the ASoC core * * @param card Card to unregister * @card: Card to unregister * * Note that currently this is an internal only function: it will be * exposed to machine drivers after further backporting of ASoC v2 Loading @@ -2107,7 +2109,7 @@ static int snd_soc_unregister_card(struct snd_soc_card *card) /** * snd_soc_register_dai - Register a DAI with the ASoC core * * @param dai DAI to register * @dai: DAI to register */ int snd_soc_register_dai(struct snd_soc_dai *dai) { Loading @@ -2134,7 +2136,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dai); /** * snd_soc_unregister_dai - Unregister a DAI from the ASoC core * * @param dai DAI to unregister * @dai: DAI to unregister */ void snd_soc_unregister_dai(struct snd_soc_dai *dai) { Loading @@ -2149,8 +2151,8 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai); /** * snd_soc_register_dais - Register multiple DAIs with the ASoC core * * @param dai Array of DAIs to register * @param count Number of DAIs * @dai: Array of DAIs to register * @count: Number of DAIs */ int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count) { Loading @@ -2175,8 +2177,8 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dais); /** * snd_soc_unregister_dais - Unregister multiple DAIs from the ASoC core * * @param dai Array of DAIs to unregister * @param count Number of DAIs * @dai: Array of DAIs to unregister * @count: Number of DAIs */ void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count) { Loading @@ -2190,7 +2192,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dais); /** * snd_soc_register_platform - Register a platform with the ASoC core * * @param platform platform to register * @platform: platform to register */ int snd_soc_register_platform(struct snd_soc_platform *platform) { Loading @@ -2213,7 +2215,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform); /** * snd_soc_unregister_platform - Unregister a platform from the ASoC core * * @param platform platform to unregister * @platform: platform to unregister */ void snd_soc_unregister_platform(struct snd_soc_platform *platform) { Loading @@ -2228,7 +2230,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_platform); /** * snd_soc_register_codec - Register a codec with the ASoC core * * @param codec codec to register * @codec: codec to register */ int snd_soc_register_codec(struct snd_soc_codec *codec) { Loading @@ -2255,7 +2257,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_codec); /** * snd_soc_unregister_codec - Unregister a codec from the ASoC core * * @param codec codec to unregister * @codec: codec to unregister */ void snd_soc_unregister_codec(struct snd_soc_codec *codec) { Loading sound/soc/soc-dapm.c +5 −5 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets); /** * snd_soc_dapm_get_volsw - dapm mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a dapm mixer control. * Loading Loading @@ -1122,7 +1122,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); /** * snd_soc_dapm_put_volsw - dapm mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a dapm mixer control. * Loading Loading @@ -1193,7 +1193,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw); /** * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a dapm enumerated double mixer control. * Loading Loading @@ -1221,7 +1221,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double); /** * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a dapm enumerated double mixer control. * Loading Loading @@ -1419,7 +1419,7 @@ int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev, /** * snd_soc_dapm_enable_pin - enable pin. * @snd_soc_codec: SoC codec * @codec: SoC codec * @pin: pin name * * Enables input/output pin and it's parents or children widgets iff there is Loading Loading
sound/soc/codecs/twl4030.c +189 −188 Original line number Diff line number Diff line Loading @@ -298,30 +298,107 @@ static const struct soc_enum twl4030_handsfreer_enum = static const struct snd_kcontrol_new twl4030_dapm_handsfreer_control = SOC_DAPM_ENUM("Route", twl4030_handsfreer_enum); static int outmixer_event(struct snd_soc_dapm_widget *w, /* Left analog microphone selection */ static const char *twl4030_analoglmic_texts[] = {"Off", "Main mic", "Headset mic", "Invalid", "AUXL", "Invalid", "Invalid", "Invalid", "Carkit mic"}; static const struct soc_enum twl4030_analoglmic_enum = SOC_ENUM_SINGLE(TWL4030_REG_ANAMICL, 0, ARRAY_SIZE(twl4030_analoglmic_texts), twl4030_analoglmic_texts); static const struct snd_kcontrol_new twl4030_dapm_analoglmic_control = SOC_DAPM_ENUM("Route", twl4030_analoglmic_enum); /* Right analog microphone selection */ static const char *twl4030_analogrmic_texts[] = {"Off", "Sub mic", "Invalid", "Invalid", "AUXR"}; static const struct soc_enum twl4030_analogrmic_enum = SOC_ENUM_SINGLE(TWL4030_REG_ANAMICR, 0, ARRAY_SIZE(twl4030_analogrmic_texts), twl4030_analogrmic_texts); static const struct snd_kcontrol_new twl4030_dapm_analogrmic_control = SOC_DAPM_ENUM("Route", twl4030_analogrmic_enum); /* TX1 L/R Analog/Digital microphone selection */ static const char *twl4030_micpathtx1_texts[] = {"Analog", "Digimic0"}; static const struct soc_enum twl4030_micpathtx1_enum = SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 0, ARRAY_SIZE(twl4030_micpathtx1_texts), twl4030_micpathtx1_texts); static const struct snd_kcontrol_new twl4030_dapm_micpathtx1_control = SOC_DAPM_ENUM("Route", twl4030_micpathtx1_enum); /* TX2 L/R Analog/Digital microphone selection */ static const char *twl4030_micpathtx2_texts[] = {"Analog", "Digimic1"}; static const struct soc_enum twl4030_micpathtx2_enum = SOC_ENUM_SINGLE(TWL4030_REG_ADCMICSEL, 2, ARRAY_SIZE(twl4030_micpathtx2_texts), twl4030_micpathtx2_texts); static const struct snd_kcontrol_new twl4030_dapm_micpathtx2_control = SOC_DAPM_ENUM("Route", twl4030_micpathtx2_enum); /* * This function filters out the non valid mux settings, named as "Invalid" * in the enum texts. * Just refuse to set an invalid mux mode. */ static int twl4030_enum_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; int ret = 0; int val; switch (e->reg) { case TWL4030_REG_PREDL_CTL: case TWL4030_REG_PREDR_CTL: case TWL4030_REG_EAR_CTL: val = w->value >> e->shift_l; if (val == 3) { printk(KERN_WARNING "Invalid MUX setting for register 0x%02x (%d)\n", if (!strcmp("Invalid", e->texts[val])) { printk(KERN_WARNING "Invalid MUX setting on 0x%02x (%d)\n", e->reg, val); ret = -1; } break; } return ret; } static int micpath_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { struct soc_enum *e = (struct soc_enum *)w->kcontrols->private_value; unsigned char adcmicsel, micbias_ctl; adcmicsel = twl4030_read_reg_cache(w->codec, TWL4030_REG_ADCMICSEL); micbias_ctl = twl4030_read_reg_cache(w->codec, TWL4030_REG_MICBIAS_CTL); /* Prepare the bits for the given TX path: * shift_l == 0: TX1 microphone path * shift_l == 2: TX2 microphone path */ if (e->shift_l) { /* TX2 microphone path */ if (adcmicsel & TWL4030_TX2IN_SEL) micbias_ctl |= TWL4030_MICBIAS2_CTL; /* digimic */ else micbias_ctl &= ~TWL4030_MICBIAS2_CTL; } else { /* TX1 microphone path */ if (adcmicsel & TWL4030_TX1IN_SEL) micbias_ctl |= TWL4030_MICBIAS1_CTL; /* digimic */ else micbias_ctl &= ~TWL4030_MICBIAS1_CTL; } twl4030_write(w->codec, TWL4030_REG_MICBIAS_CTL, micbias_ctl); return 0; } static int handsfree_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { Loading Loading @@ -503,162 +580,6 @@ static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol, return err; } static int twl4030_get_left_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); int result = 0; /* one bit must be set a time */ reg &= TWL4030_CKMIC_EN | TWL4030_AUXL_EN | TWL4030_HSMIC_EN | TWL4030_MAINMIC_EN; if (reg != 0) { result++; while ((reg & 1) == 0) { result++; reg >>= 1; } } ucontrol->value.integer.value[0] = result; return 0; } static int twl4030_put_left_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; int value = ucontrol->value.integer.value[0]; u8 anamicl, micbias, avadc_ctl; anamicl = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICL); anamicl &= ~(TWL4030_CKMIC_EN | TWL4030_AUXL_EN | TWL4030_HSMIC_EN | TWL4030_MAINMIC_EN); micbias = twl4030_read_reg_cache(codec, TWL4030_REG_MICBIAS_CTL); micbias &= ~(TWL4030_HSMICBIAS_EN | TWL4030_MICBIAS1_EN); avadc_ctl = twl4030_read_reg_cache(codec, TWL4030_REG_AVADC_CTL); switch (value) { case 1: anamicl |= TWL4030_MAINMIC_EN; micbias |= TWL4030_MICBIAS1_EN; break; case 2: anamicl |= TWL4030_HSMIC_EN; micbias |= TWL4030_HSMICBIAS_EN; break; case 3: anamicl |= TWL4030_AUXL_EN; break; case 4: anamicl |= TWL4030_CKMIC_EN; break; default: break; } /* If some input is selected, enable amp and ADC */ if (value != 0) { anamicl |= TWL4030_MICAMPL_EN; avadc_ctl |= TWL4030_ADCL_EN; } else { anamicl &= ~TWL4030_MICAMPL_EN; avadc_ctl &= ~TWL4030_ADCL_EN; } twl4030_write(codec, TWL4030_REG_ANAMICL, anamicl); twl4030_write(codec, TWL4030_REG_MICBIAS_CTL, micbias); twl4030_write(codec, TWL4030_REG_AVADC_CTL, avadc_ctl); return 1; } static int twl4030_get_right_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; u8 reg = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICR); int value = 0; reg &= TWL4030_SUBMIC_EN|TWL4030_AUXR_EN; switch (reg) { case TWL4030_SUBMIC_EN: value = 1; break; case TWL4030_AUXR_EN: value = 2; break; default: break; } ucontrol->value.integer.value[0] = value; return 0; } static int twl4030_put_right_input(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_codec *codec = kcontrol->private_data; int value = ucontrol->value.integer.value[0]; u8 anamicr, micbias, avadc_ctl; anamicr = twl4030_read_reg_cache(codec, TWL4030_REG_ANAMICR); anamicr &= ~(TWL4030_SUBMIC_EN|TWL4030_AUXR_EN); micbias = twl4030_read_reg_cache(codec, TWL4030_REG_MICBIAS_CTL); micbias &= ~TWL4030_MICBIAS2_EN; avadc_ctl = twl4030_read_reg_cache(codec, TWL4030_REG_AVADC_CTL); switch (value) { case 1: anamicr |= TWL4030_SUBMIC_EN; micbias |= TWL4030_MICBIAS2_EN; break; case 2: anamicr |= TWL4030_AUXR_EN; break; default: break; } if (value != 0) { anamicr |= TWL4030_MICAMPR_EN; avadc_ctl |= TWL4030_ADCR_EN; } else { anamicr &= ~TWL4030_MICAMPR_EN; avadc_ctl &= ~TWL4030_ADCR_EN; } twl4030_write(codec, TWL4030_REG_ANAMICR, anamicr); twl4030_write(codec, TWL4030_REG_MICBIAS_CTL, micbias); twl4030_write(codec, TWL4030_REG_AVADC_CTL, avadc_ctl); return 1; } static const char *twl4030_left_in_sel[] = { "None", "Main Mic", "Headset Mic", "Line In", "Carkit Mic", }; static const char *twl4030_right_in_sel[] = { "None", "Sub Mic", "Line In", }; static const struct soc_enum twl4030_left_input_mux = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(twl4030_left_in_sel), twl4030_left_in_sel); static const struct soc_enum twl4030_right_input_mux = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(twl4030_right_in_sel), twl4030_right_in_sel); /* * FGAIN volume control: * from -62 to 0 dB in 1 dB steps (mute instead of -63 dB) Loading Loading @@ -741,18 +662,15 @@ static const struct snd_kcontrol_new twl4030_snd_controls[] = { TWL4030_REG_EAR_CTL, 4, 3, 0, output_tvl), /* Common capture gain controls */ SOC_DOUBLE_R_TLV("Capture Volume", SOC_DOUBLE_R_TLV("TX1 Digital Capture Volume", TWL4030_REG_ATXL1PGA, TWL4030_REG_ATXR1PGA, 0, 0x1f, 0, digital_capture_tlv), SOC_DOUBLE_R_TLV("TX2 Digital Capture Volume", TWL4030_REG_AVTXL2PGA, TWL4030_REG_AVTXR2PGA, 0, 0x1f, 0, digital_capture_tlv), SOC_DOUBLE_TLV("Input Boost Volume", TWL4030_REG_ANAMIC_GAIN, SOC_DOUBLE_TLV("Analog Capture Volume", TWL4030_REG_ANAMIC_GAIN, 0, 3, 5, 0, input_gain_tlv), /* Input source controls */ SOC_ENUM_EXT("Left Input Source", twl4030_left_input_mux, twl4030_get_left_input, twl4030_put_left_input), SOC_ENUM_EXT("Right Input Source", twl4030_right_input_mux, twl4030_get_right_input, twl4030_put_right_input), }; /* add non dapm controls */ Loading @@ -772,9 +690,19 @@ static int twl4030_add_controls(struct snd_soc_codec *codec) } static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { SND_SOC_DAPM_INPUT("INL"), SND_SOC_DAPM_INPUT("INR"), /* Left channel inputs */ SND_SOC_DAPM_INPUT("MAINMIC"), SND_SOC_DAPM_INPUT("HSMIC"), SND_SOC_DAPM_INPUT("AUXL"), SND_SOC_DAPM_INPUT("CARKITMIC"), /* Right channel inputs */ SND_SOC_DAPM_INPUT("SUBMIC"), SND_SOC_DAPM_INPUT("AUXR"), /* Digital microphones (Stereo) */ SND_SOC_DAPM_INPUT("DIGIMIC0"), SND_SOC_DAPM_INPUT("DIGIMIC1"), /* Outputs */ SND_SOC_DAPM_OUTPUT("OUTL"), SND_SOC_DAPM_OUTPUT("OUTR"), SND_SOC_DAPM_OUTPUT("EARPIECE"), Loading Loading @@ -810,14 +738,14 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { /* Output MUX controls */ /* Earpiece */ SND_SOC_DAPM_MUX_E("Earpiece Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_earpiece_control, outmixer_event, &twl4030_dapm_earpiece_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), /* PreDrivL/R */ SND_SOC_DAPM_MUX_E("PredriveL Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_predrivel_control, outmixer_event, &twl4030_dapm_predrivel_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_MUX_E("PredriveR Mux", SND_SOC_NOPM, 0, 0, &twl4030_dapm_predriver_control, outmixer_event, &twl4030_dapm_predriver_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), /* HeadsetL/R */ SND_SOC_DAPM_MUX("HeadsetL Mux", SND_SOC_NOPM, 0, 0, Loading @@ -837,8 +765,50 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = { &twl4030_dapm_handsfreer_control, handsfree_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD), SND_SOC_DAPM_ADC("ADCL", "Left Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADCR", "Right Capture", SND_SOC_NOPM, 0, 0), /* Introducing four virtual ADC, since TWL4030 have four channel for capture */ SND_SOC_DAPM_ADC("ADC Virtual Left1", "Left Front Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Right1", "Right Front Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Left2", "Left Rear Capture", SND_SOC_NOPM, 0, 0), SND_SOC_DAPM_ADC("ADC Virtual Right2", "Right Rear Capture", SND_SOC_NOPM, 0, 0), /* Analog/Digital mic path selection. TX1 Left/Right: either analog Left/Right or Digimic0 TX2 Left/Right: either analog Left/Right or Digimic1 */ SND_SOC_DAPM_MUX_E("TX1 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx1_control, micpath_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), SND_SOC_DAPM_MUX_E("TX2 Capture Route", SND_SOC_NOPM, 0, 0, &twl4030_dapm_micpathtx2_control, micpath_event, SND_SOC_DAPM_POST_PMU|SND_SOC_DAPM_POST_PMD| SND_SOC_DAPM_POST_REG), /* Analog input muxes with power switch for the physical ADCL/R */ SND_SOC_DAPM_MUX_E("Analog Left Capture Route", TWL4030_REG_AVADC_CTL, 3, 0, &twl4030_dapm_analoglmic_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_MUX_E("Analog Right Capture Route", TWL4030_REG_AVADC_CTL, 1, 0, &twl4030_dapm_analogrmic_control, twl4030_enum_event, SND_SOC_DAPM_PRE_REG), SND_SOC_DAPM_PGA("Analog Left Amplifier", TWL4030_REG_ANAMICL, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("Analog Right Amplifier", TWL4030_REG_ANAMICR, 4, 0, NULL, 0), SND_SOC_DAPM_PGA("Digimic0 Enable", TWL4030_REG_ADCMICSEL, 1, 0, NULL, 0), SND_SOC_DAPM_PGA("Digimic1 Enable", TWL4030_REG_ADCMICSEL, 3, 0, NULL, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 1", TWL4030_REG_MICBIAS_CTL, 0, 0), SND_SOC_DAPM_MICBIAS("Mic Bias 2", TWL4030_REG_MICBIAS_CTL, 1, 0), SND_SOC_DAPM_MICBIAS("Headset Mic Bias", TWL4030_REG_MICBIAS_CTL, 2, 0), }; static const struct snd_soc_dapm_route intercon[] = { Loading Loading @@ -894,9 +864,39 @@ static const struct snd_soc_dapm_route intercon[] = { {"HFL", NULL, "HandsfreeL Mux"}, {"HFR", NULL, "HandsfreeR Mux"}, /* inputs */ {"ADCL", NULL, "INL"}, {"ADCR", NULL, "INR"}, /* Capture path */ {"Analog Left Capture Route", "Main mic", "MAINMIC"}, {"Analog Left Capture Route", "Headset mic", "HSMIC"}, {"Analog Left Capture Route", "AUXL", "AUXL"}, {"Analog Left Capture Route", "Carkit mic", "CARKITMIC"}, {"Analog Right Capture Route", "Sub mic", "SUBMIC"}, {"Analog Right Capture Route", "AUXR", "AUXR"}, {"Analog Left Amplifier", NULL, "Analog Left Capture Route"}, {"Analog Right Amplifier", NULL, "Analog Right Capture Route"}, {"Digimic0 Enable", NULL, "DIGIMIC0"}, {"Digimic1 Enable", NULL, "DIGIMIC1"}, /* TX1 Left capture path */ {"TX1 Capture Route", "Analog", "Analog Left Amplifier"}, {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"}, /* TX1 Right capture path */ {"TX1 Capture Route", "Analog", "Analog Right Amplifier"}, {"TX1 Capture Route", "Digimic0", "Digimic0 Enable"}, /* TX2 Left capture path */ {"TX2 Capture Route", "Analog", "Analog Left Amplifier"}, {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"}, /* TX2 Right capture path */ {"TX2 Capture Route", "Analog", "Analog Right Amplifier"}, {"TX2 Capture Route", "Digimic1", "Digimic1 Enable"}, {"ADC Virtual Left1", NULL, "TX1 Capture Route"}, {"ADC Virtual Right1", NULL, "TX1 Capture Route"}, {"ADC Virtual Left2", NULL, "TX2 Capture Route"}, {"ADC Virtual Right2", NULL, "TX2 Capture Route"}, }; static int twl4030_add_widgets(struct snd_soc_codec *codec) Loading @@ -923,6 +923,7 @@ static void twl4030_power_up(struct snd_soc_codec *codec) twl4030_write(codec, TWL4030_REG_ANAMICL, anamicl | TWL4030_CNCL_OFFSET_START); /* wait for offset cancellation to complete */ do { /* this takes a little while, so don't slam i2c */ Loading
sound/soc/codecs/twl4030.h +7 −0 Original line number Diff line number Diff line Loading @@ -147,6 +147,13 @@ #define TWL4030_AVADC_CLK_PRIORITY 0x04 #define TWL4030_ADCR_EN 0x02 /* TWL4030_REG_ADCMICSEL (0x08) Fields */ #define TWL4030_DIGMIC1_EN 0x08 #define TWL4030_TX2IN_SEL 0x04 #define TWL4030_DIGMIC0_EN 0x02 #define TWL4030_TX1IN_SEL 0x01 /* AUDIO_IF (0x0E) Fields */ #define TWL4030_AIF_SLAVE_EN 0x80 Loading
sound/soc/pxa/pxa2xx-pcm.c +2 −2 Original line number Diff line number Diff line Loading @@ -61,9 +61,9 @@ static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream) __pxa2xx_pcm_hw_free(substream); if (prtd->dma_ch) { if (prtd->dma_ch >= 0) { pxa_free_dma(prtd->dma_ch); prtd->dma_ch = 0; prtd->dma_ch = -1; } return 0; Loading
sound/soc/soc-core.c +24 −22 Original line number Diff line number Diff line Loading @@ -1300,6 +1300,8 @@ EXPORT_SYMBOL_GPL(snd_soc_test_bits); /** * snd_soc_new_pcms - create new sound card and pcms * @socdev: the SoC audio device * @idx: ALSA card index * @xid: card identification * * Create a new sound card based upon the codec and interface pcms. * Loading Loading @@ -1472,7 +1474,7 @@ EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams); * snd_soc_cnew - create new control * @_template: control template * @data: control private data * @lnng_name: control long name * @long_name: control long name * * Create a new mixer control from a template control. * Loading Loading @@ -1522,7 +1524,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_enum_double); /** * snd_soc_get_enum_double - enumerated double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a double enumerated mixer. * Loading Loading @@ -1551,7 +1553,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_enum_double); /** * snd_soc_put_enum_double - enumerated double mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a double enumerated mixer. * Loading Loading @@ -1668,7 +1670,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw); /** * snd_soc_get_volsw - single mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a single mixer control. * Loading Loading @@ -1707,7 +1709,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw); /** * snd_soc_put_volsw - single mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a single mixer control. * Loading Loading @@ -1775,7 +1777,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r); /** * snd_soc_get_volsw_2r - double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a double mixer control that spans 2 registers. * Loading Loading @@ -1812,7 +1814,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r); /** * snd_soc_put_volsw_2r - double mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a double mixer control that spans 2 registers. * Loading Loading @@ -1882,7 +1884,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_s8); /** * snd_soc_get_volsw_s8 - signed mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a signed mixer control. * Loading @@ -1909,7 +1911,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_s8); /** * snd_soc_put_volsw_sgn - signed mixer put callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a signed mixer control. * Loading Loading @@ -1954,7 +1956,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); /** * snd_soc_dai_set_clkdiv - configure DAI clock dividers. * @dai: DAI * @clk_id: DAI specific clock divider ID * @div_id: DAI specific clock divider ID * @div: new clock divisor. * * Configures the clock dividers. This is used to derive the best DAI bit and Loading Loading @@ -2060,7 +2062,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute); /** * snd_soc_register_card - Register a card with the ASoC core * * @param card Card to register * @card: Card to register * * Note that currently this is an internal only function: it will be * exposed to machine drivers after further backporting of ASoC v2 Loading @@ -2087,7 +2089,7 @@ static int snd_soc_register_card(struct snd_soc_card *card) /** * snd_soc_unregister_card - Unregister a card with the ASoC core * * @param card Card to unregister * @card: Card to unregister * * Note that currently this is an internal only function: it will be * exposed to machine drivers after further backporting of ASoC v2 Loading @@ -2107,7 +2109,7 @@ static int snd_soc_unregister_card(struct snd_soc_card *card) /** * snd_soc_register_dai - Register a DAI with the ASoC core * * @param dai DAI to register * @dai: DAI to register */ int snd_soc_register_dai(struct snd_soc_dai *dai) { Loading @@ -2134,7 +2136,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dai); /** * snd_soc_unregister_dai - Unregister a DAI from the ASoC core * * @param dai DAI to unregister * @dai: DAI to unregister */ void snd_soc_unregister_dai(struct snd_soc_dai *dai) { Loading @@ -2149,8 +2151,8 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai); /** * snd_soc_register_dais - Register multiple DAIs with the ASoC core * * @param dai Array of DAIs to register * @param count Number of DAIs * @dai: Array of DAIs to register * @count: Number of DAIs */ int snd_soc_register_dais(struct snd_soc_dai *dai, size_t count) { Loading @@ -2175,8 +2177,8 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dais); /** * snd_soc_unregister_dais - Unregister multiple DAIs from the ASoC core * * @param dai Array of DAIs to unregister * @param count Number of DAIs * @dai: Array of DAIs to unregister * @count: Number of DAIs */ void snd_soc_unregister_dais(struct snd_soc_dai *dai, size_t count) { Loading @@ -2190,7 +2192,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dais); /** * snd_soc_register_platform - Register a platform with the ASoC core * * @param platform platform to register * @platform: platform to register */ int snd_soc_register_platform(struct snd_soc_platform *platform) { Loading @@ -2213,7 +2215,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform); /** * snd_soc_unregister_platform - Unregister a platform from the ASoC core * * @param platform platform to unregister * @platform: platform to unregister */ void snd_soc_unregister_platform(struct snd_soc_platform *platform) { Loading @@ -2228,7 +2230,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_platform); /** * snd_soc_register_codec - Register a codec with the ASoC core * * @param codec codec to register * @codec: codec to register */ int snd_soc_register_codec(struct snd_soc_codec *codec) { Loading @@ -2255,7 +2257,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_codec); /** * snd_soc_unregister_codec - Unregister a codec from the ASoC core * * @param codec codec to unregister * @codec: codec to unregister */ void snd_soc_unregister_codec(struct snd_soc_codec *codec) { Loading
sound/soc/soc-dapm.c +5 −5 Original line number Diff line number Diff line Loading @@ -1077,7 +1077,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets); /** * snd_soc_dapm_get_volsw - dapm mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a dapm mixer control. * Loading Loading @@ -1122,7 +1122,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); /** * snd_soc_dapm_put_volsw - dapm mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a dapm mixer control. * Loading Loading @@ -1193,7 +1193,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw); /** * snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to get the value of a dapm enumerated double mixer control. * Loading Loading @@ -1221,7 +1221,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double); /** * snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback * @kcontrol: mixer control * @uinfo: control element information * @ucontrol: control element information * * Callback to set the value of a dapm enumerated double mixer control. * Loading Loading @@ -1419,7 +1419,7 @@ int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev, /** * snd_soc_dapm_enable_pin - enable pin. * @snd_soc_codec: SoC codec * @codec: SoC codec * @pin: pin name * * Enables input/output pin and it's parents or children widgets iff there is Loading