18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * sst_mfld_platform.h - Intel MID Platform driver header file 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2010 Intel Corp 68c2ecf20Sopenharmony_ci * Author: Vinod Koul <vinod.koul@intel.com> 78c2ecf20Sopenharmony_ci * Author: Harsha Priya <priya.harsha@intel.com> 88c2ecf20Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 98c2ecf20Sopenharmony_ci * 108c2ecf20Sopenharmony_ci * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 118c2ecf20Sopenharmony_ci */ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#ifndef __SST_PLATFORMDRV_H__ 148c2ecf20Sopenharmony_ci#define __SST_PLATFORMDRV_H__ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#include "sst-mfld-dsp.h" 178c2ecf20Sopenharmony_ci#include "sst-atom-controls.h" 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ciextern struct sst_device *sst; 208c2ecf20Sopenharmony_ciextern const struct snd_compress_ops sst_platform_compress_ops; 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define DRV_NAME "sst" 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define SST_MONO 1 258c2ecf20Sopenharmony_ci#define SST_STEREO 2 268c2ecf20Sopenharmony_ci#define SST_MAX_CAP 5 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define SST_MAX_BUFFER (800*1024) 298c2ecf20Sopenharmony_ci#define SST_MIN_BUFFER (800*1024) 308c2ecf20Sopenharmony_ci#define SST_MIN_PERIOD_BYTES 32 318c2ecf20Sopenharmony_ci#define SST_MAX_PERIOD_BYTES SST_MAX_BUFFER 328c2ecf20Sopenharmony_ci#define SST_MIN_PERIODS 2 338c2ecf20Sopenharmony_ci#define SST_MAX_PERIODS (1024*2) 348c2ecf20Sopenharmony_ci#define SST_FIFO_SIZE 0 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistruct pcm_stream_info { 378c2ecf20Sopenharmony_ci int str_id; 388c2ecf20Sopenharmony_ci void *arg; 398c2ecf20Sopenharmony_ci void (*period_elapsed) (void *arg); 408c2ecf20Sopenharmony_ci unsigned long long buffer_ptr; 418c2ecf20Sopenharmony_ci unsigned long long pcm_delay; 428c2ecf20Sopenharmony_ci int sfreq; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cienum sst_drv_status { 468c2ecf20Sopenharmony_ci SST_PLATFORM_INIT = 1, 478c2ecf20Sopenharmony_ci SST_PLATFORM_STARTED, 488c2ecf20Sopenharmony_ci SST_PLATFORM_RUNNING, 498c2ecf20Sopenharmony_ci SST_PLATFORM_PAUSED, 508c2ecf20Sopenharmony_ci SST_PLATFORM_DROPPED, 518c2ecf20Sopenharmony_ci}; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cienum sst_stream_ops { 548c2ecf20Sopenharmony_ci STREAM_OPS_PLAYBACK = 0, 558c2ecf20Sopenharmony_ci STREAM_OPS_CAPTURE, 568c2ecf20Sopenharmony_ci}; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cienum sst_audio_device_type { 598c2ecf20Sopenharmony_ci SND_SST_DEVICE_HEADSET = 1, 608c2ecf20Sopenharmony_ci SND_SST_DEVICE_IHF, 618c2ecf20Sopenharmony_ci SND_SST_DEVICE_VIBRA, 628c2ecf20Sopenharmony_ci SND_SST_DEVICE_HAPTIC, 638c2ecf20Sopenharmony_ci SND_SST_DEVICE_CAPTURE, 648c2ecf20Sopenharmony_ci SND_SST_DEVICE_COMPRESS, 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci/* PCM Parameters */ 688c2ecf20Sopenharmony_cistruct sst_pcm_params { 698c2ecf20Sopenharmony_ci u16 codec; /* codec type */ 708c2ecf20Sopenharmony_ci u8 num_chan; /* 1=Mono, 2=Stereo */ 718c2ecf20Sopenharmony_ci u8 pcm_wd_sz; /* 16/24 - bit*/ 728c2ecf20Sopenharmony_ci u32 reserved; /* Bitrate in bits per second */ 738c2ecf20Sopenharmony_ci u32 sfreq; /* Sampling rate in Hz */ 748c2ecf20Sopenharmony_ci u32 ring_buffer_size; 758c2ecf20Sopenharmony_ci u32 period_count; /* period elapsed in samples*/ 768c2ecf20Sopenharmony_ci u32 ring_buffer_addr; 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_cistruct sst_stream_params { 808c2ecf20Sopenharmony_ci u32 result; 818c2ecf20Sopenharmony_ci u32 stream_id; 828c2ecf20Sopenharmony_ci u8 codec; 838c2ecf20Sopenharmony_ci u8 ops; 848c2ecf20Sopenharmony_ci u8 stream_type; 858c2ecf20Sopenharmony_ci u8 device_type; 868c2ecf20Sopenharmony_ci struct sst_pcm_params sparams; 878c2ecf20Sopenharmony_ci}; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistruct sst_compress_cb { 908c2ecf20Sopenharmony_ci void *param; 918c2ecf20Sopenharmony_ci void (*compr_cb)(void *param); 928c2ecf20Sopenharmony_ci void *drain_cb_param; 938c2ecf20Sopenharmony_ci void (*drain_notify)(void *param); 948c2ecf20Sopenharmony_ci}; 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cistruct compress_sst_ops { 978c2ecf20Sopenharmony_ci const char *name; 988c2ecf20Sopenharmony_ci int (*open)(struct device *dev, 998c2ecf20Sopenharmony_ci struct snd_sst_params *str_params, struct sst_compress_cb *cb); 1008c2ecf20Sopenharmony_ci int (*stream_start)(struct device *dev, unsigned int str_id); 1018c2ecf20Sopenharmony_ci int (*stream_drop)(struct device *dev, unsigned int str_id); 1028c2ecf20Sopenharmony_ci int (*stream_drain)(struct device *dev, unsigned int str_id); 1038c2ecf20Sopenharmony_ci int (*stream_partial_drain)(struct device *dev, unsigned int str_id); 1048c2ecf20Sopenharmony_ci int (*stream_pause)(struct device *dev, unsigned int str_id); 1058c2ecf20Sopenharmony_ci int (*stream_pause_release)(struct device *dev, unsigned int str_id); 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci int (*tstamp)(struct device *dev, unsigned int str_id, 1088c2ecf20Sopenharmony_ci struct snd_compr_tstamp *tstamp); 1098c2ecf20Sopenharmony_ci int (*ack)(struct device *dev, unsigned int str_id, 1108c2ecf20Sopenharmony_ci unsigned long bytes); 1118c2ecf20Sopenharmony_ci int (*close)(struct device *dev, unsigned int str_id); 1128c2ecf20Sopenharmony_ci int (*get_caps)(struct snd_compr_caps *caps); 1138c2ecf20Sopenharmony_ci int (*get_codec_caps)(struct snd_compr_codec_caps *codec); 1148c2ecf20Sopenharmony_ci int (*set_metadata)(struct device *dev, unsigned int str_id, 1158c2ecf20Sopenharmony_ci struct snd_compr_metadata *mdata); 1168c2ecf20Sopenharmony_ci int (*power)(struct device *dev, bool state); 1178c2ecf20Sopenharmony_ci}; 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct sst_ops { 1208c2ecf20Sopenharmony_ci int (*open)(struct device *dev, struct snd_sst_params *str_param); 1218c2ecf20Sopenharmony_ci int (*stream_init)(struct device *dev, struct pcm_stream_info *str_info); 1228c2ecf20Sopenharmony_ci int (*stream_start)(struct device *dev, int str_id); 1238c2ecf20Sopenharmony_ci int (*stream_drop)(struct device *dev, int str_id); 1248c2ecf20Sopenharmony_ci int (*stream_pause)(struct device *dev, int str_id); 1258c2ecf20Sopenharmony_ci int (*stream_pause_release)(struct device *dev, int str_id); 1268c2ecf20Sopenharmony_ci int (*stream_read_tstamp)(struct device *dev, struct pcm_stream_info *str_info); 1278c2ecf20Sopenharmony_ci int (*send_byte_stream)(struct device *dev, struct snd_sst_bytes_v2 *bytes); 1288c2ecf20Sopenharmony_ci int (*close)(struct device *dev, unsigned int str_id); 1298c2ecf20Sopenharmony_ci int (*power)(struct device *dev, bool state); 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_cistruct sst_runtime_stream { 1338c2ecf20Sopenharmony_ci int stream_status; 1348c2ecf20Sopenharmony_ci unsigned int id; 1358c2ecf20Sopenharmony_ci size_t bytes_written; 1368c2ecf20Sopenharmony_ci struct pcm_stream_info stream_info; 1378c2ecf20Sopenharmony_ci struct sst_ops *ops; 1388c2ecf20Sopenharmony_ci struct compress_sst_ops *compr_ops; 1398c2ecf20Sopenharmony_ci spinlock_t status_lock; 1408c2ecf20Sopenharmony_ci}; 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_cistruct sst_device { 1438c2ecf20Sopenharmony_ci char *name; 1448c2ecf20Sopenharmony_ci struct device *dev; 1458c2ecf20Sopenharmony_ci struct sst_ops *ops; 1468c2ecf20Sopenharmony_ci struct platform_device *pdev; 1478c2ecf20Sopenharmony_ci struct compress_sst_ops *compr_ops; 1488c2ecf20Sopenharmony_ci}; 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_cistruct sst_data; 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ciint sst_dsp_init_v2_dpcm(struct snd_soc_component *component); 1538c2ecf20Sopenharmony_ciint sst_send_pipe_gains(struct snd_soc_dai *dai, int stream, int mute); 1548c2ecf20Sopenharmony_ciint send_ssp_cmd(struct snd_soc_dai *dai, const char *id, bool enable); 1558c2ecf20Sopenharmony_ciint sst_handle_vb_timer(struct snd_soc_dai *dai, bool enable); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_civoid sst_set_stream_status(struct sst_runtime_stream *stream, int state); 1588c2ecf20Sopenharmony_ciint sst_fill_stream_params(void *substream, const struct sst_data *ctx, 1598c2ecf20Sopenharmony_ci struct snd_sst_params *str_params, bool is_compress); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_cistruct sst_algo_int_control_v2 { 1628c2ecf20Sopenharmony_ci struct soc_mixer_control mc; 1638c2ecf20Sopenharmony_ci u16 module_id; /* module identifieer */ 1648c2ecf20Sopenharmony_ci u16 pipe_id; /* location info: pipe_id + instance_id */ 1658c2ecf20Sopenharmony_ci u16 instance_id; 1668c2ecf20Sopenharmony_ci unsigned int value; /* Value received is stored here */ 1678c2ecf20Sopenharmony_ci}; 1688c2ecf20Sopenharmony_cistruct sst_data { 1698c2ecf20Sopenharmony_ci struct platform_device *pdev; 1708c2ecf20Sopenharmony_ci struct sst_platform_data *pdata; 1718c2ecf20Sopenharmony_ci struct snd_sst_bytes_v2 *byte_stream; 1728c2ecf20Sopenharmony_ci struct mutex lock; 1738c2ecf20Sopenharmony_ci struct snd_soc_card *soc_card; 1748c2ecf20Sopenharmony_ci struct sst_cmd_sba_hw_set_ssp ssp_cmd; 1758c2ecf20Sopenharmony_ci}; 1768c2ecf20Sopenharmony_ciint sst_register_dsp(struct sst_device *dev); 1778c2ecf20Sopenharmony_ciint sst_unregister_dsp(struct sst_device *dev); 1788c2ecf20Sopenharmony_ci#endif 179