mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-11 07:03:09 -04:00
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:
parent
981ef85c0e
commit
bc1ce40dc0
3 changed files with 54 additions and 14 deletions
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue