18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright (C) 2014-2015 Broadcom Corporation 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or 58c2ecf20Sopenharmony_ci * modify it under the terms of the GNU General Public License as 68c2ecf20Sopenharmony_ci * published by the Free Software Foundation version 2. 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * This program is distributed "as is" WITHOUT ANY WARRANTY of any 98c2ecf20Sopenharmony_ci * kind, whether express or implied; without even the implied warranty 108c2ecf20Sopenharmony_ci * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 118c2ecf20Sopenharmony_ci * GNU General Public License for more details. 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci#ifndef __CYGNUS_SSP_H__ 148c2ecf20Sopenharmony_ci#define __CYGNUS_SSP_H__ 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define CYGNUS_TDM_DAI_MAX_SLOTS 16 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define CYGNUS_MAX_PLAYBACK_PORTS 4 198c2ecf20Sopenharmony_ci#define CYGNUS_MAX_CAPTURE_PORTS 3 208c2ecf20Sopenharmony_ci#define CYGNUS_MAX_I2S_PORTS 3 218c2ecf20Sopenharmony_ci#define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS 228c2ecf20Sopenharmony_ci#define CYGNUS_AUIDO_MAX_NUM_CLKS 3 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define CYGNUS_SSP_FRAMEBITS_DIV 1 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#define CYGNUS_SSPMODE_I2S 0 278c2ecf20Sopenharmony_ci#define CYGNUS_SSPMODE_TDM 1 288c2ecf20Sopenharmony_ci#define CYGNUS_SSPMODE_UNKNOWN -1 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#define CYGNUS_SSP_CLKSRC_PLL 0 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci/* Max string length of our dt property names */ 338c2ecf20Sopenharmony_ci#define PROP_LEN_MAX 40 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistruct ringbuf_regs { 368c2ecf20Sopenharmony_ci unsigned rdaddr; 378c2ecf20Sopenharmony_ci unsigned wraddr; 388c2ecf20Sopenharmony_ci unsigned baseaddr; 398c2ecf20Sopenharmony_ci unsigned endaddr; 408c2ecf20Sopenharmony_ci unsigned fmark; /* freemark for play, fullmark for caputure */ 418c2ecf20Sopenharmony_ci unsigned period_bytes; 428c2ecf20Sopenharmony_ci unsigned buf_size; 438c2ecf20Sopenharmony_ci}; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \ 468c2ecf20Sopenharmony_ci .rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \ 478c2ecf20Sopenharmony_ci .wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \ 488c2ecf20Sopenharmony_ci .baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \ 498c2ecf20Sopenharmony_ci .endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \ 508c2ecf20Sopenharmony_ci .fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \ 518c2ecf20Sopenharmony_ci .period_bytes = 0, \ 528c2ecf20Sopenharmony_ci .buf_size = 0, \ 538c2ecf20Sopenharmony_ci}) 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs) { \ 568c2ecf20Sopenharmony_ci .rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \ 578c2ecf20Sopenharmony_ci .wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \ 588c2ecf20Sopenharmony_ci .baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \ 598c2ecf20Sopenharmony_ci .endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \ 608c2ecf20Sopenharmony_ci .fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \ 618c2ecf20Sopenharmony_ci .period_bytes = 0, \ 628c2ecf20Sopenharmony_ci .buf_size = 0, \ 638c2ecf20Sopenharmony_ci}) 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_cienum cygnus_audio_port_type { 668c2ecf20Sopenharmony_ci PORT_TDM, 678c2ecf20Sopenharmony_ci PORT_SPDIF, 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistruct cygnus_ssp_regs { 718c2ecf20Sopenharmony_ci u32 i2s_stream_cfg; 728c2ecf20Sopenharmony_ci u32 i2s_cfg; 738c2ecf20Sopenharmony_ci u32 i2s_cap_stream_cfg; 748c2ecf20Sopenharmony_ci u32 i2s_cap_cfg; 758c2ecf20Sopenharmony_ci u32 i2s_mclk_cfg; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci u32 bf_destch_ctrl; 788c2ecf20Sopenharmony_ci u32 bf_destch_cfg; 798c2ecf20Sopenharmony_ci u32 bf_sourcech_ctrl; 808c2ecf20Sopenharmony_ci u32 bf_sourcech_cfg; 818c2ecf20Sopenharmony_ci u32 bf_sourcech_grp; 828c2ecf20Sopenharmony_ci}; 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_cistruct cygnus_track_clk { 858c2ecf20Sopenharmony_ci bool cap_en; 868c2ecf20Sopenharmony_ci bool play_en; 878c2ecf20Sopenharmony_ci bool cap_clk_en; 888c2ecf20Sopenharmony_ci bool play_clk_en; 898c2ecf20Sopenharmony_ci}; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistruct cygnus_aio_port { 928c2ecf20Sopenharmony_ci int portnum; 938c2ecf20Sopenharmony_ci int mode; 948c2ecf20Sopenharmony_ci bool is_slave; 958c2ecf20Sopenharmony_ci int streams_on; /* will be 0 if both capture and play are off */ 968c2ecf20Sopenharmony_ci int fsync_width; 978c2ecf20Sopenharmony_ci int port_type; 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci u32 mclk; 1008c2ecf20Sopenharmony_ci u32 lrclk; 1018c2ecf20Sopenharmony_ci u32 bit_per_frame; 1028c2ecf20Sopenharmony_ci u32 pll_clk_num; 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci struct cygnus_audio *cygaud; 1058c2ecf20Sopenharmony_ci struct cygnus_ssp_regs regs; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci struct ringbuf_regs play_rb_regs; 1088c2ecf20Sopenharmony_ci struct ringbuf_regs capture_rb_regs; 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci struct snd_pcm_substream *play_stream; 1118c2ecf20Sopenharmony_ci struct snd_pcm_substream *capture_stream; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci struct cygnus_track_clk clk_trace; 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cistruct cygnus_audio { 1188c2ecf20Sopenharmony_ci struct cygnus_aio_port portinfo[CYGNUS_MAX_PORTS]; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci int irq_num; 1218c2ecf20Sopenharmony_ci void __iomem *audio; 1228c2ecf20Sopenharmony_ci struct device *dev; 1238c2ecf20Sopenharmony_ci void __iomem *i2s_in; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS]; 1268c2ecf20Sopenharmony_ci int active_ports; 1278c2ecf20Sopenharmony_ci unsigned long vco_rate; 1288c2ecf20Sopenharmony_ci}; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ciextern int cygnus_ssp_get_mode(struct snd_soc_dai *cpu_dai); 1318c2ecf20Sopenharmony_ciextern int cygnus_ssp_add_pll_tweak_controls(struct snd_soc_pcm_runtime *rtd); 1328c2ecf20Sopenharmony_ciextern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, 1338c2ecf20Sopenharmony_ci int len); 1348c2ecf20Sopenharmony_ciextern int cygnus_soc_platform_register(struct device *dev, 1358c2ecf20Sopenharmony_ci struct cygnus_audio *cygaud); 1368c2ecf20Sopenharmony_ciextern int cygnus_soc_platform_unregister(struct device *dev); 1378c2ecf20Sopenharmony_ciextern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, 1388c2ecf20Sopenharmony_ci int len); 1398c2ecf20Sopenharmony_ci#endif 140