Merge "asoc: codecs: Fix LPI TLMM GPIO invalid access issue"
diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c
index 0137c9f..03dea20 100644
--- a/asoc/codecs/bolero/rx-macro.c
+++ b/asoc/codecs/bolero/rx-macro.c
@@ -1235,8 +1235,15 @@
rx_priv->swr_ctrl_data[0].rx_swr_pdev,
SWR_DEVICE_SSR_DOWN, NULL);
}
- if (!pm_runtime_status_suspended(rx_dev))
- bolero_runtime_suspend(rx_dev);
+ if ((!pm_runtime_enabled(rx_dev) ||
+ !pm_runtime_suspended(rx_dev))) {
+ ret = bolero_runtime_suspend(rx_dev);
+ if (!ret) {
+ pm_runtime_disable(rx_dev);
+ pm_runtime_set_suspended(rx_dev);
+ pm_runtime_enable(rx_dev);
+ }
+ }
break;
case BOLERO_MACRO_EVT_SSR_UP:
rx_priv->dev_up = true;
diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c
index db1129c..fda01e1 100644
--- a/asoc/codecs/bolero/tx-macro.c
+++ b/asoc/codecs/bolero/tx-macro.c
@@ -342,6 +342,7 @@
{
struct device *tx_dev = NULL;
struct tx_macro_priv *tx_priv = NULL;
+ int ret = 0;
if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
return -EINVAL;
@@ -356,8 +357,15 @@
tx_priv->swr_ctrl_data[0].tx_swr_pdev,
SWR_DEVICE_SSR_DOWN, NULL);
}
- if (!pm_runtime_status_suspended(tx_dev))
- bolero_runtime_suspend(tx_dev);
+ if ((!pm_runtime_enabled(tx_dev) ||
+ !pm_runtime_suspended(tx_dev))) {
+ ret = bolero_runtime_suspend(tx_dev);
+ if (!ret) {
+ pm_runtime_disable(tx_dev);
+ pm_runtime_set_suspended(tx_dev);
+ pm_runtime_enable(tx_dev);
+ }
+ }
break;
case BOLERO_MACRO_EVT_SSR_UP:
/* reset swr after ssr/pdr */
diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c
index 3c625a5..4c16319 100644
--- a/asoc/codecs/bolero/va-macro.c
+++ b/asoc/codecs/bolero/va-macro.c
@@ -252,8 +252,15 @@
bolero_rsc_clk_reset(va_dev, VA_CORE_CLK);
break;
case BOLERO_MACRO_EVT_SSR_DOWN:
- if (!pm_runtime_status_suspended(va_dev))
- bolero_runtime_suspend(va_dev);
+ if ((!pm_runtime_enabled(va_dev) ||
+ !pm_runtime_suspended(va_dev))) {
+ ret = bolero_runtime_suspend(va_dev);
+ if (!ret) {
+ pm_runtime_disable(va_dev);
+ pm_runtime_set_suspended(va_dev);
+ pm_runtime_enable(va_dev);
+ }
+ }
break;
default:
break;
diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c
index d7f9478..928aec0 100644
--- a/asoc/codecs/bolero/wsa-macro.c
+++ b/asoc/codecs/bolero/wsa-macro.c
@@ -920,8 +920,15 @@
wsa_priv->swr_ctrl_data[0].wsa_swr_pdev,
SWR_DEVICE_SSR_DOWN, NULL);
}
- if (!pm_runtime_status_suspended(wsa_dev))
- bolero_runtime_suspend(wsa_dev);
+ if ((!pm_runtime_enabled(wsa_dev) ||
+ !pm_runtime_suspended(wsa_dev))) {
+ ret = bolero_runtime_suspend(wsa_dev);
+ if (!ret) {
+ pm_runtime_disable(wsa_dev);
+ pm_runtime_set_suspended(wsa_dev);
+ pm_runtime_enable(wsa_dev);
+ }
+ }
break;
case BOLERO_MACRO_EVT_SSR_UP:
/* reset swr after ssr/pdr */
diff --git a/soc/pinctrl-lpi.c b/soc/pinctrl-lpi.c
index e11ba6e..157e2c5 100644
--- a/soc/pinctrl-lpi.c
+++ b/soc/pinctrl-lpi.c
@@ -481,6 +481,39 @@
return NOTIFY_OK;
}
+int lpi_pinctrl_suspend(struct device *dev)
+{
+ int ret = 0;
+
+ dev_dbg(dev, "%s: system suspend\n", __func__);
+
+ if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) {
+ ret = lpi_pinctrl_runtime_suspend(dev);
+ if (!ret) {
+ /*
+ * Synchronize runtime-pm and system-pm states:
+ * At this point, we are already suspended. If
+ * runtime-pm still thinks its active, then
+ * make sure its status is in sync with HW
+ * status. The three below calls let the
+ * runtime-pm know that we are suspended
+ * already without re-invoking the suspend
+ * callback
+ */
+ pm_runtime_disable(dev);
+ pm_runtime_set_suspended(dev);
+ pm_runtime_enable(dev);
+ }
+ }
+
+ return ret;
+}
+
+int lpi_pinctrl_resume(struct device *dev)
+{
+ return 0;
+}
+
static struct notifier_block service_nb = {
.notifier_call = lpi_notifier_service_cb,
.priority = -INT_MAX,
@@ -489,7 +522,7 @@
static void lpi_pinctrl_ssr_disable(struct device *dev, void *data)
{
lpi_dev_up = false;
- lpi_pinctrl_runtime_suspend(dev);
+ lpi_pinctrl_suspend(dev);
}
static const struct snd_event_ops lpi_pinctrl_ssr_ops = {
@@ -820,39 +853,6 @@
return 0;
}
-int lpi_pinctrl_suspend(struct device *dev)
-{
- int ret = 0;
-
- dev_dbg(dev, "%s: system suspend\n", __func__);
-
- if ((!pm_runtime_enabled(dev) || !pm_runtime_suspended(dev))) {
- ret = lpi_pinctrl_runtime_suspend(dev);
- if (!ret) {
- /*
- * Synchronize runtime-pm and system-pm states:
- * At this point, we are already suspended. If
- * runtime-pm still thinks its active, then
- * make sure its status is in sync with HW
- * status. The three below calls let the
- * runtime-pm know that we are suspended
- * already without re-invoking the suspend
- * callback
- */
- pm_runtime_disable(dev);
- pm_runtime_set_suspended(dev);
- pm_runtime_enable(dev);
- }
- }
-
- return ret;
-}
-
-int lpi_pinctrl_resume(struct device *dev)
-{
- return 0;
-}
-
static const struct dev_pm_ops lpi_pinctrl_dev_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(
lpi_pinctrl_suspend,