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

Commit 25916460 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: Enable clock Fs generation in bolero codec"

parents 4b706081 ff649f9d
Loading
Loading
Loading
Loading
+42 −0
Original line number Diff line number Diff line
@@ -464,6 +464,46 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id)
}
EXPORT_SYMBOL(bolero_unregister_macro);

static void bolero_fs_gen_enable(struct bolero_priv *priv, bool enable)
{
	if (enable) {
		if (++priv->clk_users == 1) {
			mutex_unlock(&priv->clk_lock);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
				0x01, 0x01);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
				0x01, 0x01);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
				0x02, 0x02);
			mutex_lock(&priv->clk_lock);
		}
	} else {
		if (priv->clk_users <= 0) {
			dev_err(priv->dev,
				"%s:clock already disabled\n",
				__func__);
			priv->clk_users = 0;
			return;
		}
		if (--priv->clk_users == 0) {
			mutex_unlock(&priv->clk_lock);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
				0x02, 0x00);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
				0x01, 0x00);
			regmap_update_bits(priv->regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
				0x01, 0x00);
			mutex_lock(&priv->clk_lock);
		}
	}
}

/**
 * bolero_request_clock - request for clock enable/disable
 *
@@ -510,6 +550,7 @@ int bolero_request_clock(struct device *dev, u16 macro_id,
				macro_id, mclk_mux0_macro);
			goto err;
		}
		bolero_fs_gen_enable(priv, enable);
		break;
	case MCLK_MUX1:
		mclk_mux1_macro =  bolero_mclk_mux_tbl[macro_id][MCLK_MUX1];
@@ -527,6 +568,7 @@ int bolero_request_clock(struct device *dev, u16 macro_id,
			if (enable)
				goto err;
		}
		bolero_fs_gen_enable(priv, enable);
		/*
		 * need different return value as ret variable
		 * is used to track mclk_mux0 enable success or fail
+1 −0
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ struct bolero_priv {
	struct wcd_ctrl_platform_data plat_data;
	struct device *wcd_dev;
	struct blocking_notifier_head notifier;
	int clk_users;
};

struct regmap *bolero_regmap_init(struct device *dev,
+0 −18
Original line number Diff line number Diff line
@@ -166,15 +166,6 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv,
			regcache_sync_region(regmap,
					VA_START_OFFSET,
					VA_MAX_OFFSET);
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
				0x01, 0x01);
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
				0x01, 0x01);
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
				0x02, 0x02);
		}
		va_priv->va_mclk_users++;
	} else {
@@ -186,15 +177,6 @@ static int va_macro_mclk_enable(struct va_macro_priv *va_priv,
		}
		va_priv->va_mclk_users--;
		if (va_priv->va_mclk_users == 0) {
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_TOP_CSR_TOP_CFG0,
				0x02, 0x00);
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL,
				0x01, 0x00);
			regmap_update_bits(regmap,
				BOLERO_CDC_VA_CLK_RST_CTRL_MCLK_CONTROL,
				0x01, 0x00);
			bolero_request_clock(va_priv->dev,
					VA_MACRO,
					va_priv->mclk_mux_sel, false);