Merge "asoc: wcd938x: Add vdd-buck as on demand supply"
diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c
index 2db0c5b..417b34d 100644
--- a/asoc/codecs/bolero/bolero-cdc.c
+++ b/asoc/codecs/bolero/bolero-cdc.c
@@ -14,6 +14,7 @@
#include <soc/snd_event.h>
#include <linux/pm_runtime.h>
#include <soc/swr-common.h>
+#include <dsp/digital-cdc-rsc-mgr.h>
#include "bolero-cdc.h"
#include "internal.h"
#include "bolero-clk-rsc.h"
@@ -1367,6 +1368,7 @@
return 0;
}
+#ifdef CONFIG_PM
int bolero_runtime_resume(struct device *dev)
{
struct bolero_priv *priv = dev_get_drvdata(dev->parent);
@@ -1379,7 +1381,7 @@
}
if (priv->core_hw_vote_count == 0) {
- ret = clk_prepare_enable(priv->lpass_core_hw_vote);
+ ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_core_hw_vote);
if (ret < 0) {
dev_err(dev, "%s:lpass core hw enable failed\n",
__func__);
@@ -1397,7 +1399,7 @@
}
if (priv->core_audio_vote_count == 0) {
- ret = clk_prepare_enable(priv->lpass_audio_hw_vote);
+ ret = digital_cdc_rsc_mgr_hw_vote_enable(priv->lpass_audio_hw_vote);
if (ret < 0) {
dev_err(dev, "%s:lpass audio hw enable failed\n",
__func__);
@@ -1422,7 +1424,8 @@
mutex_lock(&priv->vote_lock);
if (priv->lpass_core_hw_vote != NULL) {
if (--priv->core_hw_vote_count == 0)
- clk_disable_unprepare(priv->lpass_core_hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_disable(
+ priv->lpass_core_hw_vote);
if (priv->core_hw_vote_count < 0)
priv->core_hw_vote_count = 0;
} else {
@@ -1434,7 +1437,8 @@
if (priv->lpass_audio_hw_vote != NULL) {
if (--priv->core_audio_vote_count == 0)
- clk_disable_unprepare(priv->lpass_audio_hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_disable(
+ priv->lpass_audio_hw_vote);
if (priv->core_audio_vote_count < 0)
priv->core_audio_vote_count = 0;
} else {
@@ -1448,6 +1452,7 @@
return 0;
}
EXPORT_SYMBOL(bolero_runtime_suspend);
+#endif /* CONFIG_PM */
bool bolero_check_core_votes(struct device *dev)
{
diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c
index ea1a374..eb7cb88 100644
--- a/asoc/codecs/bolero/rx-macro.c
+++ b/asoc/codecs/bolero/rx-macro.c
@@ -4135,6 +4135,10 @@
};
static const struct dev_pm_ops bolero_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(
+ pm_runtime_force_suspend,
+ pm_runtime_force_resume
+ )
SET_RUNTIME_PM_OPS(
bolero_runtime_suspend,
bolero_runtime_resume,
diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c
index 9fe19c1..472cdfe 100644
--- a/asoc/codecs/bolero/tx-macro.c
+++ b/asoc/codecs/bolero/tx-macro.c
@@ -980,11 +980,12 @@
if (tx_unmute_delay < unmute_delay)
tx_unmute_delay = unmute_delay;
/* schedule work queue to Remove Mute */
- schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork,
- msecs_to_jiffies(tx_unmute_delay));
+ queue_delayed_work(system_freezable_wq,
+ &tx_priv->tx_mute_dwork[decimator].dwork,
+ msecs_to_jiffies(tx_unmute_delay));
if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
CF_MIN_3DB_150HZ) {
- schedule_delayed_work(
+ queue_delayed_work(system_freezable_wq,
&tx_priv->tx_hpf_work[decimator].dwork,
msecs_to_jiffies(hpf_delay));
snd_soc_component_update_bits(component,
@@ -3297,6 +3298,10 @@
};
static const struct dev_pm_ops bolero_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(
+ pm_runtime_force_suspend,
+ pm_runtime_force_resume
+ )
SET_RUNTIME_PM_OPS(
bolero_runtime_suspend,
bolero_runtime_resume,
diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c
index 85d4ae3..a947a28 100644
--- a/asoc/codecs/bolero/va-macro.c
+++ b/asoc/codecs/bolero/va-macro.c
@@ -16,6 +16,7 @@
#include <asoc/msm-cdc-pinctrl.h>
#include <soc/swr-common.h>
#include <soc/swr-wcd.h>
+#include <dsp/digital-cdc-rsc-mgr.h>
#include "bolero-cdc.h"
#include "bolero-cdc-registers.h"
#include "bolero-clk-rsc.h"
@@ -444,7 +445,8 @@
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
if (va_priv->lpass_audio_hw_vote) {
- ret = clk_prepare_enable(va_priv->lpass_audio_hw_vote);
+ ret = digital_cdc_rsc_mgr_hw_vote_enable(
+ va_priv->lpass_audio_hw_vote);
if (ret)
dev_err(va_dev,
"%s: lpass audio hw enable failed\n",
@@ -467,7 +469,8 @@
if (bolero_tx_clk_switch(component, CLK_SRC_TX_RCG))
dev_dbg(va_dev, "%s: clock switch failed\n",__func__);
if (va_priv->lpass_audio_hw_vote)
- clk_disable_unprepare(va_priv->lpass_audio_hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_disable(
+ va_priv->lpass_audio_hw_vote);
break;
default:
dev_err(va_priv->dev,
@@ -1183,11 +1186,12 @@
*/
usleep_range(6000, 6010);
/* schedule work queue to Remove Mute */
- schedule_delayed_work(&va_priv->va_mute_dwork[decimator].dwork,
- msecs_to_jiffies(va_tx_unmute_delay));
+ queue_delayed_work(system_freezable_wq,
+ &va_priv->va_mute_dwork[decimator].dwork,
+ msecs_to_jiffies(va_tx_unmute_delay));
if (va_priv->va_hpf_work[decimator].hpf_cut_off_freq !=
CF_MIN_3DB_150HZ)
- schedule_delayed_work(
+ queue_delayed_work(system_freezable_wq,
&va_priv->va_hpf_work[decimator].dwork,
msecs_to_jiffies(hpf_delay));
/* apply gain after decimator is enabled */
@@ -3208,6 +3212,10 @@
};
static const struct dev_pm_ops bolero_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(
+ pm_runtime_force_suspend,
+ pm_runtime_force_resume
+ )
SET_RUNTIME_PM_OPS(
bolero_runtime_suspend,
bolero_runtime_resume,
diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c
index e97d746..2ab2e8a 100644
--- a/asoc/codecs/bolero/wsa-macro.c
+++ b/asoc/codecs/bolero/wsa-macro.c
@@ -3244,6 +3244,10 @@
};
static const struct dev_pm_ops bolero_dev_pm_ops = {
+ SET_SYSTEM_SLEEP_PM_OPS(
+ pm_runtime_force_suspend,
+ pm_runtime_force_resume
+ )
SET_RUNTIME_PM_OPS(
bolero_runtime_suspend,
bolero_runtime_resume,
diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c
index 5c3f14f..2fb954b 100644
--- a/asoc/codecs/wcd937x/wcd937x.c
+++ b/asoc/codecs/wcd937x/wcd937x.c
@@ -37,6 +37,8 @@
#define WCD937X_VERSION_ENTRY_SIZE 32
#define EAR_RX_PATH_AUX 1
+#define NUM_ATTEMPTS 5
+
enum {
CODEC_TX = 0,
CODEC_RX,
@@ -1535,14 +1537,18 @@
{
int ret = 0;
uint8_t devnum = 0;
+ int num_retry = NUM_ATTEMPTS;
- ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum);
- if (ret) {
- dev_err(&swr_dev->dev,
- "%s get devnum %d for dev addr %lx failed\n",
- __func__, devnum, swr_dev->addr);
- return ret;
- }
+ do {
+ ret = swr_get_logical_dev_num(swr_dev, swr_dev->addr, &devnum);
+ if (ret) {
+ dev_err(&swr_dev->dev,
+ "%s get devnum %d for dev addr %lx failed\n",
+ __func__, devnum, swr_dev->addr);
+ /* retry after 1ms */
+ usleep_range(1000, 1010);
+ }
+ } while (ret && --num_retry);
swr_dev->dev_num = devnum;
return 0;
}
diff --git a/asoc/codecs/wsa881x-analog.c b/asoc/codecs/wsa881x-analog.c
index 038e338..fe8a5b9 100644
--- a/asoc/codecs/wsa881x-analog.c
+++ b/asoc/codecs/wsa881x-analog.c
@@ -398,9 +398,14 @@
snd_soc_component_update_bits(component,
WSA881X_BOOST_SLOPE_COMP_ISENSE_FB,
0x03, 0x00);
- snd_soc_component_update_bits(component,
- WSA881X_BOOST_PRESET_OUT1,
- 0xF0, 0x70);
+ if (snd_soc_component_read32(component, WSA881X_OTP_REG_0))
+ snd_soc_component_update_bits(component,
+ WSA881X_BOOST_PRESET_OUT1,
+ 0xF0, 0x70);
+ else
+ snd_soc_component_update_bits(component,
+ WSA881X_BOOST_PRESET_OUT1,
+ 0xF0, 0xB0);
snd_soc_component_update_bits(component,
WSA881X_ANA_CTL, 0x03, 0x01);
snd_soc_component_update_bits(component,
diff --git a/asoc/kona.c b/asoc/kona.c
index a97590f..4382689 100644
--- a/asoc/kona.c
+++ b/asoc/kona.c
@@ -3691,6 +3691,46 @@
SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate,
usb_audio_tx_sample_rate_get,
usb_audio_tx_sample_rate_put),
+ SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
+ usb_audio_rx_format_get, usb_audio_rx_format_put),
+ SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
+ usb_audio_tx_format_get, usb_audio_tx_format_put),
+ SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
+ usb_audio_rx_ch_get, usb_audio_rx_ch_put),
+ SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
+ usb_audio_tx_ch_get, usb_audio_tx_ch_put),
+ SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
+ proxy_rx_ch_get, proxy_rx_ch_put),
+ SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
+ ext_disp_rx_ch_get, ext_disp_rx_ch_put),
+ SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
+ ext_disp_rx_format_get, ext_disp_rx_format_put),
+ SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
+ ext_disp_rx_sample_rate_get,
+ ext_disp_rx_sample_rate_put),
+ SOC_ENUM_EXT("Display Port1 RX Channels", ext_disp_rx_chs,
+ ext_disp_rx_ch_get, ext_disp_rx_ch_put),
+ SOC_ENUM_EXT("Display Port1 RX Bit Format", ext_disp_rx_format,
+ ext_disp_rx_format_get, ext_disp_rx_format_put),
+ SOC_ENUM_EXT("Display Port1 RX SampleRate", ext_disp_rx_sample_rate,
+ ext_disp_rx_sample_rate_get,
+ ext_disp_rx_sample_rate_put),
+ SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
+ msm_bt_sample_rate_get,
+ msm_bt_sample_rate_put),
+ SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
+ msm_bt_sample_rate_rx_get,
+ msm_bt_sample_rate_rx_put),
+ SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
+ msm_bt_sample_rate_tx_get,
+ msm_bt_sample_rate_tx_put),
+ SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_loopback_tx_chs,
+ afe_loopback_tx_ch_get, afe_loopback_tx_ch_put),
+ SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
+ msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
+};
+
+static const struct snd_kcontrol_new msm_tdm_snd_controls[] = {
SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
tdm_rx_sample_rate_get,
tdm_rx_sample_rate_put),
@@ -3727,82 +3767,6 @@
SOC_ENUM_EXT("SEN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
tdm_tx_sample_rate_get,
tdm_tx_sample_rate_put),
- SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate,
- aux_pcm_rx_sample_rate_get,
- aux_pcm_rx_sample_rate_put),
- SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate,
- aux_pcm_tx_sample_rate_get,
- aux_pcm_tx_sample_rate_put),
- SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate,
- mi2s_rx_sample_rate_get,
- mi2s_rx_sample_rate_put),
- SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate,
- mi2s_tx_sample_rate_get,
- mi2s_tx_sample_rate_put),
- SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
- usb_audio_rx_format_get, usb_audio_rx_format_put),
- SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
- usb_audio_tx_format_get, usb_audio_tx_format_put),
SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
tdm_rx_format_get,
tdm_rx_format_put),
@@ -3839,60 +3803,6 @@
SOC_ENUM_EXT("SEN_TDM_TX_0 Format", tdm_tx_format,
tdm_tx_format_get,
tdm_tx_format_put),
- SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format,
- msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
- SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format,
- msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
- SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format,
- msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
- SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format,
- msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
- SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
- usb_audio_rx_ch_get, usb_audio_rx_ch_put),
- SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
- usb_audio_tx_ch_get, usb_audio_tx_ch_put),
- SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
- proxy_rx_ch_get, proxy_rx_ch_put),
SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
tdm_rx_ch_get,
tdm_rx_ch_put),
@@ -3929,6 +3839,134 @@
SOC_ENUM_EXT("SEN_TDM_TX_0 Channels", tdm_tx_chs,
tdm_tx_ch_get,
tdm_tx_ch_put),
+ SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0,
+ TDM_MAX_SLOTS + MAX_PATH, NULL, tdm_slot_map_put),
+};
+
+static const struct snd_kcontrol_new msm_auxpcm_snd_controls[] = {
+ SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate,
+ aux_pcm_rx_sample_rate_get,
+ aux_pcm_rx_sample_rate_put),
+ SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate,
+ aux_pcm_tx_sample_rate_get,
+ aux_pcm_tx_sample_rate_put),
+ SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format,
+ msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
+ SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+ SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format,
+ msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
+};
+
+static const struct snd_kcontrol_new msm_mi2s_snd_controls[] = {
+ SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate,
+ mi2s_rx_sample_rate_get,
+ mi2s_rx_sample_rate_put),
+ SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate,
+ mi2s_tx_sample_rate_get,
+ mi2s_tx_sample_rate_put),
+ SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format,
+ msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
+ SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
+ SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format,
+ msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
@@ -3953,35 +3991,6 @@
msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs,
msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
- SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
- ext_disp_rx_ch_get, ext_disp_rx_ch_put),
- SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
- ext_disp_rx_format_get, ext_disp_rx_format_put),
- SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
- ext_disp_rx_sample_rate_get,
- ext_disp_rx_sample_rate_put),
- SOC_ENUM_EXT("Display Port1 RX Channels", ext_disp_rx_chs,
- ext_disp_rx_ch_get, ext_disp_rx_ch_put),
- SOC_ENUM_EXT("Display Port1 RX Bit Format", ext_disp_rx_format,
- ext_disp_rx_format_get, ext_disp_rx_format_put),
- SOC_ENUM_EXT("Display Port1 RX SampleRate", ext_disp_rx_sample_rate,
- ext_disp_rx_sample_rate_get,
- ext_disp_rx_sample_rate_put),
- SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
- msm_bt_sample_rate_get,
- msm_bt_sample_rate_put),
- SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
- msm_bt_sample_rate_rx_get,
- msm_bt_sample_rate_rx_put),
- SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
- msm_bt_sample_rate_tx_get,
- msm_bt_sample_rate_tx_put),
- SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_loopback_tx_chs,
- afe_loopback_tx_ch_get, afe_loopback_tx_ch_put),
- SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
- msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
- SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0,
- TDM_MAX_SLOTS + MAX_PATH, NULL, tdm_slot_map_put),
};
static const struct snd_kcontrol_new msm_snd_controls[] = {
@@ -5313,6 +5322,45 @@
tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
}
+#ifndef CONFIG_TDM_DISABLE
+static void msm_add_tdm_snd_controls(struct snd_soc_component *component)
+{
+ snd_soc_add_component_controls(component, msm_tdm_snd_controls,
+ ARRAY_SIZE(msm_tdm_snd_controls));
+}
+#else
+static void msm_add_tdm_snd_controls(struct snd_soc_component *component)
+{
+ return;
+}
+#endif
+
+#ifndef CONFIG_MI2S_DISABLE
+static void msm_add_mi2s_snd_controls(struct snd_soc_component *component)
+{
+ snd_soc_add_component_controls(component, msm_mi2s_snd_controls,
+ ARRAY_SIZE(msm_mi2s_snd_controls));
+}
+#else
+static void msm_add_mi2s_snd_controls(struct snd_soc_component *component)
+{
+ return;
+}
+#endif
+
+#ifndef CONFIG_AUXPCM_DISABLE
+static void msm_add_auxpcm_snd_controls(struct snd_soc_component *component)
+{
+ snd_soc_add_component_controls(component, msm_auxpcm_snd_controls,
+ ARRAY_SIZE(msm_auxpcm_snd_controls));
+}
+#else
+static void msm_add_auxpcm_snd_controls(struct snd_soc_component *component)
+{
+ return;
+}
+#endif
+
static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
{
int ret = -EINVAL;
@@ -5348,6 +5396,10 @@
return ret;
}
+ msm_add_tdm_snd_controls(component);
+ msm_add_mi2s_snd_controls(component);
+ msm_add_auxpcm_snd_controls(component);
+
snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
ARRAY_SIZE(msm_int_dapm_widgets));
@@ -6244,6 +6296,10 @@
.be_hw_params_fixup = msm_be_hw_params_fixup,
.ignore_suspend = 1,
},
+};
+
+
+static struct snd_soc_dai_link msm_tdm_be_dai_links[] = {
{
.name = LPASS_BE_PRI_TDM_RX_0,
.stream_name = "Primary TDM0 Playback",
@@ -7120,7 +7176,8 @@
ARRAY_SIZE(ext_disp_be_dai_link) +
ARRAY_SIZE(msm_wcn_be_dai_links) +
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) +
- ARRAY_SIZE(msm_wcn_btfm_be_dai_links)];
+ ARRAY_SIZE(msm_wcn_btfm_be_dai_links) +
+ ARRAY_SIZE(msm_tdm_be_dai_links)];
static int msm_populate_dai_link_component_of_node(
struct snd_soc_card *card)
@@ -7437,6 +7494,16 @@
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link);
}
+ rc = of_property_read_u32(dev->of_node, "qcom,tdm-audio-intf",
+ &val);
+ if (!rc && val) {
+ memcpy(msm_kona_dai_links + total_links,
+ msm_tdm_be_dai_links,
+ sizeof(msm_tdm_be_dai_links));
+ total_links +=
+ ARRAY_SIZE(msm_tdm_be_dai_links);
+ }
+
rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm",
&wcn_btfm_intf);
if (rc) {
diff --git a/asoc/msm-pcm-loopback-v2.c b/asoc/msm-pcm-loopback-v2.c
index 19fe190..4c00c72 100644
--- a/asoc/msm-pcm-loopback-v2.c
+++ b/asoc/msm-pcm-loopback-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -307,6 +307,7 @@
dev_err(component->dev,
"%s: pcm out open failed\n", __func__);
q6asm_audio_client_free(pcm->audio_client);
+ pcm->audio_client = NULL;
mutex_unlock(&pcm->lock);
return -ENOMEM;
}
@@ -346,8 +347,10 @@
struct snd_soc_pcm_runtime *soc_pcm_rx;
struct snd_soc_pcm_runtime *soc_pcm_tx;
- if (pcm->audio_client == NULL)
+ if (pcm->audio_client == NULL) {
+ pr_err("%s: audio client freed\n", __func__);
return;
+ }
mutex_lock(&loopback_session_lock);
q6asm_cmd(pcm->audio_client, CMD_CLOSE);
@@ -445,6 +448,12 @@
dev_dbg(component->dev, "%s: ASM loopback stream:%d\n",
__func__, substream->stream);
+ if (!pcm || !pcm->audio_client) {
+ mutex_unlock(&pcm->lock);
+ pr_err("%s: private data null or audio client freed\n", __func__);
+ return -EINVAL;
+ }
+
if (pcm->playback_start && pcm->capture_start) {
mutex_unlock(&pcm->lock);
return ret;
@@ -559,11 +568,15 @@
{
int rc = 0;
struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol);
- struct snd_pcm_substream *substream =
- vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
+ struct snd_pcm_substream *substream = NULL;
struct msm_pcm_loopback *prtd;
pr_debug("%s\n", __func__);
+ if (!vol) {
+ pr_err("%s: vol is NULL\n", __func__);
+ return -ENODEV;
+ }
+ substream = vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream;
if ((!substream) || (!substream->runtime)) {
pr_debug("%s substream or runtime not found\n", __func__);
rc = -ENODEV;
diff --git a/asoc/msm-pcm-q6-noirq.c b/asoc/msm-pcm-q6-noirq.c
index 12a1f12..8fb6f7c 100644
--- a/asoc/msm-pcm-q6-noirq.c
+++ b/asoc/msm-pcm-q6-noirq.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
*/
#include <linux/init.h>
@@ -720,13 +720,17 @@
{
struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol);
struct msm_plat_data *pdata = NULL;
- struct snd_pcm_substream *substream =
- vol->pcm->streams[vol->stream].substream;
+ struct snd_pcm_substream *substream = NULL;
struct snd_soc_pcm_runtime *soc_prtd = NULL;
struct snd_soc_component *component = NULL;
struct msm_audio *prtd;
pr_debug("%s\n", __func__);
+ if (!vol) {
+ pr_err("%s: vol is NULL\n", __func__);
+ return -ENODEV;
+ }
+ substream = vol->pcm->streams[vol->stream].substream;
if (!substream) {
pr_err("%s substream not found\n", __func__);
return -ENODEV;
diff --git a/asoc/msm-pcm-q6-v2.c b/asoc/msm-pcm-q6-v2.c
index 60e84cb..c22c39b 100644
--- a/asoc/msm-pcm-q6-v2.c
+++ b/asoc/msm-pcm-q6-v2.c
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: GPL-2.0-only
-/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
*/
@@ -1514,13 +1514,17 @@
{
struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol);
struct msm_plat_data *pdata = NULL;
- struct snd_pcm_substream *substream =
- vol->pcm->streams[vol->stream].substream;
+ struct snd_pcm_substream *substream = NULL;
struct snd_soc_pcm_runtime *soc_prtd = NULL;
struct snd_soc_component *component = NULL;
struct msm_audio *prtd;
pr_debug("%s\n", __func__);
+ if (!vol) {
+ pr_err("%s: vol is NULL\n", __func__);
+ return -ENODEV;
+ }
+ substream = vol->pcm->streams[vol->stream].substream;
if (!substream) {
pr_err("%s substream not found\n", __func__);
return -ENODEV;
diff --git a/asoc/sa6155.c b/asoc/sa6155.c
index d242738..6ed96e1 100644
--- a/asoc/sa6155.c
+++ b/asoc/sa6155.c
@@ -182,14 +182,14 @@
/* TDM default config */
static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
{ /* PRI TDM */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_0 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_1 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_3 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_2 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_3 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
},
{ /* SEC TDM */
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* RX_0 */
@@ -236,14 +236,14 @@
/* TDM default config */
static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
{ /* PRI TDM */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_0 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_1 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_2 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_3 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
- {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_2 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2}, /* TX_3 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
+ {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
},
{ /* SEC TDM */
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 6}, /* TX_0 */
@@ -351,7 +351,7 @@
static struct tdm_slot_cfg tdm_slot[TDM_INTERFACE_MAX] = {
/* PRI TDM */
- {32, 8},
+ {16, 16},
/* SEC TDM */
{32, 8},
/* TERT TDM */
@@ -385,11 +385,11 @@
static unsigned int tdm_rx_slot_offset
[TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
{/* PRI TDM */
- {0, 4, 0xFFFF},
- {8, 12, 0xFFFF},
- {16, 20, 0xFFFF},
- {24, 28, 0xFFFF},
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
+ {2, 0xFFFF},
+ {4, 6, 0xFFFF},
+ {8, 10, 0xFFFF},
+ {12, 14, 0xFFFF},
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
@@ -439,11 +439,11 @@
static unsigned int tdm_tx_slot_offset
[TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
{/* PRI TDM */
- {0, 4, 0xFFFF},
- {8, 12, 0xFFFF},
- {16, 20, 0xFFFF},
- {24, 28, 0xFFFF},
- {0xFFFF}, /* not used */
+ {0, 0xFFFF},
+ {2, 0xFFFF},
+ {4, 6, 0xFFFF},
+ {8, 10, 0xFFFF},
+ {12, 14, 0xFFFF},
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
{0xFFFF}, /* not used */
@@ -5909,6 +5909,40 @@
.ignore_pmdown_time = 1,
.id = MSM_FRONTEND_DAI_MULTIMEDIA23
},
+ {
+ .name = MSM_DAILINK_NAME(Media24),
+ .stream_name = "MultiMedia24",
+ .cpu_dai_name = "MultiMedia24",
+ .platform_name = "msm-pcm-loopback",
+ .dynamic = 1,
+ .dpcm_playback = 1,
+ .dpcm_capture = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .ignore_suspend = 1,
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_pmdown_time = 1,
+ .id = MSM_FRONTEND_DAI_MULTIMEDIA24
+ },
+ {
+ .name = MSM_DAILINK_NAME(Media25),
+ .stream_name = "MultiMedia25",
+ .cpu_dai_name = "MultiMedia25",
+ .platform_name = "msm-pcm-loopback",
+ .dynamic = 1,
+ .dpcm_playback = 1,
+ .dpcm_capture = 1,
+ .trigger = {SND_SOC_DPCM_TRIGGER_POST,
+ SND_SOC_DPCM_TRIGGER_POST},
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .ignore_suspend = 1,
+ .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
+ .ignore_pmdown_time = 1,
+ .id = MSM_FRONTEND_DAI_MULTIMEDIA25
+ },
};
static struct snd_soc_dai_link msm_custom_fe_dai_links[] = {
diff --git a/config/bengalauto.conf b/config/bengalauto.conf
index 0478eca..cd614f6 100644
--- a/config/bengalauto.conf
+++ b/config/bengalauto.conf
@@ -27,6 +27,7 @@
CONFIG_VA_MACRO=m
CONFIG_RX_MACRO=m
CONFIG_TX_MACRO=m
+CONFIG_DIGITAL_CDC_RSC_MGR=m
CONFIG_SND_SOC_WCD_IRQ=m
CONFIG_SND_SOC_WCD937X=m
CONFIG_SND_SOC_WCD937X_SLAVE=m
diff --git a/config/bengalautoconf.h b/config/bengalautoconf.h
index 3e72903..83cca08 100644
--- a/config/bengalautoconf.h
+++ b/config/bengalautoconf.h
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (c) 2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
*/
#define CONFIG_PINCTRL_LPI 1
@@ -31,6 +31,7 @@
#define CONFIG_VA_MACRO 1
#define CONFIG_RX_MACRO 1
#define CONFIG_TX_MACRO 1
+#define CONFIG_DIGITAL_CDC_RSC_MGR 1
#define CONFIG_SND_SOC_WCD_IRQ 1
#define CONFIG_SND_SOC_WCD937X 1
#define CONFIG_SND_SOC_WCD937X_SLAVE 1
diff --git a/config/konaauto.conf b/config/konaauto.conf
index 03e0541..74ca2d4 100644
--- a/config/konaauto.conf
+++ b/config/konaauto.conf
@@ -36,3 +36,4 @@
export CONFIG_SND_SOC_KONA=m
export CONFIG_SND_EVENT=m
export CONFIG_VOICE_MHI=m
+export CONFIG_DIGITAL_CDC_RSC_MGR=m
diff --git a/config/konaautoconf.h b/config/konaautoconf.h
index f932236..e489b41 100644
--- a/config/konaautoconf.h
+++ b/config/konaautoconf.h
@@ -1,5 +1,5 @@
/* SPDX-License-Identifier: GPL-2.0-only */
-/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
*/
#define CONFIG_PINCTRL_LPI 1
@@ -40,3 +40,4 @@
#define CONFIG_SND_SOC_KONA 1
#define CONFIG_SND_EVENT 1
#define CONFIG_VOICE_MHI 1
+#define CONFIG_DIGITAL_CDC_RSC_MGR 1
diff --git a/config/litoauto.conf b/config/litoauto.conf
index 12bb1df..8dbeee0 100644
--- a/config/litoauto.conf
+++ b/config/litoauto.conf
@@ -29,6 +29,7 @@
CONFIG_VA_MACRO=m
CONFIG_RX_MACRO=m
CONFIG_TX_MACRO=m
+CONFIG_DIGITAL_CDC_RSC_MGR=m
CONFIG_SND_SOC_WCD_IRQ=m
CONFIG_SND_SOC_WCD938X=m
CONFIG_SND_SOC_WCD938X_SLAVE=m
diff --git a/config/litoautoconf.h b/config/litoautoconf.h
index 0cfdab2..adf43e2 100644
--- a/config/litoautoconf.h
+++ b/config/litoautoconf.h
@@ -33,6 +33,7 @@
#define CONFIG_VA_MACRO 1
#define CONFIG_RX_MACRO 1
#define CONFIG_TX_MACRO 1
+#define CONFIG_DIGITAL_CDC_RSC_MGR 1
#define CONFIG_SND_SOC_WCD_IRQ 1
#define CONFIG_SND_SOC_WCD938X 1
#define CONFIG_SND_SOC_WCD938X_SLAVE 1
diff --git a/dsp/Kbuild b/dsp/Kbuild
index 006de44..43180e7 100644
--- a/dsp/Kbuild
+++ b/dsp/Kbuild
@@ -184,6 +184,10 @@
Q6_OBJS += voice_mhi.o
endif
+ifdef CONFIG_DIGITAL_CDC_RSC_MGR
+ Q6_OBJS += digital-cdc-rsc-mgr.o
+endif
+
LINUX_INC += -Iinclude/linux
INCS += $(COMMON_INC) \
diff --git a/dsp/digital-cdc-rsc-mgr.c b/dsp/digital-cdc-rsc-mgr.c
new file mode 100644
index 0000000..4206523
--- /dev/null
+++ b/dsp/digital-cdc-rsc-mgr.c
@@ -0,0 +1,100 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
+ */
+
+#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/ratelimit.h>
+#include <dsp/digital-cdc-rsc-mgr.h>
+
+struct mutex hw_vote_lock;
+static bool is_init_done;
+
+/**
+ * digital_cdc_rsc_mgr_hw_vote_enable - Enables hw vote in DSP
+ *
+ * @vote_handle: vote handle for which voting needs to be done
+ *
+ * Returns 0 on success or -EINVAL/error code on failure
+ */
+int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle)
+{
+ int ret = 0;
+
+ if (!is_init_done || vote_handle == NULL) {
+ pr_err_ratelimited("%s: init failed or vote handle NULL\n",
+ __func__);
+ return -EINVAL;
+ }
+
+ mutex_lock(&hw_vote_lock);
+ ret = clk_prepare_enable(vote_handle);
+ mutex_unlock(&hw_vote_lock);
+
+ pr_debug("%s: return %d\n", __func__, ret);
+ trace_printk("%s: return %d\n", __func__, ret);
+ return ret;
+}
+EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_enable);
+
+/**
+ * digital_cdc_rsc_mgr_hw_vote_disable - Disables hw vote in DSP
+ *
+ * @vote_handle: vote handle for which voting needs to be disabled
+ *
+ */
+void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle)
+{
+ if (!is_init_done || vote_handle == NULL) {
+ pr_err_ratelimited("%s: init failed or vote handle NULL\n",
+ __func__);
+ return;
+ }
+
+ mutex_lock(&hw_vote_lock);
+ clk_disable_unprepare(vote_handle);
+ mutex_unlock(&hw_vote_lock);
+ trace_printk("%s\n", __func__);
+}
+EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_disable);
+
+/**
+ * digital_cdc_rsc_mgr_hw_vote_reset - Resets hw vote count
+ *
+ */
+void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle)
+{
+ int count = 0;
+
+ if (!is_init_done || vote_handle == NULL) {
+ pr_err_ratelimited("%s: init failed or vote handle NULL\n",
+ __func__);
+ return;
+ }
+
+ mutex_lock(&hw_vote_lock);
+ while (__clk_is_enabled(vote_handle)) {
+ clk_disable_unprepare(vote_handle);
+ count++;
+ }
+ pr_debug("%s: Vote count after SSR: %d\n", __func__, count);
+ trace_printk("%s: Vote count after SSR: %d\n", __func__, count);
+
+ while (count--)
+ clk_prepare_enable(vote_handle);
+ mutex_unlock(&hw_vote_lock);
+}
+EXPORT_SYMBOL(digital_cdc_rsc_mgr_hw_vote_reset);
+
+void digital_cdc_rsc_mgr_init()
+{
+ mutex_init(&hw_vote_lock);
+ is_init_done = true;
+}
+
+void digital_cdc_rsc_mgr_exit()
+{
+ mutex_destroy(&hw_vote_lock);
+ is_init_done = false;
+}
diff --git a/dsp/q6_init.c b/dsp/q6_init.c
index fb18741..e990f2a 100644
--- a/dsp/q6_init.c
+++ b/dsp/q6_init.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2017, 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017, 2019-2020 The Linux Foundation. All rights reserved.
*/
#include <linux/kernel.h>
@@ -24,11 +24,13 @@
avtimer_init();
msm_mdf_init();
voice_mhi_init();
+ digital_cdc_rsc_mgr_init();
return 0;
}
static void __exit audio_q6_exit(void)
{
+ digital_cdc_rsc_mgr_exit();
msm_mdf_exit();
avtimer_exit();
audio_slimslave_exit();
diff --git a/dsp/q6_init.h b/dsp/q6_init.h
index 4df2e03..77ba743 100644
--- a/dsp/q6_init.h
+++ b/dsp/q6_init.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
*/
#ifndef __Q6_INIT_H__
@@ -80,5 +80,19 @@
return;
}
#endif
+
+#ifdef CONFIG_DIGITAL_CDC_RSC_MGR
+void digital_cdc_rsc_mgr_init(void);
+void digital_cdc_rsc_mgr_exit(void);
+#else
+static inline void digital_cdc_rsc_mgr_init(void)
+{
+}
+
+static inline void digital_cdc_rsc_mgr_exit(void)
+{
+}
+#endif /* CONFIG_DIGITAL_CDC_RSC_MGR */
+
#endif
diff --git a/include/dsp/digital-cdc-rsc-mgr.h b/include/dsp/digital-cdc-rsc-mgr.h
new file mode 100644
index 0000000..685cd5c
--- /dev/null
+++ b/include/dsp/digital-cdc-rsc-mgr.h
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef DIGITAL_CDC_RSC_MGR_H
+#define DIGITAL_CDC_RSC_MGR_H
+
+#ifdef CONFIG_DIGITAL_CDC_RSC_MGR
+
+int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle);
+void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle);
+void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle);
+
+#else
+
+static inline int digital_cdc_rsc_mgr_hw_vote_enable(struct clk* vote_handle)
+{
+ return 0;
+}
+
+static inline void digital_cdc_rsc_mgr_hw_vote_disable(struct clk* vote_handle)
+{
+}
+
+static inline void digital_cdc_rsc_mgr_hw_vote_reset(struct clk* vote_handle)
+{
+}
+
+#endif /* CONFIG_DIGITAL_CDC_RSC_MGR */
+
+#endif /* DIGITAL_CDC_RSC_MGR_H */
diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c
index c3d2326..0b0eef5 100644
--- a/soc/pinctrl-lpi.c
+++ b/soc/pinctrl-lpi.c
@@ -16,6 +16,7 @@
#include <linux/clk.h>
#include <linux/bitops.h>
#include <soc/snd_event.h>
+#include <dsp/digital-cdc-rsc-mgr.h>
#include <linux/pm_runtime.h>
#include <dsp/audio_notifier.h>
@@ -469,6 +470,7 @@
unsigned long opcode, void *ptr)
{
static bool initial_boot = true;
+ struct lpi_gpio_state *state = dev_get_drvdata(lpi_dev);
pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode);
@@ -484,6 +486,17 @@
case AUDIO_NOTIFIER_SERVICE_UP:
if (initial_boot)
initial_boot = false;
+
+ /* Reset HW votes after SSR */
+ if (!lpi_dev_up) {
+ if (state->lpass_core_hw_vote)
+ digital_cdc_rsc_mgr_hw_vote_reset(
+ state->lpass_core_hw_vote);
+ if (state->lpass_audio_hw_vote)
+ digital_cdc_rsc_mgr_hw_vote_reset(
+ state->lpass_audio_hw_vote);
+ }
+
lpi_dev_up = true;
snd_event_notify(lpi_dev, SND_EVENT_UP);
break;
@@ -870,7 +883,7 @@
}
mutex_lock(&state->core_hw_vote_lock);
- ret = clk_prepare_enable(hw_vote);
+ ret = digital_cdc_rsc_mgr_hw_vote_enable(hw_vote);
if (ret < 0) {
pm_runtime_set_autosuspend_delay(dev,
LPI_AUTO_SUSPEND_DELAY_ERROR);
@@ -906,7 +919,7 @@
mutex_lock(&state->core_hw_vote_lock);
if (state->core_hw_vote_status) {
- clk_disable_unprepare(hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_disable(hw_vote);
state->core_hw_vote_status = false;
}
mutex_unlock(&state->core_hw_vote_lock);
diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c
index 4aa5c0c..b0ad17f 100644
--- a/soc/swr-mstr-ctrl.c
+++ b/soc/swr-mstr-ctrl.c
@@ -22,6 +22,7 @@
#include <soc/swr-common.h>
#include <linux/regmap.h>
#include <dsp/msm-audio-event-notify.h>
+#include <dsp/digital-cdc-rsc-mgr.h>
#include "swrm_registers.h"
#include "swr-mstr-ctrl.h"
@@ -378,8 +379,8 @@
}
if (++swrm->hw_core_clk_en == 1) {
ret =
- clk_prepare_enable(
- swrm->lpass_core_hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_enable(
+ swrm->lpass_core_hw_vote);
if (ret < 0) {
dev_err(swrm->dev,
"%s:lpass core hw enable failed\n",
@@ -392,8 +393,8 @@
if (swrm->hw_core_clk_en < 0)
swrm->hw_core_clk_en = 0;
else if (swrm->hw_core_clk_en == 0)
- clk_disable_unprepare(
- swrm->lpass_core_hw_vote);
+ digital_cdc_rsc_mgr_hw_vote_disable(
+ swrm->lpass_core_hw_vote);
}
}
}
@@ -410,8 +411,8 @@
}
if (++swrm->aud_core_clk_en == 1) {
ret =
- clk_prepare_enable(
- swrm->lpass_core_audio);
+ digital_cdc_rsc_mgr_hw_vote_enable(
+ swrm->lpass_core_audio);
if (ret < 0) {
dev_err(swrm->dev,
"%s:lpass audio hw enable failed\n",
@@ -424,8 +425,8 @@
if (swrm->aud_core_clk_en < 0)
swrm->aud_core_clk_en = 0;
else if (swrm->aud_core_clk_en == 0)
- clk_disable_unprepare(
- swrm->lpass_core_audio);
+ digital_cdc_rsc_mgr_hw_vote_disable(
+ swrm->lpass_core_audio);
}
}
}
@@ -1908,7 +1909,6 @@
return IRQ_NONE;
}
- mutex_lock(&swrm->ssr_lock);
mutex_lock(&swrm->reslock);
if (swrm_request_hw_vote(swrm, LPASS_HW_CORE, true)) {
ret = IRQ_NONE;
@@ -2025,6 +2025,11 @@
dev_err_ratelimited(swrm->dev,
"%s: SWR bus clsh detected\n",
__func__);
+ swrm->intr_mask &=
+ ~SWRM_INTERRUPT_STATUS_MASTER_CLASH_DET;
+ swr_master_write(swrm,
+ SWR_MSTR_RX_SWRM_CPU_INTERRUPT_EN,
+ swrm->intr_mask);
break;
case SWRM_INTERRUPT_STATUS_RD_FIFO_OVERFLOW:
dev_dbg(swrm->dev, "%s: SWR read FIFO overflow\n",
@@ -2122,7 +2127,6 @@
swrm_request_hw_vote(swrm, LPASS_HW_CORE, false);
exit:
mutex_unlock(&swrm->reslock);
- mutex_unlock(&swrm->ssr_lock);
swrm_unlock_sleep(swrm);
trace_printk("%s exit\n", __func__);
return ret;
@@ -2655,7 +2659,6 @@
mutex_init(&swrm->clklock);
mutex_init(&swrm->devlock);
mutex_init(&swrm->pm_lock);
- mutex_init(&swrm->ssr_lock);
swrm->wlock_holders = 0;
swrm->pm_state = SWRM_PM_SLEEPABLE;
init_waitqueue_head(&swrm->pm_wq);
@@ -2804,7 +2807,6 @@
mutex_destroy(&swrm->iolock);
mutex_destroy(&swrm->clklock);
mutex_destroy(&swrm->pm_lock);
- mutex_destroy(&swrm->ssr_lock);
pm_qos_remove_request(&swrm->pm_qos_req);
err_pdata_fail:
@@ -2838,7 +2840,6 @@
mutex_destroy(&swrm->clklock);
mutex_destroy(&swrm->force_down_lock);
mutex_destroy(&swrm->pm_lock);
- mutex_destroy(&swrm->ssr_lock);
pm_qos_remove_request(&swrm->pm_qos_req);
devm_kfree(&pdev->dev, swrm);
return 0;
@@ -3325,7 +3326,6 @@
break;
case SWR_DEVICE_SSR_DOWN:
trace_printk("%s: swr device down called\n", __func__);
- mutex_lock(&swrm->ssr_lock);
mutex_lock(&swrm->mlock);
if (swrm->state == SWR_MSTR_DOWN)
dev_dbg(swrm->dev, "%s:SWR master is already Down:%d\n",
@@ -3334,12 +3334,13 @@
swrm_device_down(&pdev->dev);
mutex_lock(&swrm->devlock);
swrm->dev_up = false;
+ swrm->hw_core_clk_en = 0;
+ swrm->aud_core_clk_en = 0;
mutex_unlock(&swrm->devlock);
mutex_lock(&swrm->reslock);
swrm->state = SWR_MSTR_SSR;
mutex_unlock(&swrm->reslock);
mutex_unlock(&swrm->mlock);
- mutex_unlock(&swrm->ssr_lock);
break;
case SWR_DEVICE_SSR_UP:
/* wait for clk voting to be zero */
diff --git a/soc/swr-mstr-ctrl.h b/soc/swr-mstr-ctrl.h
index 0fac80e..ce0b64d 100644
--- a/soc/swr-mstr-ctrl.h
+++ b/soc/swr-mstr-ctrl.h
@@ -126,7 +126,6 @@
struct mutex reslock;
struct mutex pm_lock;
struct mutex irq_lock;
- struct mutex ssr_lock;
u32 swrm_base_reg;
char __iomem *swrm_dig_base;
char __iomem *swrm_hctl_reg;