asoc: codec: make mclk freq configurable in Bolero

Add support to make mclk freq configurable in Bolero
Macros - VA, TX and RX. Fallback to 9.6MHz if mclk
frequency is not defined in DTSI.

Change-Id: I27034d6bd31e1ed225adfc8de1b43cd68da84db3
Signed-off-by: Abhilash Sathyanarayana <quic_abhisath@quicinc.com>
This commit is contained in:
Abhilash Sathyanarayana 2023-10-09 12:34:12 +05:30
commit bc1ce40dc0
3 changed files with 54 additions and 14 deletions

View file

@ -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,

View file

@ -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) {

View file

@ -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) {