blob: ad6ad4e0c6a4681db6ca28c66bfa5be2b677e0ee [file] [log] [blame]
/*
*
* Marvell Orion Alsa Sound driver
*
* Author: Maen Suleiman
* Copyright (C) 2008 Marvell Ltd.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#define DRIVER_NAME "mv88fx_snd"
#undef MV88FX_SND_DEBUG
#ifdef MV88FX_SND_DEBUG
#define mv88fx_snd_debug(fmt, arg...) printk(KERN_DEBUG fmt, ##arg)
#else
#define mv88fx_snd_debug(a...)
#endif
typedef struct {
unsigned int base;
unsigned int size;
} _audio_mem_info;
typedef struct {
u32 spdif_rec;
u32 spdif_play;
u32 i2s_rec;
u32 i2s_play;
_audio_mem_info mem_array[5];
} _audio_info;
struct mv88fx_snd_stream {
struct snd_pcm_substream *substream;
struct device* dev;
int direction; /* playback or capture */
#define PLAYBACK 0
#define CAPTURE 1
unsigned int dig_mode; /* i2s,spdif,both*/
#define I2S 1
#define SPDIF 2
int stereo; /* mono , stereo*/
int mono_mode; /* both mono, left mono, right mono*/
#define MONO_BOTH 0
#define MONO_LEFT 1
#define MONO_RIGHT 2
int clock_src;
#define DCO_CLOCK 0
#define SPCR_CLOCK 1
#define EXTERN_CLOCK 2
int rate;
int stat_mem; /* Channel status source*/
int format;
#define SAMPLE_32IN32 0
#define SAMPLE_24IN32 1
#define SAMPLE_20IN32 2
#define SAMPLE_16IN32 3
#define SAMPLE_16IN16 4
unsigned int dma_addr;
unsigned int dma_size;
unsigned int period_size;
unsigned int spdif_status[4]; /* SPDIF status */
unsigned char *area; /* virtual pointer */
dma_addr_t addr; /* physical address */
};
struct mv88fx_snd_chip {
struct snd_card *card;
struct device *dev;
struct mv88fx_snd_platform_data *pdata; /* platform dara*/
struct mv88fx_snd_stream *stream[2]; /* run time values*/
struct mv88fx_snd_stream *stream_defaults[2]; /* default values*/
spinlock_t reg_lock; /* Register access spinlock */
struct resource *res; /* resource for IRQ and base*/
void __iomem *base; /* base address of the host */
int irq;
int loopback; /* When Loopback is enabled, playback
data is looped back to be recorded */
int ch_stat_valid; /* Playback SPDIF channel validity bit
value when REG selected */
int burst; /* DMA Burst Size */
#define SPDIF_MEM_STAT 0
#define SPDIF_REG_STAT 1
unsigned int dco_ctrl_offst;
int pcm_mode; /* pcm, nonpcm*/
#define PCM 0
#define NON_PCM 1
_audio_info *audio_info;
};
#define MV88FX_SND_MIN_PERIODS 8
#define MV88FX_SND_MAX_PERIODS 16
#define MV88FX_SND_MIN_PERIOD_BYTES 0x4000
#define MV88FX_SND_MAX_PERIOD_BYTES 0x4000
/* read/write registers */
#define mv88fx_snd_writel(chip, offs, val) \
writel((val), (0xf1000000 + offs))
static inline unsigned int mv88fx_snd_readl(struct mv88fx_snd_chip *chip,
unsigned int offs)
{
unsigned int val = readl((0xf1000000 + offs));
return (val);
}
#define mv88fx_snd_bitset(chip, offs, bitmask) \
writel( (readl(0xf1000000 + offs) | (bitmask)), \
0xf1000000 + offs)
#define mv88fx_snd_bitreset(chip, offs, bitmask) \
writel( (readl(0xf1000000 + offs) & (~(bitmask))), \
0xf1000000 + offs)