blob: 8199005382e0b3c0d62cd7e148265bf9953ee8c9 [file] [log] [blame] [edit]
/*
* Copyright (c) 2015, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __DRIVERS_SOUND_IPQ806X_REG_H__
#define __DRIVERS_SOUND_IPQ806X_REG_H__
#define IPQ806X_LCC_BASE 0x28000000
#define IPQ806X_LPAIF_BASE 0x28100000
#define IPQ806X_LPM_BASE 0x28400000
#define LPM_SIZE (4 * 1024)
#define LPAIF_BANK_OFFSET 0x1000
/* LCC MI2S Configuration/Control */
#define LCC_MI2S_NS_REG 0x48
#define LCC_MI2S_STAT_REG 0x50
#define LCC_MI2S_NS_OSR_CXC_MASK 0x20000
#define LCC_MI2S_NS_OSR_CXC_SHIFT 17
#define LCC_MI2S_NS_OSR_CXC_ENABLE (1 << LCC_MI2S_NS_OSR_CXC_SHIFT)
#define LCC_MI2S_NS_BIT_CXC_MASK 0x8000
#define LCC_MI2S_NS_BIT_CXC_SHIFT 15
#define LCC_MI2S_NS_BIT_CXC_ENABLE (1 << LCC_MI2S_NS_BIT_CXC_SHIFT)
#define LCC_MI2S_STAT_OSR_CLK_MASK 0x2
#define LCC_MI2S_STAT_OSR_CLK_SHIFT 1
#define LCC_MI2S_STAT_OSR_CLK_ON (1 << LCC_MI2S_STAT_OSR_CLK_SHIFT)
#define LCC_MI2S_STAT_BIT_CLK_MASK 0x1
#define LCC_MI2S_STAT_BIT_CLK_SHIFT 0
#define LCC_MI2S_STAT_BIT_CLK_ON (1 << LCC_MI2S_STAT_BIT_CLK_SHIFT)
/* LPAIF I2S Configuration/Control */
#define LPAIF_MI2S_CTL_OFFSET(x) (0x0010 + 0x4 * (x))
#define LPAIF_MI2SCTL_LB_SHIFT 15
#define LPAIF_MI2SCTL_LB (1 << LPAIF_MI2SCTL_LB_SHIFT)
#define LPAIF_MI2SCTL_SPKEN_SHIFT 14
#define LPAIF_MI2SCTL_SPKEN (1 << LPAIF_MI2SCTL_SPKEN_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_MASK 0x3C00
#define LPAIF_MI2SCTL_SPKMODE_SHIFT 10
#define LPAIF_MI2SCTL_SPKMODE_NONE (0 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_SD0 (1 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_SD1 (2 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_SD2 (3 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_SD3 (4 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_QUAD01 (5 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_QUAD23 (6 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_6CH (7 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMODE_8CH (8 << LPAIF_MI2SCTL_SPKMODE_SHIFT)
#define LPAIF_MI2SCTL_SPKMONO_MASK 0x0200
#define LPAIF_MI2SCTL_SPKMONO_SHIFT 9
#define LPAIF_MI2SCTL_SPKMONO_STEREO (0 << LPAIF_MI2SCTL_SPKMONO_SHIFT)
#define LPAIF_MI2SCTL_SPKMONO_MONO (1 << LPAIF_MI2SCTL_SPKMONO_SHIFT)
#define LPAIF_MI2SCTL_WS_SHIFT 2
#define LPAIF_MI2SCTL_WS (1 << LPAIF_MI2SCTL_WS_SHIFT)
#define LPAIF_MI2SCTL_BITWIDTH_MASK 0x3
#define LPAIF_MI2SCTL_BITWIDTH_SHIFT 0
#define LPAIF_MI2SCTL_BITWIDTH_16 (0 << LPAIF_MI2SCTL_BITWIDTH_SHIFT)
#define LPAIF_MI2SCTL_BITWIDTH_24 (1 << LPAIF_MI2SCTL_BITWIDTH_SHIFT)
#define LPAIF_MI2SCTL_BITWIDTH_32 (2 << LPAIF_MI2SCTL_BITWIDTH_SHIFT)
/* LPAIF DMA Configuration/Control */
#define LPAIF_DMA_BASE 0x6000
#define LPAIF_DMA_INDEX(ch) (LPAIF_BANK_OFFSET * (ch))
#define LPAIF_DMA_ADDR(ch, addr) (LPAIF_DMA_BASE \
+ (LPAIF_DMA_INDEX(ch) \
+ (addr)))
#define LPAIF_DMA_CTL(x) LPAIF_DMA_ADDR((x), 0x00)
#define LPAIF_DMA_BASEADDR(x) LPAIF_DMA_ADDR((x), 0x04)
#define LPAIF_DMA_BUFFLEN(x) LPAIF_DMA_ADDR((x), 0x08)
#define LPAIF_DMA_CURRADDR(x) LPAIF_DMA_ADDR((x), 0x0c)
#define LPAIF_DMA_PERLEN(x) LPAIF_DMA_ADDR((x), 0x10)
#define LPAIF_DMA_PERCNT(x) LPAIF_DMA_ADDR((x), 0x14)
#define LPAIF_DMA_FRM(x) LPAIF_DMA_ADDR((x), 0x18)
#define LPAIF_DMA_FRMCLR(x) LPAIF_DMA_ADDR((x), 0x1c)
#define LPAIF_DMA_SETBUFFCNT(x) LPAIF_DMA_ADDR((x), 0x20)
#define LPAIF_DMA_SETPERCNT(x) LPAIF_DMA_ADDR((x), 0x24)
#define LPAIF_DMACTL_BURST_EN_SHIFT 11
#define LPAIF_DMACTL_BURST_EN (1 << LPAIF_DMACTL_BURST_EN_SHIFT)
#define LPAIF_DMACTL_WPSCNT_MASK 0x700
#define LPAIF_DMACTL_WPSCNT_SHIFT 8
#define LPAIF_DMACTL_WPSCNT_SINGLE (0 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_WPSCNT_DOUBLE (1 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_WPSCNT_TRIPLE (2 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_WPSCNT_QUAD (3 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_WPSCNT_SIXPACK (5 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_WPSCNT_OCTAL (7 << LPAIF_DMACTL_WPSCNT_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_MASK 0x0F0
#define LPAIF_DMACTL_AUDIO_INTF_SHIFT 4
#define LPAIF_DMACTL_AUDIO_INTF_NONE (0 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_CODEC (1 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_PCM (2 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_SEC_I2S (3 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_MI2S (4 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_HDMI (5 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_MIXOUT (6 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_LB1 (7 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_AUDIO_INTF_LB2 (8 << LPAIF_DMACTL_AUDIO_INTF_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_MASK 0x00E
#define LPAIF_DMACTL_FIFO_WM_SHIFT 1
#define LPAIF_DMACTL_FIFO_WM_1 (0 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_2 (1 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_3 (2 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_4 (3 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_5 (4 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_6 (5 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_7 (6 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_FIFO_WM_8 (7 << LPAIF_DMACTL_FIFO_WM_SHIFT)
#define LPAIF_DMACTL_ENABLE_SHIFT 0
#define LPAIF_DMACTL_ENABLE (1 << LPAIF_DMACTL_ENABLE_SHIFT)
/* LPAIF DMA Interrupt Control */
#define LPAIF_DMAIRQ_BASE 0x3000
#define LPAIF_DMAIRQ_INDEX(x) (LPAIF_BANK_OFFSET * (x))
#define LPAIF_DMAIRQ_ADDR(irq, addr) (LPAIF_DMAIRQ_BASE \
+ LPAIF_DMAIRQ_INDEX(irq) \
+ (addr))
#define LPAIF_DMAIRQ_EN(x) LPAIF_DMAIRQ_ADDR((x), 0x00)
#define LPAIF_DMAIRQ_STAT(x) LPAIF_DMAIRQ_ADDR((x), 0x04)
#define LPAIF_DMAIRQ_RAW_STAT(x) LPAIF_DMAIRQ_ADDR((x), 0x08)
#define LPAIF_DMAIRQ_CLEAR(x) LPAIF_DMAIRQ_ADDR((x), 0x0c)
#define LPAIF_DMAIRQ_FORCE(x) LPAIF_DMAIRQ_ADDR((x), 0x10)
#define LPAIF_DMAIRQ_SHIFT 3
#define LPAIF_DMAIRQ_PER(x) (1 << (LPAIF_DMAIRQ_SHIFT * (x)))
#define LPAIF_DMAIRQ_XRUN(x) (2 << (LPAIF_DMAIRQ_SHIFT * (x)))
#define LPAIF_DMAIRQ_ERR(x) (4 << (LPAIF_DMAIRQ_SHIFT * (x)))
#define LPAIF_DMAIRQ_ALL(x) (7 << (LPAIF_DMAIRQ_SHIFT * (x)))
enum lpaif_i2s_interface_ports {
LPAIF_I2S_PORT_CODEC_SPK = 0,
LPAIF_I2S_PORT_CODEC_MIC = 1,
LPAIF_I2S_PORT_SEC_SPK = 2,
LPAIF_I2S_PORT_SEC_MIC = 3,
LPAIF_I2S_PORT_MI2S = 4,
};
enum lpaif_dma_interface_channels {
LPAIF_DMA_RD_CH_MI2S = 0,
LPAIF_DMA_RD_CH_PCM0 = 1,
LPAIF_DMA_RD_CH_PCM1 = 2,
LPAIF_DMA_WR_CH_PCM0 = 5,
LPAIF_DMA_WR_CH_PCM1 = 6,
LPAIF_DMA_WR_CH_MI2S = 6,
};
enum lpaif_dmairq_interface_receivers {
LPAIF_IRQ_RECV_HOST = 0,
LPAIF_IRQ_RECV_ADSP = 1,
LPAIF_IRQ_RECV_UNKN = 2,
};
#endif /* __DRIVERS_SOUND_IPQ806X_REG_H__ */