From b9ff5ac5b0f7e9a29df86a128c29fe22575f7881 Mon Sep 17 00:00:00 2001 From: Laxminath Kasam Date: Wed, 1 Jul 2020 23:37:33 +0530 Subject: [PATCH] asoc: bolero: Ensure va-macro is registered before other macros As va-macro has fs_clk gen, ensure va-macro is registered before other macros. Change-Id: I8283dc11817caf0c208fe231132951a7a79b7d51 Signed-off-by: Laxminath Kasam --- asoc/codecs/bolero/bolero-cdc.c | 24 +++++++++++++++++++++++- asoc/codecs/bolero/bolero-cdc.h | 6 ++++++ asoc/codecs/bolero/rx-macro.c | 6 ++++++ asoc/codecs/bolero/tx-macro.c | 6 ++++++ asoc/codecs/bolero/wsa-macro.c | 7 +++++++ 5 files changed, 48 insertions(+), 1 deletion(-) diff --git a/asoc/codecs/bolero/bolero-cdc.c b/asoc/codecs/bolero/bolero-cdc.c index c46bcad0cd1b..7bde8430ac49 100644 --- a/asoc/codecs/bolero/bolero-cdc.c +++ b/asoc/codecs/bolero/bolero-cdc.c @@ -600,6 +600,28 @@ int bolero_dmic_clk_enable(struct snd_soc_component *component, } EXPORT_SYMBOL(bolero_dmic_clk_enable); +bool bolero_is_va_macro_registered(struct device *dev) +{ + struct bolero_priv *priv; + + if (!dev) { + pr_err("%s: dev is null\n", __func__); + return false; + } + if (!bolero_is_valid_child_dev(dev)) { + dev_err(dev, "%s: child device calling is not added yet\n", + __func__); + return false; + } + priv = dev_get_drvdata(dev->parent); + if (!priv) { + dev_err(dev, "%s: priv is null\n", __func__); + return false; + } + return priv->macros_supported[VA_MACRO]; +} +EXPORT_SYMBOL(bolero_is_va_macro_registered); + /** * bolero_register_macro - Registers macro to bolero * @@ -661,7 +683,7 @@ int bolero_register_macro(struct device *dev, u16 macro_id, priv->num_macros_registered++; priv->macros_supported[macro_id] = true; - dev_dbg(dev, "%s: register macro successful:%d\n", macro_id); + dev_info(dev, "%s: register macro successful:%d\n", __func__, macro_id); if (priv->num_macros_registered == priv->num_macros) { ret = bolero_copy_dais_from_macro(priv); diff --git a/asoc/codecs/bolero/bolero-cdc.h b/asoc/codecs/bolero/bolero-cdc.h index 1f21fd69c877..0a4101eca0bf 100644 --- a/asoc/codecs/bolero/bolero-cdc.h +++ b/asoc/codecs/bolero/bolero-cdc.h @@ -89,6 +89,7 @@ typedef int (*rsc_clk_cb_t)(struct device *dev, u16 event); #if IS_ENABLED(CONFIG_SND_SOC_BOLERO) int bolero_register_res_clk(struct device *dev, rsc_clk_cb_t cb); void bolero_unregister_res_clk(struct device *dev); +bool bolero_is_va_macro_registered(struct device *dev); int bolero_register_macro(struct device *dev, u16 macro_id, struct macro_ops *ops); void bolero_unregister_macro(struct device *dev, u16 macro_id); @@ -120,6 +121,11 @@ static inline void bolero_unregister_res_clk(struct device *dev) { } +static bool bolero_is_va_macro_registered(struct device *dev) +{ + return false; +} + static inline int bolero_register_macro(struct device *dev, u16 macro_id, struct macro_ops *ops) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 87c9477ad17d..dd78cf0bafe3 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -4028,6 +4028,12 @@ static int rx_macro_probe(struct platform_device *pdev) u32 is_used_rx_swr_gpio = 1; const char *is_used_rx_swr_gpio_dt = "qcom,is-used-swr-gpio"; + if (!bolero_is_va_macro_registered(&pdev->dev)) { + dev_err(&pdev->dev, + "%s: va-macro not registered yet, defer\n", __func__); + return -EPROBE_DEFER; + } + rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv), GFP_KERNEL); if (!rx_priv) diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 55b2c3017bba..a2816c42d4e1 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -3252,6 +3252,12 @@ static int tx_macro_probe(struct platform_device *pdev) u32 is_used_tx_swr_gpio = 1; const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio"; + if (!bolero_is_va_macro_registered(&pdev->dev)) { + dev_err(&pdev->dev, + "%s: va-macro not registered yet, defer\n", __func__); + return -EPROBE_DEFER; + } + tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv), GFP_KERNEL); if (!tx_priv) diff --git a/asoc/codecs/bolero/wsa-macro.c b/asoc/codecs/bolero/wsa-macro.c index 5c59d6de4f3d..b8ef8afabc7f 100644 --- a/asoc/codecs/bolero/wsa-macro.c +++ b/asoc/codecs/bolero/wsa-macro.c @@ -3139,6 +3139,12 @@ static int wsa_macro_probe(struct platform_device *pdev) u32 is_used_wsa_swr_gpio = 1; const char *is_used_wsa_swr_gpio_dt = "qcom,is-used-swr-gpio"; + if (!bolero_is_va_macro_registered(&pdev->dev)) { + dev_err(&pdev->dev, + "%s: va-macro not registered yet, defer\n", __func__); + return -EPROBE_DEFER; + } + wsa_priv = devm_kzalloc(&pdev->dev, sizeof(struct wsa_macro_priv), GFP_KERNEL); if (!wsa_priv) @@ -3224,6 +3230,7 @@ static int wsa_macro_probe(struct platform_device *pdev) wsa_macro_init_ops(&ops, wsa_io_base); ops.clk_id_req = wsa_priv->default_clk_id; ops.default_clk_id = wsa_priv->default_clk_id; + ret = bolero_register_macro(&pdev->dev, WSA_MACRO, &ops); if (ret < 0) { dev_err(&pdev->dev, "%s: register macro failed\n", __func__);