#include <linux/slab.h>
#include <linux/wait.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/delay.h>
#include <linux/of_platform.h>
#include <linux/jiffies.h>
#include <linux/soc/qcom/apr.h>
#include <dt-bindings/soc/qcom,gpr.h>
#include <dt-bindings/sound/qcom,q6dsp-lpass-ports.h>
#include "q6apm.h"
#include "q6prm.h"
#include "audioreach.h"
struct q6prm { … };
#define PRM_CMD_REQUEST_HW_RSC …
#define PRM_CMD_RSP_REQUEST_HW_RSC …
#define PRM_CMD_RELEASE_HW_RSC …
#define PRM_CMD_RSP_RELEASE_HW_RSC …
#define PARAM_ID_RSC_HW_CORE …
#define PARAM_ID_RSC_LPASS_CORE …
#define PARAM_ID_RSC_AUDIO_HW_CLK …
struct prm_cmd_request_hw_core { … } __packed;
struct prm_cmd_request_rsc { … } __packed;
struct prm_cmd_release_rsc { … } __packed;
static int q6prm_send_cmd_sync(struct q6prm *prm, struct gpr_pkt *pkt, uint32_t rsp_opcode)
{ … }
static int q6prm_set_hw_core_req(struct device *dev, uint32_t hw_block_id, bool enable)
{ … }
int q6prm_vote_lpass_core_hw(struct device *dev, uint32_t hw_block_id,
const char *client_name, uint32_t *client_handle)
{ … }
EXPORT_SYMBOL_GPL(…);
int q6prm_unvote_lpass_core_hw(struct device *dev, uint32_t hw_block_id, uint32_t client_handle)
{ … }
EXPORT_SYMBOL_GPL(…);
static int q6prm_request_lpass_clock(struct device *dev, int clk_id, int clk_attr, int clk_root,
unsigned int freq)
{ … }
static int q6prm_release_lpass_clock(struct device *dev, int clk_id, int clk_attr, int clk_root,
unsigned int freq)
{ … }
int q6prm_set_lpass_clock(struct device *dev, int clk_id, int clk_attr, int clk_root,
unsigned int freq)
{ … }
EXPORT_SYMBOL_GPL(…);
static int prm_callback(struct gpr_resp_pkt *data, void *priv, int op)
{ … }
static int prm_probe(gpr_device_t *gdev)
{ … }
#ifdef CONFIG_OF
static const struct of_device_id prm_device_id[] = …;
MODULE_DEVICE_TABLE(of, prm_device_id);
#endif
static gpr_driver_t prm_driver = …;
module_gpr_driver(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;