Skip to content

Commit

Permalink
Added bravo files.
Browse files Browse the repository at this point in the history
Credits to Defer & Kali-.
  • Loading branch information
thalamus committed Mar 29, 2011
1 parent 52630a3 commit 8ef61a3
Show file tree
Hide file tree
Showing 34 changed files with 8,655 additions and 1 deletion.
21 changes: 21 additions & 0 deletions arch/arm/mach-msm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,27 @@ config MACH_MAHIMAHI
help
Select this to support the Mahi-Mahi device

choice
depends on ARCH_QSD8X50
prompt "Bravo"
default MACH_BRAVO_NONE
help
Select this to support the Bravo GSM or CDMA device

config MACH_BRAVO_NONE
bool "None"

config MACH_BRAVO
bool "GSM"
help
Select this to support the Bravo GSM device

config MACH_BRAVOC
bool "CDMA"
help
Select this to support the Bravo CDMA device
endchoice

config MACH_QSD8X50_FFA
depends on ARCH_QSD8X50
default y
Expand Down
22 changes: 22 additions & 0 deletions arch/arm/mach-msm/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,28 @@ obj-$(CONFIG_MACH_MSM7X30_SURF) += board-surf7x30.o
obj-$(CONFIG_ARCH_MSM7X30) += board-msm7x30.o devices-msm7x30.o
obj-$(CONFIG_ARCH_QSD8X50) += board-qsd8x50.o devices-qsd8x50.o

obj-$(CONFIG_MACH_BRAVO) += board-bravo.o board-bravo-panel.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-keypad.o board-bravo-mmc.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-rfkill.o htc_wifi_nvs.o htc_awb_cal.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-wifi.o board-bravo-audio.o
obj-$(CONFIG_MACH_BRAVO) += msm_vibrator.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-microp.o
obj-$(CONFIG_MACH_BRAVO) += htc_acoustic_qsd.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-tpa2018d1.o
obj-$(CONFIG_MACH_BRAVO) += board-bravo-smb329.o
obj-$(CONFIG_MACH_BRAVO) += devices_htc.o

obj-$(CONFIG_MACH_BRAVOC) += board-bravo.o board-bravo-panel.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-keypad.o board-bravo-mmc.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-rfkill.o htc_wifi_nvs.o htc_awb_cal.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-wifi.o board-bravo-audio.o
obj-$(CONFIG_MACH_BRAVOC) += msm_vibrator.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-microp.o
obj-$(CONFIG_MACH_BRAVOC) += htc_acoustic_qsd.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-tpa2018d1.o
obj-$(CONFIG_MACH_BRAVOC) += board-bravo-smb329.o
obj-$(CONFIG_MACH_BRAVOC) += devices_htc.o

obj-$(CONFIG_HTC_PWRSINK) += htc_pwrsink.o
obj-$(CONFIG_HTC_PWRSPLY) += htc_power_supply.o
obj-$(CONFIG_HTC_HEADSET) += htc_headset.o
Expand Down
280 changes: 280 additions & 0 deletions arch/arm/mach-msm/board-bravo-audio.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,280 @@
/* arch/arm/mach-msm/board-bravo-audio.c
*
* Copyright (C) 2009 HTC Corporation
* Copyright (C) 2009 Google Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/

#include <linux/gpio.h>
#include <linux/delay.h>
#include <mach/msm_qdsp6_audio.h>
#include <mach/htc_acoustic_qsd.h>

#include "board-bravo.h"
#include "proc_comm.h"
#include "pmic.h"
#include "board-bravo-tpa2018d1.h"

#if 0
#define D(fmt, args...) printk(KERN_INFO "Audio: "fmt, ##args)
#else
#define D(fmt, args...) do {} while (0)
#endif

static struct mutex mic_lock;
static struct mutex bt_sco_lock;

static struct q6_hw_info q6_audio_hw[Q6_HW_COUNT] = {
[Q6_HW_HANDSET] = {
.min_gain = -1500,
.max_gain = 500,
},
[Q6_HW_HEADSET] = {
.min_gain = -1100,
.max_gain = 400,
},
[Q6_HW_SPEAKER] = {
.min_gain = -1000,
.max_gain = 500,
},
[Q6_HW_TTY] = {
.min_gain = 0,
.max_gain = 0,
},
[Q6_HW_BT_SCO] = {
.min_gain = -1000,
.max_gain = 400,
},
[Q6_HW_BT_A2DP] = {
.min_gain = -1100,
.max_gain = 400,
},
};

void bravo_headset_enable(int en)
{
D("%s %d\n", __func__, en);
/* enable audio amp */
if (en) mdelay(15);
gpio_set_value(BRAVO_AUD_JACKHP_EN, !!en);
}

void bravo_speaker_enable(int en)
{
struct spkr_config_mode scm;
memset(&scm, 0, sizeof(scm));

D("%s %d\n", __func__, en);
if (en) {
scm.is_right_chan_en = 0;
scm.is_left_chan_en = 1;
scm.is_stereo_en = 0;
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, 0);

/* unmute */
pmic_spkr_en_mute(LEFT_SPKR, 1);
} else {
pmic_spkr_en_mute(LEFT_SPKR, 0);

pmic_spkr_en(LEFT_SPKR, 0);
pmic_spkr_en(RIGHT_SPKR, 0);

pmic_set_spkr_configuration(&scm);
}
if (is_cdma_version(system_rev))
tpa2018d1_set_speaker_amp(en);
}

