.. | .. |
---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
---|
1 | 2 | /* |
---|
2 | 3 | * wm_adsp.h -- Wolfson ADSP support |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright 2012 Wolfson Microelectronics plc |
---|
5 | 6 | * |
---|
6 | 7 | * 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 | 8 | */ |
---|
12 | 9 | |
---|
13 | 10 | #ifndef __WM_ADSP_H |
---|
.. | .. |
---|
54 | 51 | |
---|
55 | 52 | struct wm_adsp_compr; |
---|
56 | 53 | struct wm_adsp_compr_buf; |
---|
| 54 | +struct wm_adsp_ops; |
---|
57 | 55 | |
---|
58 | 56 | struct wm_adsp { |
---|
59 | 57 | const char *part; |
---|
.. | .. |
---|
66 | 64 | struct regmap *regmap; |
---|
67 | 65 | struct snd_soc_component *component; |
---|
68 | 66 | |
---|
| 67 | + struct wm_adsp_ops *ops; |
---|
| 68 | + |
---|
69 | 69 | unsigned int base; |
---|
| 70 | + unsigned int base_sysinfo; |
---|
70 | 71 | unsigned int sysclk_reg; |
---|
71 | 72 | unsigned int sysclk_mask; |
---|
72 | 73 | unsigned int sysclk_shift; |
---|
.. | .. |
---|
75 | 76 | |
---|
76 | 77 | unsigned int fw_id; |
---|
77 | 78 | unsigned int fw_id_version; |
---|
| 79 | + unsigned int fw_vendor_id; |
---|
78 | 80 | |
---|
79 | 81 | const struct wm_adsp_region *mem; |
---|
80 | 82 | int num_mems; |
---|
.. | .. |
---|
85 | 87 | bool preloaded; |
---|
86 | 88 | bool booted; |
---|
87 | 89 | bool running; |
---|
| 90 | + bool fatal_error; |
---|
88 | 91 | |
---|
89 | 92 | struct list_head ctl_list; |
---|
90 | 93 | |
---|
91 | 94 | struct work_struct boot_work; |
---|
92 | 95 | |
---|
93 | | - struct wm_adsp_compr *compr; |
---|
94 | | - struct wm_adsp_compr_buf *buffer; |
---|
| 96 | + struct list_head compr_list; |
---|
| 97 | + struct list_head buffer_list; |
---|
95 | 98 | |
---|
96 | 99 | struct mutex pwr_lock; |
---|
97 | 100 | |
---|
.. | .. |
---|
103 | 106 | char *bin_file_name; |
---|
104 | 107 | #endif |
---|
105 | 108 | |
---|
| 109 | +}; |
---|
| 110 | + |
---|
| 111 | +struct wm_adsp_ops { |
---|
| 112 | + unsigned int sys_config_size; |
---|
| 113 | + |
---|
| 114 | + bool (*validate_version)(struct wm_adsp *dsp, unsigned int version); |
---|
| 115 | + unsigned int (*parse_sizes)(struct wm_adsp *dsp, |
---|
| 116 | + const char * const file, |
---|
| 117 | + unsigned int pos, |
---|
| 118 | + const struct firmware *firmware); |
---|
| 119 | + int (*setup_algs)(struct wm_adsp *dsp); |
---|
| 120 | + unsigned int (*region_to_reg)(struct wm_adsp_region const *mem, |
---|
| 121 | + unsigned int offset); |
---|
| 122 | + |
---|
| 123 | + void (*show_fw_status)(struct wm_adsp *dsp); |
---|
| 124 | + void (*stop_watchdog)(struct wm_adsp *dsp); |
---|
| 125 | + |
---|
| 126 | + int (*enable_memory)(struct wm_adsp *dsp); |
---|
| 127 | + void (*disable_memory)(struct wm_adsp *dsp); |
---|
| 128 | + int (*lock_memory)(struct wm_adsp *dsp, unsigned int lock_regions); |
---|
| 129 | + |
---|
| 130 | + int (*enable_core)(struct wm_adsp *dsp); |
---|
| 131 | + void (*disable_core)(struct wm_adsp *dsp); |
---|
| 132 | + |
---|
| 133 | + int (*start_core)(struct wm_adsp *dsp); |
---|
| 134 | + void (*stop_core)(struct wm_adsp *dsp); |
---|
106 | 135 | }; |
---|
107 | 136 | |
---|
108 | 137 | #define WM_ADSP1(wname, num) \ |
---|
.. | .. |
---|
120 | 149 | .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ |
---|
121 | 150 | .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ |
---|
122 | 151 | { .id = snd_soc_dapm_out_drv, .name = wname, \ |
---|
123 | | - .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp2_event, \ |
---|
| 152 | + .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp_event, \ |
---|
124 | 153 | .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } |
---|
125 | 154 | |
---|
126 | 155 | #define WM_ADSP_FW_CONTROL(dspname, num) \ |
---|
.. | .. |
---|
134 | 163 | void wm_adsp2_remove(struct wm_adsp *dsp); |
---|
135 | 164 | int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component); |
---|
136 | 165 | int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component); |
---|
| 166 | +int wm_halo_init(struct wm_adsp *dsp); |
---|
| 167 | + |
---|
137 | 168 | int wm_adsp1_event(struct snd_soc_dapm_widget *w, |
---|
138 | 169 | struct snd_kcontrol *kcontrol, int event); |
---|
139 | | -int wm_adsp2_early_event(struct snd_soc_dapm_widget *w, |
---|
140 | | - struct snd_kcontrol *kcontrol, int event, |
---|
141 | | - unsigned int freq); |
---|
142 | 170 | |
---|
143 | | -int wm_adsp2_lock(struct wm_adsp *adsp, unsigned int regions); |
---|
144 | | -irqreturn_t wm_adsp2_bus_error(struct wm_adsp *adsp); |
---|
| 171 | +int wm_adsp_early_event(struct snd_soc_dapm_widget *w, |
---|
| 172 | + struct snd_kcontrol *kcontrol, int event); |
---|
145 | 173 | |
---|
146 | | -int wm_adsp2_event(struct snd_soc_dapm_widget *w, |
---|
147 | | - struct snd_kcontrol *kcontrol, int event); |
---|
| 174 | +irqreturn_t wm_adsp2_bus_error(int irq, void *data); |
---|
| 175 | +irqreturn_t wm_halo_bus_error(int irq, void *data); |
---|
| 176 | +irqreturn_t wm_halo_wdt_expire(int irq, void *data); |
---|
| 177 | + |
---|
| 178 | +int wm_adsp_event(struct snd_soc_dapm_widget *w, |
---|
| 179 | + struct snd_kcontrol *kcontrol, int event); |
---|
| 180 | + |
---|
| 181 | +int wm_adsp2_set_dspclk(struct snd_soc_dapm_widget *w, unsigned int freq); |
---|
148 | 182 | |
---|
149 | 183 | int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, |
---|
150 | 184 | struct snd_ctl_elem_value *ucontrol); |
---|
.. | .. |
---|
156 | 190 | struct snd_ctl_elem_value *ucontrol); |
---|
157 | 191 | |
---|
158 | 192 | int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream); |
---|
159 | | -int wm_adsp_compr_free(struct snd_compr_stream *stream); |
---|
160 | | -int wm_adsp_compr_set_params(struct snd_compr_stream *stream, |
---|
| 193 | +int wm_adsp_compr_free(struct snd_soc_component *component, |
---|
| 194 | + struct snd_compr_stream *stream); |
---|
| 195 | +int wm_adsp_compr_set_params(struct snd_soc_component *component, |
---|
| 196 | + struct snd_compr_stream *stream, |
---|
161 | 197 | struct snd_compr_params *params); |
---|
162 | | -int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, |
---|
| 198 | +int wm_adsp_compr_get_caps(struct snd_soc_component *component, |
---|
| 199 | + struct snd_compr_stream *stream, |
---|
163 | 200 | struct snd_compr_caps *caps); |
---|
164 | | -int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd); |
---|
| 201 | +int wm_adsp_compr_trigger(struct snd_soc_component *component, |
---|
| 202 | + struct snd_compr_stream *stream, int cmd); |
---|
165 | 203 | int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); |
---|
166 | | -int wm_adsp_compr_pointer(struct snd_compr_stream *stream, |
---|
| 204 | +int wm_adsp_compr_pointer(struct snd_soc_component *component, |
---|
| 205 | + struct snd_compr_stream *stream, |
---|
167 | 206 | struct snd_compr_tstamp *tstamp); |
---|
168 | | -int wm_adsp_compr_copy(struct snd_compr_stream *stream, |
---|
| 207 | +int wm_adsp_compr_copy(struct snd_soc_component *component, |
---|
| 208 | + struct snd_compr_stream *stream, |
---|
169 | 209 | char __user *buf, size_t count); |
---|
| 210 | +int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type, |
---|
| 211 | + unsigned int alg, void *buf, size_t len); |
---|
| 212 | +int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type, |
---|
| 213 | + unsigned int alg, void *buf, size_t len); |
---|
170 | 214 | |
---|
171 | 215 | #endif |
---|