| .. | .. |
|---|
| 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 |
|---|