static void tosa_ext_control(struct snd_soc_dapm_context *dapm) { snd_soc_dapm_mutex_lock(dapm); /* set up jack connection */ switch (tosa_jack_func) { case TOSA_HP: snd_soc_dapm_disable_pin_unlocked(dapm, "Mic (Internal)"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); break; case TOSA_MIC_INT: snd_soc_dapm_enable_pin_unlocked(dapm, "Mic (Internal)"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); break; case TOSA_HEADSET: snd_soc_dapm_disable_pin_unlocked(dapm, "Mic (Internal)"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); break; } if (tosa_spk_func == TOSA_SPK_ON) snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker"); snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
/* Line discipline .close() */ static void cx81801_close(struct tty_struct *tty) { struct snd_soc_codec *codec = tty->disc_data; struct snd_soc_dapm_context *dapm = &codec->component.card->dapm; del_timer_sync(&cx81801_timer); /* Prevent the hook switch from further changing the DAPM pins */ INIT_LIST_HEAD(&ams_delta_hook_switch.pins); if (!codec) return; v253_ops.close(tty); /* Revert back to default audio input/output constellation */ snd_soc_dapm_mutex_lock(dapm); snd_soc_dapm_disable_pin_unlocked(dapm, "Mouthpiece"); snd_soc_dapm_enable_pin_unlocked(dapm, "Earpiece"); snd_soc_dapm_enable_pin_unlocked(dapm, "Microphone"); snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker"); snd_soc_dapm_disable_pin_unlocked(dapm, "AGCIN"); snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
static void corgi_ext_control(struct snd_soc_dapm_context *dapm) { snd_soc_dapm_mutex_lock(dapm); /* set up jack connection */ switch (corgi_jack_func) { case CORGI_HP: /* set = unmute headphone */ gpio_set_value(CORGI_GPIO_MUTE_L, 1); gpio_set_value(CORGI_GPIO_MUTE_R, 1); snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); break; case CORGI_MIC: /* reset = mute headphone */ gpio_set_value(CORGI_GPIO_MUTE_L, 0); gpio_set_value(CORGI_GPIO_MUTE_R, 0); snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); break; case CORGI_LINE: gpio_set_value(CORGI_GPIO_MUTE_L, 0); gpio_set_value(CORGI_GPIO_MUTE_R, 0); snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); break; case CORGI_HEADSET: gpio_set_value(CORGI_GPIO_MUTE_L, 0); gpio_set_value(CORGI_GPIO_MUTE_R, 1); snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); break; } if (corgi_spk_func == CORGI_SPK_ON) snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); /* signal a DAPM event */ snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
static void rx51_ext_control(struct snd_soc_dapm_context *dapm) { struct snd_soc_card *card = dapm->card; struct rx51_audio_pdata *pdata = snd_soc_card_get_drvdata(card); int hp = 0, hs = 0, tvout = 0; switch (rx51_jack_func) { case RX51_JACK_TVOUT: tvout = 1; hp = 1; break; case RX51_JACK_HS: hs = 1; case RX51_JACK_HP: hp = 1; break; } snd_soc_dapm_mutex_lock(dapm); if (rx51_spk_func) snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); if (rx51_dmic_func) snd_soc_dapm_enable_pin_unlocked(dapm, "DMic"); else snd_soc_dapm_disable_pin_unlocked(dapm, "DMic"); if (hp) snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); if (hs) snd_soc_dapm_enable_pin_unlocked(dapm, "HS Mic"); else snd_soc_dapm_disable_pin_unlocked(dapm, "HS Mic"); gpiod_set_value(pdata->tvout_selection_gpio, tvout); snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
static void n810_ext_control(struct snd_soc_dapm_context *dapm) { int hp = 0, line1l = 0; switch (n810_jack_func) { case N810_JACK_HS: line1l = 1; case N810_JACK_HP: hp = 1; break; case N810_JACK_MIC: line1l = 1; break; } snd_soc_dapm_mutex_lock(dapm); if (n810_spk_func) snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); if (hp) snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); if (line1l) snd_soc_dapm_enable_pin_unlocked(dapm, "LINE1L"); else snd_soc_dapm_disable_pin_unlocked(dapm, "LINE1L"); if (n810_dmic_func) snd_soc_dapm_enable_pin_unlocked(dapm, "DMic"); else snd_soc_dapm_disable_pin_unlocked(dapm, "DMic"); snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
static int ams_delta_set_audio_mode(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); struct snd_soc_dapm_context *dapm = &card->dapm; struct soc_enum *control = (struct soc_enum *)kcontrol->private_value; unsigned short pins; int pin, changed = 0; /* Refuse any mode changes if we are not able to control the codec. */ if (!cx20442_codec->hw_write) return -EUNATCH; if (ucontrol->value.enumerated.item[0] >= control->items) return -EINVAL; snd_soc_dapm_mutex_lock(dapm); /* Translate selection to bitmap */ pins = ams_delta_audio_mode_pins[ucontrol->value.enumerated.item[0]]; /* Setup pins after corresponding bits if changed */ pin = !!(pins & (1 << AMS_DELTA_MOUTHPIECE)); if (pin != snd_soc_dapm_get_pin_status(dapm, "Mouthpiece")) { changed = 1; if (pin) snd_soc_dapm_enable_pin_unlocked(dapm, "Mouthpiece"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Mouthpiece"); } pin = !!(pins & (1 << AMS_DELTA_EARPIECE)); if (pin != snd_soc_dapm_get_pin_status(dapm, "Earpiece")) { changed = 1; if (pin) snd_soc_dapm_enable_pin_unlocked(dapm, "Earpiece"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Earpiece"); } pin = !!(pins & (1 << AMS_DELTA_MICROPHONE)); if (pin != snd_soc_dapm_get_pin_status(dapm, "Microphone")) { changed = 1; if (pin) snd_soc_dapm_enable_pin_unlocked(dapm, "Microphone"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Microphone"); } pin = !!(pins & (1 << AMS_DELTA_SPEAKER)); if (pin != snd_soc_dapm_get_pin_status(dapm, "Speaker")) { changed = 1; if (pin) snd_soc_dapm_enable_pin_unlocked(dapm, "Speaker"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Speaker"); } pin = !!(pins & (1 << AMS_DELTA_AGC)); if (pin != ams_delta_audio_agc) { ams_delta_audio_agc = pin; changed = 1; if (pin) snd_soc_dapm_enable_pin_unlocked(dapm, "AGCIN"); else snd_soc_dapm_disable_pin_unlocked(dapm, "AGCIN"); } if (changed) snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); return changed; }
static void spitz_ext_control(struct snd_soc_dapm_context *dapm) { snd_soc_dapm_mutex_lock(dapm); if (spitz_spk_func == SPITZ_SPK_ON) snd_soc_dapm_enable_pin_unlocked(dapm, "Ext Spk"); else snd_soc_dapm_disable_pin_unlocked(dapm, "Ext Spk"); /* set up jack connection */ switch (spitz_jack_func) { case SPITZ_HP: /* enable and unmute hp jack, disable mic bias */ snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack"); gpio_set_value(SPITZ_GPIO_MUTE_L, 1); gpio_set_value(SPITZ_GPIO_MUTE_R, 1); break; case SPITZ_MIC: /* enable mic jack and bias, mute hp */ snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); gpio_set_value(SPITZ_GPIO_MUTE_L, 0); gpio_set_value(SPITZ_GPIO_MUTE_R, 0); break; case SPITZ_LINE: /* enable line jack, disable mic bias and mute hp */ snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack"); gpio_set_value(SPITZ_GPIO_MUTE_L, 0); gpio_set_value(SPITZ_GPIO_MUTE_R, 0); break; case SPITZ_HEADSET: /* enable and unmute headset jack enable mic bias, mute L hp */ snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack"); gpio_set_value(SPITZ_GPIO_MUTE_L, 0); gpio_set_value(SPITZ_GPIO_MUTE_R, 1); break; case SPITZ_HP_OFF: /* jack removed, everything off */ snd_soc_dapm_disable_pin_unlocked(dapm, "Headphone Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack"); snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack"); gpio_set_value(SPITZ_GPIO_MUTE_L, 0); gpio_set_value(SPITZ_GPIO_MUTE_R, 0); break; } snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); }
static int adav80x_set_sysclk(struct snd_soc_codec *codec, int clk_id, int source, unsigned int freq, int dir) { struct adav80x *adav80x = snd_soc_codec_get_drvdata(codec); struct snd_soc_dapm_context *dapm = &codec->dapm; if (dir == SND_SOC_CLOCK_IN) { switch (clk_id) { case ADAV80X_CLK_XIN: case ADAV80X_CLK_XTAL: case ADAV80X_CLK_MCLKI: case ADAV80X_CLK_PLL1: case ADAV80X_CLK_PLL2: break; default: return -EINVAL; } adav80x->sysclk = freq; if (adav80x->clk_src != clk_id) { unsigned int iclk_ctrl1, iclk_ctrl2; adav80x->clk_src = clk_id; if (clk_id == ADAV80X_CLK_XTAL) clk_id = ADAV80X_CLK_XIN; iclk_ctrl1 = ADAV80X_ICLK_CTRL1_DAC_SRC(clk_id) | ADAV80X_ICLK_CTRL1_ADC_SRC(clk_id) | ADAV80X_ICLK_CTRL1_ICLK2_SRC(clk_id); iclk_ctrl2 = ADAV80X_ICLK_CTRL2_ICLK1_SRC(clk_id); regmap_write(adav80x->regmap, ADAV80X_ICLK_CTRL1, iclk_ctrl1); regmap_write(adav80x->regmap, ADAV80X_ICLK_CTRL2, iclk_ctrl2); snd_soc_dapm_sync(dapm); } } else { unsigned int mask; switch (clk_id) { case ADAV80X_CLK_SYSCLK1: case ADAV80X_CLK_SYSCLK2: case ADAV80X_CLK_SYSCLK3: break; default: return -EINVAL; } clk_id -= ADAV80X_CLK_SYSCLK1; mask = ADAV80X_PLL_OUTE_SYSCLKPD(clk_id); if (freq == 0) { regmap_update_bits(adav80x->regmap, ADAV80X_PLL_OUTE, mask, mask); adav80x->sysclk_pd[clk_id] = true; } else { regmap_update_bits(adav80x->regmap, ADAV80X_PLL_OUTE, mask, 0); adav80x->sysclk_pd[clk_id] = false; } snd_soc_dapm_mutex_lock(dapm); if (adav80x->sysclk_pd[0]) snd_soc_dapm_disable_pin_unlocked(dapm, "PLL1"); else snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL1"); if (adav80x->sysclk_pd[1] || adav80x->sysclk_pd[2]) snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2"); else snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2"); snd_soc_dapm_sync_unlocked(dapm); snd_soc_dapm_mutex_unlock(dapm); } return 0; }