diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 1d1153b510ff..509a139144ec 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -465,6 +465,7 @@ struct rx_macro_priv { u16 default_clk_id; int8_t rx0_gain_val; int8_t rx1_gain_val; + u32 mclk_freq; }; static struct snd_soc_dai_driver rx_macro_dai[]; @@ -1411,11 +1412,12 @@ static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w, int ret = 0; struct device *rx_dev = NULL; struct rx_macro_priv *rx_priv = NULL; - int mclk_freq = MCLK_FREQ; + int mclk_freq = 0; if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__)) return -EINVAL; + mclk_freq = rx_priv->mclk_freq; dev_dbg(rx_dev, "%s: event = %d\n", __func__, event); switch (event) { case SND_SOC_DAPM_PRE_PMU: @@ -4166,13 +4168,14 @@ static int rx_macro_probe(struct platform_device *pdev) { struct macro_ops ops = {0}; struct rx_macro_priv *rx_priv = NULL; - u32 rx_base_addr = 0, muxsel = 0; + u32 rx_base_addr = 0, muxsel = 0, mclk_freq = 0; char __iomem *rx_io_base = NULL, *muxsel_io = NULL; int ret = 0; u8 bcl_pmic_params[3]; u32 default_clk_id = 0; u32 is_used_rx_swr_gpio = 1; const char *is_used_rx_swr_gpio_dt = "qcom,is-used-swr-gpio"; + const char *cdc_mclk_clk_rate = "qcom,cdc-mclk-clk-rate"; if (!bolero_is_va_macro_registered(&pdev->dev)) { dev_err(&pdev->dev, @@ -4207,6 +4210,15 @@ static int rx_macro_probe(struct platform_device *pdev) __func__, "qcom,default-clk-id"); default_clk_id = RX_CORE_CLK; } + ret = of_property_read_u32(pdev->dev.of_node, cdc_mclk_clk_rate, + &mclk_freq); + if (ret) { + rx_priv->mclk_freq = MCLK_FREQ; + } else { + rx_priv->mclk_freq = mclk_freq; + } + dev_dbg(rx_priv->dev, + "%s: mclk_freq = %u\n", __func__, rx_priv->mclk_freq); if (of_find_property(pdev->dev.of_node, is_used_rx_swr_gpio_dt, NULL)) { ret = of_property_read_u32(pdev->dev.of_node, diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index 6b0d1d82be81..208d480c0075 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -186,6 +186,7 @@ struct tx_macro_priv { bool register_event_listener; u16 current_clk_id; int disable_afe_wakeup_event_listener; + u32 mclk_freq; }; static bool tx_macro_get_data(struct snd_soc_component *component, @@ -2985,13 +2986,12 @@ static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, struct tx_macro_priv *tx_priv) { u32 div_factor = TX_MACRO_CLK_DIV_2; - u32 mclk_rate = TX_MACRO_MCLK_FREQ; if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) + tx_priv->mclk_freq % dmic_sample_rate != 0) goto undefined_rate; - div_factor = mclk_rate / dmic_sample_rate; + div_factor = tx_priv->mclk_freq / dmic_sample_rate; switch (div_factor) { case 2: @@ -3019,13 +3019,13 @@ static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, /* Valid dmic DIV factors */ dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); + __func__, div_factor, tx_priv->mclk_freq); return dmic_sample_rate; undefined_rate: dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); + __func__, dmic_sample_rate, tx_priv->mclk_freq); dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; return dmic_sample_rate; @@ -3362,10 +3362,11 @@ static int tx_macro_probe(struct platform_device *pdev) { struct macro_ops ops = {0}; struct tx_macro_priv *tx_priv = NULL; - u32 tx_base_addr = 0, sample_rate = 0; + u32 tx_base_addr = 0, sample_rate = 0, mclk_freq = 0; char __iomem *tx_io_base = NULL; int ret = 0; const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate"; + const char *cdc_mclk_clk_rate = "qcom,cdc-mclk-clk-rate"; u32 is_used_tx_swr_gpio = 1; const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio"; u32 disable_afe_wakeup_event_listener = 0; @@ -3425,6 +3426,17 @@ static int tx_macro_probe(struct platform_device *pdev) return -ENOMEM; } tx_priv->tx_io_base = tx_io_base; + + ret = of_property_read_u32(pdev->dev.of_node, cdc_mclk_clk_rate, + &mclk_freq); + if (ret) { + tx_priv->mclk_freq = TX_MACRO_MCLK_FREQ; + } else { + tx_priv->mclk_freq = mclk_freq; + } + dev_dbg(tx_priv->dev, + "%s: mclk_freq = %u\n", __func__, tx_priv->mclk_freq); + ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, &sample_rate); if (ret) { diff --git a/asoc/codecs/bolero/va-macro.c b/asoc/codecs/bolero/va-macro.c index 6cd9e9402b64..363c7a41ce2c 100644 --- a/asoc/codecs/bolero/va-macro.c +++ b/asoc/codecs/bolero/va-macro.c @@ -186,6 +186,7 @@ struct va_macro_priv { u16 current_clk_id; int pcm_rate[VA_MACRO_NUM_DECIMATORS]; bool dev_up; + u32 mclk_freq; }; static bool va_macro_get_data(struct snd_soc_component *component, @@ -1567,6 +1568,12 @@ static int va_macro_hw_params(struct snd_pcm_substream *substream, dai->name, dai->id, params_rate(params), params_channels(params)); + if (va_priv->mclk_freq != VA_MACRO_MCLK_FREQ) { + dev_err(va_dev, "%s: unsupported VA mclk: %u\n", + __func__, va_priv->mclk_freq); + return -EINVAL; + } + sample_rate = params_rate(params); if (sample_rate > 16000) va_priv->clk_div_switch = true; @@ -2636,13 +2643,12 @@ static int va_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, struct va_macro_priv *va_priv) { u32 div_factor; - u32 mclk_rate = VA_MACRO_MCLK_FREQ; if (dmic_sample_rate == VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED || - mclk_rate % dmic_sample_rate != 0) + va_priv->mclk_freq % dmic_sample_rate != 0) goto undefined_rate; - div_factor = mclk_rate / dmic_sample_rate; + div_factor = va_priv->mclk_freq / dmic_sample_rate; switch (div_factor) { case 2: @@ -2670,13 +2676,13 @@ static int va_macro_validate_dmic_sample_rate(u32 dmic_sample_rate, /* Valid dmic DIV factors */ dev_dbg(va_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n", - __func__, div_factor, mclk_rate); + __func__, div_factor, va_priv->mclk_freq); return dmic_sample_rate; undefined_rate: dev_dbg(va_priv->dev, "%s: Invalid rate %d, for mclk %d\n", - __func__, dmic_sample_rate, mclk_rate); + __func__, dmic_sample_rate, va_priv->mclk_freq); dmic_sample_rate = VA_MACRO_DMIC_SAMPLE_RATE_UNDEFINED; return dmic_sample_rate; @@ -3061,7 +3067,7 @@ static int va_macro_probe(struct platform_device *pdev) { struct macro_ops ops; struct va_macro_priv *va_priv; - u32 va_base_addr, sample_rate = 0; + u32 va_base_addr, sample_rate = 0, mclk_freq = 0; char __iomem *va_io_base; bool va_without_decimation = false; const char *micb_supply_str = "va-vdd-micb-supply"; @@ -3074,6 +3080,7 @@ static int va_macro_probe(struct platform_device *pdev) struct clk *lpass_audio_hw_vote = NULL; u32 is_used_va_swr_gpio = 0; const char *is_used_va_swr_gpio_dt = "qcom,is-used-swr-gpio"; + const char *cdc_mclk_clk_rate = "qcom,cdc-mclk-clk-rate"; va_priv = devm_kzalloc(&pdev->dev, sizeof(struct va_macro_priv), GFP_KERNEL); @@ -3092,6 +3099,15 @@ static int va_macro_probe(struct platform_device *pdev) "qcom,va-without-decimation"); va_priv->va_without_decimation = va_without_decimation; + ret = of_property_read_u32(pdev->dev.of_node, cdc_mclk_clk_rate, + &mclk_freq); + if (ret) { + va_priv->mclk_freq = VA_MACRO_MCLK_FREQ; + } else { + va_priv->mclk_freq = mclk_freq; + } + dev_dbg(va_priv->dev, + "%s: mclk_freq = %u\n", __func__, va_priv->mclk_freq); ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate, &sample_rate); if (ret) {