blob: 47ee21a8e7c11b1e900d6dcb6e3c035cc9a4245f [file] [log] [blame]
/*
* arch/arm/plat-ambarella/include/plat/audio.h
*
* Author: Anthony Ginger <hfjiang@ambarella.com>
*
* Copyright (C) 2004-2010, Ambarella, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef __PLAT_AMBARELLA_AUDIO_H__
#define __PLAT_AMBARELLA_AUDIO_H__
/* ==========================================================================*/
#if (CHIP_REV == S2L) || (CHIP_REV == S3) || (CHIP_REV == S3L)
#define I2S_OFFSET 0x1A000
#else
#define I2S_OFFSET 0xA000
#endif
#define I2S_BASE (AHB_BASE + I2S_OFFSET)
#define I2S_BASE_PHYS (AHB_PHYS_BASE + I2S_OFFSET)
#define I2S_REG(x) (I2S_BASE + (x))
#define I2S_REG_PHYS(x) (I2S_BASE_PHYS + (x))
/* ==========================================================================*/
#define I2S_MODE_OFFSET 0x00
#define I2S_RX_CTRL_OFFSET 0x04
#define I2S_TX_CTRL_OFFSET 0x08
#define I2S_WLEN_OFFSET 0x0c
#define I2S_WPOS_OFFSET 0x10
#define I2S_SLOT_OFFSET 0x14
#define I2S_TX_FIFO_LTH_OFFSET 0x18
#define I2S_RX_FIFO_GTH_OFFSET 0x1c
#define I2S_CLOCK_OFFSET 0x20
#define I2S_INIT_OFFSET 0x24
#define I2S_TX_STATUS_OFFSET 0x28
#define I2S_TX_LEFT_DATA_OFFSET 0x2c
#define I2S_TX_RIGHT_DATA_OFFSET 0x30
#define I2S_RX_STATUS_OFFSET 0x34
#define I2S_RX_DATA_OFFSET 0x38
#define I2S_TX_FIFO_CNTR_OFFSET 0x3c
#define I2S_RX_FIFO_CNTR_OFFSET 0x40
#define I2S_TX_INT_ENABLE_OFFSET 0x44
#define I2S_RX_INT_ENABLE_OFFSET 0x48
#define I2S_RX_ECHO_OFFSET 0x4c
#define I2S_24BITMUX_MODE_OFFSET 0x50
#define I2S_GATEOFF_OFFSET 0x54
#define I2S_CHANNEL_SELECT_OFFSET 0x58
#define I2S_RX_DATA_DMA_OFFSET 0x80
#define I2S_TX_LEFT_DATA_DMA_OFFSET 0xc0
#define I2S_MODE_REG I2S_REG(0x00)
#define I2S_RX_CTRL_REG I2S_REG(0x04)
#define I2S_TX_CTRL_REG I2S_REG(0x08)
#define I2S_WLEN_REG I2S_REG(0x0c)
#define I2S_WPOS_REG I2S_REG(0x10)
#define I2S_SLOT_REG I2S_REG(0x14)
#define I2S_TX_FIFO_LTH_REG I2S_REG(0x18)
#define I2S_RX_FIFO_GTH_REG I2S_REG(0x1c)
#define I2S_CLOCK_REG I2S_REG(0x20)
#define I2S_INIT_REG I2S_REG(0x24)
#define I2S_TX_STATUS_REG I2S_REG(0x28)
#define I2S_TX_LEFT_DATA_REG I2S_REG(0x2c)
#define I2S_TX_RIGHT_DATA_REG I2S_REG(0x30)
#define I2S_RX_STATUS_REG I2S_REG(0x34)
#define I2S_RX_DATA_REG I2S_REG(0x38)
#define I2S_TX_FIFO_CNTR_REG I2S_REG(0x3c)
#define I2S_RX_FIFO_CNTR_REG I2S_REG(0x40)
#define I2S_TX_INT_ENABLE_REG I2S_REG(0x44)
#define I2S_RX_INT_ENABLE_REG I2S_REG(0x48)
#define I2S_RX_ECHO_REG I2S_REG(0x4c)
#define I2S_24BITMUX_MODE_REG I2S_REG(0x50)
#define I2S_GATEOFF_REG I2S_REG(0x54)
#define I2S_CHANNEL_SELECT_REG I2S_REG(0x58)
#define I2S_RX_DATA_DMA_REG I2S_REG_PHYS(0x80)
#define I2S_TX_LEFT_DATA_DMA_REG I2S_REG_PHYS(0xc0)
#define I2S_LEFT_JUSTIFIED_MODE 0x0
#define I2S_RIGHT_JUSTIFIED_MODE 0x1
#define I2S_MSB_EXTEND_MODE 0x2
#define I2S_I2S_MODE 0x4
#define I2S_DSP_MODE 0x6
#define I2S_TX_FIFO_RESET_BIT (1 << 4)
#define I2S_RX_FIFO_RESET_BIT (1 << 3)
#define I2S_TX_ENABLE_BIT (1 << 2)
#define I2S_RX_ENABLE_BIT (1 << 1)
#define I2S_FIFO_RESET_BIT (1 << 0)
#define I2S_RX_LOOPBACK_BIT (1 << 3)
#define I2S_RX_ORDER_BIT (1 << 2)
#define I2S_RX_WS_MST_BIT (1 << 1)
#define I2S_RX_WS_INV_BIT (1 << 0)
#define I2S_TX_LOOPBACK_BIT (1 << 7)
#define I2S_TX_ORDER_BIT (1 << 6)
#define I2S_TX_WS_MST_BIT (1 << 5)
#define I2S_TX_WS_INV_BIT (1 << 4)
#define I2S_TX_UNISON_BIT (1 << 3)
#define I2S_TX_MUTE_BIT (1 << 2)
#define I2S_TX_MONO_MASK 0xfffffffc
#define I2S_TX_MONO_RIGHT (1 << 1)
#define I2S_TX_MONO_LEFT (1 << 0)
#define I2S_CLK_WS_OUT_EN (1 << 9)
#define I2S_CLK_BCLK_OUT_EN (1 << 8)
#define I2S_CLK_BCLK_OUTPUT (1 << 7)
#define I2S_CLK_MASTER_MODE (I2S_CLK_WS_OUT_EN | \
I2S_CLK_BCLK_OUT_EN | \
I2S_CLK_BCLK_OUTPUT)
#define I2S_CLK_TX_PO_FALL (1 << 6)
#define I2S_CLK_RX_PO_FALL (1 << 5)
#define I2S_CLK_DIV_MASK 0xffffffe0
#define I2S_RX_SHIFT_ENB (1 << 1)
#define I2S_TX_SHIFT_ENB (1 << 0)
#define I2S_2CHANNELS_ENB 0x00
#define I2S_4CHANNELS_ENB 0x01
#define I2S_6CHANNELS_ENB 0x02
#define I2S_FIFO_THRESHOLD_INTRPT 0x08
#define I2S_FIFO_FULL_INTRPT 0x02
#define I2S_FIFO_EMPTY_INTRPT 0x01
/* I2S_24BITMUX_MODE_REG */
#define I2S_24BITMUX_MODE_ENABLE 0x1
#define I2S_24BITMUX_MODE_FDMA_BURST_DIS 0x2
#define I2S_24BITMUX_MODE_RST_CHAN0 0x4
#define I2S_24BITMUX_MODE_DMA_BOOTSEL 0x8
/* ==========================================================================*/
#define DAI_CLOCK_MASK 0x0000001f
#define MAX_MCLK_IDX_NUM 15
/* ==========================================================================*/
#ifndef __ASSEMBLER__
struct notifier_block;
struct ambarella_i2s_interface {
u32 state;
u32 mode;
u32 clksrc;
u32 mclk;
u32 div;
u32 sfreq;
u32 channels;
u32 word_len;
u32 word_pos;
u32 slots;
u32 rx_ctrl;
u32 tx_ctrl;
u32 rx_fifo_len;
u32 tx_fifo_len;
u32 multi24;
u32 shift;
};
enum Audio_Notify_Type
{
AUDIO_NOTIFY_UNKNOWN,
AUDIO_NOTIFY_INIT,
AUDIO_NOTIFY_SETHWPARAMS,
AUDIO_NOTIFY_REMOVE
};
#define AMBARELLA_CLKSRC_ONCHIP 0x0
#define AMBARELLA_CLKSRC_SP_CLK 0x1
#define AMBARELLA_CLKSRC_CLK_SI 0x2
#define AMBARELLA_CLKSRC_EXTERNAL 0x3
#define AMBARELLA_CLKSRC_LVDS_IDSP_SCLK 0x4
#define AMBARELLA_CLKDIV_LRCLK 0
/* ==========================================================================*/
extern int ambarella_init_audio(void);
extern void ambarella_audio_notify_transition(
struct ambarella_i2s_interface *data, unsigned int type);
extern int ambarella_audio_register_notifier(struct notifier_block *nb);
extern int ambarella_audio_unregister_notifier(struct notifier_block *nb);
extern struct ambarella_i2s_interface get_audio_i2s_interface(void);
#endif /* __ASSEMBLER__ */
/* ==========================================================================*/
#endif /* __PLAT_AMBARELLA_AUDIO_H__ */