linux/sound/soc/bcm/cygnus-ssp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/* Copyright (C) 2014-2015 Broadcom Corporation */
   3#ifndef __CYGNUS_SSP_H__
   4#define __CYGNUS_SSP_H__
   5
   6#define CYGNUS_TDM_DAI_MAX_SLOTS 16
   7
   8#define CYGNUS_MAX_PLAYBACK_PORTS 4
   9#define CYGNUS_MAX_CAPTURE_PORTS 3
  10#define CYGNUS_MAX_I2S_PORTS 3
  11#define CYGNUS_MAX_PORTS  CYGNUS_MAX_PLAYBACK_PORTS
  12#define CYGNUS_AUIDO_MAX_NUM_CLKS 3
  13
  14#define CYGNUS_SSP_FRAMEBITS_DIV 1
  15
  16#define CYGNUS_SSPMODE_I2S 0
  17#define CYGNUS_SSPMODE_TDM 1
  18#define CYGNUS_SSPMODE_UNKNOWN -1
  19
  20#define CYGNUS_SSP_CLKSRC_PLL      0
  21
  22/* Max string length of our dt property names */
  23#define PROP_LEN_MAX 40
  24
  25struct ringbuf_regs {
  26        unsigned rdaddr;
  27        unsigned wraddr;
  28        unsigned baseaddr;
  29        unsigned endaddr;
  30        unsigned fmark;   /* freemark for play, fullmark for caputure */
  31        unsigned period_bytes;
  32        unsigned buf_size;
  33};
  34
  35#define RINGBUF_REG_PLAYBACK(num) ((struct ringbuf_regs) { \
  36        .rdaddr = SRC_RBUF_ ##num## _RDADDR_OFFSET, \
  37        .wraddr = SRC_RBUF_ ##num## _WRADDR_OFFSET, \
  38        .baseaddr = SRC_RBUF_ ##num## _BASEADDR_OFFSET, \
  39        .endaddr = SRC_RBUF_ ##num## _ENDADDR_OFFSET, \
  40        .fmark = SRC_RBUF_ ##num## _FREE_MARK_OFFSET, \
  41        .period_bytes = 0, \
  42        .buf_size = 0, \
  43})
  44
  45#define RINGBUF_REG_CAPTURE(num) ((struct ringbuf_regs)  { \
  46        .rdaddr = DST_RBUF_ ##num## _RDADDR_OFFSET, \
  47        .wraddr = DST_RBUF_ ##num## _WRADDR_OFFSET, \
  48        .baseaddr = DST_RBUF_ ##num## _BASEADDR_OFFSET, \
  49        .endaddr = DST_RBUF_ ##num## _ENDADDR_OFFSET, \
  50        .fmark = DST_RBUF_ ##num## _FULL_MARK_OFFSET, \
  51        .period_bytes = 0, \
  52        .buf_size = 0, \
  53})
  54
  55enum cygnus_audio_port_type {
  56        PORT_TDM,
  57        PORT_SPDIF,
  58};
  59
  60struct cygnus_ssp_regs {
  61        u32 i2s_stream_cfg;
  62        u32 i2s_cfg;
  63        u32 i2s_cap_stream_cfg;
  64        u32 i2s_cap_cfg;
  65        u32 i2s_mclk_cfg;
  66
  67        u32 bf_destch_ctrl;
  68        u32 bf_destch_cfg;
  69        u32 bf_sourcech_ctrl;
  70        u32 bf_sourcech_cfg;
  71        u32 bf_sourcech_grp;
  72};
  73
  74struct cygnus_track_clk {
  75        bool cap_en;
  76        bool play_en;
  77        bool cap_clk_en;
  78        bool play_clk_en;
  79};
  80
  81struct cygnus_aio_port {
  82        int portnum;
  83        int mode;
  84        bool is_slave;
  85        int streams_on;   /* will be 0 if both capture and play are off */
  86        int fsync_width;
  87        int port_type;
  88
  89        u32 mclk;
  90        u32 lrclk;
  91        u32 bit_per_frame;
  92        u32 pll_clk_num;
  93
  94        struct cygnus_audio *cygaud;
  95        struct cygnus_ssp_regs regs;
  96
  97        struct ringbuf_regs play_rb_regs;
  98        struct ringbuf_regs capture_rb_regs;
  99
 100        struct snd_pcm_substream *play_stream;
 101        struct snd_pcm_substream *capture_stream;
 102
 103        struct cygnus_track_clk clk_trace;
 104};
 105
 106
 107struct cygnus_audio {
 108        struct cygnus_aio_port  portinfo[CYGNUS_MAX_PORTS];
 109
 110        int irq_num;
 111        void __iomem *audio;
 112        struct device *dev;
 113        void __iomem *i2s_in;
 114
 115        struct clk *audio_clk[CYGNUS_AUIDO_MAX_NUM_CLKS];
 116        int active_ports;
 117        unsigned long vco_rate;
 118};
 119
 120extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
 121                                                int len);
 122extern int cygnus_soc_platform_register(struct device *dev,
 123                                        struct cygnus_audio *cygaud);
 124extern int cygnus_soc_platform_unregister(struct device *dev);
 125extern int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai,
 126        int len);
 127#endif
 128