blob: b4d38b85ee6e0aaebdd309fcabb377d27c98d984 [file] [log] [blame]
/*
* sound/soc/amlogic/meson/audio_hw.h
*
* Copyright (C) 2017 Amlogic, Inc. All rights reserved.
*
* 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.
*
*/
#ifndef __AML_AUDIO_HW_H__
#define __AML_AUDIO_HW_H__
#include "sound/asound.h"
#include <linux/amlogic/media/sound/spdif_info.h>
#define AUDIO_CLK_GATE_ON(a) CLK_GATE_ON(a)
#define AUDIO_CLK_GATE_OFF(a) CLK_GATE_OFF(a)
struct _aiu_clk_setting_t {
unsigned short pll;
unsigned short mux;
unsigned short devisor;
};
struct audio_output_config_t {
/* audio clock */
unsigned short clock;
/* analog output */
unsigned short i2s_mode;
unsigned short i2s_dac_mode;
unsigned short i2s_preemphsis;
/* digital output */
unsigned short i958_buf_start_addr;
unsigned short i958_buf_blksize;
unsigned short i958_int_flag;
unsigned short i958_mode;
unsigned short i958_sync_mode;
unsigned short i958_preemphsis;
unsigned short i958_copyright;
unsigned short bpf;
unsigned short brst;
unsigned short length;
unsigned short paddsize;
struct iec958_chsts chan_status;
};
struct _aiu_958_raw_setting_t {
unsigned short int_flag;
unsigned short bpf;
unsigned short brst;
unsigned short length;
unsigned short paddsize;
struct iec958_chsts *chan_stat;
};
struct aml_chipset_info {
/* is tv chipset */
bool is_tv_chipset;
/* audin clk support */
bool audin_clk_support;
/* audin(i2s in) for external codec */
bool audin_ext_support;
/* audin (i2s in) check l/r invert */
bool audin_lr_invert;
/* aud_buf gate is removed*/
bool audbuf_gate_rm;
/* split mode supoort completely */
bool split_complete;
/* spdif pao mode */
bool spdif_pao;
/* spdif in 88k/176k*/
bool spdifin_more_rate;
/* cpudai fmt polarity */
unsigned int fmt_polarity;
};
enum {
I2SIN_MASTER_MODE = 0,
I2SIN_SLAVE_MODE = 1 << 0,
SPDIFIN_MODE = 1 << 1,
};
enum {
AML_AUDIO_NA = 0,
AML_AUDIO_SPDIFIN = 1 << 0,
AML_AUDIO_SPDIFOUT = 1 << 1,
AML_AUDIO_I2SIN = 1 << 2,
AML_AUDIO_I2SOUT = 1 << 3,
AML_AUDIO_PCMIN = 1 << 4,
AML_AUDIO_PCMOUT = 1 << 5,
AML_AUDIO_I2SIN2 = 1 << 6,
};
#define AUDIO_CLK_256FS 0
#define AUDIO_CLK_384FS 1
#define AUDIO_CLK_FREQ_192 0
#define AUDIO_CLK_FREQ_1764 1
#define AUDIO_CLK_FREQ_96 2
#define AUDIO_CLK_FREQ_882 3
#define AUDIO_CLK_FREQ_48 4
#define AUDIO_CLK_FREQ_441 5
#define AUDIO_CLK_FREQ_32 6
#define AUDIO_CLK_FREQ_8 7
#define AUDIO_CLK_FREQ_11 8
#define AUDIO_CLK_FREQ_12 9
#define AUDIO_CLK_FREQ_16 10
#define AUDIO_CLK_FREQ_22 11
#define AUDIO_CLK_FREQ_24 12
#define AIU_958_MODE_RAW 0
#define AIU_958_MODE_PCM16 1
#define AIU_958_MODE_PCM24 2
#define AIU_958_MODE_PCM32 3
#define AIU_958_MODE_PCM_RAW 4
#define AIU_I2S_MODE_PCM16 0
#define AIU_I2S_MODE_PCM24 2
#define AIU_I2S_MODE_PCM32 3
#define AUDIO_ALGOUT_DAC_FORMAT_DSP 0
#define AUDIO_ALGOUT_DAC_FORMAT_LEFT_JUSTIFY 1
#ifdef CONFIG_AMLOGIC_SND_SPLIT_MODE
#define DEFAULT_PLAYBACK_SIZE 256
#else
#define DEFAULT_PLAYBACK_SIZE 64
#endif
extern unsigned int IEC958_MODE;
extern unsigned int I2S_MODE;
extern unsigned int audio_in_source;
extern unsigned int bSpdifIN_PAO;
void audio_set_aiubuf(u32 addr, u32 size, unsigned int channel,
snd_pcm_format_t format);
void audio_set_958outbuf(u32 addr, u32 size, int flag);
void audio_in_i2s_set_buf(u32 addr, u32 size, u32 i2s_mode,
u32 i2s_sync, u32 din_sel, u32 ch, snd_pcm_format_t format);
void audio_in_spdif_set_buf(u32 addr, u32 size, u32 src);
void audio_in_i2s2_set_buf(u32 addr, u32 size, u32 src, u32 ch);
void audio_in_i2s_enable(int flag);
void audio_in_spdif_enable(int flag);
void audio_in_i2s2_enable(int flag);
unsigned int audio_in_i2s_rd_ptr(void);
unsigned int audio_in_i2s_wr_ptr(void);
unsigned int audio_in_i2s2_wr_ptr(void);
unsigned int audio_in_spdif_wr_ptr(void);
#ifdef CONFIG_AMLOGIC_SND_SPLIT_MODE
void audio_set_i2s_mode(u32 mode, unsigned int channel);
#else
void audio_set_i2s_mode(u32 mode);
#endif
void audio_set_i2s_clk_div(void);
void audio_set_spdif_clk_div(uint div);
void audio_enable_output(int flag);
unsigned int read_i2s_rd_ptr(void);
void audio_i2s_unmute(void);
void audio_i2s_mute(void);
void aml_audio_i2s_unmute(void);
void aml_audio_i2s_mute(void);
void audio_util_set_i2s_format(unsigned int format);
void audio_util_set_dac_958_format(unsigned int format);
void audio_set_958_mode(
unsigned int mode,
struct _aiu_958_raw_setting_t *set);
unsigned int read_i2s_mute_swap_reg(void);
void audio_i2s_swap_left_right(unsigned int flag);
int if_audio_out_enable(void);
int if_audio_in_i2s_enable(void);
int if_audio_in_spdif_enable(void);
void audio_out_i2s_enable(unsigned int flag);
void audio_hw_958_enable(unsigned int flag);
void audio_out_enabled(int flag);
unsigned int audio_hdmi_init_ready(void);
unsigned int read_iec958_rd_ptr(void);
void audio_in_spdif_enable(int flag);
unsigned int audio_spdifout_pg_enable(unsigned char enable);
unsigned int audio_aiu_pg_enable(unsigned char enable);
void audio_mute_left_right(unsigned int flag);
void audio_i2s_958_same_source(unsigned int same);
void set_hdmi_tx_clk_source(int source);
extern void audio_in_clk_sel(void);
extern void aml_chipset_update_info(struct aml_chipset_info *chipset_info);
extern bool is_meson_tv_chipset(void);
extern bool is_audin_ext_support(void);
extern bool is_audin_lr_invert_check(void);
extern bool is_audbuf_gate_rm(void);
extern void chipset_set_spdif_pao(void);
extern unsigned int IEC958_mode_codec;
extern unsigned int clk81;
/* OVERCLOCK == 1, our SOC privide 512fs mclk;
* DOWNCLOCK == 1, 128fs;
* normal mclk : 256fs
*/
#define OVERCLOCK 0
#define DOWNCLOCK 0
#define IEC958_OVERCLOCK 1
#if (OVERCLOCK == 1)
#define MCLKFS_RATIO 512
#elif (DOWNCLOCK == 1)
#define MCLKFS_RATIO 128
#else
#define MCLKFS_RATIO 256
#endif
#define DEFAULT_SAMPLERATE 48000
#define DEFAULT_MCLK_RATIO_SR MCLKFS_RATIO
#define I2S_PLL_SRC 1 /* MPLL0 */
#define MPLL_I2S_CNTL HHI_MPLL_MP0
#define I958_PLL_SRC 2 /* MPLL1 */
#define MPLL_958_CNTL HHI_MPLL_MP1
#endif