2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2012-10-11 11:54:02 +09:00
/*
* wm_adsp . h - - Wolfson ADSP support
*
* Copyright 2012 Wolfson Microelectronics plc
*
* Author : Mark Brown < broonie @ opensource . wolfsonmicro . com >
*/
# ifndef __WM_ADSP_H
# define __WM_ADSP_H
# include <sound/soc.h>
# include <sound/soc-dapm.h>
2015-12-15 11:29:45 +00:00
# include <sound/compress_driver.h>
2012-10-11 11:54:02 +09:00
# include "wmfw.h"
2016-05-13 16:45:17 +01:00
/* Return values for wm_adsp_compr_handle_irq */
# define WM_ADSP_COMPR_OK 0
# define WM_ADSP_COMPR_VOICE_TRIGGER 1
2021-09-13 17:00:46 +01:00
# 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 {
2012-10-11 11:54:02 +09:00
int type ;
unsigned int base ;
} ;
2021-09-13 17:00:46 +01:00
struct cs_dsp_alg_region {
2013-01-08 16:09:31 +00:00
struct list_head list ;
unsigned int alg ;
int type ;
unsigned int base ;
} ;
2015-12-15 11:29:45 +00:00
struct wm_adsp_compr ;
2015-12-15 11:29:46 +00:00
struct wm_adsp_compr_buf ;
2021-09-13 17:00:46 +01:00
struct cs_dsp_ops ;
2021-09-13 17:00:56 +01:00
struct cs_dsp_client_ops ;
2015-12-15 11:29:45 +00:00
2021-09-13 17:00:51 +01:00
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 ;
2021-09-13 17:00:55 +01:00
struct cs_dsp * dsp ;
2021-09-13 17:00:51 +01:00
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 ;
} ;
2021-09-13 17:00:55 +01:00
struct cs_dsp {
2018-08-08 17:13:39 +01:00
const char * name ;
2017-04-05 11:07:59 +01:00
int rev ;
2012-10-11 11:54:02 +09:00
int num ;
int type ;
struct device * dev ;
struct regmap * regmap ;
2021-09-13 17:00:46 +01:00
const struct cs_dsp_ops * ops ;
2021-09-13 17:00:56 +01:00
const struct cs_dsp_client_ops * client_ops ;
2019-03-19 11:52:12 +00:00
2018-02-16 14:36:10 +00:00
unsigned int base ;
2019-03-19 11:52:13 +00:00
unsigned int base_sysinfo ;
2018-02-16 14:36:10 +00:00
unsigned int sysclk_reg ;
unsigned int sysclk_mask ;
unsigned int sysclk_shift ;
2012-10-11 11:54:02 +09:00
2013-01-08 16:09:31 +00:00
struct list_head alg_regions ;
2021-09-13 17:00:53 +01:00
const char * fw_name ;
2015-12-08 16:08:25 +00:00
unsigned int fw_id ;
unsigned int fw_id_version ;
2019-03-19 11:52:13 +00:00
unsigned int fw_vendor_id ;
2013-03-05 22:39:54 +08:00
2021-09-13 17:00:46 +01:00
const struct cs_dsp_region * mem ;
2012-10-11 11:54:02 +09:00
int num_mems ;
2012-11-28 17:20:32 +00:00
2015-04-13 13:28:02 +01:00
int fw_ver ;
2016-09-20 13:52:32 +01:00
bool booted ;
2015-09-26 15:04:07 -07:00
bool running ;
2013-01-11 22:58:28 +00:00
2013-07-29 13:51:59 +01:00
struct list_head ctl_list ;
2014-01-08 17:42:18 +00:00
2015-12-08 16:08:26 +00:00
struct mutex pwr_lock ;
2017-04-05 11:08:00 +01:00
unsigned int lock_regions ;
2015-06-11 11:32:32 +01:00
# ifdef CONFIG_DEBUG_FS
struct dentry * debugfs_root ;
char * wmfw_file_name ;
char * bin_file_name ;
# endif
2021-09-13 17:00:55 +01:00
} ;
2015-06-11 11:32:32 +01:00
2021-09-13 17:00:55 +01:00
struct wm_adsp {
struct cs_dsp cs_dsp ;
const char * part ;
const char * fwf_name ;
struct snd_soc_component * component ;
unsigned int sys_config_size ;
int fw ;
struct work_struct boot_work ;
bool preloaded ;
bool fatal_error ;
struct list_head compr_list ;
struct list_head buffer_list ;
2012-10-11 11:54:02 +09:00
} ;
2021-09-13 17:00:46 +01:00
struct cs_dsp_ops {
2021-09-13 17:00:55 +01:00
bool ( * validate_version ) ( struct cs_dsp * dsp , unsigned int version ) ;
unsigned int ( * parse_sizes ) ( struct cs_dsp * dsp ,
2019-03-19 11:52:12 +00:00
const char * const file ,
unsigned int pos ,
const struct firmware * firmware ) ;
2021-09-13 17:00:55 +01:00
int ( * setup_algs ) ( struct cs_dsp * dsp ) ;
2021-09-13 17:00:46 +01:00
unsigned int ( * region_to_reg ) ( struct cs_dsp_region const * mem ,
2019-03-19 11:52:13 +00:00
unsigned int offset ) ;
2019-03-19 11:52:12 +00:00
2021-09-13 17:00:55 +01:00
void ( * show_fw_status ) ( struct cs_dsp * dsp ) ;
void ( * stop_watchdog ) ( struct cs_dsp * dsp ) ;
2019-03-19 11:52:12 +00:00
2021-09-13 17:00:55 +01:00
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 ) ;
2019-03-19 11:52:12 +00:00
2021-09-13 17:00:55 +01:00
int ( * enable_core ) ( struct cs_dsp * dsp ) ;
void ( * disable_core ) ( struct cs_dsp * dsp ) ;
2019-03-19 11:52:12 +00:00
2021-09-13 17:00:55 +01:00
int ( * start_core ) ( struct cs_dsp * dsp ) ;
void ( * stop_core ) ( struct cs_dsp * dsp ) ;
2019-03-19 11:52:12 +00:00
} ;
2012-10-11 11:54:02 +09:00
# define WM_ADSP1(wname, num) \
2013-06-19 19:34:02 +02:00
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 )
2012-10-11 11:54:02 +09:00
2017-01-06 14:24:41 +00:00
# define WM_ADSP2_PRELOAD_SWITCH(wname, num) \
SOC_SINGLE_EXT ( wname " Preload Switch " , SND_SOC_NOPM , num , 1 , 0 , \
wm_adsp2_preloader_get , wm_adsp2_preloader_put )
2016-01-21 17:53:02 +00:00
# define WM_ADSP2(wname, num, event_fn) \
2017-01-06 14:24:41 +00:00
SND_SOC_DAPM_SPK ( wname " Preload " , NULL ) , \
2016-09-20 13:52:31 +01:00
{ . id = snd_soc_dapm_supply , . name = wname " Preloader " , \
2015-06-02 11:53:34 +01:00
. reg = SND_SOC_NOPM , . shift = num , . event = event_fn , \
2016-09-26 10:15:24 +01:00
. event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD , \
2016-09-20 13:52:31 +01:00
. subseq = 100 , /* Ensure we run after SYSCLK supply widget */ } , \
2014-01-08 17:42:19 +00:00
{ . id = snd_soc_dapm_out_drv , . name = wname , \
2019-03-19 11:52:12 +00:00
. reg = SND_SOC_NOPM , . shift = num , . event = wm_adsp_event , \
2014-01-08 17:42:19 +00:00
. event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD }
2012-10-11 11:54:02 +09:00
2018-08-08 17:13:38 +01:00
# define WM_ADSP_FW_CONTROL(dspname, num) \
SOC_ENUM_EXT ( dspname " Firmware " , wm_adsp_fw_enum [ num ] , \
wm_adsp_fw_get , wm_adsp_fw_put )
extern const struct soc_enum wm_adsp_fw_enum [ ] ;
2013-01-11 22:58:28 +00:00
2015-04-13 13:27:54 +01:00
int wm_adsp1_init ( struct wm_adsp * dsp ) ;
2015-06-02 11:53:34 +01:00
int wm_adsp2_init ( struct wm_adsp * dsp ) ;
2016-04-27 14:58:27 +01:00
void wm_adsp2_remove ( struct wm_adsp * dsp ) ;
2018-02-13 02:03:12 +00:00
int wm_adsp2_component_probe ( struct wm_adsp * dsp , struct snd_soc_component * component ) ;
int wm_adsp2_component_remove ( struct wm_adsp * dsp , struct snd_soc_component * component ) ;
2019-03-19 11:52:13 +00:00
int wm_halo_init ( struct wm_adsp * dsp ) ;
2012-10-11 11:54:02 +09:00
int wm_adsp1_event ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol , int event ) ;
2019-03-19 11:52:09 +00:00
2019-03-19 11:52:12 +00:00
int wm_adsp_early_event ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol , int event ) ;
2017-04-05 11:08:00 +01:00
2019-07-25 17:39:29 +01:00
irqreturn_t wm_adsp2_bus_error ( int irq , void * data ) ;
irqreturn_t wm_halo_bus_error ( int irq , void * data ) ;
2019-03-19 11:52:15 +00:00
irqreturn_t wm_halo_wdt_expire ( int irq , void * data ) ;
2017-04-05 11:08:00 +01:00
2019-03-19 11:52:12 +00:00
int wm_adsp_event ( struct snd_soc_dapm_widget * w ,
struct snd_kcontrol * kcontrol , int event ) ;
2012-10-11 11:54:02 +09:00
2019-03-19 11:52:09 +00:00
int wm_adsp2_set_dspclk ( struct snd_soc_dapm_widget * w , unsigned int freq ) ;
2017-01-06 14:24:41 +00:00
int wm_adsp2_preloader_get ( struct snd_kcontrol * kcontrol ,
struct snd_ctl_elem_value * ucontrol ) ;
int wm_adsp2_preloader_put ( struct snd_kcontrol * kcontrol ,
struct snd_ctl_elem_value * ucontrol ) ;
2018-08-08 17:13:38 +01:00
int wm_adsp_fw_get ( struct snd_kcontrol * kcontrol ,
struct snd_ctl_elem_value * ucontrol ) ;
int wm_adsp_fw_put ( struct snd_kcontrol * kcontrol ,
struct snd_ctl_elem_value * ucontrol ) ;
2017-01-06 14:24:41 +00:00
2016-11-29 10:46:21 +00:00
int wm_adsp_compr_open ( struct wm_adsp * dsp , struct snd_compr_stream * stream ) ;
2020-04-20 16:08:13 +09:00
int wm_adsp_compr_free ( struct snd_soc_component * component ,
struct snd_compr_stream * stream ) ;
int wm_adsp_compr_set_params ( struct snd_soc_component * component ,
struct snd_compr_stream * stream ,
2016-11-29 10:46:21 +00:00
struct snd_compr_params * params ) ;
2020-04-20 16:08:13 +09:00
int wm_adsp_compr_get_caps ( struct snd_soc_component * component ,
struct snd_compr_stream * stream ,
2016-11-29 10:46:21 +00:00
struct snd_compr_caps * caps ) ;
2020-04-20 16:08:13 +09:00
int wm_adsp_compr_trigger ( struct snd_soc_component * component ,
struct snd_compr_stream * stream , int cmd ) ;
2016-11-29 10:46:21 +00:00
int wm_adsp_compr_handle_irq ( struct wm_adsp * dsp ) ;
2020-04-20 16:08:13 +09:00
int wm_adsp_compr_pointer ( struct snd_soc_component * component ,
struct snd_compr_stream * stream ,
2016-11-29 10:46:21 +00:00
struct snd_compr_tstamp * tstamp ) ;
2020-04-20 16:08:13 +09:00
int wm_adsp_compr_copy ( struct snd_soc_component * component ,
struct snd_compr_stream * stream ,
2016-11-29 10:46:21 +00:00
char __user * buf , size_t count ) ;
2019-11-15 13:54:13 -06:00
int wm_adsp_write_ctl ( struct wm_adsp * dsp , const char * name , int type ,
unsigned int alg , void * buf , size_t len ) ;
int wm_adsp_read_ctl ( struct wm_adsp * dsp , const char * name , int type ,
unsigned int alg , void * buf , size_t len ) ;
2015-12-15 11:29:45 +00:00
2021-09-13 17:00:56 +01:00
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 ) ;
} ;
2012-10-11 11:54:02 +09:00
# endif