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

Commit 9e0d10f2 authored by Linux Build Service Account's avatar Linux Build Service Account
Browse files

Merge 18e9fac0 on remote branch

Change-Id: I92ccdee7b7e8a6470b7c4d668ccdfd2e66694067
parents 4616373a 18e9fac0
Loading
Loading
Loading
Loading
+52 −1
Original line number Diff line number Diff line
/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -33,6 +33,7 @@ enum {
	AUDIO_EXT_CLK_LPASS5,
	AUDIO_EXT_CLK_LPASS6,
	AUDIO_EXT_CLK_LPASS7,
	AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE,
	AUDIO_EXT_CLK_LPASS_MAX,
	AUDIO_EXT_CLK_MAX = AUDIO_EXT_CLK_LPASS_MAX,
};
@@ -55,6 +56,7 @@ struct audio_ext_clk_priv {
	struct afe_clk_set clk_cfg;
	struct audio_ext_clk audio_clk;
	const char *clk_name;
	uint32_t lpass_core_hwvote_client_handle;
};

static inline struct audio_ext_clk_priv *to_audio_clk(struct clk_hw *hw)
@@ -141,16 +143,56 @@ static u8 audio_ext_clk_get_parent(struct clk_hw *hw)
		return 0;
}

static int lpass_hw_vote_prepare(struct clk_hw *hw)
{
	struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw);
	int ret = 0;

	if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE)  {
		ret = afe_vote_lpass_core_hw(AFE_LPASS_CORE_HW_MACRO_BLOCK,
			"LPASS_HW_MACRO",
			&clk_priv->lpass_core_hwvote_client_handle);
		if (ret < 0) {
			pr_err("%s lpass core hw vote failed %d\n",
				__func__, ret);
			return ret;
		}
	}

	return 0;
}

static void lpass_hw_vote_unprepare(struct clk_hw *hw)
{
	struct audio_ext_clk_priv *clk_priv = to_audio_clk(hw);
	int ret = 0;

	if (clk_priv->clk_src == AUDIO_EXT_CLK_LPASS_CORE_HW_VOTE) {
		ret = afe_unvote_lpass_core_hw(
			AFE_LPASS_CORE_HW_MACRO_BLOCK,
			clk_priv->lpass_core_hwvote_client_handle);
		if (ret < 0)
			pr_err("%s lpass core hw vote failed %d\n",
				__func__, ret);
	}
}

static const struct clk_ops audio_ext_clk_ops = {
	.prepare = audio_ext_clk_prepare,
	.unprepare = audio_ext_clk_unprepare,
	.get_parent = audio_ext_clk_get_parent,
};

static const struct clk_ops lpass_hw_vote_ops = {
	.prepare = lpass_hw_vote_prepare,
	.unprepare = lpass_hw_vote_unprepare,
};

static const char * const audio_ext_pmi_div_clk[] = {
	"qpnp_clkdiv_1",
	"pms405_div_clk1",
	"pm6150_div_clk1",
	"pm6125_div_clk1",
};

static int audio_ext_clk_dummy_prepare(struct clk_hw *hw)
@@ -274,6 +316,15 @@ static struct audio_ext_clk audio_clk_array[] = {
			},
		},
	},
	{
		.pnctrl_info = {NULL},
		.fact = {
			.hw.init = &(struct clk_init_data){
				.name = "lpass_hw_vote_clk",
				.ops = &lpass_hw_vote_ops,
			},
		},
	},
};

static int audio_get_pinctrl(struct platform_device *pdev)
+39 −0
Original line number Diff line number Diff line
@@ -460,6 +460,10 @@ static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = {
	SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0)
};

static const char * const hph_idle_detect_text[] = {"OFF", "ON"};

static SOC_ENUM_SINGLE_EXT_DECL(hph_idle_detect_enum, hph_idle_detect_text);

RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0,
		rx_int_mix_mux_text);
RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0,
@@ -1633,6 +1637,38 @@ static void rx_macro_hd2_control(struct snd_soc_codec *codec,
	}
}

static int rx_macro_hph_idle_detect_get(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
	struct rx_macro_priv *rx_priv = NULL;
	struct device *rx_dev = NULL;

	if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
		return -EINVAL;

	ucontrol->value.integer.value[0] =
		rx_priv->idle_det_cfg.hph_idle_detect_en;

	return 0;
}

static int rx_macro_hph_idle_detect_put(struct snd_kcontrol *kcontrol,
					struct snd_ctl_elem_value *ucontrol)
{
	struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
	struct rx_macro_priv *rx_priv = NULL;
	struct device *rx_dev = NULL;

	if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
		return -EINVAL;

	rx_priv->idle_det_cfg.hph_idle_detect_en =
		ucontrol->value.integer.value[0];

	return 0;
}

static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,
			       struct snd_ctl_elem_value *ucontrol)
{
@@ -2511,6 +2547,9 @@ static const struct snd_kcontrol_new rx_macro_snd_controls[] = {
	SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,
		rx_macro_get_compander, rx_macro_set_compander),

	SOC_ENUM_EXT("HPH Idle Detect", hph_idle_detect_enum,
		rx_macro_hph_idle_detect_get, rx_macro_hph_idle_detect_put),

	SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum,
		rx_macro_get_ear_mode, rx_macro_put_ear_mode),