void bravo_receiver_enable(int en)
{
if (is_cdma_version(system_rev)) {
struct spkr_config_mode scm;
memset(&scm, 0, sizeof(scm));

D("%s %d\n", __func__, en);
if (en) {
scm.is_right_chan_en = 1;
scm.is_left_chan_en = 0;
scm.is_stereo_en = 0;
scm.is_hpf_en = 1;
pmic_spkr_en_mute(RIGHT_SPKR, 0);
pmic_set_spkr_configuration(&scm);
pmic_spkr_en(RIGHT_SPKR, 1);

/* unmute */
pmic_spkr_en_mute(RIGHT_SPKR, 1);
} else {
pmic_spkr_en_mute(RIGHT_SPKR, 0);

pmic_spkr_en(RIGHT_SPKR, 0);

pmic_set_spkr_configuration(&scm);
}
}
}

static void config_gpio_table(uint32_t *table, int len)
{
int n;
unsigned id;
for (n = 0; n < len; n++) {
id = table[n];
msm_proc_comm(PCOM_RPC_GPIO_TLMM_CONFIG_EX, &id, 0);
}
}

static uint32_t bt_sco_enable[] = {
PCOM_GPIO_CFG(BRAVO_BT_PCM_OUT, 1, GPIO_OUTPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_IN, 1, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_SYNC, 2, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_CLK, 2, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
};

static uint32_t bt_sco_disable[] = {
PCOM_GPIO_CFG(BRAVO_BT_PCM_OUT, 0, GPIO_OUTPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_IN, 0, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_SYNC, 0, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
PCOM_GPIO_CFG(BRAVO_BT_PCM_CLK, 0, GPIO_INPUT,
GPIO_NO_PULL, GPIO_2MA),
};

void bravo_bt_sco_enable(int en)
{
static int bt_sco_refcount;
D("%s %d\n", __func__, en);

mutex_lock(&bt_sco_lock);
if (en) {
if (++bt_sco_refcount == 1)
config_gpio_table(bt_sco_enable,
ARRAY_SIZE(bt_sco_enable));
} else {
if (--bt_sco_refcount == 0) {
config_gpio_table(bt_sco_disable,
ARRAY_SIZE(bt_sco_disable));
gpio_set_value(BRAVO_BT_PCM_OUT, 0);
}
}
mutex_unlock(&bt_sco_lock);
}

void bravo_mic_enable(int en)
{
static int old_state = 0, new_state = 0;

D("%s %d\n", __func__, en);

mutex_lock(&mic_lock);
if (!!en)
new_state++;
else
new_state--;

if (new_state == 1 && old_state == 0) {
gpio_set_value(BRAVO_AUD_2V5_EN, 1);
mdelay(60);
} else if (new_state == 0 && old_state == 1)
gpio_set_value(BRAVO_AUD_2V5_EN, 0);
else
D("%s: do nothing %d %d\n", __func__, old_state, new_state);

old_state = new_state;
mutex_unlock(&mic_lock);
}

void bravo_analog_init(void)
{
D("%s\n", __func__);
/* stereo pmic init */
pmic_spkr_set_gain(LEFT_SPKR, SPKR_GAIN_PLUS12DB);
pmic_spkr_set_gain(RIGHT_SPKR, SPKR_GAIN_PLUS12DB);
pmic_spkr_en_right_chan(OFF_CMD);
pmic_spkr_en_left_chan(OFF_CMD);
pmic_spkr_add_right_left_chan(OFF_CMD);
pmic_spkr_en_stereo(OFF_CMD);
pmic_spkr_select_usb_with_hpf_20hz(OFF_CMD);
pmic_spkr_bypass_mux(OFF_CMD);
pmic_spkr_en_hpf(ON_CMD);
pmic_spkr_en_sink_curr_from_ref_volt_cir(OFF_CMD);
pmic_spkr_set_mux_hpf_corner_freq(SPKR_FREQ_0_73KHZ);
pmic_mic_set_volt(MIC_VOLT_1_80V);

gpio_request(BRAVO_AUD_JACKHP_EN, "aud_jackhp_en");
gpio_request(BRAVO_BT_PCM_OUT, "bt_pcm_out");

gpio_direction_output(BRAVO_AUD_JACKHP_EN, 0);

mutex_lock(&bt_sco_lock);
config_gpio_table(bt_sco_disable,
ARRAY_SIZE(bt_sco_disable));
gpio_direction_output(BRAVO_BT_PCM_OUT, 0);
mutex_unlock(&bt_sco_lock);
}

int bravo_get_rx_vol(uint8_t hw, int level)
{
int vol;
struct q6_hw_info *info;

if (level > 100)
level = 100;
else if (level < 0)
level = 0;

if (is_cdma_version(system_rev) && hw == Q6_HW_HANDSET) {
int handset_volume[6] = { -1600, -1300, -1000, -600, -300, 0 };
vol = handset_volume[5 * level / 100];
} else {
info = &q6_audio_hw[hw];
vol = info->min_gain + ((info->max_gain - info->min_gain) * level) / 100;
}

D("%s %d\n", __func__, vol);
return vol;
}

static struct qsd_acoustic_ops acoustic = {
.enable_mic_bias = bravo_mic_enable,
};

static struct q6audio_analog_ops ops = {
.init = bravo_analog_init,
.speaker_enable = bravo_speaker_enable,
.headset_enable = bravo_headset_enable,
.receiver_enable = bravo_receiver_enable,
.bt_sco_enable = bravo_bt_sco_enable,
.int_mic_enable = bravo_mic_enable,
.ext_mic_enable = bravo_mic_enable,
.get_rx_vol = bravo_get_rx_vol,
};

void __init bravo_audio_init(void)
{
mutex_init(&mic_lock);
mutex_init(&bt_sco_lock);
q6audio_register_analog_ops(&ops);
acoustic_register_ops(&acoustic);
if (is_cdma_version(system_rev))
q6audio_set_acdb_file("default_PMIC.acdb");
}
Loading

0 comments on commit 8ef61a3

Please sign in to comment.