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