+5 −1
Original line number Diff line number Diff line
@@ -127,7 +127,8 @@ static int wcd937x_init_reg(struct snd_soc_codec *codec)
	snd_soc_update_bits(codec, WCD937X_ANA_BIAS, 0x40, 0x00);
	snd_soc_update_bits(codec, WCD937X_HPH_OCP_CTL, 0xFF, 0x3A);
	snd_soc_update_bits(codec, WCD937X_RX_OCP_CTL, 0x0F, 0x02);

	snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN, 0xFF,
			    0xD9);
	return 0;
}

@@ -1400,6 +1401,9 @@ static int wcd937x_event_notify(struct notifier_block *block,
		wcd937x_get_logical_addr(wcd937x->rx_swr_dev);
		regcache_mark_dirty(wcd937x->regmap);
		regcache_sync(wcd937x->regmap);
		/* Enable surge protection */
		snd_soc_update_bits(codec, WCD937X_HPH_SURGE_HPHLR_SURGE_EN,
				    0xFF, 0xD9);
		/* Initialize MBHC module */
		mbhc = &wcd937x->mbhc->wcd_mbhc;
		ret = wcd937x_mbhc_post_ssr_init(wcd937x->mbhc, codec);
+29 −48
Original line number Diff line number Diff line
/*
 * Copyright (c) 2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -4724,28 +4724,6 @@ static void msm_afe_clear_config(void)
	afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
}

static int msm_config_hph_en0_gpio(struct snd_soc_codec *codec, bool high)
{
	struct snd_soc_card *card = codec->component.card;
	struct msm_asoc_mach_data *pdata;
	int val;

	if (!card)
		return 0;

	pdata = snd_soc_card_get_drvdata(card);
	if (!pdata || !gpio_is_valid(pdata->hph_en0_gpio))
		return 0;

	val = gpio_get_value_cansleep(pdata->hph_en0_gpio);
	if ((!!val) == high)
		return 0;

	gpio_direction_output(pdata->hph_en0_gpio, (int)high);

	return 1;
}

static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd)
{
	int ret = 0;
@@ -4870,6 +4848,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd)
	}

	card = rtd->card->snd_card;
	if (!pdata->codec_root) {
		entry = snd_info_create_subdir(card->module, "codecs",
						 card->proc_root);
		if (!entry) {
@@ -4879,6 +4858,7 @@ static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd)
			goto err;
		}
		pdata->codec_root = entry;
	}
	tavil_codec_info_create_codec_entry(pdata->codec_root, codec);

	codec_reg_done = true;
@@ -5038,6 +5018,7 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd)
	}

	card = rtd->card->snd_card;
	if (!pdata->codec_root) {
		entry = snd_info_create_subdir(card->module, "codecs",
						 card->proc_root);
		if (!entry) {
@@ -5047,8 +5028,8 @@ static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd)
			goto err;
		}
		pdata->codec_root = entry;
	}
	tasha_codec_info_create_codec_entry(pdata->codec_root, codec);
	tasha_mbhc_zdet_gpio_ctrl(msm_config_hph_en0_gpio, rtd->codec);

	codec_reg_done = true;
	return 0;
@@ -8795,8 +8776,8 @@ static int msm_init_aux_dev(struct platform_device *pdev,
		__func__, found);

codec_aux_dev:
	if (!strnstr(card->name, "tavil", sizeof("tavil")) &&
	    !strnstr(card->name, "tasha", sizeof("tasha"))) {
	if (!strnstr(card->name, "tavil", strlen(card->name)) &&
	    !strnstr(card->name, "tasha", strlen(card->name))) {
		/* Get count of aux codec device phandles for this platform */
		codec_aux_dev_cnt = of_count_phandle_with_args(
					pdev->dev.of_node,
@@ -8984,8 +8965,8 @@ static int sm6150_ssr_enable(struct device *dev, void *data)
		goto err;
	}

	if (strnstr(card->name, "tavil", sizeof("tavil")) ||
	    strnstr(card->name, "tasha", sizeof("tasha"))) {
	if (strnstr(card->name, "tavil", strlen(card->name)) ||
	    strnstr(card->name, "tasha", strlen(card->name))) {
		pdata = snd_soc_card_get_drvdata(card);
		if (!pdata->is_afe_config_done) {
			const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
@@ -9028,8 +9009,8 @@ static void sm6150_ssr_disable(struct device *dev, void *data)
	dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__);
	snd_soc_card_change_online_state(card, 0);

	if (strnstr(card->name, "tavil", sizeof("tavil")) ||
	    strnstr(card->name, "tasha", sizeof("tasha"))) {
	if (strnstr(card->name, "tavil", strlen(card->name)) ||
	    strnstr(card->name, "tasha", strlen(card->name))) {
		pdata = snd_soc_card_get_drvdata(card);
		msm_afe_clear_config();
		pdata->is_afe_config_done = false;
@@ -9252,8 +9233,8 @@ static int msm_asoc_machine_probe(struct platform_device *pdev)
	}

	msm_i2s_auxpcm_init(pdev);
	if (!strnstr(card->name, "tavil", sizeof("tavil")) &&
	    !strnstr(card->name, "tasha", sizeof("tasha"))) {
	if (!strnstr(card->name, "tavil", strlen(card->name)) &&
	    !strnstr(card->name, "tasha", strlen(card->name))) {
		pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node,
						      "qcom,cdc-dmic01-gpios",
						       0);
+1 −0
Original line number Diff line number Diff line
@@ -38,3 +38,4 @@ CONFIG_DTS_SRS_TM=m
CONFIG_SND_SOC_MSM_STUB=m
CONFIG_MSM_AVTIMER=m
CONFIG_SND_SOC_MSM_HDMI_CODEC_RX=m
CONFIG_VOICE_MHI=m
Loading