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

Commit ea6cbeeb authored by Laxminath Kasam's avatar Laxminath Kasam Committed by Gerrit - the friendly Code Review server
Browse files

soc: mstr-ctrl: Retain Audio_HM voting until suspend



Restore change to retain audio_hm voting and
ensure AOP hang issue not seen by masking interrupt
wakeup of swr pinctrl pins.

Change-Id: I51bf36d6d6b0999abf10a4bc94cce900d1adf1d5
Signed-off-by: default avatarLaxminath Kasam <lkasam@codeaurora.org>
parent 9128e309
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -378,6 +378,7 @@ struct rx_swr_ctrl_platform_data {
							  void *data),
			  void *swrm_handle,
			  int action);
	int (*pinctrl_setup)(void *handle, bool enable);
};

enum {
@@ -4068,6 +4069,7 @@ static int rx_macro_probe(struct platform_device *pdev)
	rx_priv->swr_plat_data.clk = rx_swrm_clock;
	rx_priv->swr_plat_data.core_vote = rx_macro_core_vote;
	rx_priv->swr_plat_data.handle_irq = NULL;
	rx_priv->swr_plat_data.pinctrl_setup = NULL;

	ret = of_property_read_u8_array(pdev->dev.of_node,
				"qcom,rx-bcl-pmic-params", bcl_pmic_params,
+28 −8
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ struct tx_macro_swr_ctrl_platform_data {
							  void *data),
			  void *swrm_handle,
			  int action);
	int (*pinctrl_setup)(void *handle, bool enable);
};

enum {
@@ -2384,12 +2385,30 @@ static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
		       tx_macro_get_bcs, tx_macro_set_bcs),
};

static int tx_macro_pinctrl_setup(void *handle, bool enable)
{
	struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;

	if (tx_priv == NULL) {
		pr_err("%s: tx priv data is NULL\n", __func__);
		return -EINVAL;
	}
	if (enable)
		msm_cdc_pinctrl_set_wakeup_capable(
			tx_priv->tx_swr_gpio_p, true);
	else
		msm_cdc_pinctrl_set_wakeup_capable(
			tx_priv->tx_swr_gpio_p, false);
	return 0;
}

static int tx_macro_register_event_listener(struct snd_soc_component *component,
					    bool enable, bool is_dmic_sva)
{
	struct device *tx_dev = NULL;
	struct tx_macro_priv *tx_priv = NULL;
	int ret = 0;
	u32 dmic_sva = is_dmic_sva;

	if (!component)
		return -EINVAL;
@@ -2411,17 +2430,17 @@ static int tx_macro_register_event_listener(struct snd_soc_component *component,
		if (enable) {
			ret = swrm_wcd_notify(
				tx_priv->swr_ctrl_data[0].tx_swr_pdev,
				SWR_REGISTER_WAKEUP, NULL);
			if (!is_dmic_sva)
				SWR_REGISTER_WAKEUP, &dmic_sva);
			msm_cdc_pinctrl_set_wakeup_capable(
				tx_priv->tx_swr_gpio_p, false);
		} else {
			if (!is_dmic_sva)
			/* while teardown we can reset the flag */
			dmic_sva = 0;
			msm_cdc_pinctrl_set_wakeup_capable(
				tx_priv->tx_swr_gpio_p, true);
			ret = swrm_wcd_notify(
				tx_priv->swr_ctrl_data[0].tx_swr_pdev,
				SWR_DEREGISTER_WAKEUP, NULL);
				SWR_DEREGISTER_WAKEUP, &dmic_sva);
		}
	}

@@ -3230,6 +3249,7 @@ static int tx_macro_probe(struct platform_device *pdev)
		tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
		tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
		tx_priv->swr_plat_data.handle_irq = NULL;
		tx_priv->swr_plat_data.pinctrl_setup = tx_macro_pinctrl_setup;
		mutex_init(&tx_priv->swr_clk_lock);
	}
	tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
+2 −0
Original line number Diff line number Diff line
@@ -130,6 +130,7 @@ struct va_macro_swr_ctrl_platform_data {
							  void *data),
			  void *swrm_handle,
			  int action);
	int (*pinctrl_setup)(void *handle, bool enable);
};

struct va_macro_priv {
@@ -3213,6 +3214,7 @@ static int va_macro_probe(struct platform_device *pdev)
		va_priv->swr_plat_data.clk = va_macro_swrm_clock;
		va_priv->swr_plat_data.core_vote = va_macro_core_vote;
		va_priv->swr_plat_data.handle_irq = NULL;
		va_priv->swr_plat_data.pinctrl_setup = NULL;
		mutex_init(&va_priv->swr_clk_lock);
	}
	va_priv->is_used_va_swr_gpio = is_used_va_swr_gpio;
+2 −0
Original line number Diff line number Diff line
@@ -166,6 +166,7 @@ struct wsa_macro_swr_ctrl_platform_data {
							  void *data),
			  void *swrm_handle,
			  int action);
	int (*pinctrl_setup)(void *handle, bool enable);
};

