Loading Android.bp 0 → 100644 +18 −0 Original line number Diff line number Diff line gensrcs { name: "qcom-audio-kernel-includes", cmd: "$(location headers_install.sh) `dirname $(out)` `dirname $(in)` `basename $(in)`", tools: ["headers_install.sh"], export_include_dirs: ["include/uapi"], srcs: [ "include/uapi/**/*.h", ], output_extension: "h", } cc_library_headers { name: "qcom_audio_kernel_headers", generated_headers: ["qcom-audio-kernel-includes"], export_generated_headers: ["qcom-audio-kernel-includes"], vendor: true, recovery_available: true, } asoc/bengal-port-config.h +3 −3 Original line number Diff line number Diff line Loading @@ -31,9 +31,9 @@ static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { /* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { {1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX1 */ {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, /* TX2 */ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX1 */ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX2 */ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ }; static struct swr_mstr_port_map sm_port_map[] = { Loading asoc/bengal.c +38 −8 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #include <linux/clk.h> Loading @@ -14,6 +14,7 @@ #include <linux/input.h> #include <linux/of_device.h> #include <linux/soc/qcom/fsa4480-i2c.h> #include <linux/nvmem-consumer.h> #include <sound/core.h> #include <sound/soc.h> #include <sound/soc-dapm.h> Loading Loading @@ -155,6 +156,7 @@ struct msm_asoc_mach_data { struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ bool is_afe_config_done; struct device_node *fsa_handle; bool va_disable; }; struct tdm_port { Loading Loading @@ -3465,6 +3467,8 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, break; case MSM_BACKEND_DAI_SLIMBUS_7_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, slim_tx_cfg[SLIM_TX_7].bit_format); rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_7].channels; Loading Loading @@ -3811,11 +3815,17 @@ static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream) int ret = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai_link *dai_link = rtd->dai_link; struct snd_soc_card *card = rtd->card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); switch (dai_link->id) { case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: if (pdata->va_disable) { pr_debug("%s: SVA not supported\n", __func__); return -EINVAL; } ret = bengal_send_island_va_config(dai_link->id); if (ret) pr_err("%s: send island va cfg failed, err: %d\n", Loading Loading @@ -4835,7 +4845,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = { }; static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { {/* hw:x,34 */ {/* hw:x,33 */ .name = MSM_DAILINK_NAME(ASM Loopback), .stream_name = "MultiMedia6", .cpu_dai_name = "MultiMedia6", Loading @@ -4852,7 +4862,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA6, }, {/* hw:x,35 */ {/* hw:x,34 */ .name = "USB Audio Hostless", .stream_name = "USB Audio Hostless", .cpu_dai_name = "USBAUDIO_HOSTLESS", Loading @@ -4868,7 +4878,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,36 */ {/* hw:x,35 */ .name = "SLIMBUS_7 Hostless", .stream_name = "SLIMBUS_7 Hostless", .cpu_dai_name = "SLIMBUS7_HOSTLESS", Loading @@ -4884,7 +4894,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,37 */ {/* hw:x,36 */ .name = "Compress Capture", .stream_name = "Compress9", .cpu_dai_name = "MultiMedia17", Loading @@ -4899,7 +4909,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA17, }, {/* hw:x,38 */ {/* hw:x,37 */ .name = "SLIMBUS_8 Hostless", .stream_name = "SLIMBUS_8 Hostless", .cpu_dai_name = "SLIMBUS8_HOSTLESS", Loading @@ -4915,7 +4925,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,39 */ {/* hw:x,38 */ .name = LPASS_BE_TX_CDC_DMA_TX_5, .stream_name = "TX CDC DMA5 Capture", .cpu_dai_name = "msm-dai-cdc-dma-dev.45115", Loading Loading @@ -6443,6 +6453,10 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) const char *mbhc_audio_jack_type = NULL; int ret = 0; uint index = 0; struct nvmem_cell *cell; size_t len; u32 *buf; u32 adsp_var_idx = 0; if (!pdev->dev.of_node) { dev_err(&pdev->dev, Loading Loading @@ -6592,7 +6606,23 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) __func__, ret); is_initial_boot = true; /* get adsp variant idx */ cell = nvmem_cell_get(&pdev->dev, "adsp_variant"); if (IS_ERR_OR_NULL(cell)) { dev_dbg(&pdev->dev, "%s: FAILED to get nvmem cell \n", __func__); goto ret; } buf = nvmem_cell_read(cell, &len); nvmem_cell_put(cell); if (IS_ERR_OR_NULL(buf) || len <= 0 || len > sizeof(32)) { dev_dbg(&pdev->dev, "%s: FAILED to read nvmem cell \n", __func__); goto ret; } memcpy(&adsp_var_idx, buf, len); kfree(buf); pdata->va_disable = adsp_var_idx; ret: return 0; err: devm_kfree(&pdev->dev, pdata); Loading asoc/codecs/bolero/bolero-cdc-regmap.c +8 −0 Original line number Diff line number Diff line Loading @@ -797,6 +797,14 @@ static bool bolero_is_volatile_register(struct device *dev, case BOLERO_CDC_VA_TOP_CSR_CORE_ID_1: case BOLERO_CDC_VA_TOP_CSR_CORE_ID_2: case BOLERO_CDC_VA_TOP_CSR_CORE_ID_3: case BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL: case BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL: case BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST: case BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0: Loading asoc/codecs/bolero/bolero-cdc.c +170 −3 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include <linux/of_platform.h> Loading Loading @@ -470,6 +470,129 @@ void bolero_unregister_res_clk(struct device *dev) } EXPORT_SYMBOL(bolero_unregister_res_clk); static u8 bolero_dmic_clk_div_get(struct snd_soc_component *component, int mode) { struct bolero_priv* priv = snd_soc_component_get_drvdata(component); int macro = (mode ? VA_MACRO : TX_MACRO); int ret = 0; if (priv->macro_params[macro].clk_div_get) { ret = priv->macro_params[macro].clk_div_get(component); if (ret > 0) return ret; } return 1; } int bolero_dmic_clk_enable(struct snd_soc_component *component, u32 dmic, u32 tx_mode, bool enable) { struct bolero_priv* priv = snd_soc_component_get_drvdata(component); u8 dmic_clk_en = 0x01; u16 dmic_clk_reg = 0; s32 *dmic_clk_cnt = NULL; u8 *dmic_clk_div = NULL; u8 freq_change_mask = 0; u8 clk_div = 0; dev_dbg(component->dev, "%s: enable: %d, tx_mode:%d, dmic: %d\n", __func__, enable, tx_mode, dmic); switch (dmic) { case 0: case 1: dmic_clk_cnt = &(priv->dmic_0_1_clk_cnt); dmic_clk_div = &(priv->dmic_0_1_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL; freq_change_mask = 0x01; break; case 2: case 3: dmic_clk_cnt = &(priv->dmic_2_3_clk_cnt); dmic_clk_div = &(priv->dmic_2_3_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL; freq_change_mask = 0x02; break; case 4: case 5: dmic_clk_cnt = &(priv->dmic_4_5_clk_cnt); dmic_clk_div = &(priv->dmic_4_5_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL; freq_change_mask = 0x04; break; case 6: case 7: dmic_clk_cnt = &(priv->dmic_6_7_clk_cnt); dmic_clk_div = &(priv->dmic_6_7_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL; freq_change_mask = 0x08; break; default: dev_err(component->dev, "%s: Invalid DMIC Selection\n", __func__); return -EINVAL; } dev_dbg(component->dev, "%s: DMIC%d dmic_clk_cnt %d\n", __func__, dmic, *dmic_clk_cnt); if (enable) { clk_div = bolero_dmic_clk_div_get(component, tx_mode); (*dmic_clk_cnt)++; if (*dmic_clk_cnt == 1) { snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, 0x80, 0x00); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, dmic_clk_reg, dmic_clk_en, dmic_clk_en); } else { if (*dmic_clk_div > clk_div) { snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, freq_change_mask); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, 0x00); } else { clk_div = *dmic_clk_div; } } *dmic_clk_div = clk_div; } else { (*dmic_clk_cnt)--; if (*dmic_clk_cnt == 0) { snd_soc_component_update_bits(component, dmic_clk_reg, dmic_clk_en, 0); clk_div = 0; snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); } else { clk_div = bolero_dmic_clk_div_get(component, tx_mode); if (*dmic_clk_div > clk_div) { clk_div = bolero_dmic_clk_div_get(component, !tx_mode); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, freq_change_mask); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, 0x00); } else { clk_div = *dmic_clk_div; } } *dmic_clk_div = clk_div; } return 0; } EXPORT_SYMBOL(bolero_dmic_clk_enable); /** * bolero_register_macro - Registers macro to bolero * Loading Loading @@ -517,7 +640,11 @@ int bolero_register_macro(struct device *dev, u16 macro_id, priv->macro_params[macro_id].clk_switch = ops->clk_switch; priv->macro_params[macro_id].reg_evt_listener = ops->reg_evt_listener; priv->macro_params[macro_id].clk_enable = ops->clk_enable; } if (macro_id == TX_MACRO || macro_id == VA_MACRO) priv->macro_params[macro_id].clk_div_get = ops->clk_div_get; if (priv->version == BOLERO_VERSION_2_1) { if (macro_id == VA_MACRO) priv->macro_params[macro_id].reg_wake_irq = Loading Loading @@ -587,7 +714,10 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id) priv->macro_params[macro_id].reg_wake_irq = NULL; priv->macro_params[macro_id].clk_switch = NULL; priv->macro_params[macro_id].reg_evt_listener = NULL; priv->macro_params[macro_id].clk_enable = NULL; } if (macro_id == TX_MACRO || macro_id == VA_MACRO) priv->macro_params[macro_id].clk_div_get = NULL; priv->num_dais -= priv->macro_params[macro_id].num_dais; priv->num_macros_registered--; Loading Loading @@ -861,9 +991,11 @@ EXPORT_SYMBOL(bolero_register_wake_irq); * * @component: pointer to codec component instance. * * @clk_src: 0 for TX_RCG and 1 for VA_RCG * * Returns 0 on success or -EINVAL on error. */ int bolero_tx_clk_switch(struct snd_soc_component *component) int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src) { struct bolero_priv *priv = NULL; int ret = 0; Loading @@ -881,12 +1013,47 @@ int bolero_tx_clk_switch(struct snd_soc_component *component) } if (priv->macro_params[TX_MACRO].clk_switch) ret = priv->macro_params[TX_MACRO].clk_switch(component); ret = priv->macro_params[TX_MACRO].clk_switch(component, clk_src); return ret; } EXPORT_SYMBOL(bolero_tx_clk_switch); /** * bolero_tx_mclk_enable - Enable/Disable TX Macro mclk * * @component: pointer to codec component instance. * @enable: set true to enable, otherwise false. * * Returns 0 on success or -EINVAL on error. */ int bolero_tx_mclk_enable(struct snd_soc_component *component, bool enable) { struct bolero_priv *priv = NULL; int ret = 0; if (!component) return -EINVAL; priv = snd_soc_component_get_drvdata(component); if (!priv) return -EINVAL; if (!bolero_is_valid_codec_dev(priv->dev)) { dev_err(component->dev, "%s: invalid codec\n", __func__); return -EINVAL; } if (priv->macro_params[TX_MACRO].clk_enable) ret = priv->macro_params[TX_MACRO].clk_enable(component, enable); return ret; } EXPORT_SYMBOL(bolero_tx_mclk_enable); /** * bolero_register_event_listener - Register/Deregister to event listener * Loading Loading
Android.bp 0 → 100644 +18 −0 Original line number Diff line number Diff line gensrcs { name: "qcom-audio-kernel-includes", cmd: "$(location headers_install.sh) `dirname $(out)` `dirname $(in)` `basename $(in)`", tools: ["headers_install.sh"], export_include_dirs: ["include/uapi"], srcs: [ "include/uapi/**/*.h", ], output_extension: "h", } cc_library_headers { name: "qcom_audio_kernel_headers", generated_headers: ["qcom-audio-kernel-includes"], export_generated_headers: ["qcom-audio-kernel-includes"], vendor: true, recovery_available: true, }
asoc/bengal-port-config.h +3 −3 Original line number Diff line number Diff line Loading @@ -31,9 +31,9 @@ static struct port_params rx_frame_params_dsd[SWR_MSTR_PORT_LEN] = { /* TX UC1: TX1: 1ch, TX2: 2chs, TX3: 1ch(MBHC) */ static struct port_params tx_frame_params_default[SWR_MSTR_PORT_LEN] = { {1, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX1 */ {1, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 1}, /* TX2 */ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX1 */ {3, 2, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX2 */ {3, 1, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0}, /* TX3 */ }; static struct swr_mstr_port_map sm_port_map[] = { Loading
asoc/bengal.c +38 −8 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #include <linux/clk.h> Loading @@ -14,6 +14,7 @@ #include <linux/input.h> #include <linux/of_device.h> #include <linux/soc/qcom/fsa4480-i2c.h> #include <linux/nvmem-consumer.h> #include <sound/core.h> #include <sound/soc.h> #include <sound/soc-dapm.h> Loading Loading @@ -155,6 +156,7 @@ struct msm_asoc_mach_data { struct device_node *hph_en0_gpio_p; /* used by pinctrl API */ bool is_afe_config_done; struct device_node *fsa_handle; bool va_disable; }; struct tdm_port { Loading Loading @@ -3465,6 +3467,8 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, break; case MSM_BACKEND_DAI_SLIMBUS_7_TX: param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, slim_tx_cfg[SLIM_TX_7].bit_format); rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate; channels->min = channels->max = slim_tx_cfg[SLIM_TX_7].channels; Loading Loading @@ -3811,11 +3815,17 @@ static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream) int ret = 0; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_dai_link *dai_link = rtd->dai_link; struct snd_soc_card *card = rtd->card; struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); switch (dai_link->id) { case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0: case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1: case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2: if (pdata->va_disable) { pr_debug("%s: SVA not supported\n", __func__); return -EINVAL; } ret = bengal_send_island_va_config(dai_link->id); if (ret) pr_err("%s: send island va cfg failed, err: %d\n", Loading Loading @@ -4835,7 +4845,7 @@ static struct snd_soc_dai_link msm_common_dai_links[] = { }; static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { {/* hw:x,34 */ {/* hw:x,33 */ .name = MSM_DAILINK_NAME(ASM Loopback), .stream_name = "MultiMedia6", .cpu_dai_name = "MultiMedia6", Loading @@ -4852,7 +4862,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA6, }, {/* hw:x,35 */ {/* hw:x,34 */ .name = "USB Audio Hostless", .stream_name = "USB Audio Hostless", .cpu_dai_name = "USBAUDIO_HOSTLESS", Loading @@ -4868,7 +4878,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,36 */ {/* hw:x,35 */ .name = "SLIMBUS_7 Hostless", .stream_name = "SLIMBUS_7 Hostless", .cpu_dai_name = "SLIMBUS7_HOSTLESS", Loading @@ -4884,7 +4894,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,37 */ {/* hw:x,36 */ .name = "Compress Capture", .stream_name = "Compress9", .cpu_dai_name = "MultiMedia17", Loading @@ -4899,7 +4909,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .ignore_pmdown_time = 1, .id = MSM_FRONTEND_DAI_MULTIMEDIA17, }, {/* hw:x,38 */ {/* hw:x,37 */ .name = "SLIMBUS_8 Hostless", .stream_name = "SLIMBUS_8 Hostless", .cpu_dai_name = "SLIMBUS8_HOSTLESS", Loading @@ -4915,7 +4925,7 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = { .codec_dai_name = "snd-soc-dummy-dai", .codec_name = "snd-soc-dummy", }, {/* hw:x,39 */ {/* hw:x,38 */ .name = LPASS_BE_TX_CDC_DMA_TX_5, .stream_name = "TX CDC DMA5 Capture", .cpu_dai_name = "msm-dai-cdc-dma-dev.45115", Loading Loading @@ -6443,6 +6453,10 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) const char *mbhc_audio_jack_type = NULL; int ret = 0; uint index = 0; struct nvmem_cell *cell; size_t len; u32 *buf; u32 adsp_var_idx = 0; if (!pdev->dev.of_node) { dev_err(&pdev->dev, Loading Loading @@ -6592,7 +6606,23 @@ static int msm_asoc_machine_probe(struct platform_device *pdev) __func__, ret); is_initial_boot = true; /* get adsp variant idx */ cell = nvmem_cell_get(&pdev->dev, "adsp_variant"); if (IS_ERR_OR_NULL(cell)) { dev_dbg(&pdev->dev, "%s: FAILED to get nvmem cell \n", __func__); goto ret; } buf = nvmem_cell_read(cell, &len); nvmem_cell_put(cell); if (IS_ERR_OR_NULL(buf) || len <= 0 || len > sizeof(32)) { dev_dbg(&pdev->dev, "%s: FAILED to read nvmem cell \n", __func__); goto ret; } memcpy(&adsp_var_idx, buf, len); kfree(buf); pdata->va_disable = adsp_var_idx; ret: return 0; err: devm_kfree(&pdev->dev, pdata); Loading
asoc/codecs/bolero/bolero-cdc-regmap.c +8 −0 Original line number Diff line number Diff line Loading @@ -797,6 +797,14 @@ static bool bolero_is_volatile_register(struct device *dev, case BOLERO_CDC_VA_TOP_CSR_CORE_ID_1: case BOLERO_CDC_VA_TOP_CSR_CORE_ID_2: case BOLERO_CDC_VA_TOP_CSR_CORE_ID_3: case BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL: case BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC1_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC2_CTL: case BOLERO_CDC_TX_TOP_CSR_SWR_DMIC3_CTL: case BOLERO_CDC_WSA_VBAT_BCL_VBAT_GAIN_MON_VAL: case BOLERO_CDC_WSA_VBAT_BCL_VBAT_DECODE_ST: case BOLERO_CDC_WSA_INTR_CTRL_PIN1_STATUS0: Loading
asoc/codecs/bolero/bolero-cdc.c +170 −3 Original line number Diff line number Diff line // SPDX-License-Identifier: GPL-2.0-only /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include <linux/of_platform.h> Loading Loading @@ -470,6 +470,129 @@ void bolero_unregister_res_clk(struct device *dev) } EXPORT_SYMBOL(bolero_unregister_res_clk); static u8 bolero_dmic_clk_div_get(struct snd_soc_component *component, int mode) { struct bolero_priv* priv = snd_soc_component_get_drvdata(component); int macro = (mode ? VA_MACRO : TX_MACRO); int ret = 0; if (priv->macro_params[macro].clk_div_get) { ret = priv->macro_params[macro].clk_div_get(component); if (ret > 0) return ret; } return 1; } int bolero_dmic_clk_enable(struct snd_soc_component *component, u32 dmic, u32 tx_mode, bool enable) { struct bolero_priv* priv = snd_soc_component_get_drvdata(component); u8 dmic_clk_en = 0x01; u16 dmic_clk_reg = 0; s32 *dmic_clk_cnt = NULL; u8 *dmic_clk_div = NULL; u8 freq_change_mask = 0; u8 clk_div = 0; dev_dbg(component->dev, "%s: enable: %d, tx_mode:%d, dmic: %d\n", __func__, enable, tx_mode, dmic); switch (dmic) { case 0: case 1: dmic_clk_cnt = &(priv->dmic_0_1_clk_cnt); dmic_clk_div = &(priv->dmic_0_1_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL; freq_change_mask = 0x01; break; case 2: case 3: dmic_clk_cnt = &(priv->dmic_2_3_clk_cnt); dmic_clk_div = &(priv->dmic_2_3_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL; freq_change_mask = 0x02; break; case 4: case 5: dmic_clk_cnt = &(priv->dmic_4_5_clk_cnt); dmic_clk_div = &(priv->dmic_4_5_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL; freq_change_mask = 0x04; break; case 6: case 7: dmic_clk_cnt = &(priv->dmic_6_7_clk_cnt); dmic_clk_div = &(priv->dmic_6_7_clk_div); dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL; freq_change_mask = 0x08; break; default: dev_err(component->dev, "%s: Invalid DMIC Selection\n", __func__); return -EINVAL; } dev_dbg(component->dev, "%s: DMIC%d dmic_clk_cnt %d\n", __func__, dmic, *dmic_clk_cnt); if (enable) { clk_div = bolero_dmic_clk_div_get(component, tx_mode); (*dmic_clk_cnt)++; if (*dmic_clk_cnt == 1) { snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, 0x80, 0x00); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, dmic_clk_reg, dmic_clk_en, dmic_clk_en); } else { if (*dmic_clk_div > clk_div) { snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, freq_change_mask); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, 0x00); } else { clk_div = *dmic_clk_div; } } *dmic_clk_div = clk_div; } else { (*dmic_clk_cnt)--; if (*dmic_clk_cnt == 0) { snd_soc_component_update_bits(component, dmic_clk_reg, dmic_clk_en, 0); clk_div = 0; snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); } else { clk_div = bolero_dmic_clk_div_get(component, tx_mode); if (*dmic_clk_div > clk_div) { clk_div = bolero_dmic_clk_div_get(component, !tx_mode); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, freq_change_mask); snd_soc_component_update_bits(component, dmic_clk_reg, 0x0E, clk_div << 0x1); snd_soc_component_update_bits(component, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG, freq_change_mask, 0x00); } else { clk_div = *dmic_clk_div; } } *dmic_clk_div = clk_div; } return 0; } EXPORT_SYMBOL(bolero_dmic_clk_enable); /** * bolero_register_macro - Registers macro to bolero * Loading Loading @@ -517,7 +640,11 @@ int bolero_register_macro(struct device *dev, u16 macro_id, priv->macro_params[macro_id].clk_switch = ops->clk_switch; priv->macro_params[macro_id].reg_evt_listener = ops->reg_evt_listener; priv->macro_params[macro_id].clk_enable = ops->clk_enable; } if (macro_id == TX_MACRO || macro_id == VA_MACRO) priv->macro_params[macro_id].clk_div_get = ops->clk_div_get; if (priv->version == BOLERO_VERSION_2_1) { if (macro_id == VA_MACRO) priv->macro_params[macro_id].reg_wake_irq = Loading Loading @@ -587,7 +714,10 @@ void bolero_unregister_macro(struct device *dev, u16 macro_id) priv->macro_params[macro_id].reg_wake_irq = NULL; priv->macro_params[macro_id].clk_switch = NULL; priv->macro_params[macro_id].reg_evt_listener = NULL; priv->macro_params[macro_id].clk_enable = NULL; } if (macro_id == TX_MACRO || macro_id == VA_MACRO) priv->macro_params[macro_id].clk_div_get = NULL; priv->num_dais -= priv->macro_params[macro_id].num_dais; priv->num_macros_registered--; Loading Loading @@ -861,9 +991,11 @@ EXPORT_SYMBOL(bolero_register_wake_irq); * * @component: pointer to codec component instance. * * @clk_src: 0 for TX_RCG and 1 for VA_RCG * * Returns 0 on success or -EINVAL on error. */ int bolero_tx_clk_switch(struct snd_soc_component *component) int bolero_tx_clk_switch(struct snd_soc_component *component, int clk_src) { struct bolero_priv *priv = NULL; int ret = 0; Loading @@ -881,12 +1013,47 @@ int bolero_tx_clk_switch(struct snd_soc_component *component) } if (priv->macro_params[TX_MACRO].clk_switch) ret = priv->macro_params[TX_MACRO].clk_switch(component); ret = priv->macro_params[TX_MACRO].clk_switch(component, clk_src); return ret; } EXPORT_SYMBOL(bolero_tx_clk_switch); /** * bolero_tx_mclk_enable - Enable/Disable TX Macro mclk * * @component: pointer to codec component instance. * @enable: set true to enable, otherwise false. * * Returns 0 on success or -EINVAL on error. */ int bolero_tx_mclk_enable(struct snd_soc_component *component, bool enable) { struct bolero_priv *priv = NULL; int ret = 0; if (!component) return -EINVAL; priv = snd_soc_component_get_drvdata(component); if (!priv) return -EINVAL; if (!bolero_is_valid_codec_dev(priv->dev)) { dev_err(component->dev, "%s: invalid codec\n", __func__); return -EINVAL; } if (priv->macro_params[TX_MACRO].clk_enable) ret = priv->macro_params[TX_MACRO].clk_enable(component, enable); return ret; } EXPORT_SYMBOL(bolero_tx_mclk_enable); /** * bolero_register_event_listener - Register/Deregister to event listener * Loading