1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 22159ad93SMark Brown /* 32159ad93SMark Brown * wm_adsp.h -- Wolfson ADSP support 42159ad93SMark Brown * 52159ad93SMark Brown * Copyright 2012 Wolfson Microelectronics plc 62159ad93SMark Brown * 72159ad93SMark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 82159ad93SMark Brown */ 92159ad93SMark Brown 102159ad93SMark Brown #ifndef __WM_ADSP_H 112159ad93SMark Brown #define __WM_ADSP_H 122159ad93SMark Brown 13f6bc909eSSimon Trimmer #include <linux/firmware/cirrus/cs_dsp.h> 14f6bc909eSSimon Trimmer #include <linux/firmware/cirrus/wmfw.h> 15f6bc909eSSimon Trimmer 162159ad93SMark Brown #include <sound/soc.h> 172159ad93SMark Brown #include <sound/soc-dapm.h> 18406abc95SCharles Keepax #include <sound/compress_driver.h> 192159ad93SMark Brown 2020b7f7c5SCharles Keepax /* Return values for wm_adsp_compr_handle_irq */ 2120b7f7c5SCharles Keepax #define WM_ADSP_COMPR_OK 0 2220b7f7c5SCharles Keepax #define WM_ADSP_COMPR_VOICE_TRIGGER 1 2320b7f7c5SCharles Keepax 24406abc95SCharles Keepax struct wm_adsp_compr; 252cd19bdbSCharles Keepax struct wm_adsp_compr_buf; 26f9f55e31SRichard Fitzgerald 27e1468202SSimon Trimmer struct wm_adsp { 28e1468202SSimon Trimmer struct cs_dsp cs_dsp; 29e1468202SSimon Trimmer const char *part; 30e1468202SSimon Trimmer const char *fwf_name; 31b6b62d94SSimon Trimmer const char *system_name; 32e1468202SSimon Trimmer struct snd_soc_component *component; 33e1468202SSimon Trimmer 34e1468202SSimon Trimmer unsigned int sys_config_size; 35e1468202SSimon Trimmer 36e1468202SSimon Trimmer int fw; 3765a314b7SSimon Trimmer bool wmfw_optional; 38e1468202SSimon Trimmer 39e1468202SSimon Trimmer struct work_struct boot_work; 40fe071308SRichard Fitzgerald int (*pre_run)(struct wm_adsp *dsp); 41e1468202SSimon Trimmer 42e1468202SSimon Trimmer bool preloaded; 43e1468202SSimon Trimmer bool fatal_error; 44e1468202SSimon Trimmer 45e1468202SSimon Trimmer struct list_head compr_list; 46e1468202SSimon Trimmer struct list_head buffer_list; 47ba235634SCharles Keepax 48ba235634SCharles Keepax /* 49ba235634SCharles Keepax * Flag indicating the preloader widget only needs power toggled 50ba235634SCharles Keepax * on state change rather than held on for the duration of the 51ba235634SCharles Keepax * preload, useful for devices that can retain firmware memory 52ba235634SCharles Keepax * across power down. 53ba235634SCharles Keepax */ 54ba235634SCharles Keepax bool toggle_preload; 552159ad93SMark Brown }; 562159ad93SMark Brown 572159ad93SMark Brown #define WM_ADSP1(wname, num) \ 58f9eeae9fSLars-Peter Clausen SND_SOC_DAPM_PGA_E(wname, SND_SOC_NOPM, num, 0, NULL, 0, \ 59f9eeae9fSLars-Peter Clausen wm_adsp1_event, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD) 602159ad93SMark Brown 61af813a6fSCharles Keepax #define WM_ADSP2_PRELOAD_SWITCH(wname, num) \ 62af813a6fSCharles Keepax SOC_SINGLE_EXT(wname " Preload Switch", SND_SOC_NOPM, num, 1, 0, \ 63af813a6fSCharles Keepax wm_adsp2_preloader_get, wm_adsp2_preloader_put) 64af813a6fSCharles Keepax 65d82d767fSCharles Keepax #define WM_ADSP2(wname, num, event_fn) \ 66af813a6fSCharles Keepax SND_SOC_DAPM_SPK(wname " Preload", NULL), \ 675ca7e170SCharles Keepax { .id = snd_soc_dapm_supply, .name = wname " Preloader", \ 6881ac58b1SRichard Fitzgerald .reg = SND_SOC_NOPM, .shift = num, .event = event_fn, \ 6957a60cc3SCharles Keepax .event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD, \ 705ca7e170SCharles Keepax .subseq = 100, /* Ensure we run after SYSCLK supply widget */ }, \ 7112db5eddSCharles Keepax { .id = snd_soc_dapm_out_drv, .name = wname, \ 724e08d50dSCharles Keepax .reg = SND_SOC_NOPM, .shift = num, .event = wm_adsp_event, \ 7312db5eddSCharles Keepax .event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD } 742159ad93SMark Brown 750a047f07SRichard Fitzgerald #define WM_ADSP_FW_CONTROL(dspname, num) \ 760a047f07SRichard Fitzgerald SOC_ENUM_EXT(dspname " Firmware", wm_adsp_fw_enum[num], \ 770a047f07SRichard Fitzgerald wm_adsp_fw_get, wm_adsp_fw_put) 780a047f07SRichard Fitzgerald 790a047f07SRichard Fitzgerald extern const struct soc_enum wm_adsp_fw_enum[]; 801023dbd9SMark Brown 813809f001SCharles Keepax int wm_adsp1_init(struct wm_adsp *dsp); 8281ac58b1SRichard Fitzgerald int wm_adsp2_init(struct wm_adsp *dsp); 8366225e98SRichard Fitzgerald void wm_adsp2_remove(struct wm_adsp *dsp); 840fe1daa6SKuninori Morimoto int wm_adsp2_component_probe(struct wm_adsp *dsp, struct snd_soc_component *component); 850fe1daa6SKuninori Morimoto int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component); 86170b1e12SWen Shi int wm_halo_init(struct wm_adsp *dsp); 87170b1e12SWen Shi 882159ad93SMark Brown int wm_adsp1_event(struct snd_soc_dapm_widget *w, 892159ad93SMark Brown struct snd_kcontrol *kcontrol, int event); 90b9070df4SRichard Fitzgerald 914e08d50dSCharles Keepax int wm_adsp_early_event(struct snd_soc_dapm_widget *w, 92b9070df4SRichard Fitzgerald struct snd_kcontrol *kcontrol, int event); 9351a2c944SMayuresh Kulkarni 94*62ddad42SRichard Fitzgerald int wm_adsp_power_up(struct wm_adsp *dsp, bool load_firmware); 95d0a3a6adSSimon Trimmer void wm_adsp_power_down(struct wm_adsp *dsp); 9611520b87SSimon Trimmer 9701ec57a4SCharles Keepax irqreturn_t wm_adsp2_bus_error(int irq, void *data); 9801ec57a4SCharles Keepax irqreturn_t wm_halo_bus_error(int irq, void *data); 998bc144f9SStuart Henderson irqreturn_t wm_halo_wdt_expire(int irq, void *data); 10051a2c944SMayuresh Kulkarni 1014e08d50dSCharles Keepax int wm_adsp_event(struct snd_soc_dapm_widget *w, 1022159ad93SMark Brown struct snd_kcontrol *kcontrol, int event); 1032159ad93SMark Brown 104b9070df4SRichard Fitzgerald int wm_adsp2_set_dspclk(struct snd_soc_dapm_widget *w, unsigned int freq); 105b9070df4SRichard Fitzgerald 106af813a6fSCharles Keepax int wm_adsp2_preloader_get(struct snd_kcontrol *kcontrol, 107af813a6fSCharles Keepax struct snd_ctl_elem_value *ucontrol); 108af813a6fSCharles Keepax int wm_adsp2_preloader_put(struct snd_kcontrol *kcontrol, 109af813a6fSCharles Keepax struct snd_ctl_elem_value *ucontrol); 1100a047f07SRichard Fitzgerald int wm_adsp_fw_get(struct snd_kcontrol *kcontrol, 1110a047f07SRichard Fitzgerald struct snd_ctl_elem_value *ucontrol); 1120a047f07SRichard Fitzgerald int wm_adsp_fw_put(struct snd_kcontrol *kcontrol, 1130a047f07SRichard Fitzgerald struct snd_ctl_elem_value *ucontrol); 114af813a6fSCharles Keepax 11563079b6eSCharles Keepax int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream); 1163a5ccf25SKuninori Morimoto int wm_adsp_compr_free(struct snd_soc_component *component, 1173a5ccf25SKuninori Morimoto struct snd_compr_stream *stream); 1183a5ccf25SKuninori Morimoto int wm_adsp_compr_set_params(struct snd_soc_component *component, 1193a5ccf25SKuninori Morimoto struct snd_compr_stream *stream, 120406abc95SCharles Keepax struct snd_compr_params *params); 1213a5ccf25SKuninori Morimoto int wm_adsp_compr_get_caps(struct snd_soc_component *component, 1223a5ccf25SKuninori Morimoto struct snd_compr_stream *stream, 123406abc95SCharles Keepax struct snd_compr_caps *caps); 1243a5ccf25SKuninori Morimoto int wm_adsp_compr_trigger(struct snd_soc_component *component, 1253a5ccf25SKuninori Morimoto struct snd_compr_stream *stream, int cmd); 12663079b6eSCharles Keepax int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); 1273a5ccf25SKuninori Morimoto int wm_adsp_compr_pointer(struct snd_soc_component *component, 1283a5ccf25SKuninori Morimoto struct snd_compr_stream *stream, 129565ace46SCharles Keepax struct snd_compr_tstamp *tstamp); 1303a5ccf25SKuninori Morimoto int wm_adsp_compr_copy(struct snd_soc_component *component, 1313a5ccf25SKuninori Morimoto struct snd_compr_stream *stream, 13283a40ce9SCharles Keepax char __user *buf, size_t count); 133eb65ccdbSLi Xu int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type, 134eb65ccdbSLi Xu unsigned int alg, void *buf, size_t len); 135eb65ccdbSLi Xu int wm_adsp_read_ctl(struct wm_adsp *dsp, const char *name, int type, 136eb65ccdbSLi Xu unsigned int alg, void *buf, size_t len); 137406abc95SCharles Keepax 1382159ad93SMark Brown #endif 139