diff --git a/audioreach-driver/audioreach_common.c b/audioreach-driver/audioreach_common.c index d00144a..e87e7a8 100644 --- a/audioreach-driver/audioreach_common.c +++ b/audioreach-driver/audioreach_common.c @@ -12,10 +12,9 @@ #include #include #include -#include "qdsp6/q6afe.h" -#include "sdw.h" #include "q6prm_audioreach.h" +#define AFE_PORT_MAX 137 #define NAME_SIZE 32 struct qcs6490_snd_data { @@ -50,7 +49,6 @@ static const struct snd_soc_dapm_widget qcom_jack_snd_widgets[] = { SND_SOC_DAPM_SPK("DP7 Jack", NULL), }; - static struct snd_soc_jack_pin qcs6490_headset_jack_pins[] = { /* Headset */ { @@ -63,9 +61,9 @@ static struct snd_soc_jack_pin qcs6490_headset_jack_pins[] = { }, }; - -int qcs6490_snd_dp_jack_setup(struct snd_soc_pcm_runtime *rtd, - struct snd_soc_jack *dp_jack, int dp_pcm_id) +static int qcs6490_snd_dp_jack_setup(struct snd_soc_pcm_runtime *rtd, + struct snd_soc_jack *dp_jack, + int dp_pcm_id) { struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); struct snd_soc_card *card = rtd->card; @@ -88,8 +86,9 @@ int qcs6490_snd_dp_jack_setup(struct snd_soc_pcm_runtime *rtd, return 0; } -int qcs6490_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd, - struct snd_soc_jack *jack, bool *jack_setup) +static int qcs6490_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd, + struct snd_soc_jack *jack, + bool *jack_setup) { struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); @@ -142,7 +141,7 @@ int qcs6490_snd_wcd_jack_setup(struct snd_soc_pcm_runtime *rtd, } -void audioreach_get_link_name(const char **link_name, int dai_id) +static void audioreach_get_link_name(const char **link_name, int dai_id) { switch (dai_id) { case WSA_CODEC_DMA_RX_0: @@ -201,7 +200,7 @@ void audioreach_get_link_name(const char **link_name, int dai_id) } } -int qcs6490_snd_parse_of(struct snd_soc_card *card) +static int qcs6490_snd_parse_of(struct snd_soc_card *card) { struct device_node *np; struct device_node *codec = NULL; @@ -388,6 +387,64 @@ static int qcs6490_snd_init(struct snd_soc_pcm_runtime *rtd) return qcs6490_snd_wcd_jack_setup(rtd, &data->jack, &data->jack_setup); } +static int qcs6490_snd_startup(struct snd_pcm_substream *substream) +{ + struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); + struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); + u32 rx_ch[SDW_MAX_PORTS], tx_ch[SDW_MAX_PORTS]; + struct sdw_stream_runtime *sruntime; + struct snd_soc_dai *codec_dai; + u32 rx_ch_cnt = 0, tx_ch_cnt = 0; + int ret, i, j; + + sruntime = sdw_alloc_stream(cpu_dai->name, SDW_STREAM_PCM); + if (!sruntime) + return -ENOMEM; + + for_each_rtd_codec_dais(rtd, i, codec_dai) { + ret = snd_soc_dai_set_stream(codec_dai, sruntime, + substream->stream); + if (ret < 0 && ret != -ENOTSUPP) { + dev_err(rtd->dev, "Failed to set sdw stream on %s\n", codec_dai->name); + goto err_set_stream; + } else if (ret == -ENOTSUPP) { + /* Ignore unsupported */ + continue; + } + + ret = snd_soc_dai_get_channel_map(codec_dai, &tx_ch_cnt, tx_ch, + &rx_ch_cnt, rx_ch); + if (ret != 0 && ret != -ENOTSUPP) { + dev_err(rtd->dev, "Failed to get codec chan map %s\n", codec_dai->name); + goto err_set_stream; + } else if (ret == -ENOTSUPP) { + /* Ignore unsupported */ + continue; + } + } + + switch (cpu_dai->id) { + case RX_CODEC_DMA_RX_0: + case TX_CODEC_DMA_TX_3: + if (tx_ch_cnt || rx_ch_cnt) { + for_each_rtd_codec_dais(rtd, j, codec_dai) { + ret = snd_soc_dai_set_channel_map(codec_dai, + tx_ch_cnt, tx_ch, + rx_ch_cnt, rx_ch); + if (ret != 0 && ret != -ENOTSUPP) + goto err_set_stream; + } + } + } + + return 0; + +err_set_stream: + sdw_release_stream(sruntime); + + return ret; +} + static void qcs6490_snd_shutdown(struct snd_pcm_substream *substream) { struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); @@ -400,7 +457,7 @@ static void qcs6490_snd_shutdown(struct snd_pcm_substream *substream) } static int qcs6490_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, - struct snd_pcm_hw_params *params) + struct snd_pcm_hw_params *params) { struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); struct snd_interval *rate = hw_param_interval(params, @@ -427,13 +484,32 @@ static int qcs6490_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, } static int qcs6490_snd_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) + struct snd_pcm_hw_params *params) { struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream); + struct snd_soc_dai *codec_dai = snd_soc_rtd_to_codec(rtd, 0); struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); struct qcs6490_snd_data *pdata = snd_soc_card_get_drvdata(rtd->card); + struct sdw_stream_runtime *sruntime; + int i; - return qcom_snd_sdw_hw_params(substream, params, &pdata->sruntime[cpu_dai->id]); + switch (cpu_dai->id) { + case WSA_CODEC_DMA_RX_0: + case RX_CODEC_DMA_RX_0: + case RX_CODEC_DMA_RX_1: + case TX_CODEC_DMA_TX_0: + case TX_CODEC_DMA_TX_1: + case TX_CODEC_DMA_TX_2: + case TX_CODEC_DMA_TX_3: + for_each_rtd_codec_dais(rtd, i, codec_dai) { + sruntime = snd_soc_dai_get_stream(codec_dai, substream->stream); + if (sruntime != ERR_PTR(-ENOTSUPP)) + pdata->sruntime[cpu_dai->id] = sruntime; + } + break; + } + + return 0; } static int qcs6490_snd_prepare(struct snd_pcm_substream *substream) @@ -442,9 +518,49 @@ static int qcs6490_snd_prepare(struct snd_pcm_substream *substream) struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); struct qcs6490_snd_data *data = snd_soc_card_get_drvdata(rtd->card); struct sdw_stream_runtime *sruntime = data->sruntime[cpu_dai->id]; + bool *stream_prepared = &data->stream_prepared[cpu_dai->id]; + int ret; + + if (!sruntime) + return 0; + + switch (cpu_dai->id) { + case WSA_CODEC_DMA_RX_0: + case WSA_CODEC_DMA_RX_1: + case RX_CODEC_DMA_RX_0: + case RX_CODEC_DMA_RX_1: + case TX_CODEC_DMA_TX_0: + case TX_CODEC_DMA_TX_1: + case TX_CODEC_DMA_TX_2: + case TX_CODEC_DMA_TX_3: + break; + default: + return 0; + } + + if (*stream_prepared) + return 0; + + ret = sdw_prepare_stream(sruntime); + if (ret) + return ret; + + /** + * NOTE: there is a strict hw requirement about the ordering of port + * enables and actual WSA881x PA enable. PA enable should only happen + * after soundwire ports are enabled if not DC on the line is + * accumulated resulting in Click/Pop Noise + * PA enable/mute are handled as part of codec DAPM and digital mute. + */ + + ret = sdw_enable_stream(sruntime); + if (ret) { + sdw_deprepare_stream(sruntime); + return ret; + } + *stream_prepared = true; - return qcom_snd_sdw_prepare(substream, sruntime, - &data->stream_prepared[cpu_dai->id]); + return ret; } static int qcs6490_snd_hw_free(struct snd_pcm_substream *substream) @@ -453,13 +569,32 @@ static int qcs6490_snd_hw_free(struct snd_pcm_substream *substream) struct qcs6490_snd_data *data = snd_soc_card_get_drvdata(rtd->card); struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0); struct sdw_stream_runtime *sruntime = data->sruntime[cpu_dai->id]; + bool *stream_prepared = &data->stream_prepared[cpu_dai->id]; - return qcom_snd_sdw_hw_free(substream, sruntime, - &data->stream_prepared[cpu_dai->id]); + switch (cpu_dai->id) { + case WSA_CODEC_DMA_RX_0: + case WSA_CODEC_DMA_RX_1: + case RX_CODEC_DMA_RX_0: + case RX_CODEC_DMA_RX_1: + case TX_CODEC_DMA_TX_0: + case TX_CODEC_DMA_TX_1: + case TX_CODEC_DMA_TX_2: + case TX_CODEC_DMA_TX_3: + if (sruntime && *stream_prepared) { + sdw_disable_stream(sruntime); + sdw_deprepare_stream(sruntime); + *stream_prepared = false; + } + break; + default: + break; + } + + return 0; } static const struct snd_soc_ops qcs6490_be_ops = { - .startup = qcom_snd_sdw_startup, + .startup = qcs6490_snd_startup, .shutdown = qcs6490_snd_shutdown, .hw_params = qcs6490_snd_hw_params, .hw_free = qcs6490_snd_hw_free, @@ -527,6 +662,7 @@ static struct platform_driver snd_qcs6490_driver = { .of_match_table = snd_qcs6490_dt_match, }, }; + int snd_qcs6490_init(void) { return platform_driver_register(&snd_qcs6490_driver); @@ -536,6 +672,7 @@ void snd_qcs6490_exit(void) { platform_driver_unregister(&snd_qcs6490_driver); } + static int __init audio_reach_driver_init(void) { int ret; @@ -592,7 +729,5 @@ static void __exit audio_reach_driver_exit(void) module_init(audio_reach_driver_init); module_exit(audio_reach_driver_exit); - -//module_platform_driver(snd_qcs6490_driver); MODULE_DESCRIPTION("QCS6490 ASoC Machine Driver"); MODULE_LICENSE("GPL"); diff --git a/audioreach-driver/q6apm_audio_mem.c b/audioreach-driver/q6apm_audio_mem.c index f6c53bf..2b90104 100644 --- a/audioreach-driver/q6apm_audio_mem.c +++ b/audioreach-driver/q6apm_audio_mem.c @@ -362,19 +362,7 @@ static int msm_audio_mem_map_buf(struct dma_buf *dma_buf, dma_addr_t *paddr, return rc; } -void msm_audio_fd_list_debug(void) -{ - struct msm_audio_fd_data *msm_audio_fd_data = NULL; - - list_for_each_entry(msm_audio_fd_data, - &msm_audio_mem_fd_list.fd_list, list) { - pr_debug("%s fd %d handle %pK phy. addr %pK\n", __func__, - msm_audio_fd_data->fd, msm_audio_fd_data->handle, - (void *)msm_audio_fd_data->paddr); - } -} - -void msm_audio_update_fd_list(struct msm_audio_fd_data *msm_audio_fd_data) +static void msm_audio_update_fd_list(struct msm_audio_fd_data *msm_audio_fd_data) { struct msm_audio_fd_data *msm_audio_fd_data1 = NULL; @@ -392,7 +380,7 @@ void msm_audio_update_fd_list(struct msm_audio_fd_data *msm_audio_fd_data) mutex_unlock(&(msm_audio_mem_fd_list.list_mutex)); } -void msm_audio_delete_fd_entry(void *handle) +static void msm_audio_delete_fd_entry(void *handle) { struct msm_audio_fd_data *msm_audio_fd_data = NULL; struct list_head *ptr, *next; @@ -441,7 +429,7 @@ int msm_audio_get_phy_addr(int fd, dma_addr_t *paddr, size_t *pa_len) } EXPORT_SYMBOL_GPL(msm_audio_get_phy_addr); -int msm_audio_set_hyp_assign(int fd, bool assign) +static int msm_audio_set_hyp_assign(int fd, bool assign) { struct msm_audio_fd_data *msm_audio_fd_data = NULL; int status = -EINVAL; @@ -461,7 +449,7 @@ int msm_audio_set_hyp_assign(int fd, bool assign) return status; } -void msm_audio_get_handle(int fd, void **handle) +static void msm_audio_get_handle(int fd, void **handle) { struct msm_audio_fd_data *msm_audio_fd_data = NULL; @@ -805,8 +793,6 @@ static int q6apm_audio_mem_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct of_phandle_args iommuspec; bool smmu_enabled = true; - const char *msm_audio_mem_dt = "qcom,smmu-enabled"; - const char *msm_audio_mem_smmu_sid_mask = "qcom,smmu-sid-mask"; struct msm_audio_mem_private *msm_audio_mem_data = NULL; if (dev->of_node == NULL) { diff --git a/audioreach-driver/q6apm_audio_pkt.c b/audioreach-driver/q6apm_audio_pkt.c index a2c893e..cb20c07 100644 --- a/audioreach-driver/q6apm_audio_pkt.c +++ b/audioreach-driver/q6apm_audio_pkt.c @@ -26,14 +26,16 @@ #include #include #include -#include "audioreach.h" -#include "q6apm.h" #include "q6prm_audioreach.h" +#define APM_MODULE_INSTANCE_ID 0x00000001 +#define APM_CMD_CLOSE_ALL 0x01001013 +#define APM_CMD_GET_SPF_STATE 0x01001021 +#define APM_CMD_RSP_GET_SPF_STATE 0x02001007 +#define APM_CMD_CLOSE_ALL 0x01001013 #define APM_CMD_SHARED_MEM_MAP_REGIONS 0x0100100C #define APM_MEMORY_MAP_BIT_MASK_IS_OFFSET_MODE 0x00000004UL -static bool audio_pkt_probed; /* Define Logging Macros */ static int audio_pkt_debug_mask; enum { @@ -104,6 +106,15 @@ struct audio_gpr_pkt { struct audio_pkt_apm_mem_map audpkt_mem_map; }; +struct apm_cmd_header { + uint32_t payload_address_lsw; + uint32_t payload_address_msw; + uint32_t mem_map_handle; + uint32_t payload_size; +} __packed; + +#define APM_CMD_HDR_SIZE sizeof(struct apm_cmd_header) + typedef void (*audio_pkt_clnt_cb_fn)(void *buf, int len, void *priv); struct audio_pkt_clnt_ch { @@ -180,12 +191,12 @@ static int fifo_pop(struct port_backup *backup) return 0; } -int q6apm_send_audio_cmd_sync(struct device *dev, gpr_device_t *gdev, - struct gpr_ibasic_rsp_result_t *result, struct mutex *cmd_lock, - gpr_port_t *port, wait_queue_head_t *cmd_wait, - struct gpr_pkt *pkt, uint32_t rsp_opcode) +static int q6apm_send_audio_cmd_sync(struct device *dev, gpr_device_t *gdev, + struct gpr_ibasic_rsp_result_t *result, + struct mutex *cmd_lock, gpr_port_t *port, + wait_queue_head_t *cmd_wait, + struct gpr_pkt *pkt, uint32_t rsp_opcode) { - struct gpr_hdr *hdr = &pkt->hdr; int rc, wait_time = 2; @@ -227,17 +238,15 @@ int q6apm_send_audio_cmd_sync(struct device *dev, gpr_device_t *gdev, mutex_unlock(cmd_lock); return rc; } -EXPORT_SYMBOL_GPL(q6apm_send_audio_cmd_sync); - -int q6apm_audio_send_cmd(struct q6apm_audio_pkt *apm, struct gpr_pkt *pkt, uint32_t rsp_opcode) +static int q6apm_audio_send_cmd(struct q6apm_audio_pkt *apm, struct gpr_pkt *pkt, + uint32_t rsp_opcode) { gpr_device_t *gdev = apm->adev; return q6apm_send_audio_cmd_sync(&gdev->dev, gdev, &apm->result, &apm->lock, NULL, &apm->readq, pkt, rsp_opcode); } -EXPORT_SYMBOL_GPL(q6apm_audio_send_cmd); static void *__q6apm_audio_alloc_pkt(int payload_size, uint32_t opcode, uint32_t token, uint32_t src_port, uint32_t dest_port, bool has_cmd_hdr) @@ -276,12 +285,11 @@ static void *__q6apm_audio_alloc_pkt(int payload_size, uint32_t opcode, uint32_t return pkt; } -void *q6apm_audio_alloc_apm_cmd_pkt(int pkt_size, uint32_t opcode, uint32_t token) +static void *q6apm_audio_alloc_apm_cmd_pkt(int pkt_size, uint32_t opcode, uint32_t token) { return __q6apm_audio_alloc_pkt(pkt_size, opcode, token, GPR_APM_MODULE_IID, APM_MODULE_INSTANCE_ID, true); } -EXPORT_SYMBOL_GPL(q6apm_audio_alloc_apm_cmd_pkt); static int q6apm_audio_get_apm_state(struct q6apm_audio_pkt *apm) { @@ -307,7 +315,7 @@ bool q6apm_audio_is_adsp_ready(void) } EXPORT_SYMBOL_GPL(q6apm_audio_is_adsp_ready); -void q6apm_audio_close_all(void) +static void q6apm_audio_close_all(void) { struct gpr_pkt *pkt; @@ -319,15 +327,12 @@ void q6apm_audio_close_all(void) kfree(pkt); } -EXPORT_SYMBOL_GPL(q6apm_audio_close_all); -int audio_pkt_open(struct inode *inode, struct file *file) +static int audio_pkt_open(struct inode *inode, struct file *file) { struct q6apm_audio_pkt *audpkt_dev = cdev_to_audpkt_dev(inode->i_cdev); struct device *dev = audpkt_dev->dev; - AUDIO_PKT_ERR("for %s\n", audpkt_dev->ch_name); - get_device(dev); file->private_data = audpkt_dev; @@ -343,7 +348,7 @@ int audio_pkt_open(struct inode *inode, struct file *file) * userspace client do a close() system call. All input arguments are * validated by the virtual file system before calling this function. */ -int audio_pkt_release(struct inode *inode, struct file *file) +static int audio_pkt_release(struct inode *inode, struct file *file) { struct q6apm_audio_pkt *audpkt_dev = cdev_to_audpkt_dev(inode->i_cdev); struct device *dev = audpkt_dev->dev; @@ -379,8 +384,8 @@ int audio_pkt_release(struct inode *inode, struct file *file) * userspace client do a read() system call. All input arguments are * validated by the virtual file system before calling this function. */ -ssize_t audio_pkt_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) +static ssize_t audio_pkt_read(struct file *file, char __user *buf, + size_t count, loff_t *ppos) { struct q6apm_audio_pkt *audpkt_dev = file->private_data; unsigned long flags; @@ -427,7 +432,7 @@ ssize_t audio_pkt_read(struct file *file, char __user *buf, * audpkt_update_physical_addr - Update physical address * audpkt_hdr: Pointer to the file structure. */ -int audpkt_chk_and_update_physical_addr(struct audio_gpr_pkt *gpr_pkt) +static int audpkt_chk_and_update_physical_addr(struct audio_gpr_pkt *gpr_pkt) { size_t pa_len = 0; dma_addr_t paddr = 0; @@ -465,7 +470,7 @@ int audpkt_chk_and_update_physical_addr(struct audio_gpr_pkt *gpr_pkt) * userspace client do a write() system call. All input arguments are * validated by the virtual file system before calling this function. */ -ssize_t audio_pkt_write(struct file *file, const char __user *buf, +static ssize_t audio_pkt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { struct q6apm_audio_pkt *audpkt_dev = file->private_data; @@ -646,9 +651,9 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o { gpr_device_t *gdev = priv; struct q6apm_audio_pkt *apm = dev_get_drvdata(&gdev->dev); - struct device *dev = &gdev->dev; struct gpr_ibasic_rsp_result_t *result; struct gpr_hdr *hdr = &data->hdr; + struct device *dev = &gdev->dev; uint8_t *pkt = NULL; uint16_t hdr_size, pkt_size; unsigned long flags; @@ -663,7 +668,7 @@ static int q6apm_audio_pkt_callback(struct gpr_resp_pkt *data, void *priv, int o ret = fifo_pop(&backup); if (ret < 0) - AUDIO_PKT_ERR("Failed to pop backup ports from FIFO\n"); + dev_dbg(dev, "Failed to pop backup ports from FIFO\n"); hdr->dest_port = backup.src_port; hdr->src_port = backup.dest_port; diff --git a/audioreach-driver/q6prm_audioreach.c b/audioreach-driver/q6prm_audioreach.c index 23567a2..4ff32f3 100644 --- a/audioreach-driver/q6prm_audioreach.c +++ b/audioreach-driver/q6prm_audioreach.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0 +// SPDX-License-Identifier: GPL-2.0-only // Copyright (c) 2021, Linaro Limited // Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. @@ -51,12 +51,12 @@ struct prm_cmd_release_rsc { struct audio_hw_clk_rel_cfg clock_id; } __packed; -int q6prm_audio_send_cmd_sync(struct device *dev, gpr_device_t *gdev, - struct gpr_ibasic_rsp_result_t *result, struct mutex *cmd_lock, - gpr_port_t *port, wait_queue_head_t *cmd_wait, - struct gpr_pkt *pkt, uint32_t rsp_opcode) +static int q6prm_audio_send_cmd_sync(struct device *dev, gpr_device_t *gdev, + struct gpr_ibasic_rsp_result_t *result, + struct mutex *cmd_lock, gpr_port_t *port, + wait_queue_head_t *cmd_wait, + struct gpr_pkt *pkt, uint32_t rsp_opcode) { - struct gpr_hdr *hdr = &pkt->hdr; int rc; @@ -95,7 +95,6 @@ int q6prm_audio_send_cmd_sync(struct device *dev, gpr_device_t *gdev, mutex_unlock(cmd_lock); return rc; } -EXPORT_SYMBOL_GPL(q6prm_audio_send_cmd_sync); static int q6prm_audioreach_send_cmd_sync(struct q6prm *prm, struct gpr_pkt *pkt, uint32_t rsp_opcode) { @@ -140,12 +139,11 @@ static void *__q6prm_audioreach_alloc_pkt(int payload_size, uint32_t opcode, uin return pkt; } -void *q6prm_audioreach_alloc_cmd_pkt(int payload_size, uint32_t opcode, uint32_t token, - uint32_t src_port, uint32_t dest_port) +static void *q6prm_audioreach_alloc_cmd_pkt(int payload_size, uint32_t opcode, uint32_t token, + uint32_t src_port, uint32_t dest_port) { return __q6prm_audioreach_alloc_pkt(payload_size, opcode, token, src_port, dest_port, true); } -EXPORT_SYMBOL_GPL(q6prm_audioreach_alloc_cmd_pkt); static int q6prm_audioreach_set_hw_core_req(struct device *dev, uint32_t hw_block_id, bool enable) { @@ -193,13 +191,11 @@ int q6prm_audioreach_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id return q6prm_audioreach_set_hw_core_req(dev, hw_block_id, true); } -EXPORT_SYMBOL_GPL(q6prm_audioreach_vote_lpass_core_hw); int q6prm_audioreach_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id, uint32_t client_handle) { return q6prm_audioreach_set_hw_core_req(dev, hw_block_id, false); } -EXPORT_SYMBOL_GPL(q6prm_audioreach_unvote_lpass_core_hw); static int q6prm_audioreach_request_lpass_clock(struct device *dev, int clk_id, int clk_attr, int clk_root, unsigned int freq) @@ -280,7 +276,6 @@ int q6prm_audioreach_set_lpass_clock(struct device *dev, int clk_id, int clk_att return q6prm_audioreach_release_lpass_clock(dev, clk_id, clk_attr, clk_root, freq); } -EXPORT_SYMBOL_GPL(q6prm_audioreach_set_lpass_clock); static int prm_audioreach_callback(struct gpr_resp_pkt *data, void *priv, int op) { diff --git a/audioreach-driver/q6prm_audioreach.h b/audioreach-driver/q6prm_audioreach.h index 08b618e..4b40798 100644 --- a/audioreach-driver/q6prm_audioreach.h +++ b/audioreach-driver/q6prm_audioreach.h @@ -5,7 +5,6 @@ #define __Q6PRM_AUDIOREACH_H__ #include -#include "q6prm.h" int q6prm_audioreach_set_lpass_clock(struct device *dev, int clk_id, int clk_attr, int clk_root, unsigned int freq);