linux/sound/soc/sh/siu.h
<<
>>
Prefs
   1/*
   2 * siu.h - ALSA SoC driver for Renesas SH7343, SH7722 SIU peripheral.
   3 *
   4 * Copyright (C) 2009-2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de>
   5 * Copyright (C) 2006 Carlos Munoz <carlos@kenati.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License as published by
   9 * the Free Software Foundation; either version 2 of the License, or
  10 * (at your option) any later version.
  11 *
  12 * This program is distributed in the hope that it will be useful,
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15 * GNU General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20 */
  21
  22#ifndef SIU_H
  23#define SIU_H
  24
  25/* Common kernel and user-space firmware-building defines and types */
  26
  27#define YRAM0_SIZE              (0x0040 / 4)            /* 16 */
  28#define YRAM1_SIZE              (0x0080 / 4)            /* 32 */
  29#define YRAM2_SIZE              (0x0040 / 4)            /* 16 */
  30#define YRAM3_SIZE              (0x0080 / 4)            /* 32 */
  31#define YRAM4_SIZE              (0x0080 / 4)            /* 32 */
  32#define YRAM_DEF_SIZE           (YRAM0_SIZE + YRAM1_SIZE + YRAM2_SIZE + \
  33                                 YRAM3_SIZE + YRAM4_SIZE)
  34#define YRAM_FIR_SIZE           (0x0400 / 4)            /* 256 */
  35#define YRAM_IIR_SIZE           (0x0200 / 4)            /* 128 */
  36
  37#define XRAM0_SIZE              (0x0400 / 4)            /* 256 */
  38#define XRAM1_SIZE              (0x0200 / 4)            /* 128 */
  39#define XRAM2_SIZE              (0x0200 / 4)            /* 128 */
  40
  41/* PRAM program array size */
  42#define PRAM0_SIZE              (0x0100 / 4)            /* 64 */
  43#define PRAM1_SIZE              ((0x2000 - 0x0100) / 4) /* 1984 */
  44
  45#include <linux/types.h>
  46
  47struct siu_spb_param {
  48        __u32   ab1a;   /* input FIFO address */
  49        __u32   ab0a;   /* output FIFO address */
  50        __u32   dir;    /* 0=the ather except CPUOUTPUT, 1=CPUINPUT */
  51        __u32   event;  /* SPB program starting conditions */
  52        __u32   stfifo; /* STFIFO register setting value */
  53        __u32   trdat;  /* TRDAT register setting value */
  54};
  55
  56struct siu_firmware {
  57        __u32                   yram_fir_coeff[YRAM_FIR_SIZE];
  58        __u32                   pram0[PRAM0_SIZE];
  59        __u32                   pram1[PRAM1_SIZE];
  60        __u32                   yram0[YRAM0_SIZE];
  61        __u32                   yram1[YRAM1_SIZE];
  62        __u32                   yram2[YRAM2_SIZE];
  63        __u32                   yram3[YRAM3_SIZE];
  64        __u32                   yram4[YRAM4_SIZE];
  65        __u32                   spbpar_num;
  66        struct siu_spb_param    spbpar[32];
  67};
  68
  69#ifdef __KERNEL__
  70
  71#include <linux/dmaengine.h>
  72#include <linux/interrupt.h>
  73#include <linux/io.h>
  74#include <linux/sh_dma.h>
  75
  76#include <sound/core.h>
  77#include <sound/pcm.h>
  78#include <sound/soc.h>
  79
  80#define SIU_PERIOD_BYTES_MAX    8192            /* DMA transfer/period size */
  81#define SIU_PERIOD_BYTES_MIN    256             /* DMA transfer/period size */
  82#define SIU_PERIODS_MAX         64              /* Max periods in buffer */
  83#define SIU_PERIODS_MIN         4               /* Min periods in buffer */
  84#define SIU_BUFFER_BYTES_MAX    (SIU_PERIOD_BYTES_MAX * SIU_PERIODS_MAX)
  85
  86/* SIU ports: only one can be used at a time */
  87enum {
  88        SIU_PORT_A,
  89        SIU_PORT_B,
  90        SIU_PORT_NUM,
  91};
  92
  93/* SIU clock configuration */
  94enum {
  95        SIU_CLKA_PLL,
  96        SIU_CLKA_EXT,
  97        SIU_CLKB_PLL,
  98        SIU_CLKB_EXT
  99};
 100
 101struct device;
 102struct siu_info {
 103        struct device           *dev;
 104        int                     port_id;
 105        u32 __iomem             *pram;
 106        u32 __iomem             *xram;
 107        u32 __iomem             *yram;
 108        u32 __iomem             *reg;
 109        struct siu_firmware     fw;
 110};
 111
 112struct siu_stream {
 113        struct tasklet_struct           tasklet;
 114        struct snd_pcm_substream        *substream;
 115        snd_pcm_format_t                format;
 116        size_t                          buf_bytes;
 117        size_t                          period_bytes;
 118        int                             cur_period;     /* Period currently in dma */
 119        u32                             volume;
 120        snd_pcm_sframes_t               xfer_cnt;       /* Number of frames */
 121        u8                              rw_flg;         /* transfer status */
 122        /* DMA status */
 123        struct dma_chan                 *chan;          /* DMA channel */
 124        struct dma_async_tx_descriptor  *tx_desc;
 125        dma_cookie_t                    cookie;
 126        struct sh_dmae_slave            param;
 127};
 128
 129struct siu_port {
 130        unsigned long           play_cap;       /* Used to track full duplex */
 131        struct snd_pcm          *pcm;
 132        struct siu_stream       playback;
 133        struct siu_stream       capture;
 134        u32                     stfifo;         /* STFIFO value from firmware */
 135        u32                     trdat;          /* TRDAT value from firmware */
 136};
 137
 138extern struct siu_port *siu_ports[SIU_PORT_NUM];
 139
 140static inline struct siu_port *siu_port_info(struct snd_pcm_substream *substream)
 141{
 142        struct platform_device *pdev =
 143                to_platform_device(substream->pcm->card->dev);
 144        return siu_ports[pdev->id];
 145}
 146
 147/* Register access */
 148static inline void siu_write32(u32 __iomem *addr, u32 val)
 149{
 150        __raw_writel(val, addr);
 151}
 152
 153static inline u32 siu_read32(u32 __iomem *addr)
 154{
 155        return __raw_readl(addr);
 156}
 157
 158/* SIU registers */
 159#define SIU_IFCTL       (0x000 / sizeof(u32))
 160#define SIU_SRCTL       (0x004 / sizeof(u32))
 161#define SIU_SFORM       (0x008 / sizeof(u32))
 162#define SIU_CKCTL       (0x00c / sizeof(u32))
 163#define SIU_TRDAT       (0x010 / sizeof(u32))
 164#define SIU_STFIFO      (0x014 / sizeof(u32))
 165#define SIU_DPAK        (0x01c / sizeof(u32))
 166#define SIU_CKREV       (0x020 / sizeof(u32))
 167#define SIU_EVNTC       (0x028 / sizeof(u32))
 168#define SIU_SBCTL       (0x040 / sizeof(u32))
 169#define SIU_SBPSET      (0x044 / sizeof(u32))
 170#define SIU_SBFSTS      (0x068 / sizeof(u32))
 171#define SIU_SBDVCA      (0x06c / sizeof(u32))
 172#define SIU_SBDVCB      (0x070 / sizeof(u32))
 173#define SIU_SBACTIV     (0x074 / sizeof(u32))
 174#define SIU_DMAIA       (0x090 / sizeof(u32))
 175#define SIU_DMAIB       (0x094 / sizeof(u32))
 176#define SIU_DMAOA       (0x098 / sizeof(u32))
 177#define SIU_DMAOB       (0x09c / sizeof(u32))
 178#define SIU_DMAML       (0x0a0 / sizeof(u32))
 179#define SIU_SPSTS       (0x0cc / sizeof(u32))
 180#define SIU_SPCTL       (0x0d0 / sizeof(u32))
 181#define SIU_BRGASEL     (0x100 / sizeof(u32))
 182#define SIU_BRRA        (0x104 / sizeof(u32))
 183#define SIU_BRGBSEL     (0x108 / sizeof(u32))
 184#define SIU_BRRB        (0x10c / sizeof(u32))
 185
 186extern struct snd_soc_platform_driver siu_platform;
 187extern struct siu_info *siu_i2s_data;
 188
 189int siu_init_port(int port, struct siu_port **port_info, struct snd_card *card);
 190void siu_free_port(struct siu_port *port_info);
 191
 192#endif
 193
 194#endif /* SIU_H */
 195