Commit | Line | Data |
---|---|---|
2159ad93 MB |
1 | /* |
2 | * wm_adsp.h -- Wolfson ADSP support | |
3 | * | |
4 | * Copyright 2012 Wolfson Microelectronics plc | |
5 | * | |
6 | * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU General Public License version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | */ | |
12 | ||
13 | #ifndef __WM_ADSP_H | |
14 | #define __WM_ADSP_H | |
15 | ||
16 | #include <sound/soc.h> | |
17 | #include <sound/soc-dapm.h> | |
406abc95 | 18 | #include <sound/compress_driver.h> |
2159ad93 MB |
19 | |
20 | #include "wmfw.h" | |
21 | ||
20b7f7c5 CK |
22 | /* Return values for wm_adsp_compr_handle_irq */ |
23 | #define WM_ADSP_COMPR_OK 0 | |
24 | #define WM_ADSP_COMPR_VOICE_TRIGGER 1 | |
25 | ||
2159ad93 MB |
26 | struct wm_adsp_region { |
27 | int type; | |
28 | unsigned int base; | |
29 | }; | |
30 | ||
471f4885 MB |
31 | struct wm_adsp_alg_region { |
32 | struct list_head list; | |
33 | unsigned int alg; | |
34 | int type; | |
35 | unsigned int base; | |
36 | }; | |
37 | ||
406abc95 | 38 | struct wm_adsp_compr; |
2cd19bdb | 39 | struct wm_adsp_compr_buf; |
406abc95 | 40 | |
2159ad93 MB |
41 | struct wm_adsp { |
42 | const char *part; | |
43 | int num; | |
44 | int type; | |
45 | struct device *dev; | |
46 | struct regmap *regmap; | |
685f51a5 | 47 | struct snd_soc_codec *codec; |
2159ad93 MB |
48 | |
49 | int base; | |
94e205bf CR |
50 | int sysclk_reg; |
51 | int sysclk_mask; | |
52 | int sysclk_shift; | |
2159ad93 | 53 | |
471f4885 MB |
54 | struct list_head alg_regions; |
55 | ||
7585a5b0 CK |
56 | unsigned int fw_id; |
57 | unsigned int fw_id_version; | |
f395a218 | 58 | |
2159ad93 MB |
59 | const struct wm_adsp_region *mem; |
60 | int num_mems; | |
973838a0 | 61 | |
1023dbd9 | 62 | int fw; |
2323736d | 63 | int fw_ver; |
28823eba CK |
64 | |
65 | bool booted; | |
621a5f7a | 66 | bool running; |
1023dbd9 | 67 | |
81ad93ec | 68 | struct list_head ctl_list; |
d8a64d6a CK |
69 | |
70 | struct work_struct boot_work; | |
f9f55e31 | 71 | |
406abc95 | 72 | struct wm_adsp_compr *compr; |
2cd19bdb | 73 | struct wm_adsp_compr_buf *buffer; |
406abc95 | 74 | |
078e7183 CK |
75 | struct mutex pwr_lock; |
76 | ||
f9f55e31 RF |
77 | #ifdef CONFIG_DEBUG_FS |
78 | struct dentry *debugfs_root; | |
f9f55e31 RF |
79 | char *wmfw_file_name; |
80 | char *bin_file_name; | |
81 | #endif | |
82 | ||
2159ad93 MB |
83 | }; |
84 | ||
85 | #define WM_ADSP1(wname, num) \ | |
f9eeae9f LPC |
86 | SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \ |
87 | wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD) | |
2159ad93 | 88 | |
d82d767f | 89 | #define WM_ADSP2(wname, num, event_fn) \ |
5ca7e170 | 90 | { .id = snd_soc_dapm_supply, .name = wname " Preloader", \ |
81ac58b1 | 91 | .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ |
57a60cc3 | 92 | .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ |
5ca7e170 | 93 | .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ |
12db5edd CK |
94 | { .id = snd_soc_dapm_out_drv, .name = wname, \ |
95 | .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_event, \ | |
96 | .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } | |
2159ad93 | 97 | |
336d0442 | 98 | extern const struct snd_kcontrol_new wm_adsp_fw_controls[]; |
1023dbd9 | 99 | |
3809f001 | 100 | int wm_adsp1_init(struct wm_adsp *dsp); |
81ac58b1 | 101 | int wm_adsp2_init(struct wm_adsp *dsp); |
66225e98 | 102 | void wm_adsp2_remove(struct wm_adsp *dsp); |
f5e2ce92 RF |
103 | int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec); |
104 | int wm_adsp2_codec_remove(struct wm_adsp *dsp, struct snd_soc_codec *codec); | |
2159ad93 MB |
105 | int wm_adsp1_event(struct snd_soc_dapm_widget *w, |
106 | struct snd_kcontrol *kcontrol, int event); | |
12db5edd | 107 | int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, |
d82d767f CK |
108 | struct snd_kcontrol *kcontrol, int event, |
109 | unsigned int freq); | |
2159ad93 MB |
110 | int wm_adsp2_event(struct snd_soc_dapm_widget *w, |
111 | struct snd_kcontrol *kcontrol, int event); | |
112 | ||
63079b6e CK |
113 | int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream); |
114 | int wm_adsp_compr_free(struct snd_compr_stream *stream); | |
115 | int wm_adsp_compr_set_params(struct snd_compr_stream *stream, | |
116 | struct snd_compr_params *params); | |
117 | int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, | |
118 | struct snd_compr_caps *caps); | |
119 | int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd); | |
120 | int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); | |
121 | int wm_adsp_compr_pointer(struct snd_compr_stream *stream, | |
122 | struct snd_compr_tstamp *tstamp); | |
123 | int wm_adsp_compr_copy(struct snd_compr_stream *stream, | |
124 | char __user *buf, size_t count); | |
406abc95 | 125 | |
2159ad93 | 126 | #endif |