68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| #include <linux/gpio.h>
 | |
| #include "../pmic.h"
 | |
| #include <mach/msm_qdsp6_audio.h>
 | |
| 
 | |
| #define GPIO_HEADSET_AMP 157
 | |
| 
 | |
| void analog_init(void)
 | |
| {
 | |
| 	/* stereo pmic init */
 | |
| 	pmic_spkr_set_gain(LEFT_SPKR, SPKR_GAIN_PLUS12DB);
 | |
| 	pmic_spkr_set_gain(RIGHT_SPKR, SPKR_GAIN_PLUS12DB);
 | |
| 	pmic_mic_set_volt(MIC_VOLT_1_80V);
 | |
| 
 | |
| 	gpio_direction_output(GPIO_HEADSET_AMP, 1);
 | |
| 	gpio_set_value(GPIO_HEADSET_AMP, 0);
 | |
| }
 | |
| 
 | |
| void analog_headset_enable(int en)
 | |
| {
 | |
| 	/* enable audio amp */
 | |
| 	gpio_set_value(GPIO_HEADSET_AMP, !!en);
 | |
| }
 | |
| 
 | |
| void analog_speaker_enable(int en)
 | |
| {
 | |
| 	struct spkr_config_mode scm;
 | |
| 	memset(&scm, 0, sizeof(scm));
 | |
| 
 | |
| 	if (en) {
 | |
| 		scm.is_right_chan_en = 1;
 | |
| 		scm.is_left_chan_en = 1;
 | |
| 		scm.is_stereo_en = 1;
 | |
| 		scm.is_hpf_en = 1;
 | |
| 		pmic_spkr_en_mute(LEFT_SPKR, 0);
 | |
| 		pmic_spkr_en_mute(RIGHT_SPKR, 0);
 | |
| 		pmic_set_spkr_configuration(&scm);
 | |
| 		pmic_spkr_en(LEFT_SPKR, 1);
 | |
| 		pmic_spkr_en(RIGHT_SPKR, 1);
 | |
| 		
 | |
| 		/* unmute */
 | |
| 		pmic_spkr_en_mute(LEFT_SPKR, 1);
 | |
| 		pmic_spkr_en_mute(RIGHT_SPKR, 1);
 | |
| 	} else {
 | |
| 		pmic_spkr_en_mute(LEFT_SPKR, 0);
 | |
| 		pmic_spkr_en_mute(RIGHT_SPKR, 0);
 | |
| 
 | |
| 		pmic_spkr_en(LEFT_SPKR, 0);
 | |
| 		pmic_spkr_en(RIGHT_SPKR, 0);
 | |
| 
 | |
| 		pmic_set_spkr_configuration(&scm);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static struct q6audio_analog_ops ops = {
 | |
| 	.init = analog_init,
 | |
| 	.speaker_enable = analog_speaker_enable,
 | |
| 	.headset_enable = analog_headset_enable,
 | |
| };
 | |
| 
 | |
| static int __init init(void)
 | |
| {
 | |
| 	q6audio_register_analog_ops(&ops);
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| device_initcall(init);
 |