2022-06-07 16:11:13 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2014-2015 Broadcom Corporation */
2016-05-17 17:01:08 -07:00
# ifndef __CYGNUS_SSP_H__
# define __CYGNUS_SSP_H__
# define CYGNUS_TDM_DAI_MAX_SLOTS 16
# define CYGNUS_MAX_PLAYBACK_PORTS 4
# define CYGNUS_MAX_CAPTURE_PORTS 3
# define CYGNUS_MAX_I2S_PORTS 3
# define CYGNUS_MAX_PORTS CYGNUS_MAX_PLAYBACK_PORTS
# define CYGNUS_AUIDO_MAX_NUM_CLKS 3
# define CYGNUS_SSP_FRAMEBITS_DIV 1
# define CYGNUS_SSPMODE_I2S 0
# define CYGNUS_SSPMODE_TDM 1
# define CYGNUS_SSPMODE_UNKNOWN -1
# define CYGNUS_SSP_CLKSRC_PLL 0
/* Max string length of our dt property names */
# define PROP_LEN_MAX 40
struct ringbuf_regs {
unsigned rdaddr ;
unsigned wraddr ;
unsigned baseaddr ;
unsigned endaddr ;
unsigned fmark ; /* freemark for play, fullmark for caputure */
unsigned period_bytes ;
unsigned buf_size ;
} ;
# define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \
. rdaddr = SRC_RBUF_ # # num # # _RDADDR_OFFSET , \
. wraddr = SRC_RBUF_ # # num # # _WRADDR_OFFSET , \
. baseaddr = SRC_RBUF_ # # num # # _BASEADDR_OFFSET , \
. endaddr = SRC_RBUF_ # # num # # _ENDADDR_OFFSET , \
. fmark = SRC_RBUF_ # # num # # _FREE_MARK_OFFSET , \
. period_bytes = 0 , \
. buf_size = 0 , \
} )
# define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs) { \
. rdaddr = DST_RBUF_ # # num # # _RDADDR_OFFSET , \
. wraddr = DST_RBUF_ # # num # # _WRADDR_OFFSET , \
. baseaddr = DST_RBUF_ # # num # # _BASEADDR_OFFSET , \
. endaddr = DST_RBUF_ # # num # # _ENDADDR_OFFSET , \
. fmark = DST_RBUF_ # # num # # _FULL_MARK_OFFSET , \
. period_bytes = 0 , \
. buf_size = 0 , \
} )
enum cygnus_audio_port_type {
PORT_TDM ,
PORT_SPDIF ,
} ;
struct cygnus_ssp_regs {
u32 i2s_stream_cfg ;
u32 i2s_cfg ;
u32 i2s_cap_stream_cfg ;
u32 i2s_cap_cfg ;
u32 i2s_mclk_cfg ;
u32 bf_destch_ctrl ;
u32 bf_destch_cfg ;
u32 bf_sourcech_ctrl ;
u32 bf_sourcech_cfg ;
u32 bf_sourcech_grp ;
} ;
struct cygnus_track_clk {
bool cap_en ;
bool play_en ;
bool cap_clk_en ;
bool play_clk_en ;
} ;
struct cygnus_aio_port {
int portnum ;
int mode ;
bool is_slave ;
int streams_on ; /* will be 0 if both capture and play are off */
int fsync_width ;
int port_type ;
u32 mclk ;
u32 lrclk ;
u32 bit_per_frame ;
u32 pll_clk_num ;
struct cygnus_audio * cygaud ;
struct cygnus_ssp_regs regs ;
struct ringbuf_regs play_rb_regs ;
struct ringbuf_regs capture_rb_regs ;
struct snd_pcm_substream * play_stream ;
struct snd_pcm_substream * capture_stream ;
struct cygnus_track_clk clk_trace ;
} ;
struct cygnus_audio {
struct cygnus_aio_port portinfo [ CYGNUS_MAX_PORTS ] ;
int irq_num ;
void __iomem * audio ;
struct device * dev ;
void __iomem * i2s_in ;
struct clk * audio_clk [ CYGNUS_AUIDO_MAX_NUM_CLKS ] ;
int active_ports ;
unsigned long vco_rate ;
} ;
extern int cygnus_ssp_get_mode ( struct snd_soc_dai * cpu_dai ) ;
extern int cygnus_ssp_add_pll_tweak_controls ( struct snd_soc_pcm_runtime * rtd ) ;
extern int cygnus_ssp_set_custom_fsync_width ( struct snd_soc_dai * cpu_dai ,
int len ) ;
extern int cygnus_soc_platform_register ( struct device * dev ,
struct cygnus_audio * cygaud ) ;
extern int cygnus_soc_platform_unregister ( struct device * dev ) ;
extern int cygnus_ssp_set_custom_fsync_width ( struct snd_soc_dai * cpu_dai ,
int len ) ;
# endif