summaryrefslogtreecommitdiff
path: root/sound/soc/codecs/wm_adsp.h
diff options
context:
space:
mode:
authorSimon Trimmer <simont@opensource.cirrus.com>2021-09-13 19:00:57 +0300
committerMark Brown <broonie@kernel.org>2021-09-27 15:00:42 +0300
commitf6bc909e7673c30abcbdb329e7d0aa2e83c103d7 (patch)
tree88b93cf757f56bef051555ef8fbb30c83e8af9dc /sound/soc/codecs/wm_adsp.h
parent2dd044641ec3672433b9fe3ec47b236621757aa8 (diff)
downloadlinux-f6bc909e7673c30abcbdb329e7d0aa2e83c103d7.tar.xz
firmware: cs_dsp: add driver to support firmware loading on Cirrus Logic DSPs
wm_adsp originally provided firmware loading on some audio DSP and was implemented as an ASoC codec driver. However, the firmware loading now covers a wider range of DSP cores and peripherals containing them, beyond just audio. So it needs to be available to non-audio drivers. All the core firmware loading support has been moved into a new driver cs_dsp, leaving only the ASoC-specific parts in wm_adsp. Signed-off-by: Simon Trimmer <simont@opensource.cirrus.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Link: https://lore.kernel.org/r/20210913160057.103842-17-simont@opensource.cirrus.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound/soc/codecs/wm_adsp.h')
-rw-r--r--sound/soc/codecs/wm_adsp.h132
1 files changed, 3 insertions, 129 deletions
diff --git a/sound/soc/codecs/wm_adsp.h b/sound/soc/codecs/wm_adsp.h
index 25aaef74654c..0e2f113bd342 100644
--- a/sound/soc/codecs/wm_adsp.h
+++ b/sound/soc/codecs/wm_adsp.h
@@ -10,113 +10,19 @@
#ifndef __WM_ADSP_H
#define __WM_ADSP_H
+#include <linux/firmware/cirrus/cs_dsp.h>
+#include <linux/firmware/cirrus/wmfw.h>
+
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/compress_driver.h>
-#include "wmfw.h"
-
/* Return values for wm_adsp_compr_handle_irq */
#define WM_ADSP_COMPR_OK 0
#define WM_ADSP_COMPR_VOICE_TRIGGER 1
-#define CS_ADSP2_REGION_0 BIT(0)
-#define CS_ADSP2_REGION_1 BIT(1)
-#define CS_ADSP2_REGION_2 BIT(2)
-#define CS_ADSP2_REGION_3 BIT(3)
-#define CS_ADSP2_REGION_4 BIT(4)
-#define CS_ADSP2_REGION_5 BIT(5)
-#define CS_ADSP2_REGION_6 BIT(6)
-#define CS_ADSP2_REGION_7 BIT(7)
-#define CS_ADSP2_REGION_8 BIT(8)
-#define CS_ADSP2_REGION_9 BIT(9)
-#define CS_ADSP2_REGION_1_9 (CS_ADSP2_REGION_1 | \
- CS_ADSP2_REGION_2 | CS_ADSP2_REGION_3 | \
- CS_ADSP2_REGION_4 | CS_ADSP2_REGION_5 | \
- CS_ADSP2_REGION_6 | CS_ADSP2_REGION_7 | \
- CS_ADSP2_REGION_8 | CS_ADSP2_REGION_9)
-#define CS_ADSP2_REGION_ALL (CS_ADSP2_REGION_0 | CS_ADSP2_REGION_1_9)
-
-struct cs_dsp_region {
- int type;
- unsigned int base;
-};
-
-struct cs_dsp_alg_region {
- struct list_head list;
- unsigned int alg;
- int type;
- unsigned int base;
-};
-
struct wm_adsp_compr;
struct wm_adsp_compr_buf;
-struct cs_dsp_ops;
-struct cs_dsp_client_ops;
-
-struct cs_dsp_coeff_ctl {
- const char *fw_name;
- /* Subname is needed to match with firmware */
- const char *subname;
- unsigned int subname_len;
- struct cs_dsp_alg_region alg_region;
- struct cs_dsp *dsp;
- unsigned int enabled:1;
- struct list_head list;
- void *cache;
- unsigned int offset;
- size_t len;
- unsigned int set:1;
- unsigned int flags;
- unsigned int type;
-
- void *priv;
-};
-
-struct cs_dsp {
- const char *name;
- int rev;
- int num;
- int type;
- struct device *dev;
- struct regmap *regmap;
-
- const struct cs_dsp_ops *ops;
- const struct cs_dsp_client_ops *client_ops;
-
- unsigned int base;
- unsigned int base_sysinfo;
- unsigned int sysclk_reg;
- unsigned int sysclk_mask;
- unsigned int sysclk_shift;
-
- struct list_head alg_regions;
-
- const char *fw_name;
- unsigned int fw_id;
- unsigned int fw_id_version;
- unsigned int fw_vendor_id;
-
- const struct cs_dsp_region *mem;
- int num_mems;
-
- int fw_ver;
-
- bool booted;
- bool running;
-
- struct list_head ctl_list;
-
- struct mutex pwr_lock;
-
- unsigned int lock_regions;
-
-#ifdef CONFIG_DEBUG_FS
- struct dentry *debugfs_root;
- char *wmfw_file_name;
- char *bin_file_name;
-#endif
-};
struct wm_adsp {
struct cs_dsp cs_dsp;
@@ -137,30 +43,6 @@ struct wm_adsp {
struct list_head buffer_list;
};
-struct cs_dsp_ops {
- bool (*validate_version)(struct cs_dsp *dsp, unsigned int version);
- unsigned int (*parse_sizes)(struct cs_dsp *dsp,
- const char * const file,
- unsigned int pos,
- const struct firmware *firmware);
- int (*setup_algs)(struct cs_dsp *dsp);
- unsigned int (*region_to_reg)(struct cs_dsp_region const *mem,
- unsigned int offset);
-
- void (*show_fw_status)(struct cs_dsp *dsp);
- void (*stop_watchdog)(struct cs_dsp *dsp);
-
- int (*enable_memory)(struct cs_dsp *dsp);
- void (*disable_memory)(struct cs_dsp *dsp);
- int (*lock_memory)(struct cs_dsp *dsp, unsigned int lock_regions);
-
- int (*enable_core)(struct cs_dsp *dsp);
- void (*disable_core)(struct cs_dsp *dsp);
-
- int (*start_core)(struct cs_dsp *dsp);
- void (*stop_core)(struct cs_dsp *dsp);
-};
-
#define WM_ADSP1(wname, num) \
SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \
wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD)
@@ -239,12 +121,4 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type,
unsigned int alg, void *buf, size_t len);
-struct cs_dsp_client_ops {
- int (*control_add)(struct cs_dsp_coeff_ctl *ctl);
- void (*control_remove)(struct cs_dsp_coeff_ctl *ctl);
- int (*post_run)(struct cs_dsp *dsp);
- void (*post_stop)(struct cs_dsp *dsp);
- void (*watchdog_expired)(struct cs_dsp *dsp);
-};
-
#endif