Beispiel #1
0
/* 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;
}
Beispiel #2
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;
}
Beispiel #3
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;
}
Beispiel #4
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;
};
Beispiel #5
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);
}
Beispiel #6
0
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;
}
Beispiel #7
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;
}
Beispiel #8
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);
}
Beispiel #9
0
/*
 * 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;
}
Beispiel #10
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;
}
Beispiel #11
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);
}
Beispiel #12
0
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;
}
Beispiel #14
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;
}
Beispiel #15
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;
}
Beispiel #17
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);
};
Beispiel #18
0
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;
}
Beispiel #19
0
static int machine_init(struct snd_soc_codec *codec)
{
    snd_soc_dapm_sync_endpoints(codec);
    return 0;
}
Beispiel #20
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;
}