static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_card *card = runtime->card; const struct snd_soc_dapm_route *custom_map; int num_routes; card->dapm.idle_bias_off = true; dmi_check_system(byt_rt5651_quirk_table); switch (BYT_RT5651_MAP(byt_rt5651_quirk)) { case BYT_RT5651_IN1_MAP: custom_map = byt_rt5651_intmic_in1_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_map); break; case BYT_RT5651_DMIC2_MAP: custom_map = byt_rt5651_intmic_dmic2_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic2_map); break; default: custom_map = byt_rt5651_intmic_dmic1_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic1_map); } ret = snd_soc_add_card_controls(card, byt_rt5651_controls, ARRAY_SIZE(byt_rt5651_controls)); if (ret) { dev_err(card->dev, "unable to add card controls\n"); return ret; } snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone"); snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker"); return ret; }
static int neo1973_gta02_wm8753_init(struct snd_soc_codec *codec) { struct snd_soc_dapm_context *dapm = &codec->dapm; int ret; ret = snd_soc_dapm_new_controls(dapm, neo1973_gta02_wm8753_dapm_widgets, ARRAY_SIZE(neo1973_gta02_wm8753_dapm_widgets)); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, neo1973_gta02_routes, ARRAY_SIZE(neo1973_gta02_routes)); if (ret) return ret; ret = snd_soc_add_card_controls(codec->card, neo1973_gta02_wm8753_controls, ARRAY_SIZE(neo1973_gta02_wm8753_controls)); if (ret) return ret; snd_soc_dapm_disable_pin(dapm, "Stereo Out"); snd_soc_dapm_disable_pin(dapm, "Handset Spk"); snd_soc_dapm_ignore_suspend(dapm, "Stereo Out"); snd_soc_dapm_ignore_suspend(dapm, "Handset Spk"); return 0; }
static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; int ret; /* set up NC codec pins */ if (machine_is_neo1973_gta01()) { snd_soc_dapm_nc_pin(dapm, "LOUT2"); snd_soc_dapm_nc_pin(dapm, "ROUT2"); } snd_soc_dapm_nc_pin(dapm, "OUT3"); snd_soc_dapm_nc_pin(dapm, "OUT4"); snd_soc_dapm_nc_pin(dapm, "LINE1"); snd_soc_dapm_nc_pin(dapm, "LINE2"); /* Add neo1973 specific widgets */ ret = snd_soc_dapm_new_controls(dapm, neo1973_wm8753_dapm_widgets, ARRAY_SIZE(neo1973_wm8753_dapm_widgets)); if (ret) return ret; /* add neo1973 specific controls */ ret = snd_soc_add_controls(codec, neo1973_wm8753_controls, ARRAY_SIZE(neo1973_wm8753_controls)); if (ret) return ret; /* set up neo1973 specific audio routes */ ret = snd_soc_dapm_add_routes(dapm, neo1973_wm8753_routes, ARRAY_SIZE(neo1973_wm8753_routes)); if (ret) return ret; /* set endpoints to default off mode */ snd_soc_dapm_disable_pin(dapm, "GSM Line Out"); snd_soc_dapm_disable_pin(dapm, "GSM Line In"); snd_soc_dapm_disable_pin(dapm, "Headset Mic"); snd_soc_dapm_disable_pin(dapm, "Handset Mic"); /* allow audio paths from the GSM modem to run during suspend */ snd_soc_dapm_ignore_suspend(dapm, "GSM Line Out"); snd_soc_dapm_ignore_suspend(dapm, "GSM Line In"); snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); if (machine_is_neo1973_gta02()) { ret = neo1973_gta02_wm8753_init(codec); if (ret) return ret; } return 0; }
static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; int ret; /* */ snd_soc_dapm_nc_pin(dapm, "OUT3"); snd_soc_dapm_nc_pin(dapm, "OUT4"); snd_soc_dapm_nc_pin(dapm, "LINE1"); snd_soc_dapm_nc_pin(dapm, "LINE2"); /* */ ret = snd_soc_dapm_new_controls(dapm, neo1973_wm8753_dapm_widgets, ARRAY_SIZE(neo1973_wm8753_dapm_widgets)); if (ret) return ret; /* */ ret = snd_soc_add_card_controls(rtd->card, neo1973_wm8753_controls, ARRAY_SIZE(neo1973_wm8753_controls)); if (ret) return ret; /* */ ret = snd_soc_dapm_add_routes(dapm, neo1973_wm8753_routes, ARRAY_SIZE(neo1973_wm8753_routes)); if (ret) return ret; /* */ snd_soc_dapm_disable_pin(dapm, "GSM Line Out"); snd_soc_dapm_disable_pin(dapm, "GSM Line In"); snd_soc_dapm_disable_pin(dapm, "Headset Mic"); snd_soc_dapm_disable_pin(dapm, "Handset Mic"); /* */ snd_soc_dapm_ignore_suspend(dapm, "GSM Line Out"); snd_soc_dapm_ignore_suspend(dapm, "GSM Line In"); snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "Handset Mic"); if (machine_is_neo1973_gta02()) { ret = neo1973_gta02_wm8753_init(codec); if (ret) return ret; } return 0; }
int ctp_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_codec *codec = runtime->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_card *card = runtime->card; struct ctp_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); /* Set codec bias level */ ctp_set_bias_level(card, dapm, SND_SOC_BIAS_OFF); card->dapm.idle_bias_off = true; /* Add Jack specific widgets */ ret = snd_soc_dapm_new_controls(dapm, ctp_dapm_widgets, ARRAY_SIZE(ctp_dapm_widgets)); if (ret) return ret; /* Set up Jack specific audio path audio_map */ snd_soc_dapm_add_routes(dapm, ctp_audio_map, ARRAY_SIZE(ctp_audio_map)); /* Add Comms specefic controls */ ctx->comms_ctl.ssp_bt_sco_master_mode = false; ctx->comms_ctl.ssp_voip_master_mode = false; ctx->comms_ctl.ssp_modem_master_mode = false; ret = snd_soc_add_card_controls(card, ssp_comms_controls, ARRAY_SIZE(ssp_comms_controls)); if (ret) { pr_err("Add Comms Controls failed %d", ret); return ret; } /* Keep the voice call paths active during suspend. Mark the end points ignore_suspend */ snd_soc_dapm_ignore_suspend(dapm, "EAROUT"); snd_soc_dapm_ignore_suspend(dapm, "HPOUTA"); snd_soc_dapm_ignore_suspend(dapm, "HPOUTB"); snd_soc_dapm_ignore_suspend(dapm, "VSPOUT"); snd_soc_dapm_disable_pin(dapm, "MIC2"); snd_soc_dapm_disable_pin(dapm, "SPKLINEOUT"); snd_soc_dapm_ignore_suspend(dapm, "SPKOUT"); mutex_lock(&codec->mutex); snd_soc_dapm_sync(dapm); mutex_unlock(&codec->mutex); return ret; }
static int neo1973_lm4857_init(struct snd_soc_dapm_context *dapm) { int ret; ret = snd_soc_dapm_new_controls(dapm, neo1973_lm4857_dapm_widgets, ARRAY_SIZE(neo1973_lm4857_dapm_widgets)); if (ret) return ret; ret = snd_soc_dapm_add_routes(dapm, neo1973_lm4857_routes, ARRAY_SIZE(neo1973_lm4857_routes)); if (ret) return ret; snd_soc_dapm_ignore_suspend(dapm, "Stereo Out"); snd_soc_dapm_ignore_suspend(dapm, "Handset Spk"); snd_soc_dapm_ignore_suspend(dapm, "Headphone"); return 0; }
static int byt_alc5645_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_codec *codec = runtime->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_card *card = runtime->card; alc5645.codec = codec; mutex_init(&alc5645.mutex); alc5645.jack_status = false; pr_info("Enter:%s", __func__); /* Set codec bias level */ card->dapm.idle_bias_off = true; /* codec init registers */ /* TODO */ /* Keep the voice call paths active during suspend. Mark the end points ignore_suspend */ /*TODO: CHECK this */ snd_soc_dapm_ignore_suspend(dapm, "HPOL"); snd_soc_dapm_ignore_suspend(dapm, "HPOR"); snd_soc_dapm_ignore_suspend(dapm, "SPOL"); snd_soc_dapm_ignore_suspend(dapm, "SPOR"); snd_soc_dapm_ignore_suspend(dapm, "IN2P"); snd_soc_dapm_ignore_suspend(dapm, "IN2N"); snd_soc_dapm_ignore_suspend(dapm, "IN1P"); snd_soc_dapm_ignore_suspend(dapm, "IN1N"); snd_soc_dapm_enable_pin(dapm, "Headphone"); snd_soc_dapm_enable_pin(dapm, "Ext Spk"); snd_soc_dapm_enable_pin(dapm, "Headset AMIC"); snd_soc_dapm_enable_pin(dapm, "AMIC"); snd_soc_dapm_enable_pin(dapm, "IN2P"); snd_soc_dapm_enable_pin(dapm, "IN2N"); snd_soc_dapm_disable_pin(dapm, "DMIC"); snd_soc_dapm_disable_pin(dapm, "DMIC L2"); snd_soc_dapm_disable_pin(dapm, "DMIC R2"); snd_soc_dapm_disable_pin(dapm, "DMIC L1"); snd_soc_dapm_disable_pin(dapm, "DMIC R1"); snd_soc_dapm_disable_pin(dapm, "PDM1R"); snd_soc_dapm_disable_pin(dapm, "PDM1L"); snd_soc_dapm_disable_pin(dapm, "LOUTL"); snd_soc_dapm_disable_pin(dapm, "LOUTR"); mutex_lock(&codec->mutex); snd_soc_dapm_sync(dapm); mutex_unlock(&codec->mutex); return 0; }
static int neo1973_wm8753_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_card *card = rtd->card; /* set up NC codec pins */ snd_soc_dapm_nc_pin(&codec->dapm, "OUT3"); snd_soc_dapm_nc_pin(&codec->dapm, "OUT4"); snd_soc_dapm_nc_pin(&codec->dapm, "LINE1"); snd_soc_dapm_nc_pin(&codec->dapm, "LINE2"); /* set endpoints to default off mode */ snd_soc_dapm_disable_pin(&card->dapm, "GSM Line Out"); snd_soc_dapm_disable_pin(&card->dapm, "GSM Line In"); snd_soc_dapm_disable_pin(&card->dapm, "Headset Mic"); snd_soc_dapm_disable_pin(&card->dapm, "Handset Mic"); snd_soc_dapm_disable_pin(&card->dapm, "Stereo Out"); snd_soc_dapm_disable_pin(&card->dapm, "Handset Spk"); /* allow audio paths from the GSM modem to run during suspend */ snd_soc_dapm_ignore_suspend(&card->dapm, "GSM Line Out"); snd_soc_dapm_ignore_suspend(&card->dapm, "GSM Line In"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(&card->dapm, "Handset Mic"); snd_soc_dapm_ignore_suspend(&card->dapm, "Stereo Out"); snd_soc_dapm_ignore_suspend(&card->dapm, "Handset Spk"); return 0; }
static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_codec *codec = runtime->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_card *card = runtime->card; card->dapm.idle_bias_off = true; ret = snd_soc_add_card_controls(card, byt_rt5640_controls, ARRAY_SIZE(byt_rt5640_controls)); if (ret) { dev_err(card->dev, "unable to add card controls\n"); return ret; } snd_soc_dapm_ignore_suspend(dapm, "HPOL"); snd_soc_dapm_ignore_suspend(dapm, "HPOR"); snd_soc_dapm_ignore_suspend(dapm, "SPOLP"); snd_soc_dapm_ignore_suspend(dapm, "SPOLN"); snd_soc_dapm_ignore_suspend(dapm, "SPORP"); snd_soc_dapm_ignore_suspend(dapm, "SPORN"); return ret; }
static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; int ret; /* Add SDP4430 specific controls */ ret = snd_soc_add_controls(codec, sdp4430_controls, ARRAY_SIZE(sdp4430_controls)); if (ret) return ret; /* Add SDP4430 specific widgets */ ret = snd_soc_dapm_new_controls(codec->dapm, sdp4430_twl6040_dapm_widgets, ARRAY_SIZE(sdp4430_twl6040_dapm_widgets)); if (ret) return ret; /* Set up SDP4430 specific audio path audio_map */ snd_soc_dapm_add_routes(codec->dapm, audio_map, ARRAY_SIZE(audio_map)); /* SDP4430 connected pins */ snd_soc_dapm_enable_pin(codec->dapm, "Ext Mic"); snd_soc_dapm_enable_pin(codec->dapm, "Ext Spk"); snd_soc_dapm_enable_pin(codec->dapm, "AFML"); snd_soc_dapm_enable_pin(codec->dapm, "AFMR"); snd_soc_dapm_disable_pin(codec->dapm, "Headset Mic"); snd_soc_dapm_disable_pin(codec->dapm, "Headset Stereophone"); /* allow audio paths from the audio modem to run during suspend */ snd_soc_dapm_ignore_suspend(codec, "Ext Mic"); snd_soc_dapm_ignore_suspend(codec, "Ext Spk"); snd_soc_dapm_ignore_suspend(codec, "AFML"); snd_soc_dapm_ignore_suspend(codec, "AFMR"); snd_soc_dapm_ignore_suspend(codec, "Headset Mic"); snd_soc_dapm_ignore_suspend(codec, "Headset Stereophone"); ret = snd_soc_dapm_sync(codec->dapm); if (ret) return ret; /*Headset jack detection */ ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) return ret; ret = snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), hs_jack_pins); if (machine_is_omap_4430sdp()) twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET); else snd_soc_jack_report(&hs_jack, SND_JACK_HEADSET, SND_JACK_HEADSET); /* wait 500 ms before switching of HS power */ rtd->pmdown_time = 500; return ret; }
static int speyside_late_probe(struct snd_soc_card *card) { snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(&card->dapm, "Main AMIC"); snd_soc_dapm_ignore_suspend(&card->dapm, "Main DMIC"); snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker"); snd_soc_dapm_ignore_suspend(&card->dapm, "WM1250 Output"); snd_soc_dapm_ignore_suspend(&card->dapm, "WM1250 Input"); return 0; }
static int adonisuniv_late_probe(struct snd_soc_card *card) { struct snd_soc_codec *codec = card->rtd[0].codec; struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai; struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai; struct wm5102_machine_priv *priv = snd_soc_card_get_drvdata(codec->card); int i, ret; priv->codec = codec; the_codec = codec; for (i = 0; i < 3; i++) priv->aif[i] = card->rtd[i].codec_dai; codec_dai->driver->playback.channels_max = cpu_dai->driver->playback.channels_max; /* close codec device immediately when pcm is closed */ codec->ignore_pmdown_time = true; snd_soc_dapm_ignore_suspend(&codec->dapm, "RCV"); snd_soc_dapm_ignore_suspend(&codec->dapm, "VPS"); snd_soc_dapm_ignore_suspend(&codec->dapm, "SPK"); snd_soc_dapm_ignore_suspend(&codec->dapm, "HP"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF2 Playback"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF2 Capture"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF3 Playback"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF3 Capture"); adonisuniv_set_media_clocking(priv); ret = snd_soc_add_codec_controls(codec, adonisuniv_codec_controls, ARRAY_SIZE(adonisuniv_codec_controls)); if (ret < 0) { dev_err(codec->dev, "Failed to add controls to codec: %d\n", ret); return ret; } dev_info(codec->dev, "%s: Successfully created\n", __func__); return snd_soc_dapm_sync(&codec->dapm); }
static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_codec *codec = runtime->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_card *card = runtime->card; const struct snd_soc_dapm_route *custom_map; int num_routes; card->dapm.idle_bias_off = true; ret = snd_soc_add_card_controls(card, byt_rt5640_controls, ARRAY_SIZE(byt_rt5640_controls)); if (ret) { dev_err(card->dev, "unable to add card controls\n"); return ret; } dmi_check_system(byt_rt5640_quirk_table); switch (BYT_RT5640_MAP(byt_rt5640_quirk)) { case BYT_RT5640_IN1_MAP: custom_map = byt_rt5640_intmic_in1_map; num_routes = ARRAY_SIZE(byt_rt5640_intmic_in1_map); break; case BYT_RT5640_DMIC2_MAP: custom_map = byt_rt5640_intmic_dmic2_map; num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic2_map); break; default: custom_map = byt_rt5640_intmic_dmic1_map; num_routes = ARRAY_SIZE(byt_rt5640_intmic_dmic1_map); } ret = snd_soc_dapm_add_routes(dapm, custom_map, num_routes); if (ret) return ret; if (byt_rt5640_quirk & BYT_RT5640_DMIC_EN) { ret = rt5640_dmic_enable(codec, 0, 0); if (ret) return ret; } snd_soc_dapm_ignore_suspend(dapm, "HPOL"); snd_soc_dapm_ignore_suspend(dapm, "HPOR"); snd_soc_dapm_ignore_suspend(dapm, "SPOLP"); snd_soc_dapm_ignore_suspend(dapm, "SPOLN"); snd_soc_dapm_ignore_suspend(dapm, "SPORP"); snd_soc_dapm_ignore_suspend(dapm, "SPORN"); return ret; }
static int kylew_late_probe(struct snd_soc_card *card) { struct snd_soc_codec *codec = list_first_entry(&card->codec_dev_list, struct snd_soc_codec, card_list); vbc_add_controls(codec); kylew_ext_control(&card->dapm); #if 0 snd_soc_dapm_ignore_suspend(&card->dapm, "Mic Jack"); snd_soc_dapm_ignore_suspend(&card->dapm, "HP Mic Jack"); #endif snd_soc_dapm_ignore_suspend(&card->dapm, "Line Jack"); snd_soc_dapm_ignore_suspend(&card->dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(&card->dapm, "Ext Ear"); snd_soc_dapm_ignore_suspend(&card->dapm, "HeadPhone Jack"); return 0; }
static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime) { struct snd_soc_card *card = runtime->card; struct snd_soc_component *codec = runtime->codec_dai->component; struct byt_rt5651_private *priv = snd_soc_card_get_drvdata(card); const struct snd_soc_dapm_route *custom_map; int num_routes; int ret; card->dapm.idle_bias_off = true; /* Start with RC clk for jack-detect (we disable MCLK below) */ if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) snd_soc_component_update_bits(codec, RT5651_GLB_CLK, RT5651_SCLK_SRC_MASK, RT5651_SCLK_SRC_RCCLK); switch (BYT_RT5651_MAP(byt_rt5651_quirk)) { case BYT_RT5651_IN1_MAP: custom_map = byt_rt5651_intmic_in1_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_map); break; case BYT_RT5651_IN2_MAP: custom_map = byt_rt5651_intmic_in2_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_in2_map); break; case BYT_RT5651_IN1_IN2_MAP: custom_map = byt_rt5651_intmic_in1_in2_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_in1_in2_map); break; default: custom_map = byt_rt5651_intmic_dmic_map; num_routes = ARRAY_SIZE(byt_rt5651_intmic_dmic_map); } ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes); if (ret) return ret; if (byt_rt5651_quirk & BYT_RT5651_SSP2_AIF2) { ret = snd_soc_dapm_add_routes(&card->dapm, byt_rt5651_ssp2_aif2_map, ARRAY_SIZE(byt_rt5651_ssp2_aif2_map)); } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF1) { ret = snd_soc_dapm_add_routes(&card->dapm, byt_rt5651_ssp0_aif1_map, ARRAY_SIZE(byt_rt5651_ssp0_aif1_map)); } else if (byt_rt5651_quirk & BYT_RT5651_SSP0_AIF2) { ret = snd_soc_dapm_add_routes(&card->dapm, byt_rt5651_ssp0_aif2_map, ARRAY_SIZE(byt_rt5651_ssp0_aif2_map)); } else { ret = snd_soc_dapm_add_routes(&card->dapm, byt_rt5651_ssp2_aif1_map, ARRAY_SIZE(byt_rt5651_ssp2_aif1_map)); } if (ret) return ret; ret = snd_soc_add_card_controls(card, byt_rt5651_controls, ARRAY_SIZE(byt_rt5651_controls)); if (ret) { dev_err(card->dev, "unable to add card controls\n"); return ret; } snd_soc_dapm_ignore_suspend(&card->dapm, "Headphone"); snd_soc_dapm_ignore_suspend(&card->dapm, "Speaker"); if (byt_rt5651_quirk & BYT_RT5651_MCLK_EN) { /* * The firmware might enable the clock at * boot (this information may or may not * be reflected in the enable clock register). * To change the rate we must disable the clock * first to cover these cases. Due to common * clock framework restrictions that do not allow * to disable a clock that has not been enabled, * we need to enable the clock first. */ ret = clk_prepare_enable(priv->mclk); if (!ret) clk_disable_unprepare(priv->mclk); if (byt_rt5651_quirk & BYT_RT5651_MCLK_25MHZ) ret = clk_set_rate(priv->mclk, 25000000); else ret = clk_set_rate(priv->mclk, 19200000); if (ret) dev_err(card->dev, "unable to set MCLK rate\n"); } if (BYT_RT5651_JDSRC(byt_rt5651_quirk)) { ret = snd_soc_card_jack_new(runtime->card, "Headset", SND_JACK_HEADSET | SND_JACK_BTN_0, &priv->jack, bytcr_jack_pins, ARRAY_SIZE(bytcr_jack_pins)); if (ret) { dev_err(runtime->dev, "jack creation failed %d\n", ret); return ret; } snd_jack_set_key(priv->jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE); ret = snd_soc_component_set_jack(codec, &priv->jack, NULL); if (ret) return ret; } return 0; }
static int sdp4430_twl6040_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct twl6040 *twl6040 = codec->control_data; struct snd_soc_dapm_context *dapm = &codec->dapm; int hsotrim, left_offset, right_offset, mode, ret; /* Add SDP4430 specific controls */ ret = snd_soc_add_controls(codec, sdp4430_controls, ARRAY_SIZE(sdp4430_controls)); if (ret) return ret; /* Add SDP4430 specific widgets */ ret = snd_soc_dapm_new_controls(dapm, sdp4430_twl6040_dapm_widgets, ARRAY_SIZE(sdp4430_twl6040_dapm_widgets)); if (ret) return ret; /* Set up SDP4430 specific audio path audio_map */ snd_soc_dapm_add_routes(dapm, audio_map, ARRAY_SIZE(audio_map)); /* SDP4430 connected pins */ snd_soc_dapm_enable_pin(dapm, "Ext Mic"); snd_soc_dapm_enable_pin(dapm, "Ext Spk"); snd_soc_dapm_enable_pin(dapm, "AFML"); snd_soc_dapm_enable_pin(dapm, "AFMR"); snd_soc_dapm_enable_pin(dapm, "Headset Mic"); snd_soc_dapm_enable_pin(dapm, "Headset Stereophone"); /* allow audio paths from the audio modem to run during suspend */ snd_soc_dapm_ignore_suspend(dapm, "Ext Mic"); snd_soc_dapm_ignore_suspend(dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(dapm, "AFML"); snd_soc_dapm_ignore_suspend(dapm, "AFMR"); snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "Headset Stereophone"); snd_soc_dapm_ignore_suspend(dapm, "Digital Mic 0"); snd_soc_dapm_ignore_suspend(dapm, "Digital Mic 1"); snd_soc_dapm_ignore_suspend(dapm, "Digital Mic 2"); ret = snd_soc_dapm_sync(dapm); if (ret) return ret; /* Headset jack detection */ ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) return ret; ret = snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), hs_jack_pins); if (machine_is_omap_4430sdp() || machine_is_omap_tabletblaze() || machine_is_omap4_panda()) twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET); else snd_soc_jack_report(&hs_jack, SND_JACK_HEADSET, SND_JACK_HEADSET); /* DC offset cancellation computation */ hsotrim = snd_soc_read(codec, TWL6040_REG_HSOTRIM); right_offset = (hsotrim & TWL6040_HSRO) >> TWL6040_HSRO_OFFSET; left_offset = hsotrim & TWL6040_HSLO; if (twl6040_get_icrev(twl6040) < TWL6040_REV_1_3) /* For ES under ES_1.3 HS step is 2 mV */ mode = 2; else /* For ES_1.3 HS step is 1 mV */ mode = 1; abe_dsp_set_hs_offset(left_offset, right_offset, mode); /* don't wait before switching of HS power */ rtd->pmdown_time = 0; return ret; }
int ctp_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_codec *codec = runtime->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_card *card = runtime->card; struct ctp_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); //#ifndef UART_DEBUG // static int hp_enable; //#endif pr_debug("%s\n", __func__); /* Set codec bias level */ ctp_set_bias_level(card, dapm, SND_SOC_BIAS_OFF); card->dapm.idle_bias_off = true; /* Add Jack specific widgets */ ret = snd_soc_dapm_new_controls(dapm, ctp_dapm_widgets, ARRAY_SIZE(ctp_dapm_widgets)); if (ret) return ret; /* Set up Jack specific audio path audio_map */ snd_soc_dapm_add_routes(dapm, ctp_audio_map, ARRAY_SIZE(ctp_audio_map)); /* Add Comms specefic controls */ ctx->comms_ctl.ssp_bt_sco_master_mode = false; /* Set ssp_voip to master mode by default */ #if 0 ctx->comms_ctl.ssp_voip_master_mode = false; #else ctx->comms_ctl.ssp_voip_master_mode = true; pr_debug("ctp_init ssp_voip_master_mode %d\n", ctx->comms_ctl.ssp_voip_master_mode); #endif ctx->comms_ctl.ssp_modem_master_mode = false; ret = snd_soc_add_card_controls(card, ssp_comms_controls, ARRAY_SIZE(ssp_comms_controls)); if (ret) { pr_err("Add Comms Controls failed %d", ret); return ret; } /* Keep the voice call paths active during suspend. Mark the end points ignore_suspend */ snd_soc_dapm_ignore_suspend(dapm, "HPOL"); snd_soc_dapm_ignore_suspend(dapm, "HPOR"); snd_soc_dapm_ignore_suspend(dapm, "SPOL"); snd_soc_dapm_ignore_suspend(dapm, "SPOR"); snd_soc_dapm_ignore_suspend(dapm, "AIF2 Playback"); snd_soc_dapm_ignore_suspend(dapm, "AIF2 Capture"); snd_soc_dapm_ignore_suspend(dapm, "AIF2TX"); snd_soc_dapm_ignore_suspend(dapm, "AIF2RX"); snd_soc_dapm_ignore_suspend(dapm, "MonoP"); snd_soc_dapm_ignore_suspend(dapm, "MonoN"); snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "Headphone"); snd_soc_dapm_ignore_suspend(dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(dapm, "Int Mic"); snd_soc_dapm_ignore_suspend(dapm, "Receiver"); snd_soc_dapm_ignore_suspend(dapm, "DMIC L2"); snd_soc_dapm_ignore_suspend(dapm, "DMIC R2"); snd_soc_dapm_ignore_suspend(dapm, "IN1P"); snd_soc_dapm_ignore_suspend(dapm, "IN1N"); snd_soc_dapm_ignore_suspend(dapm, "IN2P"); snd_soc_dapm_ignore_suspend(dapm, "IN2N"); snd_soc_dapm_enable_pin(dapm, "Headset Mic"); snd_soc_dapm_enable_pin(dapm, "Headphone"); snd_soc_dapm_enable_pin(dapm, "Ext Spk"); snd_soc_dapm_enable_pin(dapm, "Int Mic"); snd_soc_dapm_enable_pin(dapm, "Receiver"); mutex_lock(&codec->mutex); snd_soc_dapm_sync(dapm); mutex_unlock(&codec->mutex); /*Register switch Control as misc driver*/ ret = misc_register(&switch_ctrl); if (ret) pr_err("%s: couldn't register control device\n", __func__); rt5647_codec = codec; //#ifndef UART_DEBUG // /* use hard-coded GPIO value before IFWI ready */ // /* hp_enable = get_gpio_by_name("AUDIO_DEBUG"); */ // hp_enable = 172; // if (hp_enable > 0) { // pr_info("Get AUDIO_DEBUG name!\n"); // ret = gpio_request_one(hp_enable, GPIOF_DIR_OUT, "AUDIO_DEBUG"); // if (ret) // pr_err("gpio_request AUDIO_DEBUG failed!\n"); // // /*Set GPIO O(H) to default => Low:UART; High:headset */ // gpio_direction_output(hp_enable, 1); // pr_info("AUDIO_DEBUG value = %d\n", gpio_get_value(hp_enable)); // } else // pr_err("get_gpio AUDIO_DEBUG failed!\n"); //#endif return ret; }
static int ctp_wm5102_init(struct snd_soc_pcm_runtime *runtime) { int ret; struct snd_soc_card *card = runtime->card; struct ctp_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card); struct snd_soc_codec *codec; struct snd_soc_dapm_context *dapm; codec = ctp_get_codec(card, "wm5102-codec"); if (!codec) return -EIO; dapm = &codec->dapm; /* Set codec bias level */ ctp_set_bias_level(card, dapm, SND_SOC_BIAS_OFF); card->dapm.idle_bias_off = true; /* Disable MICBIAS3 bypass mode and set CAP mode. * Capacitors are connected to DMIC on 1525-EV1 board */ snd_soc_update_bits(codec, ARIZONA_MIC_BIAS_CTRL_3, ARIZONA_MICB1_BYPASS_MASK | ARIZONA_MICB1_EXT_CAP_MASK, ARIZONA_MICB1_EXT_CAP); /* Set codec clock */ ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK, ARIZONA_CLK_SRC_FLL1, SYSCLK_RATE, SND_SOC_CLOCK_IN); if (ret != 0) { pr_err("failed: %d\n", ret); return ret; } /* Add Jack specific widgets */ ret = snd_soc_dapm_new_controls(dapm, ctp_dapm_widgets, ARRAY_SIZE(ctp_dapm_widgets)); if (ret) return ret; /* Set up Jack specific audio path audio_map */ snd_soc_dapm_add_routes(dapm, ctp_audio_map, ARRAY_SIZE(ctp_audio_map)); /* Add Comms specefic controls */ ctx->comms_ctl.ssp_bt_sco_master_mode = false; ctx->comms_ctl.ssp_voip_master_mode = false; ctx->comms_ctl.ssp_modem_master_mode = false; ret = snd_soc_add_card_controls(card, ssp_comms_controls, ARRAY_SIZE(ssp_comms_controls)); if (ret) { pr_err("Add Comms Controls failed %d", ret); return ret; } /* Keep the voice call paths active during suspend. Mark the end points ignore_suspend */ snd_soc_dapm_ignore_suspend(dapm, "HPOUT1R"); snd_soc_dapm_ignore_suspend(dapm, "HPOUT1L"); snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); snd_soc_dapm_disable_pin(dapm, "SPKOUTLP"); snd_soc_dapm_disable_pin(dapm, "SPKOUTLN"); snd_soc_dapm_ignore_suspend(dapm, "SPKOUTRP"); snd_soc_dapm_ignore_suspend(dapm, "SPKOUTRN"); mutex_lock(&codec->mutex); snd_soc_dapm_sync(dapm); mutex_unlock(&codec->mutex); return ret; }
static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_card *card = codec->card; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dapm_context *dapm = &codec->dapm; struct omap_abe_twl6040_data *pdata = dev_get_platdata(card->dev); struct omap_abe_data *card_data = snd_soc_card_get_drvdata(card); u32 hsotrim, left_offset, right_offset, step_mV; int ret = 0; /* Disable not connected paths if not used */ twl6040_disconnect_pin(dapm, pdata->has_hs, "Headset Stereophone"); twl6040_disconnect_pin(dapm, pdata->has_hf, "Ext Spk"); twl6040_disconnect_pin(dapm, pdata->has_ep, "Earphone Spk"); twl6040_disconnect_pin(dapm, pdata->has_aux, "Line Out"); twl6040_disconnect_pin(dapm, pdata->has_vibra, "Vibrator"); twl6040_disconnect_pin(dapm, pdata->has_hsmic, "Headset Mic"); twl6040_disconnect_pin(dapm, pdata->has_mainmic, "Main Handset Mic"); twl6040_disconnect_pin(dapm, pdata->has_submic, "Sub Handset Mic"); twl6040_disconnect_pin(dapm, pdata->has_afm, "Line In"); /* allow audio paths from the audio modem to run during suspend */ snd_soc_dapm_ignore_suspend(&card->dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(dapm, "AFML"); snd_soc_dapm_ignore_suspend(dapm, "AFMR"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Stereophone"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 0"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 1"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 2"); /* DC offset cancellation computation only if ABE is enabled */ if (pdata->has_abe) { hsotrim = twl6040_get_trim_value(codec, TWL6040_TRIM_HSOTRIM); right_offset = TWL6040_HSF_TRIM_RIGHT(hsotrim); left_offset = TWL6040_HSF_TRIM_LEFT(hsotrim); step_mV = twl6040_get_hs_step_size(codec); omap_abe_dc_set_hs_offset(platform, left_offset, right_offset, step_mV); } /* Headset jack detection only if it is supported */ ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) return ret; ret = snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), hs_jack_pins); if (pdata->jack_detection) twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET); else snd_soc_jack_report(&hs_jack, SND_JACK_HEADSET, SND_JACK_HEADSET); /* Only configure the TPS6130x on SDP4430 */ if (machine_is_omap_4430sdp()) { card_data->adapter = i2c_get_adapter(1); if (!card_data->adapter) { dev_err(card->dev, "can't get i2c adapter\n"); return -ENODEV; } card_data->tps6130x = i2c_new_device(card_data->adapter, &tps6130x_hwmon_info); if (!card_data->tps6130x) { dev_err(card->dev, "can't add i2c device\n"); i2c_put_adapter(card_data->adapter); return -ENODEV; } omap_abe_tps6130x_configure(card_data); } return ret; }
static int midas_wm1811_init_paiftx(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct wm1811_machine_priv *wm1811 = snd_soc_card_get_drvdata(codec->card); struct snd_soc_dai *aif1_dai = rtd->codec_dai; struct wm8994 *control = codec->control_data; struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec); int ret; #ifdef SND_USE_BIAS_LEVEL midas_aif1_dai = aif1_dai; #endif #ifdef CONFIG_MACH_GC1 wm1811_codec = codec; #endif midas_snd_set_mclk(true, false); rtd->codec_dai->driver->playback.channels_max = rtd->cpu_dai->driver->playback.channels_max; ret = snd_soc_add_controls(codec, midas_controls, ARRAY_SIZE(midas_controls)); ret = snd_soc_dapm_new_controls(&codec->dapm, midas_dapm_widgets, ARRAY_SIZE(midas_dapm_widgets)); if (ret != 0) dev_err(codec->dev, "Failed to add DAPM widgets: %d\n", ret); ret = snd_soc_dapm_add_routes(&codec->dapm, midas_dapm_routes, ARRAY_SIZE(midas_dapm_routes)); if (ret != 0) dev_err(codec->dev, "Failed to add DAPM routes: %d\n", ret); ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2, MIDAS_DEFAULT_MCLK2, SND_SOC_CLOCK_IN); if (ret < 0) dev_err(codec->dev, "Failed to boot clocking\n"); /* Force AIF1CLK on as it will be master for jack detection */ if (wm8994->revision > 1) { ret = snd_soc_dapm_force_enable_pin(&codec->dapm, "AIF1CLK"); if (ret < 0) dev_err(codec->dev, "Failed to enable AIF1CLK: %d\n", ret); } ret = snd_soc_dapm_disable_pin(&codec->dapm, "S5P RP"); if (ret < 0) dev_err(codec->dev, "Failed to disable S5P RP: %d\n", ret); snd_soc_dapm_ignore_suspend(&codec->dapm, "RCV"); snd_soc_dapm_ignore_suspend(&codec->dapm, "SPK"); snd_soc_dapm_ignore_suspend(&codec->dapm, "HP"); snd_soc_dapm_ignore_suspend(&codec->dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(&codec->dapm, "Sub Mic"); snd_soc_dapm_ignore_suspend(&codec->dapm, "Main Mic"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF1DACDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF2DACDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF3DACDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF1ADCDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF2ADCDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "AIF3ADCDAT"); snd_soc_dapm_ignore_suspend(&codec->dapm, "FM In"); snd_soc_dapm_ignore_suspend(&codec->dapm, "LINE"); snd_soc_dapm_ignore_suspend(&codec->dapm, "HDMI"); snd_soc_dapm_ignore_suspend(&codec->dapm, "Third Mic"); wm1811->codec = codec; midas_micd_set_rate(codec); #ifdef CONFIG_SEC_DEV_JACK /* By default use idle_bias_off, will override for WM8994 */ codec->dapm.idle_bias_off = 0; #else /* CONFIG_SEC_DEV_JACK */ wm1811->jack.status = 0; ret = snd_soc_jack_new(codec, "Midas Jack", SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2, &wm1811->jack); if (ret < 0) dev_err(codec->dev, "Failed to create jack: %d\n", ret); ret = snd_jack_set_key(wm1811->jack.jack, SND_JACK_BTN_0, KEY_MEDIA); if (ret < 0) dev_err(codec->dev, "Failed to set KEY_MEDIA: %d\n", ret); ret = snd_jack_set_key(wm1811->jack.jack, SND_JACK_BTN_1, KEY_VOLUMEDOWN); if (ret < 0) dev_err(codec->dev, "Failed to set KEY_VOLUMEUP: %d\n", ret); ret = snd_jack_set_key(wm1811->jack.jack, SND_JACK_BTN_2, KEY_VOLUMEUP); if (ret < 0) dev_err(codec->dev, "Failed to set KEY_VOLUMEDOWN: %d\n", ret); if (wm8994->revision > 1) { dev_info(codec->dev, "wm1811: Rev %c support mic detection\n", 'A' + wm8994->revision); ret = wm8958_mic_detect(codec, &wm1811->jack, midas_micdet, wm1811); if (ret < 0) dev_err(codec->dev, "Failed start detection: %d\n", ret); } else { dev_info(codec->dev, "wm1811: Rev %c doesn't support mic detection\n", 'A' + wm8994->revision); codec->dapm.idle_bias_off = 0; } /* To wakeup for earjack event in suspend mode */ enable_irq_wake(control->irq); wake_lock_init(&wm1811->jackdet_wake_lock, WAKE_LOCK_SUSPEND, "midas_jackdet"); /* To support PBA function test */ jack_class = class_create(THIS_MODULE, "audio"); if (IS_ERR(jack_class)) pr_err("Failed to create class\n"); jack_dev = device_create(jack_class, NULL, 0, codec, "earjack"); if (device_create_file(jack_dev, &dev_attr_select_jack) < 0) pr_err("Failed to create device file (%s)!\n", dev_attr_select_jack.attr.name); if (device_create_file(jack_dev, &dev_attr_key_state) < 0) pr_err("Failed to create device file (%s)!\n", dev_attr_key_state.attr.name); if (device_create_file(jack_dev, &dev_attr_state) < 0) pr_err("Failed to create device file (%s)!\n", dev_attr_state.attr.name); if (device_create_file(jack_dev, &dev_attr_reselect_jack) < 0) pr_err("Failed to create device file (%s)!\n", dev_attr_reselect_jack.attr.name); #endif /* CONFIG_SEC_DEV_JACK */ return snd_soc_dapm_sync(&codec->dapm); }
int omap4_wm8994_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_dai *aif1_dai = &rtd->codec_dai[0]; int ret; the_codec = codec; ret = snd_soc_add_controls(codec, omap4_controls, ARRAY_SIZE(omap4_controls)); ret = snd_soc_dapm_new_controls(dapm, omap4_dapm_widgets, ARRAY_SIZE(omap4_dapm_widgets)); if (ret != 0) dev_err(codec->dev, "Failed to add DAPM widgets: %d\n", ret); ret = snd_soc_dapm_add_routes(dapm, omap4_dapm_routes, ARRAY_SIZE(omap4_dapm_routes)); if (ret != 0) dev_err(codec->dev, "Failed to add DAPM routes: %d\n", ret); /* set up NC codec pins */ snd_soc_dapm_nc_pin(dapm, "IN2LP:VXRN"); snd_soc_dapm_nc_pin(dapm, "IN2LN"); #ifdef CONFIG_MACH_SAMSUNG_ESPRESSO_10 snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP"); snd_soc_dapm_nc_pin(dapm, "IN2RN"); #endif snd_soc_dapm_ignore_suspend(dapm, "RCV"); snd_soc_dapm_ignore_suspend(dapm, "SPK"); snd_soc_dapm_ignore_suspend(dapm, "LINEOUT"); snd_soc_dapm_ignore_suspend(dapm, "HP"); snd_soc_dapm_ignore_suspend(dapm, "Main Mic"); #if defined(CONFIG_MACH_SAMSUNG_ESPRESSO) \ || defined(CONFIG_MACH_SAMSUNG_ESPRESSO_CHN_CMCC) snd_soc_dapm_ignore_suspend(dapm, "Sub Mic"); #endif snd_soc_dapm_ignore_suspend(dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(dapm, "AIF1DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF2DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF3DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF1ADCDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF2ADCDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF3ADCDAT"); ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2, 32768, SND_SOC_CLOCK_IN); if (ret < 0) dev_err(codec->dev, "Failed to boot clocking\n"); return snd_soc_dapm_sync(dapm); }
static int smdk_wm8994_init_paiftx(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_dapm_context *dapm = &codec->dapm; #ifdef TC4 snd_soc_dapm_enable_pin(dapm, "HP"); snd_soc_dapm_enable_pin(dapm, "MAIN MIC"); snd_soc_dapm_enable_pin(dapm, "SUB MIC"); snd_soc_dapm_enable_pin(dapm, "SPK"); snd_soc_dapm_enable_pin(dapm, "IN2LN"); snd_soc_dapm_enable_pin(dapm, "IN2LP:VXRN"); /* Other pins NC */ snd_soc_dapm_nc_pin(dapm, "IN1LN"); snd_soc_dapm_nc_pin(dapm, "IN1LP"); snd_soc_dapm_nc_pin(dapm, "IN1RN"); snd_soc_dapm_nc_pin(dapm, "IN1RP"); snd_soc_dapm_nc_pin(dapm, "HPOUT1N"); snd_soc_dapm_nc_pin(dapm, "HPOUT1P"); snd_soc_dapm_nc_pin(dapm, "SPKOUTLN"); snd_soc_dapm_nc_pin(dapm, "SPKOUTLP"); snd_soc_dapm_nc_pin(dapm, "SPKOUTRN"); snd_soc_dapm_nc_pin(dapm, "SPKOUTRP"); snd_soc_dapm_nc_pin(dapm, "HPOUT2P"); snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); snd_soc_dapm_nc_pin(dapm, "LINEOUT1N"); snd_soc_dapm_nc_pin(dapm, "LINEOUT1P"); snd_soc_dapm_nc_pin(dapm, "LINEOUT2N"); snd_soc_dapm_nc_pin(dapm, "LINEOUT2P"); snd_soc_dapm_nc_pin(dapm, "IN2RN"); snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP"); #if 1 snd_soc_dapm_ignore_suspend(dapm, "RCV"); snd_soc_dapm_ignore_suspend(dapm, "SPK"); snd_soc_dapm_ignore_suspend(dapm, "HP"); snd_soc_dapm_ignore_suspend(dapm, "SEC MIC"); snd_soc_dapm_ignore_suspend(dapm, "SUB MIC"); snd_soc_dapm_ignore_suspend(dapm, "MAIN MIC"); snd_soc_dapm_ignore_suspend(dapm, "AIF1DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF2DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF3DACDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF1ADCDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF2ADCDAT"); snd_soc_dapm_ignore_suspend(dapm, "AIF3ADCDAT"); // snd_soc_dapm_ignore_suspend(&codec->dapm, "LINE"); // snd_soc_dapm_ignore_suspend(&codec->dapm, "HDMI"); #endif #else /* HeadPhone */ snd_soc_dapm_enable_pin(dapm, "HPOUT1R"); snd_soc_dapm_enable_pin(dapm, "HPOUT1L"); /* MicIn */ snd_soc_dapm_enable_pin(dapm, "IN1LN"); snd_soc_dapm_enable_pin(dapm, "IN1RN"); /* LineIn */ snd_soc_dapm_enable_pin(dapm, "IN2LN"); snd_soc_dapm_enable_pin(dapm, "IN2RN"); /* Other pins NC */ snd_soc_dapm_nc_pin(dapm, "HPOUT2P"); snd_soc_dapm_nc_pin(dapm, "HPOUT2N"); snd_soc_dapm_nc_pin(dapm, "SPKOUTLN"); snd_soc_dapm_nc_pin(dapm, "SPKOUTLP"); snd_soc_dapm_nc_pin(dapm, "SPKOUTRP"); snd_soc_dapm_nc_pin(dapm, "SPKOUTRN"); snd_soc_dapm_nc_pin(dapm, "LINEOUT1N"); snd_soc_dapm_nc_pin(dapm, "LINEOUT1P"); snd_soc_dapm_nc_pin(dapm, "LINEOUT2N"); snd_soc_dapm_nc_pin(dapm, "LINEOUT2P"); snd_soc_dapm_nc_pin(dapm, "IN1LP"); snd_soc_dapm_nc_pin(dapm, "IN2LP:VXRN"); snd_soc_dapm_nc_pin(dapm, "IN1RP"); snd_soc_dapm_nc_pin(dapm, "IN2RP:VXRP"); #endif snd_soc_dapm_new_controls(dapm, board_specific_widgets, ARRAY_SIZE(board_specific_widgets)); snd_soc_dapm_add_routes(dapm, board_specific_routes, ARRAY_SIZE(board_specific_routes)); snd_soc_dapm_sync(dapm); return 0; }
static int omap_abe_twl6040_init(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_codec *codec = rtd->codec; struct snd_soc_card *card = codec->card; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dapm_context *dapm = &codec->dapm; struct snd_soc_dapm_context *card_dapm = &card->dapm; struct omap_abe_twl6040_data *pdata = dev_get_platdata(card->dev); struct omap_abe_data *card_data = snd_soc_card_get_drvdata(card); u32 hsotrim, left_offset, right_offset, step_mV; int ret = 0; card_data->twl6040_codec = codec; /* Disable not connected paths if not used */ twl6040_disconnect_pin(dapm, pdata->has_hs, "Headset Stereophone"); twl6040_disconnect_pin(dapm, pdata->has_hf, "Ext Spk"); twl6040_disconnect_pin(dapm, pdata->has_ep, "Earphone Spk"); twl6040_disconnect_pin(dapm, pdata->has_aux, "Line Out"); twl6040_disconnect_pin(dapm, pdata->has_vibra, "Vibrator"); twl6040_disconnect_pin(dapm, pdata->has_hsmic, "Headset Mic"); twl6040_disconnect_pin(dapm, pdata->has_mainmic, "Main Handset Mic"); twl6040_disconnect_pin(dapm, pdata->has_submic, "Sub Handset Mic"); twl6040_disconnect_pin(dapm, pdata->has_afm, "Line In"); /* allow audio paths from the audio modem to run during suspend */ snd_soc_dapm_ignore_suspend(&card->dapm, "Ext Spk"); snd_soc_dapm_ignore_suspend(dapm, "AFML"); snd_soc_dapm_ignore_suspend(dapm, "AFMR"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Mic"); snd_soc_dapm_ignore_suspend(&card->dapm, "Headset Stereophone"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 0"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 1"); snd_soc_dapm_ignore_suspend(&card->dapm, "Digital Mic 2"); card_dapm->stream_event = omap_abe_stream_event; /* DC offset cancellation computation only if ABE is enabled */ if (pdata->has_abe) { hsotrim = twl6040_get_trim_value(codec, TWL6040_TRIM_HSOTRIM); right_offset = TWL6040_HSF_TRIM_RIGHT(hsotrim); left_offset = TWL6040_HSF_TRIM_LEFT(hsotrim); step_mV = twl6040_get_hs_step_size(codec); omap_abe_dc_set_hs_offset(platform, left_offset, right_offset, step_mV); } /* Headset jack detection only if it is supported */ if (pdata->jack_detection) { ret = snd_soc_jack_new(codec, "Headset Jack", SND_JACK_HEADSET, &hs_jack); if (ret) return ret; ret = snd_soc_jack_add_pins(&hs_jack, ARRAY_SIZE(hs_jack_pins), hs_jack_pins); if (machine_is_omap_4430sdp() || machine_is_omap_tabletblaze() || machine_is_omap5_sevm() || machine_is_omap5_panda()) twl6040_hs_jack_detect(codec, &hs_jack, SND_JACK_HEADSET); else snd_soc_jack_report(&hs_jack, SND_JACK_HEADSET, SND_JACK_HEADSET); } return ret; }