mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 07:44:21 +08:00
2adfc68877
The audio unit of Marvell Armada38x SoC is similar to the ones comprised by other Marvell SoCs (Kirkwood, Dove and Armada 370). Therefore KW audio driver can be used to support it and this commit adds new compatible string to identify Armada 38x variant. Two new memory regions are added: first one for PLL configuration and the second one for choosing one of audio I/O modes (I2S or S/PDIF). For the latter purpose a new optional DT property is added ('spdif-mode'). kirkwood-i2s driver is extended by adding a new init function for Armada 38x flavor and also a routine that enables PLL output (i.e. MCLK) configuration. Signed-off-by: Marcin Wojtas <mw@semihalf.com> Tested-by: Star_Automation <star@marvell.com> Reviewed-by: Nadav Haklai <nadavh@marvell.com> Reviewed-by: Lior Amsalem <alior@marvell.com> Tested-by: Lior Amsalem <alior@marvell.com> Signed-off-by: Hezi Shahmoon <hezi@marvell.com> Reviewed-by: Neta Zur Hershkovits <neta@marvell.com> [pali: Fix support for pre-38x SoCs] Signed-off-by: Pali Rohár <pali@kernel.org> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Link: https://lore.kernel.org/r/20220926110533.13475-1-pali@kernel.org Signed-off-by: Mark Brown <broonie@kernel.org>
149 lines
4.8 KiB
C
149 lines
4.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* kirkwood.h
|
|
*
|
|
* (c) 2010 Arnaud Patard <apatard@mandriva.com>
|
|
*/
|
|
|
|
#ifndef _KIRKWOOD_AUDIO_H
|
|
#define _KIRKWOOD_AUDIO_H
|
|
|
|
#define DRV_NAME "mvebu-audio"
|
|
|
|
#define KIRKWOOD_RECORD_WIN 0
|
|
#define KIRKWOOD_PLAYBACK_WIN 1
|
|
#define KIRKWOOD_MAX_AUDIO_WIN 2
|
|
|
|
#define KIRKWOOD_AUDIO_WIN_BASE_REG(win) (0xA00 + ((win)<<3))
|
|
#define KIRKWOOD_AUDIO_WIN_CTRL_REG(win) (0xA04 + ((win)<<3))
|
|
|
|
|
|
#define KIRKWOOD_RECCTL 0x1000
|
|
#define KIRKWOOD_RECCTL_SPDIF_EN (1<<11)
|
|
#define KIRKWOOD_RECCTL_I2S_EN (1<<10)
|
|
#define KIRKWOOD_RECCTL_PAUSE (1<<9)
|
|
#define KIRKWOOD_RECCTL_MUTE (1<<8)
|
|
#define KIRKWOOD_RECCTL_BURST_MASK (3<<5)
|
|
#define KIRKWOOD_RECCTL_BURST_128 (2<<5)
|
|
#define KIRKWOOD_RECCTL_BURST_32 (1<<5)
|
|
#define KIRKWOOD_RECCTL_MONO (1<<4)
|
|
#define KIRKWOOD_RECCTL_MONO_CHAN_RIGHT (1<<3)
|
|
#define KIRKWOOD_RECCTL_MONO_CHAN_LEFT (0<<3)
|
|
#define KIRKWOOD_RECCTL_SIZE_MASK (7<<0)
|
|
#define KIRKWOOD_RECCTL_SIZE_16 (7<<0)
|
|
#define KIRKWOOD_RECCTL_SIZE_16_C (3<<0)
|
|
#define KIRKWOOD_RECCTL_SIZE_20 (2<<0)
|
|
#define KIRKWOOD_RECCTL_SIZE_24 (1<<0)
|
|
#define KIRKWOOD_RECCTL_SIZE_32 (0<<0)
|
|
|
|
#define KIRKWOOD_RECCTL_ENABLE_MASK (KIRKWOOD_RECCTL_SPDIF_EN | \
|
|
KIRKWOOD_RECCTL_I2S_EN)
|
|
|
|
#define KIRKWOOD_REC_BUF_ADDR 0x1004
|
|
#define KIRKWOOD_REC_BUF_SIZE 0x1008
|
|
#define KIRKWOOD_REC_BYTE_COUNT 0x100C
|
|
|
|
#define KIRKWOOD_PLAYCTL 0x1100
|
|
#define KIRKWOOD_PLAYCTL_PLAY_BUSY (1<<16)
|
|
#define KIRKWOOD_PLAYCTL_BURST_MASK (3<<11)
|
|
#define KIRKWOOD_PLAYCTL_BURST_128 (2<<11)
|
|
#define KIRKWOOD_PLAYCTL_BURST_32 (1<<11)
|
|
#define KIRKWOOD_PLAYCTL_PAUSE (1<<9)
|
|
#define KIRKWOOD_PLAYCTL_SPDIF_MUTE (1<<8)
|
|
#define KIRKWOOD_PLAYCTL_MONO_MASK (3<<5)
|
|
#define KIRKWOOD_PLAYCTL_MONO_BOTH (3<<5)
|
|
#define KIRKWOOD_PLAYCTL_MONO_OFF (0<<5)
|
|
#define KIRKWOOD_PLAYCTL_I2S_MUTE (1<<7)
|
|
#define KIRKWOOD_PLAYCTL_SPDIF_EN (1<<4)
|
|
#define KIRKWOOD_PLAYCTL_I2S_EN (1<<3)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_MASK (7<<0)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_16 (7<<0)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_16_C (3<<0)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_20 (2<<0)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_24 (1<<0)
|
|
#define KIRKWOOD_PLAYCTL_SIZE_32 (0<<0)
|
|
|
|
#define KIRKWOOD_PLAYCTL_ENABLE_MASK (KIRKWOOD_PLAYCTL_SPDIF_EN | \
|
|
KIRKWOOD_PLAYCTL_I2S_EN)
|
|
|
|
#define KIRKWOOD_PLAY_BUF_ADDR 0x1104
|
|
#define KIRKWOOD_PLAY_BUF_SIZE 0x1108
|
|
#define KIRKWOOD_PLAY_BYTE_COUNT 0x110C
|
|
|
|
#define KIRKWOOD_DCO_CTL 0x1204
|
|
#define KIRKWOOD_DCO_CTL_OFFSET_MASK (0xFFF<<2)
|
|
#define KIRKWOOD_DCO_CTL_OFFSET_0 (0x800<<2)
|
|
#define KIRKWOOD_DCO_CTL_FREQ_MASK (3<<0)
|
|
#define KIRKWOOD_DCO_CTL_FREQ_11 (0<<0)
|
|
#define KIRKWOOD_DCO_CTL_FREQ_12 (1<<0)
|
|
#define KIRKWOOD_DCO_CTL_FREQ_24 (2<<0)
|
|
|
|
#define KIRKWOOD_DCO_SPCR_STATUS 0x120c
|
|
#define KIRKWOOD_DCO_SPCR_STATUS_DCO_LOCK (1<<16)
|
|
|
|
#define KIRKWOOD_CLOCKS_CTRL 0x1230
|
|
#define KIRKWOOD_MCLK_SOURCE_MASK (3<<0)
|
|
#define KIRKWOOD_MCLK_SOURCE_DCO (0<<0)
|
|
#define KIRKWOOD_MCLK_SOURCE_EXTCLK (3<<0)
|
|
|
|
#define KIRKWOOD_ERR_CAUSE 0x1300
|
|
#define KIRKWOOD_ERR_MASK 0x1304
|
|
|
|
#define KIRKWOOD_INT_CAUSE 0x1308
|
|
#define KIRKWOOD_INT_MASK 0x130C
|
|
#define KIRKWOOD_INT_CAUSE_PLAY_BYTES (1<<14)
|
|
#define KIRKWOOD_INT_CAUSE_REC_BYTES (1<<13)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_PLAY_END (1<<7)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_PLAY_3Q (1<<6)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_PLAY_HALF (1<<5)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_PLAY_1Q (1<<4)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_REC_END (1<<3)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_REC_3Q (1<<2)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_REC_HALF (1<<1)
|
|
#define KIRKWOOD_INT_CAUSE_DMA_REC_1Q (1<<0)
|
|
|
|
#define KIRKWOOD_REC_BYTE_INT_COUNT 0x1310
|
|
#define KIRKWOOD_PLAY_BYTE_INT_COUNT 0x1314
|
|
#define KIRKWOOD_BYTE_INT_COUNT_MASK 0xffffff
|
|
|
|
#define KIRKWOOD_I2S_PLAYCTL 0x2508
|
|
#define KIRKWOOD_I2S_RECCTL 0x2408
|
|
#define KIRKWOOD_I2S_CTL_JUST_MASK (0xf<<26)
|
|
#define KIRKWOOD_I2S_CTL_LJ (0<<26)
|
|
#define KIRKWOOD_I2S_CTL_I2S (5<<26)
|
|
#define KIRKWOOD_I2S_CTL_RJ (8<<26)
|
|
#define KIRKWOOD_I2S_CTL_SIZE_MASK (3<<30)
|
|
#define KIRKWOOD_I2S_CTL_SIZE_16 (3<<30)
|
|
#define KIRKWOOD_I2S_CTL_SIZE_20 (2<<30)
|
|
#define KIRKWOOD_I2S_CTL_SIZE_24 (1<<30)
|
|
#define KIRKWOOD_I2S_CTL_SIZE_32 (0<<30)
|
|
|
|
#define KIRKWOOD_AUDIO_BUF_MAX (16*1024*1024)
|
|
|
|
/* Theses values come from the marvell alsa driver */
|
|
/* need to find where they come from */
|
|
#define KIRKWOOD_SND_MIN_PERIODS 2
|
|
#define KIRKWOOD_SND_MAX_PERIODS 16
|
|
#define KIRKWOOD_SND_MIN_PERIOD_BYTES 256
|
|
#define KIRKWOOD_SND_MAX_PERIOD_BYTES 0x8000
|
|
#define KIRKWOOD_SND_MAX_BUFFER_BYTES (KIRKWOOD_SND_MAX_PERIOD_BYTES \
|
|
* KIRKWOOD_SND_MAX_PERIODS)
|
|
|
|
struct kirkwood_dma_data {
|
|
void __iomem *io;
|
|
void __iomem *pll_config;
|
|
void __iomem *soc_control;
|
|
struct clk *clk;
|
|
struct clk *extclk;
|
|
uint32_t ctl_play;
|
|
uint32_t ctl_rec;
|
|
struct snd_pcm_substream *substream_play;
|
|
struct snd_pcm_substream *substream_rec;
|
|
int irq;
|
|
int burst;
|
|
};
|
|
|
|
extern const struct snd_soc_component_driver kirkwood_soc_component;
|
|
|
|
#endif
|