struct wsa_macro_bcl_pmic_params {
@@ -3195,6 +3196,7 @@ static int wsa_macro_probe(struct platform_device *pdev)
	wsa_priv->swr_plat_data.clk = wsa_swrm_clock;
	wsa_priv->swr_plat_data.core_vote = wsa_macro_core_vote;
	wsa_priv->swr_plat_data.handle_irq = NULL;
	wsa_priv->swr_plat_data.pinctrl_setup = NULL;

	ret = of_property_read_u32(pdev->dev.of_node, "qcom,default-clk-id",
				   &default_clk_id);
+13 −10
Original line number Diff line number Diff line
@@ -2552,6 +2552,8 @@ static int swrm_probe(struct platform_device *pdev)
		ret = -EINVAL;
		goto err_pdata_fail;
	}
	swrm->pinctrl_setup = pdata->pinctrl_setup;

	if (of_property_read_u32(pdev->dev.of_node,
			"qcom,swr-clock-stop-mode0",
			&swrm->clk_stop_mode0_supp)) {
@@ -2873,7 +2875,6 @@ static int swrm_runtime_resume(struct device *dev)
	int ret = 0;
	bool swrm_clk_req_err = false;
	bool hw_core_err = false;
	bool aud_core_err = false;
	struct swr_master *mstr = &swrm->master;
	struct swr_device *swr_dev;

@@ -2891,7 +2892,7 @@ static int swrm_runtime_resume(struct device *dev)
	if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
		dev_err(dev, "%s:lpass audio hw enable failed\n",
			__func__);
		aud_core_err = true;
		swrm->aud_core_err = true;
	}

	if ((swrm->state == SWR_MSTR_DOWN) ||
@@ -2910,6 +2911,9 @@ static int swrm_runtime_resume(struct device *dev)
				    irq_get_irq_data(swrm->wake_irq)))
					disable_irq_nosync(swrm->wake_irq);
				mutex_unlock(&swrm->irq_lock);
				if (swrm->dmic_sva && swrm->pinctrl_setup)
					swrm->pinctrl_setup(swrm->handle,
							    false);
			}
			if (swrm->ipc_wakeup)
				msm_aud_evt_blocking_notifier_call_chain(
@@ -2977,7 +2981,7 @@ static int swrm_runtime_resume(struct device *dev)
		swrm->state = SWR_MSTR_UP;
	}
exit:
	if (!aud_core_err)
	if (ret && !swrm->aud_core_err)
		swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false);
	if (!hw_core_err)
		swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
@@ -3000,7 +3004,6 @@ static int swrm_runtime_suspend(struct device *dev)
	struct swr_mstr_ctrl *swrm = platform_get_drvdata(pdev);
	int ret = 0;
	bool hw_core_err = false;
	bool aud_core_err = false;
	struct swr_master *mstr = &swrm->master;
	struct swr_device *swr_dev;
	int current_state = 0;
@@ -3019,11 +3022,6 @@ static int swrm_runtime_suspend(struct device *dev)
			__func__);
		hw_core_err = true;
	}
	if (swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, true)) {
		dev_err(dev, "%s:lpass audio hw enable failed\n",
			__func__);
		aud_core_err = true;
	}

	if ((current_state == SWR_MSTR_UP) ||
	    (current_state == SWR_MSTR_SSR)) {
@@ -3108,6 +3106,8 @@ static int swrm_runtime_suspend(struct device *dev)

		if (swrm->clk_stop_mode0_supp) {
			if (swrm->wake_irq > 0) {
				if (swrm->dmic_sva && swrm->pinctrl_setup)
					swrm->pinctrl_setup(swrm->handle, true);
				enable_irq(swrm->wake_irq);
			} else if (swrm->ipc_wakeup) {
				msm_aud_evt_blocking_notifier_call_chain(
@@ -3121,10 +3121,11 @@ static int swrm_runtime_suspend(struct device *dev)
	if (current_state != SWR_MSTR_SSR)
		swrm->state = SWR_MSTR_DOWN;
exit:
	if (!aud_core_err)
	if (!swrm->aud_core_err)
		swrm_request_hw_vote(swrm, LPASS_AUDIO_CORE, false);
	if (!hw_core_err)
		swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
	swrm->aud_core_err = false;
	mutex_unlock(&swrm->reslock);
	trace_printk("%s: pm_runtime: suspend done state: %d\n",
		__func__, swrm->state);
@@ -3451,10 +3452,12 @@ int swrm_wcd_notify(struct platform_device *pdev, u32 id, void *data)
	case SWR_REGISTER_WAKEUP:
		msm_aud_evt_blocking_notifier_call_chain(
					SWR_WAKE_IRQ_REGISTER, (void *)swrm);
		swrm->dmic_sva = *(u32 *)data;
		break;
	case SWR_DEREGISTER_WAKEUP:
		msm_aud_evt_blocking_notifier_call_chain(
					SWR_WAKE_IRQ_DEREGISTER, (void *)swrm);
		swrm->dmic_sva = 0;
		break;
	case SWR_SET_PORT_MAP:
		if (!data) {
Loading