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

Commit 04804945 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "asoc: bolero: Fix gfmux access during SSR"

parents 1563894f 701e3584
Loading
Loading
Loading
Loading
+16 −8
Original line number Diff line number Diff line
@@ -428,7 +428,7 @@ int bolero_request_clock(struct device *dev, u16 macro_id,
{
	struct bolero_priv *priv;
	u16 mclk_mux0_macro, mclk_mux1_macro;
	int ret = 0;
	int ret = 0, ret1 = 0;

	if (!dev) {
		pr_err("%s: dev is null\n", __func__);
@@ -468,24 +468,32 @@ int bolero_request_clock(struct device *dev, u16 macro_id,
			dev_err(dev,
				"%s: MCLK_MUX0 en failed for macro:%d mclk_mux0_macro:%d\n",
				__func__, macro_id, mclk_mux0_macro);
			/*
			 * for disable case, need to proceed still for mclk_mux1
			 * counter to decrement
			 */
			if (enable)
				goto err;
		}
		ret = priv->macro_params[mclk_mux1_macro].mclk_fn(
		/*
		 * need different return value as ret variable
		 * is used to track mclk_mux0 enable success or fail
		 */
		ret1 = priv->macro_params[mclk_mux1_macro].mclk_fn(
			priv->macro_params[mclk_mux1_macro].dev, enable);
		if (ret < 0) {
		if (ret1 < 0)
			dev_err(dev,
				"%s: MCLK_MUX1 %s failed for macro:%d, mclk_mux1_macro:%d\n",
				__func__,
				enable ? "enable" : "disable",
				macro_id, mclk_mux1_macro);
		/* disable mclk_mux0 only if ret is success(0) */
		if (!ret)
			priv->macro_params[mclk_mux0_macro].mclk_fn(
				priv->macro_params[mclk_mux0_macro].dev,
				false);
		if (enable && ret1)
			goto err;
		}
		priv->macro_params[mclk_mux0_macro].mclk_fn(
			priv->macro_params[mclk_mux0_macro].dev,
			false);
		break;
	case MCLK_MUX_MAX:
	default:
+17 −4
Original line number Diff line number Diff line
@@ -343,6 +343,7 @@ struct rx_macro_priv {
	int rx_mclk_cnt;
	bool is_native_on;
	bool is_ear_mode_on;
	bool dev_up;
	u16 mclk_mux;
	struct mutex mclk_lock;
	struct mutex swr_clk_lock;
@@ -1087,16 +1088,20 @@ static int rx_macro_mclk_ctrl(struct device *dev, bool enable)
				__func__);
			return ret;
		}
		if (rx_priv->rx_mclk_cnt++ == 0)
		if (rx_priv->rx_mclk_cnt++ == 0) {
			if (rx_priv->dev_up)
				iowrite32(0x1, rx_priv->rx_mclk_mode_muxsel);
		}
	} else {
		if (rx_priv->rx_mclk_cnt <= 0) {
			dev_dbg(dev, "%s:rx mclk already disabled\n", __func__);
			rx_priv->rx_mclk_cnt = 0;
			return 0;
		}
		if (--rx_priv->rx_mclk_cnt == 0)
		if (--rx_priv->rx_mclk_cnt == 0) {
			if (rx_priv->dev_up)
				iowrite32(0x0, rx_priv->rx_mclk_mode_muxsel);
		}
		clk_disable_unprepare(rx_priv->rx_npl_clk);
		clk_disable_unprepare(rx_priv->rx_core_clk);
	}
@@ -1132,6 +1137,7 @@ static int rx_macro_event_handler(struct snd_soc_codec *codec, u16 event,
		rx_macro_wcd_clsh_imped_config(codec, data, false);
		break;
	case BOLERO_MACRO_EVT_SSR_DOWN:
		rx_priv->dev_up = false;
		swrm_wcd_notify(
			rx_priv->swr_ctrl_data[0].rx_swr_pdev,
			SWR_DEVICE_SSR_DOWN, NULL);
@@ -1140,6 +1146,12 @@ static int rx_macro_event_handler(struct snd_soc_codec *codec, u16 event,
			SWR_DEVICE_DOWN, NULL);
		break;
	case BOLERO_MACRO_EVT_SSR_UP:
		rx_priv->dev_up = true;
		/* enable&disable MCLK_MUX1 to reset GFMUX reg */
		bolero_request_clock(rx_priv->dev,
				RX_MACRO, MCLK_MUX1, true);
		bolero_request_clock(rx_priv->dev,
				RX_MACRO, MCLK_MUX1, false);
		swrm_wcd_notify(
			rx_priv->swr_ctrl_data[0].rx_swr_pdev,
			SWR_DEVICE_SSR_UP, NULL);
@@ -3028,6 +3040,7 @@ static int rx_macro_init(struct snd_soc_codec *codec)
		dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
		return ret;
	}
	rx_priv->dev_up = true;
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback");
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback");
	snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback");