Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8777b754 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 1038df1f on remote branch

Change-Id: I761867a8fb236b21861778bcf75222b16ce1c7a2
parents 97be5145 1038df1f
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 */

#ifndef _BENGAL_PORT_CONFIG
@@ -21,6 +21,15 @@ static struct port_params rx_frame_params_default[SWR_MSTR_PORT_LEN] = {
	{0,  0,  0,  0xFF, 0xFF, 0xFF, 0xFF, 0,    0},
};

static struct port_params rx_frame_params_rouleur[SWR_MSTR_PORT_LEN] = {
	{3,  0,  0,  0xFF, 0xFF, 1,    0xFF, 0xFF, 1},
	{31, 0,  0,  3,    6,    7,    0,    0xFF, 0},
	{31, 1,  0,  0xFF, 0xFF, 4,    1,    0xFF, 0},
	{7,  1,  0,  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0},
	{0,  0,  0,  0xFF, 0xFF, 0xFF, 0xFF, 0,    0},
};


static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = {
	{3,  0,  0,  0xFF, 0xFF, 1,    0xFF, 0xFF, 1},
	{31, 0,  0,  3,    6,    7,    0,    0xFF, 0},
@@ -42,4 +51,9 @@ static struct swr_mstr_port_map sm_port_map[] = {
	{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
};

static struct swr_mstr_port_map sm_port_map_rouleur[] = {
	{VA_MACRO, SWR_UC0, tx_frame_params_default},
	{RX_MACRO, SWR_UC0, rx_frame_params_rouleur},
	{RX_MACRO, SWR_UC1, rx_frame_params_dsd},
};
#endif /* _BENGAL_PORT_CONFIG */
+107 −11
Original line number Diff line number Diff line
@@ -59,10 +59,12 @@

#define WCD9XXX_MBHC_DEF_RLOADS     5
#define WCD9XXX_MBHC_DEF_BUTTONS    8
#define ROULEUR_MBHC_DEF_BUTTONS    5
#define CODEC_EXT_CLK_RATE          9600000
#define ADSP_STATE_READY_TIMEOUT_MS 3000
#define DEV_NAME_STR_LEN            32
#define WCD_MBHC_HS_V_MAX           1600
#define ROULEUR_MBHC_HS_V_MAX       1700

#define TDM_CHANNEL_MAX		8
#define DEV_NAME_STR_LEN	32
@@ -555,6 +557,7 @@ static int dmic_0_1_gpio_cnt;
static int dmic_2_3_gpio_cnt;

static void *def_wcd_mbhc_cal(void);
static void *def_rouleur_mbhc_cal(void);

/*
 * Need to report LINEIN
@@ -4218,6 +4221,9 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
	struct snd_soc_dapm_context *dapm;
	struct snd_card *card;
	struct snd_info_entry *entry;
	struct platform_device *pdev = NULL;
	int i = 0;
	char *data = NULL;
	struct msm_asoc_mach_data *pdata =
				snd_soc_card_get_drvdata(rtd->card);

@@ -4260,8 +4266,38 @@ static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)

	snd_soc_dapm_sync(dapm);

		bolero_set_port_map(component, ARRAY_SIZE(sm_port_map),
	for (i = 0; i < rtd->card->num_aux_devs; i++)
	{
		if (msm_aux_dev[i].name != NULL ) {
			if (strstr(msm_aux_dev[i].name, "wsa"))
				continue;
		}

		if (msm_aux_dev[i].codec_of_node) {
			pdev = of_find_device_by_node(
					msm_aux_dev[i].codec_of_node);

			if (pdev)
				data = (char*) of_device_get_match_data(
								&pdev->dev);
			if (data != NULL) {
				if (!strncmp(data, "wcd937x",
						sizeof("wcd937x"))) {
					bolero_set_port_map(component,
						ARRAY_SIZE(sm_port_map),
						sm_port_map);
					break;
				} else if (!strncmp( data, "rouleur",
							sizeof("rouleur"))) {
					bolero_set_port_map(component,
						ARRAY_SIZE(sm_port_map_rouleur),
						sm_port_map_rouleur);
					break;
				}
			}
		}
	}

	card = rtd->card->snd_card;
	if (!pdata->codec_root) {
		entry = snd_info_create_subdir(card->module, "codecs",
@@ -4311,6 +4347,34 @@ static void *def_wcd_mbhc_cal(void)
	return wcd_mbhc_cal;
}

static void *def_rouleur_mbhc_cal(void)
{
	void *wcd_mbhc_cal;
	struct wcd_mbhc_btn_detect_cfg *btn_cfg;
	u16 *btn_high;

	wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(ROULEUR_MBHC_DEF_BUTTONS,
				WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
	if (!wcd_mbhc_cal)
		return NULL;

	WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max =
						ROULEUR_MBHC_HS_V_MAX;
	WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn =
						ROULEUR_MBHC_DEF_BUTTONS;
	btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal);
	btn_high = ((void *)&btn_cfg->_v_btn_low) +
		(sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);

	btn_high[0] = 75;
	btn_high[1] = 150;
	btn_high[2] = 237;
	btn_high[3] = 500;
	btn_high[4] = 500;

	return wcd_mbhc_cal;
}

/* Digital audio interface glue - connects codec <---> CPU */
static struct snd_soc_dai_link msm_common_dai_links[] = {
	/* FrontEnd DAI Links */
@@ -5030,6 +5094,33 @@ static struct snd_soc_dai_link msm_common_be_dai_links[] = {
		.ignore_suspend = 1,
		.ignore_pmdown_time = 1,
	},
	/* Proxy Tx BACK END DAI Link */
	{
		.name = LPASS_BE_PROXY_TX,
		.stream_name = "Proxy Capture",
		.cpu_dai_name = "msm-dai-q6-dev.8195",
		.platform_name = "msm-pcm-routing",
		.codec_name = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-tx",
		.no_pcm = 1,
		.dpcm_capture = 1,
		.id = MSM_BACKEND_DAI_PROXY_TX,
		.ignore_suspend = 1,
	},
	/* Proxy Rx BACK END DAI Link */
	{
		.name = LPASS_BE_PROXY_RX,
		.stream_name = "Proxy Playback",
		.cpu_dai_name = "msm-dai-q6-dev.8194",
		.platform_name = "msm-pcm-routing",
		.codec_name = "msm-stub-codec.1",
		.codec_dai_name = "msm-stub-rx",
		.no_pcm = 1,
		.dpcm_playback = 1,
		.id = MSM_BACKEND_DAI_PROXY_RX,
		.ignore_pmdown_time = 1,
		.ignore_suspend = 1,
	},
	{
		.name = LPASS_BE_USB_AUDIO_RX,
		.stream_name = "USB Audio Playback",
@@ -6056,16 +6147,21 @@ static int msm_aux_codec_init(struct snd_soc_component *component)
	}

mbhc_cfg_cal:
        if (data != NULL) {
		if (!strncmp(data, "wcd937x", sizeof("wcd937x"))) {
			mbhc_calibration = def_wcd_mbhc_cal();
			if (!mbhc_calibration)
				return -ENOMEM;
			wcd_mbhc_cfg.calibration = mbhc_calibration;
        if (data != NULL) {
                if (!strncmp(data, "wcd937x", sizeof("wcd937x")))
			ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
                else if (!strncmp( data, "rouleur", sizeof("rouleur")))
		} else if (!strncmp( data, "rouleur", sizeof("rouleur"))) {
			mbhc_calibration = def_rouleur_mbhc_cal();
			if (!mbhc_calibration)
				return -ENOMEM;
			wcd_mbhc_cfg.calibration = mbhc_calibration;
			ret = rouleur_mbhc_hs_detect(component, &wcd_mbhc_cfg);
		}
	}

	if (ret) {
		dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n",
+19 −12
Original line number Diff line number Diff line
@@ -1687,13 +1687,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component,
	dev_dbg(component->dev, "%s: event %d compander %d, enabled %d\n",
		__func__, event, comp + 1, rx_priv->comp_enabled[comp]);

	if (!rx_priv->comp_enabled[comp])
		return 0;

	comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 +
					(comp * RX_MACRO_COMP_OFFSET);
	rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 +
					(comp * RX_MACRO_RX_PATH_OFFSET);
	rx_path_cfg3_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG3 +
					(comp * RX_MACRO_RX_PATH_OFFSET);
	rx0_path_ctl_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
@@ -1709,6 +1702,19 @@ static int rx_macro_config_compander(struct snd_soc_component *component,
	else
		val = 0x00;

	if (SND_SOC_DAPM_EVENT_ON(event))
		snd_soc_component_update_bits(component, rx_path_cfg3_reg,
					0x03, val);
	if (SND_SOC_DAPM_EVENT_OFF(event))
		snd_soc_component_update_bits(component, rx_path_cfg3_reg,
					0x03, 0x03);
	if (!rx_priv->comp_enabled[comp])
		return 0;

	comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 +
					(comp * RX_MACRO_COMP_OFFSET);
	rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 +
					(comp * RX_MACRO_RX_PATH_OFFSET);
	if (SND_SOC_DAPM_EVENT_ON(event)) {
		/* Enable Compander Clock */
		snd_soc_component_update_bits(component, comp_ctl0_reg,
@@ -1719,8 +1725,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component,
					0x02, 0x00);
		snd_soc_component_update_bits(component, rx_path_cfg0_reg,
					0x02, 0x02);
		snd_soc_component_update_bits(component, rx_path_cfg3_reg,
					0x03, val);
	}

	if (SND_SOC_DAPM_EVENT_OFF(event)) {
@@ -1732,8 +1736,6 @@ static int rx_macro_config_compander(struct snd_soc_component *component,
					0x01, 0x00);
		snd_soc_component_update_bits(component, comp_ctl0_reg,
					0x04, 0x00);
		snd_soc_component_update_bits(component, rx_path_cfg3_reg,
					0x03, 0x03);
	}

	return 0;
@@ -1908,6 +1910,11 @@ static int rx_macro_config_classh(struct snd_soc_component *component,
				0x40, 0x40);
		break;
	case INTERP_HPHR:
		if (rx_priv->is_ear_mode_on)
			snd_soc_component_update_bits(component,
				BOLERO_CDC_RX_CLSH_HPH_V_PA,
				0x3F, 0x39);
		else
			snd_soc_component_update_bits(component,
				BOLERO_CDC_RX_CLSH_HPH_V_PA,
				0x3F, 0x1C);
+30 −4
Original line number Diff line number Diff line
@@ -241,6 +241,7 @@ struct wsa_macro_priv {
	struct wsa_macro_bcl_pmic_params bcl_pmic_params;
	char __iomem *mclk_mode_muxsel;
	u16 default_clk_id;
	u32 pcm_rate_vi;
	int wsa_digital_mute_status[WSA_MACRO_RX_MAX];
};

@@ -747,6 +748,15 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
{
	struct snd_soc_component *component = dai->component;
	int ret;
	struct device *wsa_dev = NULL;
	struct wsa_macro_priv *wsa_priv = NULL;

	if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
		return -EINVAL;

	wsa_priv = dev_get_drvdata(wsa_dev);
	if (!wsa_priv)
		return -EINVAL;

	dev_dbg(component->dev,
		"%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
@@ -764,6 +774,8 @@ static int wsa_macro_hw_params(struct snd_pcm_substream *substream,
		}
		break;
	case SNDRV_PCM_STREAM_CAPTURE:
		if (dai->id == WSA_MACRO_AIF_VI)
			wsa_priv->pcm_rate_vi = params_rate(params);
	default:
		break;
	}
@@ -1046,10 +1058,24 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
			snd_soc_dapm_to_component(w->dapm);
	struct device *wsa_dev = NULL;
	struct wsa_macro_priv *wsa_priv = NULL;
	u8 val = 0x0;

	if (!wsa_macro_get_data(component, &wsa_dev, &wsa_priv, __func__))
		return -EINVAL;

	switch (wsa_priv->pcm_rate_vi) {
		case 48000:
			val = 0x04;
			break;
		case 24000:
			val = 0x02;
			break;
		case 8000:
		default:
			val = 0x00;
			break;
	}

	switch (event) {
	case SND_SOC_DAPM_POST_PMU:
		if (test_bit(WSA_MACRO_TX0,
@@ -1064,10 +1090,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
				0x20, 0x20);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
				0x0F, 0x00);
				0x0F, val);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX1_SPKR_PROT_PATH_CTL,
				0x0F, 0x00);
				0x0F, val);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX0_SPKR_PROT_PATH_CTL,
				0x10, 0x10);
@@ -1093,10 +1119,10 @@ static int wsa_macro_enable_vi_feedback(struct snd_soc_dapm_widget *w,
				0x20, 0x20);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
				0x0F, 0x00);
				0x0F, val);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX3_SPKR_PROT_PATH_CTL,
				0x0F, 0x00);
				0x0F, val);
			snd_soc_component_update_bits(component,
				BOLERO_CDC_WSA_TX2_SPKR_PROT_PATH_CTL,
				0x10, 0x10);
+20 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
 */
#include <linux/init.h>
#include <linux/delay.h>
@@ -602,6 +602,25 @@ static const struct snd_soc_dapm_route csra66x0_dapm_routes[] = {
	{"PGA", NULL, "DAC"},
	{"SPKR", NULL, "PGA"},
};
/*
 * csra66x0_hw_free_mute - Update csra66x0 mute register
 *
 * @component - csra66x0 component
 *
 */
void csra66x0_hw_free_mute(struct snd_soc_component *component)
{
	int val = 0;

	if (component == NULL)
		return;

	val = snd_soc_component_read32(component,
			CSRA66X0_MISC_CONTROL_STATUS_1_FA);
	snd_soc_component_write(component, CSRA66X0_MISC_CONTROL_STATUS_1_FA,
			val | 0x04);
}
EXPORT_SYMBOL(csra66x0_hw_free_mute);

static int csra66x0_wait_for_config_state(struct snd_soc_component *component)
{
Loading