Merge "asoc: codecs: fix race condition of core vote and reg access"

这个提交包含在:
qctecmdr
2021-03-18 05:03:24 -07:00
提交者 Gerrit - the friendly Code Review server
当前提交 a919ccc068
修改 3 个文件,包含 28 行新增14 行删除

查看文件

@@ -377,6 +377,7 @@ static struct interp_sample_rate sr_val_tbl[] = {
{176400, 0xB}, {352800, 0xC}, {176400, 0xB}, {352800, 0xC},
}; };
static int lpass_cdc_rx_macro_core_vote(void *handle, bool enable);
static int lpass_cdc_rx_macro_hw_params(struct snd_pcm_substream *substream, static int lpass_cdc_rx_macro_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai); struct snd_soc_dai *dai);
@@ -1301,10 +1302,12 @@ static int lpass_cdc_rx_macro_mclk_enable(
if (rx_priv->rx_mclk_users == 0) { if (rx_priv->rx_mclk_users == 0) {
if (rx_priv->is_native_on) if (rx_priv->is_native_on)
rx_priv->clk_id = RX_CORE_CLK; rx_priv->clk_id = RX_CORE_CLK;
lpass_cdc_rx_macro_core_vote(rx_priv, true);
ret = lpass_cdc_clk_rsc_request_clock(rx_priv->dev, ret = lpass_cdc_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id, rx_priv->default_clk_id,
rx_priv->clk_id, rx_priv->clk_id,
true); true);
lpass_cdc_rx_macro_core_vote(rx_priv, false);
if (ret < 0) { if (ret < 0) {
dev_err(rx_priv->dev, dev_err(rx_priv->dev,
"%s: rx request clock enable failed\n", "%s: rx request clock enable failed\n",
@@ -1354,10 +1357,12 @@ static int lpass_cdc_rx_macro_mclk_enable(
0x01, 0x00); 0x01, 0x00);
lpass_cdc_clk_rsc_fs_gen_request(rx_priv->dev, lpass_cdc_clk_rsc_fs_gen_request(rx_priv->dev,
false); false);
lpass_cdc_rx_macro_core_vote(rx_priv, true);
lpass_cdc_clk_rsc_request_clock(rx_priv->dev, lpass_cdc_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id, rx_priv->default_clk_id,
rx_priv->clk_id, rx_priv->clk_id,
false); false);
lpass_cdc_rx_macro_core_vote(rx_priv, false);
rx_priv->clk_id = rx_priv->default_clk_id; rx_priv->clk_id = rx_priv->default_clk_id;
} }
} }
@@ -1467,6 +1472,7 @@ static int lpass_cdc_rx_macro_event_handler(struct snd_soc_component *component,
} }
break; break;
case LPASS_CDC_MACRO_EVT_PRE_SSR_UP: case LPASS_CDC_MACRO_EVT_PRE_SSR_UP:
lpass_cdc_rx_macro_core_vote(rx_priv, true);
/* enable&disable RX_CORE_CLK to reset GFMUX reg */ /* enable&disable RX_CORE_CLK to reset GFMUX reg */
ret = lpass_cdc_clk_rsc_request_clock(rx_priv->dev, ret = lpass_cdc_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id, rx_priv->default_clk_id,
@@ -1479,6 +1485,7 @@ static int lpass_cdc_rx_macro_event_handler(struct snd_soc_component *component,
lpass_cdc_clk_rsc_request_clock(rx_priv->dev, lpass_cdc_clk_rsc_request_clock(rx_priv->dev,
rx_priv->default_clk_id, rx_priv->default_clk_id,
RX_CORE_CLK, false); RX_CORE_CLK, false);
lpass_cdc_rx_macro_core_vote(rx_priv, false);
break; break;
case LPASS_CDC_MACRO_EVT_SSR_UP: case LPASS_CDC_MACRO_EVT_SSR_UP:
trace_printk("%s, enter SSR up\n", __func__); trace_printk("%s, enter SSR up\n", __func__);
@@ -3746,6 +3753,7 @@ static const struct snd_soc_dapm_route rx_audio_map[] = {
static int lpass_cdc_rx_macro_core_vote(void *handle, bool enable) static int lpass_cdc_rx_macro_core_vote(void *handle, bool enable)
{ {
int rc = 0;
struct lpass_cdc_rx_macro_priv *rx_priv = (struct lpass_cdc_rx_macro_priv *) handle; struct lpass_cdc_rx_macro_priv *rx_priv = (struct lpass_cdc_rx_macro_priv *) handle;
if (rx_priv == NULL) { if (rx_priv == NULL) {
@@ -3754,14 +3762,15 @@ static int lpass_cdc_rx_macro_core_vote(void *handle, bool enable)
} }
if (enable) { if (enable) {
pm_runtime_get_sync(rx_priv->dev); pm_runtime_get_sync(rx_priv->dev);
if (lpass_cdc_check_core_votes(rx_priv->dev))
rc = 0;
else
rc = -ENOTSYNC;
} else {
pm_runtime_put_autosuspend(rx_priv->dev); pm_runtime_put_autosuspend(rx_priv->dev);
pm_runtime_mark_last_busy(rx_priv->dev); pm_runtime_mark_last_busy(rx_priv->dev);
} }
return rc;
if (lpass_cdc_check_core_votes(rx_priv->dev))
return 0;
else
return -EINVAL;
} }
static int rx_swrm_clock(void *handle, bool enable) static int rx_swrm_clock(void *handle, bool enable)

查看文件

@@ -657,6 +657,7 @@ done:
static int lpass_cdc_va_macro_core_vote(void *handle, bool enable) static int lpass_cdc_va_macro_core_vote(void *handle, bool enable)
{ {
int rc = 0;
struct lpass_cdc_va_macro_priv *va_priv = struct lpass_cdc_va_macro_priv *va_priv =
(struct lpass_cdc_va_macro_priv *) handle; (struct lpass_cdc_va_macro_priv *) handle;
@@ -666,14 +667,15 @@ static int lpass_cdc_va_macro_core_vote(void *handle, bool enable)
} }
if (enable) { if (enable) {
pm_runtime_get_sync(va_priv->dev); pm_runtime_get_sync(va_priv->dev);
if (lpass_cdc_check_core_votes(va_priv->dev))
rc = 0;
else
rc = -ENOTSYNC;
} else {
pm_runtime_put_autosuspend(va_priv->dev); pm_runtime_put_autosuspend(va_priv->dev);
pm_runtime_mark_last_busy(va_priv->dev); pm_runtime_mark_last_busy(va_priv->dev);
} }
return rc;
if (lpass_cdc_check_core_votes(va_priv->dev))
return 0;
else
return -EINVAL;
} }
static int lpass_cdc_va_macro_swrm_clock(void *handle, bool enable) static int lpass_cdc_va_macro_swrm_clock(void *handle, bool enable)

查看文件

@@ -2604,6 +2604,7 @@ static void lpass_cdc_wsa_macro_init_reg(struct snd_soc_component *component)
static int lpass_cdc_wsa_macro_core_vote(void *handle, bool enable) static int lpass_cdc_wsa_macro_core_vote(void *handle, bool enable)
{ {
int rc = 0;
struct lpass_cdc_wsa_macro_priv *wsa_priv = (struct lpass_cdc_wsa_macro_priv *) handle; struct lpass_cdc_wsa_macro_priv *wsa_priv = (struct lpass_cdc_wsa_macro_priv *) handle;
if (wsa_priv == NULL) { if (wsa_priv == NULL) {
@@ -2612,14 +2613,16 @@ static int lpass_cdc_wsa_macro_core_vote(void *handle, bool enable)
} }
if (enable) { if (enable) {
pm_runtime_get_sync(wsa_priv->dev); pm_runtime_get_sync(wsa_priv->dev);
if (lpass_cdc_check_core_votes(wsa_priv->dev))
rc = 0;
else
rc = -ENOTSYNC;
} else {
pm_runtime_put_autosuspend(wsa_priv->dev); pm_runtime_put_autosuspend(wsa_priv->dev);
pm_runtime_mark_last_busy(wsa_priv->dev); pm_runtime_mark_last_busy(wsa_priv->dev);
} }
if (lpass_cdc_check_core_votes(wsa_priv->dev)) return rc;
return 0;
else
return -EINVAL;
} }
static int wsa_swrm_clock(void *handle, bool enable) static int wsa_swrm_clock(void *handle, bool enable)