From cbb6f02c959455930f12c5d0d5394abaa46aae70 Mon Sep 17 00:00:00 2001 From: Ramprasad Katkam Date: Wed, 26 Dec 2018 15:20:17 +0530 Subject: [PATCH 1/3] asoc: bolero: set bolero dev_up flag before macro notification When UP notification is sent to macros, the macros can try to do regcache sync for their regions. Set dev_up flag in bolero before sending UP event to macros to enable register access. Change-Id: Ic04cfef121e9be55e91bf8927da26f9ec249338e Signed-off-by: Ramprasad Katkam --- asoc/codecs/bolero/bolero-cdc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index 14a0defeb97d..8092bb7cc533 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: GPL-2.0-only -/* Copyright (c) 2018, The Linux Foundation. All rights reserved. +/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */ #include @@ -615,6 +615,9 @@ static int bolero_ssr_enable(struct device *dev, void *data) BOLERO_MACRO_EVT_WAIT_VA_CLK_RESET, 0x0); regcache_cache_only(priv->regmap, false); + mutex_lock(&priv->clk_lock); + priv->dev_up = true; + mutex_unlock(&priv->clk_lock); /* call ssr event for supported macros */ for (macro_idx = START_MACRO; macro_idx < MAX_MACRO; macro_idx++) { if (!priv->macro_params[macro_idx].event_handler) @@ -623,9 +626,6 @@ static int bolero_ssr_enable(struct device *dev, void *data) priv->component, BOLERO_MACRO_EVT_SSR_UP, 0x0); } - mutex_lock(&priv->clk_lock); - priv->dev_up = true; - mutex_unlock(&priv->clk_lock); bolero_cdc_notifier_call(priv, BOLERO_WCD_EVT_SSR_UP); return 0; } From 452772abf97a290028c637abfe77c3d0f155e970 Mon Sep 17 00:00:00 2001 From: Ramprasad Katkam Date: Mon, 7 Jan 2019 17:30:36 +0530 Subject: [PATCH 2/3] asoc: bolero: Do not disable mclk in widget power down upon enable failure If mclk enable is failed during mclk widget power up event, it would still send a power down event for the widget during disable, which could disable the mclk voted by other client like soundwire. Do not disable mclk during power down if enable is failed during power up. Change-Id: If782b34f9ef414501590ed8cf681bbe58f1dda76 Signed-off-by: Ramprasad Katkam --- asoc/codecs/bolero/rx-macro.c | 8 +++++++- asoc/codecs/bolero/tx-macro.c | 8 +++++++- asoc/codecs/bolero/wsa-macro.c | 8 +++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index ec7390a0cbc5..4d9ccb43761c 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -344,6 +344,7 @@ struct rx_macro_priv { u16 prim_int_users[INTERP_MAX]; int rx_mclk_users; int swr_clk_users; + bool dapm_mclk_enable; bool reset_swr; int clsh_users; int rx_mclk_cnt; @@ -1152,9 +1153,14 @@ static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w, rx_priv->swr_ctrl_data[0].rx_swr_pdev, SWR_CLK_FREQ, &mclk_freq); ret = rx_macro_mclk_enable(rx_priv, 1, true); + if (ret) + rx_priv->dapm_mclk_enable = false; + else + rx_priv->dapm_mclk_enable = true; break; case SND_SOC_DAPM_POST_PMD: - ret = rx_macro_mclk_enable(rx_priv, 0, true); + if (rx_priv->dapm_mclk_enable) + ret = rx_macro_mclk_enable(rx_priv, 0, true); break; default: dev_err(rx_priv->dev, diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 4cbf0aaccbff..ec5616672210 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -127,6 +127,7 @@ struct tx_macro_priv { bool dec_active[NUM_DECIMATORS]; int tx_mclk_users; int swr_clk_users; + bool dapm_mclk_enable; bool reset_swr; struct clk *tx_core_clk; struct clk *tx_npl_clk; @@ -260,9 +261,14 @@ static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: ret = tx_macro_mclk_enable(tx_priv, 1); + if (ret) + tx_priv->dapm_mclk_enable = false; + else + tx_priv->dapm_mclk_enable = true; break; case SND_SOC_DAPM_POST_PMD: - ret = tx_macro_mclk_enable(tx_priv, 0); + if (tx_priv->dapm_mclk_enable) + ret = tx_macro_mclk_enable(tx_priv, 0); break; default: dev_err(tx_priv->dev, diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c index 85417bc3df33..00d3d2c7782b 100644 --- a/asoc/codecs/bolero/wsa-macro.c +++ b/asoc/codecs/bolero/wsa-macro.c @@ -192,6 +192,7 @@ struct wsa_macro_priv { u16 prim_int_users[WSA_MACRO_RX1 + 1]; u16 wsa_mclk_users; u16 swr_clk_users; + bool dapm_mclk_enable; bool reset_swr; unsigned int vi_feed_value; struct mutex mclk_lock; @@ -870,9 +871,14 @@ static int wsa_macro_mclk_event(struct snd_soc_dapm_widget *w, switch (event) { case SND_SOC_DAPM_PRE_PMU: ret = wsa_macro_mclk_enable(wsa_priv, 1, true); + if (ret) + wsa_priv->dapm_mclk_enable = false; + else + wsa_priv->dapm_mclk_enable = true; break; case SND_SOC_DAPM_POST_PMD: - wsa_macro_mclk_enable(wsa_priv, 0, true); + if (wsa_priv->dapm_mclk_enable) + wsa_macro_mclk_enable(wsa_priv, 0, true); break; default: dev_err(wsa_priv->dev, From a60239e354d946d4f8b5b6cb325449cb02b3195f Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Thu, 10 Jan 2019 14:43:03 +0530 Subject: [PATCH 3/3] soc: soundwire: Add support for GPIO interrupt path In trinket target, interrupt for wakeup is provided via chip TLMM. Add required support to handle wakeup interrupt on SWR data line triggered over this TLMM line. Change-Id: I7fb6d7009a6271d54d0f11f99930b0d039f57129 Signed-off-by: Laxminath Kasam --- soc/swr-mstr-ctrl.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/soc/swr-mstr-ctrl.c b/soc/swr-mstr-ctrl.c index 74817af99597..2235934a727d 100644 --- a/soc/swr-mstr-ctrl.c +++ b/soc/swr-mstr-ctrl.c @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -2168,17 +2170,28 @@ static int swrm_device_down(struct device *dev) int swrm_register_wake_irq(struct swr_mstr_ctrl *swrm) { int ret = 0; + int irq, dir_apps_irq; if (!swrm->ipc_wakeup) { - swrm->wake_irq = platform_get_irq_byname(swrm->pdev, - "swr_wake_irq"); - if (swrm->wake_irq < 0) { - dev_err(swrm->dev, - "%s() error getting wake irq handle: %d\n", - __func__, swrm->wake_irq); - return -EINVAL; + irq = of_get_named_gpio(swrm->dev->of_node, + "qcom,swr-wakeup-irq", 0); + if (gpio_is_valid(irq)) { + swrm->wake_irq = gpio_to_irq(irq); + if (swrm->wake_irq < 0) { + dev_err(swrm->dev, + "Unable to configure irq\n"); + return swrm->wake_irq; + } + } else { + dir_apps_irq = platform_get_irq_byname(swrm->pdev, + "swr_wake_irq"); + if (dir_apps_irq < 0) { + dev_err(swrm->dev, + "TLMM connect gpio not found\n"); + return -EINVAL; + } + swrm->wake_irq = dir_apps_irq; } - ret = request_threaded_irq(swrm->wake_irq, NULL, swrm_wakeup_interrupt, IRQF_TRIGGER_HIGH | IRQF_ONESHOT,