/* Logic for a aic3x as connected on a davinci-evm */ static int evm_aic3x_init(struct snd_soc_codec *codec) { int i; /* Add davinci-evm specific widgets */ for (i = 0; i < ARRAY_SIZE(aic3x_dapm_widgets); i++) snd_soc_dapm_new_control(codec, &aic3x_dapm_widgets[i]); /* Set up davinci-evm specific audio path audio_map */ for (i = 0; audio_map[i][0] != NULL; i++) snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); /* not connected */ snd_soc_dapm_set_endpoint(codec, "MONO_LOUT", 0); snd_soc_dapm_set_endpoint(codec, "HPLCOM", 0); snd_soc_dapm_set_endpoint(codec, "HPRCOM", 0); /* always connected */ snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line Out", 1); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line In", 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
/* * Pavo for a jzcodec as connected on jz4740 Device */ static int pavo_jzcodec_init(struct snd_soc_codec *codec) { int i, err; snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0); snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0); /* Add pavo specific controls */ for (i = 0; i < ARRAY_SIZE(jzcodec_pavo_controls); i++) { err = snd_ctl_add(codec->card, snd_soc_cnew(&jzcodec_pavo_controls[i],codec, NULL)); if (err < 0) return err; } /* Add pavo specific widgets */ for(i = 0; i < ARRAY_SIZE(jzcodec_dapm_widgets); i++) { snd_soc_dapm_new_control(codec, &jzcodec_dapm_widgets[i]); } /* Set up pavo specific audio path audio_map */ for(i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } snd_soc_dapm_sync_endpoints(codec); return 0; }
/* * Logic for a wm8731 as connected on a Endrelia ETI-B1 board. */ static int mainstone_wm8731_init(struct snd_soc_codec *codec) { int i; /* Add specific widgets */ for(i = 0; i < ARRAY_SIZE(dapm_widgets); i++) { snd_soc_dapm_new_control(codec, &dapm_widgets[i]); } /* Set up specific audio path interconnects */ for(i = 0; intercon[i][0] != NULL; i++) { snd_soc_dapm_connect_input(codec, intercon[i][0], intercon[i][1], intercon[i][2]); } /* not connected */ snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0); snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0); /* always connected */ snd_soc_dapm_set_endpoint(codec, "Int Mic", 1); snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
static int h5000_ak4535_init (struct snd_soc_codec *codec) { int i, err; /* NC codec pins */ snd_soc_dapm_set_endpoint (codec, "MOUT1", 0); snd_soc_dapm_set_endpoint (codec, "LOUT", 0); snd_soc_dapm_set_endpoint (codec, "ROUT", 0); snd_soc_dapm_set_endpoint (codec, "MOUT2", 0); /* FIXME: These pins are marked as INPUTS */ snd_soc_dapm_set_endpoint (codec, "MIN", 0); /* FIXME: and OUTPUTS in ak4535.c . We need to do this in order */ snd_soc_dapm_set_endpoint (codec, "AIN", 0); /* FIXME: to get DAPM working properly, because the pins are connected */ snd_soc_dapm_set_endpoint (codec, "MICOUT", 0); /* FIXME: OUTPUT -> INPUT. */ /* Add h5000 specific controls */ for (i = 0; i < ARRAY_SIZE (ak4535_h5000_controls); i++) { err = snd_ctl_add (codec->card, snd_soc_cnew (&ak4535_h5000_controls[i], codec, NULL)); if (err < 0) return err; }; /* Add h5000 specific widgets */ for (i = 0; i < ARRAY_SIZE (ak4535_dapm_widgets); i++) { snd_soc_dapm_new_control (codec, &ak4535_dapm_widgets [i]); }; /* Set up h5000 specific audio path audio_map */ for (i = 0; audio_map [i][0] != NULL; i++) { snd_soc_dapm_connect_input (codec, audio_map [i][0], audio_map [i][1], audio_map [i][2]); }; snd_soc_dapm_sync_endpoints (codec); return 0; };
static void poodle_ext_control(struct snd_soc_codec *codec) { int spk = 0; /* set up jack connection */ if (poodle_jack_func == POODLE_HP) { /* set = unmute headphone */ locomo_gpio_write(&poodle_locomo_device.dev, POODLE_LOCOMO_GPIO_MUTE_L, 1); locomo_gpio_write(&poodle_locomo_device.dev, POODLE_LOCOMO_GPIO_MUTE_R, 1); snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); } else { locomo_gpio_write(&poodle_locomo_device.dev, POODLE_LOCOMO_GPIO_MUTE_L, 0); locomo_gpio_write(&poodle_locomo_device.dev, POODLE_LOCOMO_GPIO_MUTE_R, 0); snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); } if (poodle_spk_func == POODLE_SPK_ON) spk = 1; /* set the enpoints to their new connetion states */ snd_soc_dapm_set_endpoint(codec, "Ext Spk", spk); /* signal a DAPM event */ snd_soc_dapm_sync_endpoints(codec); }
static int set_scenario_endpoints(struct snd_soc_codec *codec, int scenario) { switch(smdk_scenario) { case SMDK_AUDIO_OFF: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK_STEREO_TO_HEADPHONES: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK_CAPTURE_MIC1: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK_CAPTURE_LINE_IN: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 1); break; default: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 1); break; } snd_soc_dapm_sync_endpoints(codec); return 0; }
/* * This is an example machine initialisation for a wm8580 connected to a * smdk2450. It is missing logic to detect hp/mic insertions and logic * to re-route the audio in such an event. */ static int smdk_wm8580_init(struct snd_soc_codec *codec) { int i, err; /* set endpoints to default mode */ set_scenario_endpoints(codec, SMDK_AUDIO_OFF); /* Add smdk2450 specific widgets */ for (i = 0; i < ARRAY_SIZE(wm8580_dapm_widgets); i++) snd_soc_dapm_new_control(codec, &wm8580_dapm_widgets[i]); /* add smdk2450 specific controls */ for (i = 0; i < ARRAY_SIZE(wm8580_smdk_controls); i++) { err = snd_ctl_add(codec->card, snd_soc_cnew(&wm8580_smdk_controls[i], codec, NULL)); if (err < 0) return err; } /* set up smdk2450 specific audio path audio_mapnects */ for (i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } /* always connected */ snd_soc_dapm_set_endpoint(codec, "Mic1 Jack", 1); snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
static void imx_3stack_ext_control(void) { int spk = 0, mic = 0, hp = 0, line_in = 0, line_out = 0; /* set up jack connection */ switch (wm8903_jack_func) { case IMX_3STACK_MIXER_DEFAULT: hp = 1; mic = 1; case IMX_3STACK_MIXER_HP: hp = 1; break; case IMX_3STACK_MIXER_MIC: mic = 1; break; case IMX_3STACK_MIXER_LINE_IN: line_in = 1; break; case IMX_3STACK_MIXER_LINE_OUT: line_out = 1; break; } if (wm8903_spk_func == IMX_3STACK_MIXER_SPK_ON) spk = 1; snd_soc_dapm_set_endpoint(imx_3stack_mach, "Mic Jack", mic); snd_soc_dapm_set_endpoint(imx_3stack_mach, "Line In Jack", line_in); snd_soc_dapm_set_endpoint(imx_3stack_mach, "Line Out Jack", line_out); snd_soc_dapm_set_endpoint(imx_3stack_mach, "Headphone Jack", hp); snd_soc_dapm_set_endpoint(imx_3stack_mach, "Ext Spk", spk); snd_soc_dapm_sync_endpoints(imx_3stack_mach); }
/* * Logic for a wm8994 as connected on a rockchip board. */ static int rockchip_wm8994_init(struct snd_soc_codec *codec) { int i; DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); /* Add specific widgets */ for(i = 0; i < ARRAY_SIZE(rockchip_dapm_widgets); i++) { snd_soc_dapm_new_control(codec, &rockchip_dapm_widgets[i]); } /* Set up specific audio path audio_mapnects */ for(i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } /* not connected */ snd_soc_dapm_set_endpoint(codec, "RLINEIN", 0); snd_soc_dapm_set_endpoint(codec, "LLINEIN", 0); /* always connected */ snd_soc_dapm_set_endpoint(codec, "Int Mic", 1); snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
/* * Logic for a wm8750 as connected on a Sharp SL-Cxx00 Device */ static int spitz_wm8750_init(struct snd_soc_codec *codec) { int i, err; /* NC codec pins */ snd_soc_dapm_set_endpoint(codec, "RINPUT1", 0); snd_soc_dapm_set_endpoint(codec, "LINPUT2", 0); snd_soc_dapm_set_endpoint(codec, "RINPUT2", 0); snd_soc_dapm_set_endpoint(codec, "LINPUT3", 0); snd_soc_dapm_set_endpoint(codec, "RINPUT3", 0); snd_soc_dapm_set_endpoint(codec, "OUT3", 0); snd_soc_dapm_set_endpoint(codec, "MONO", 0); /* Add spitz specific controls */ for (i = 0; i < ARRAY_SIZE(wm8750_spitz_controls); i++) { err = snd_ctl_add(codec->card, snd_soc_cnew(&wm8750_spitz_controls[i], codec, NULL)); if (err < 0) return err; } /* Add spitz specific widgets */ for (i = 0; i < ARRAY_SIZE(wm8750_dapm_widgets); i++) snd_soc_dapm_new_control(codec, &wm8750_dapm_widgets[i]); /* Set up spitz specific audio path audio_map */ for (i = 0; audio_map[i][0] != NULL; i++) snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); snd_soc_dapm_sync_endpoints(codec); return 0; }
static void spitz_ext_control(struct snd_soc_codec *codec) { if (spitz_spk_func == SPITZ_SPK_ON) snd_soc_dapm_set_endpoint(codec, "Ext Spk", 1); else snd_soc_dapm_set_endpoint(codec, "Ext Spk", 0); /* set up jack connection */ switch (spitz_jack_func) { case SPITZ_HP: /* enable and unmute hp jack, disable mic bias */ snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line Jack", 0); snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L); set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R); break; case SPITZ_MIC: /* enable mic jack and bias, mute hp */ snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 1); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R); break; case SPITZ_LINE: /* enable line jack, disable mic bias and mute hp */ snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line Jack", 1); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R); break; case SPITZ_HEADSET: /* enable and unmute headset jack enable mic bias, mute L hp */ snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 1); snd_soc_dapm_set_endpoint(codec, "Line Jack", 0); snd_soc_dapm_set_endpoint(codec, "Headset Jack", 1); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L); set_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R); break; case SPITZ_HP_OFF: /* jack removed, everything off */ snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Headset Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Jack", 0); snd_soc_dapm_set_endpoint(codec, "Line Jack", 0); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_L); reset_scoop_gpio(&spitzscoop_device.dev, SPITZ_SCP_MUTE_R); break; } snd_soc_dapm_sync_endpoints(codec); }
static void pavo_ext_control(struct snd_soc_codec *codec) { int spk = 0, mic = 0, line = 0, hp = 0, hs = 0; /* set up jack connection */ switch (pavo_jack_func) { case PAVO_HP: hp = 1; /* set = unmute headphone */ //set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L); //set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R); break; case PAVO_MIC: mic = 1; /* reset = mute headphone */ //reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L); //reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R); break; case PAVO_LINE: line = 1; //reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L); //reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R); break; case PAVO_HEADSET: hs = 1; mic = 1; //reset_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_L); //set_scoop_gpio(&corgiscoop_device.dev, CORGI_SCP_MUTE_R); break; } if (pavo_spk_func == PAVO_SPK_ON) spk = 1; /* set the enpoints to their new connetion states */ snd_soc_dapm_set_endpoint(codec, "Ext Spk", spk); snd_soc_dapm_set_endpoint(codec, "Mic Jack", mic); snd_soc_dapm_set_endpoint(codec, "Line Jack", line); snd_soc_dapm_set_endpoint(codec, "Headphone Jack", hp); snd_soc_dapm_set_endpoint(codec, "Headset Jack", hs); /* signal a DAPM event */ snd_soc_dapm_sync_endpoints(codec); }
static int smdk6440_s5m8751_init(struct snd_soc_codec *codec) { int i; /* Add smdk6440 specific widgets */ snd_soc_dapm_new_controls(codec, s5m8751_dapm_widgets,ARRAY_SIZE(s5m8751_dapm_widgets)); /* set up smdk6440 specific audio paths */ snd_soc_dapm_add_routes(codec, audio_map,ARRAY_SIZE(audio_map)); /* No jack detect - mark all jacks as enabled */ for (i = 0; i < ARRAY_SIZE(s5m8751_dapm_widgets); i++) snd_soc_dapm_set_endpoint(codec, s5m8751_dapm_widgets[i].name, 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
static int smdk6410_wm8580_init(struct snd_soc_codec *codec) { int i; /* Add smdk6410 specific widgets */ for (i = 0; i < ARRAY_SIZE(wm8580_dapm_widgets); i++) snd_soc_dapm_new_control(codec, &wm8580_dapm_widgets[i]); /* set up smdk6410 specific audio paths */ for (i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } /* No jack detect - mark all jacks as enabled */ for (i = 0; i < ARRAY_SIZE(wm8580_dapm_widgets); i++) snd_soc_dapm_set_endpoint(codec, wm8580_dapm_widgets[i].name, 1); snd_soc_dapm_sync_endpoints(codec); return 0; }
static int set_scenario_endpoints(struct snd_soc_codec *codec, int scenario) { __D("\n"); switch(smdk6400_scenario) { __I("smdk6400_scenario is %d\n",smdk6400_scenario);//lzcx case SMDK6400_AUDIO_OFF: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Bias", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK6400_STEREO_TO_HEADPHONES: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Mic Bias", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK6400_CAPTURE_MIC1: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Bias", 1); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 0); break; case SMDK6400_CAPTURE_LINE_IN: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint(codec, "Mic Bias", 0); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 1); break; default: snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint(codec, "Mic Bias", 1); snd_soc_dapm_set_endpoint(codec, "Line In Jack", 1); break; } snd_soc_dapm_sync_endpoints(codec); return 0; }
static int armadillo440_wm8978_dai_init(struct snd_soc_codec *codec) { int i; int ret; armadillo440_wm8978_codec_init(codec); /* set up NC codec pins */ snd_soc_dapm_set_endpoint(codec, "RIP", 0); snd_soc_dapm_set_endpoint(codec, "RIN", 0); snd_soc_dapm_set_endpoint(codec, "AUXL", 0); snd_soc_dapm_set_endpoint(codec, "AUXR", 0); snd_soc_dapm_set_endpoint(codec, "OUT3", 0); snd_soc_dapm_set_endpoint(codec, "OUT4", 0); /* Add armadillo500fx specific widgets */ for (i = 0; i < ARRAY_SIZE(armadillo440_dapm_widgets); i++) { ret = snd_soc_dapm_new_control(codec, &armadillo440_dapm_widgets[i]); if (ret < 0) { error("widgets %d ret: %d\n", i, ret); } } /* set up armadillo440 audio specific path audio_map */ for (i = 0; audio_map[i][0] != NULL; i++) { ret = snd_soc_dapm_connect_input(codec, audio_map[i][0], audio_map[i][1], audio_map[i][2]); if (ret < 0) return ret; } snd_soc_dapm_sync_endpoints(codec); return 0; }
static void h5000_ext_control (struct snd_soc_codec *codec) { switch (h5000_spk_func) { case H5000_SPK_OFF: snd_soc_dapm_set_endpoint (codec, "Ext Spk", 0); break; case H5000_SPK_ON: snd_soc_dapm_set_endpoint (codec, "Ext Spk", 1); break; default: printk (KERN_ERR "%s: invalid value %d for h5000_spk_func\n", __FUNCTION__, h5000_spk_func); break; }; switch (h5000_jack_func) { case H5000_OFF: snd_soc_dapm_set_endpoint (codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint (codec, "Internal Mic", 1); snd_soc_dapm_set_endpoint (codec, "Mic Jack", 0); break; case H5000_HP: snd_soc_dapm_set_endpoint (codec, "Headphone Jack", 1); snd_soc_dapm_set_endpoint (codec, "Internal Mic", 1); snd_soc_dapm_set_endpoint (codec, "Mic Jack", 0); break; case H5000_MIC: snd_soc_dapm_set_endpoint (codec, "Headphone Jack", 0); snd_soc_dapm_set_endpoint (codec, "Internal Mic", 0); snd_soc_dapm_set_endpoint (codec, "Mic Jack", 1); default: printk (KERN_ERR "%s: invalid value %d for h5000_jack_func\n", __FUNCTION__, h5000_jack_func); break; }; snd_soc_dapm_sync_endpoints (codec); };
static int mach_probe(struct snd_soc_machine *machine) { struct snd_soc_codec *codec; struct snd_soc_dai *codec_dai; struct snd_soc_pcm_link *pcm_link; struct platform_device *pdev = machine->pdev; struct mxc_sgtl5000_platform_data *plat = pdev->dev.platform_data; struct sgtl5000_platform_data *codec_data; struct imx_3stack_priv *priv; struct regulator *reg; int i, ret; pcm_link = list_first_entry(&machine->active_list, struct snd_soc_pcm_link, active_list); sgtl5000_3stack_pcm_link = pcm_link; codec = pcm_link->codec; codec_dai = pcm_link->codec_dai; codec_dai->ops->set_sysclk(codec_dai, 0, plat->sysclk, 0); priv = kzalloc(sizeof(struct imx_3stack_priv), GFP_KERNEL); if (!priv) return -ENOMEM; codec_data = kzalloc(sizeof(struct sgtl5000_platform_data), GFP_KERNEL); if (!codec_data) { ret = -ENOMEM; goto err_codec_data; } ret = -EINVAL; if (plat->init && plat->init()) goto err_plat_init; if (plat->vddio_reg) { reg = regulator_get(&pdev->dev, plat->vddio_reg); if (IS_ERR(reg)) goto err_reg_vddio; priv->reg_vddio = reg; } if (plat->vdda_reg) { reg = regulator_get(&pdev->dev, plat->vdda_reg); if (IS_ERR(reg)) goto err_reg_vdda; priv->reg_vdda = reg; } if (plat->vddd_reg) { reg = regulator_get(&pdev->dev, plat->vddd_reg); if (IS_ERR(reg)) goto err_reg_vddd; priv->reg_vddd = reg; } machine->platform_data = priv; if (priv->reg_vdda) { ret = regulator_set_voltage(priv->reg_vdda, plat->vdda); regulator_enable(priv->reg_vdda); } if (priv->reg_vddio) { regulator_set_voltage(priv->reg_vddio, plat->vddio); regulator_enable(priv->reg_vddio); } if (priv->reg_vddd) { regulator_set_voltage(priv->reg_vddd, plat->vddd); regulator_enable(priv->reg_vddd); } /* The SGTL5000 has an internal reset that is deasserted 8 SYS_MCLK cycles after all power rails have been brought up. After this time communication can start */ msleep(1); codec_data->vddio = plat->vddio / 1000; /* uV to mV */ codec_data->vdda = plat->vdda / 1000; codec_data->vddd = plat->vddd / 1000; codec->platform_data = codec_data; ret = codec->ops->io_probe(codec, machine); if (ret < 0) goto err_card_reg; gpio_activate_audio_ports(); imx_3stack_init_dam(plat->src_port, plat->ext_port); /* Add imx_3stack specific widgets */ for (i = 0; i < ARRAY_SIZE(imx_3stack_dapm_widgets); i++) { snd_soc_dapm_new_control(machine, codec, &imx_3stack_dapm_widgets[i]); } /* set up imx_3stack specific audio path audio map */ for (i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(machine, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } /* connect and enable all imx_3stack SGTL5000 jacks (for now) */ snd_soc_dapm_set_endpoint(machine, "Line In Jack", 1); snd_soc_dapm_set_endpoint(machine, "Mic Jack", 1); snd_soc_dapm_set_endpoint(machine, "Line Out Jack", 1); snd_soc_dapm_set_endpoint(machine, "Headphone Jack", 1); sgtl5000_jack_func = 1; sgtl5000_spk_func = 1; snd_soc_dapm_set_policy(machine, SND_SOC_DAPM_POLICY_STREAM); snd_soc_dapm_sync_endpoints(machine); for (i = 0; i < ARRAY_SIZE(sgtl5000_machine_controls); i++) { ret = snd_ctl_add(machine->card, snd_soc_cnew(&sgtl5000_machine_controls[i], codec, NULL)); if (ret < 0) goto err_card_reg; } /* register card with ALSA upper layers */ ret = snd_soc_register_card(machine); if (ret < 0) { pr_err("%s: failed to register sound card\n", __func__); goto err_card_reg; } if (plat->hp_status()) ret = request_irq(plat->hp_irq, imx_headphone_detect_handler, IRQT_FALLING, pdev->name, machine); else ret = request_irq(plat->hp_irq, imx_headphone_detect_handler, IRQT_RISING, pdev->name, machine); if (ret < 0) { pr_err("%s: request irq failed\n", __func__); goto err_card_reg; } return 0; err_card_reg: if (priv->reg_vddd) regulator_put(priv->reg_vddd, &pdev->dev); err_reg_vddd: if (priv->reg_vdda) regulator_put(priv->reg_vdda, &pdev->dev); err_reg_vdda: if (priv->reg_vddio) regulator_put(priv->reg_vddio, &pdev->dev); err_reg_vddio: if (plat->finit) plat->finit(); err_plat_init: kfree(codec_data); codec->platform_data = NULL; err_codec_data: kfree(priv); machine->platform_data = NULL; return ret; }
static int machine_init(struct snd_soc_codec *codec) { snd_soc_dapm_sync_endpoints(codec); return 0; }
static int imx_3stack_mach_probe(struct snd_soc_machine *machine) { struct snd_soc_codec *codec; struct snd_soc_pcm_link *pcm_link; int i, ret; pcm_link = list_first_entry(&machine->active_list, struct snd_soc_pcm_link, active_list); wm8903_3stack_pcm_link = pcm_link; codec = pcm_link->codec; gpio_activate_audio_ports(); codec->ops->io_probe(codec, machine); /* set unused imx_3stack WM8903 codec pins */ snd_soc_dapm_set_endpoint(machine, "IN2R", 0); snd_soc_dapm_set_endpoint(machine, "IN1R", 0); /* Add imx_3stack specific widgets */ for (i = 0; i < ARRAY_SIZE(imx_3stack_dapm_widgets); i++) { snd_soc_dapm_new_control(machine, codec, &imx_3stack_dapm_widgets[i]); } for (i = 0; i < ARRAY_SIZE(imx_3stack_machine_controls); i++) { ret = snd_ctl_add(machine->card, snd_soc_cnew(&imx_3stack_machine_controls[i], codec, NULL)); if (ret < 0) return ret; } /* set up imx_3stack specific audio path audio map */ for (i = 0; audio_map[i][0] != NULL; i++) { snd_soc_dapm_connect_input(machine, audio_map[i][0], audio_map[i][1], audio_map[i][2]); } imx_3stack_ext_control(); snd_soc_dapm_set_policy(machine, SND_SOC_DAPM_POLICY_STREAM); snd_soc_dapm_sync_endpoints(machine); wm8903_hp_initialize_hp_detect(codec); wm8903_hp_status(codec); gpio_config(WM8903_IRQ_GPIO_PORT, WM8903_IRQ_GPIO_NUM, false, GPIO_INT_RISE_EDGE); gpio_request_irq(WM8903_IRQ_GPIO_PORT, WM8903_IRQ_GPIO_NUM, GPIO_LOW_PRIO, imx_headphone_detect_handler, 0, "headphone", pcm_link); /* register card with ALSA upper layers */ ret = snd_soc_register_card(machine); if (ret < 0) { pr_err("%s: failed to register sound card\n", __func__); return ret; } return 0; }