blob: 5f4b7ceafd1440d9fe0af383991efda7b93da83e [file] [log] [blame]
/*
* linux/sound/soc/codecs/tlv320aic326x.h
*
* Copyright (C) 2011 Mistral Solutions Pvt Ltd.
*
* Based on sound/soc/codecs/tlv320aic3262.c
*
* This package 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.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* The TLV320AIC3262 is a flexible, low-power, low-voltage stereo audio
* codec with digital microphone inputs and programmable outputs.
*
* History:
*
* Rev 0.1 ASoC driver support Mistral 20-01-2011
*
* The AIC325x ASoC driver is ported for the codec AIC3262.
* Rev 0.2 ASoC driver support Mistral 21-03-2011
* The AIC326x ASoC driver is updated for linux 2.6.32 Kernel.
* Rev 0.3 ASoC driver support Mistral 20-04-2011
* The AIC326x ASoC driver is ported to 2.6.35 omap4 kernel
*/
#ifndef _TLV320AIC3262_H
#define _TLV320AIC3262_H
#ifdef DEBUG
#define dprintk(x...) printk(x)
#define DBG(x...) printk(x)
#else
#define dprintk(x...)
#define DBG(x...)
#endif
#define AUDIO_NAME "aic3262"
#define AIC3262_VERSION "1.1"
/* Macro to enable the inclusion of tiload kernel driver */
//#define AIC3262_TiLoad
/* Macro enables or disables support for miniDSP in the driver */
/* Enable the AIC3262_TiLoad macro first before enabling these macros */
//#define CONFIG_MINI_DSP
#undef CONFIG_MINI_DSP
//#define MULTIBYTE_CONFIG_SUPPORT
#undef MULTIBYTE_CONFIG_SUPPORT
/* Macro for McBsp master / slave configuration */
#define AIC3262_MCBSP_SLAVE /*3262 master*/
//#undef AIC3262_MCBSP_SLAVE
/* Enable this macro allow for different ASI formats */
//#define ASI_MULTI_FMT
#undef ASI_MULTI_FMT
/* Enable register caching on write */
//#define EN_REG_CACHE
/* Enable Headset Detection */
//#define HEADSET_DETECTION
#undef HEADSET_DETECTION
/* Enable or disable controls to have Input routing*/
//#define FULL_IN_CNTL
#undef FULL_IN_CNTL
/* AIC3262 supported sample rate are 8k to 192k */
#define AIC3262_RATES SNDRV_PCM_RATE_8000_192000
/* AIC3262 supports the word formats 16bits, 20bits, 24bits and 32 bits */
#define AIC3262_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE \
| SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
#define AIC3262_FREQ_12000000 12000000
#define AIC3262_FREQ_19200000 19200000
#define AIC3262_FREQ_24000000 24000000
#define AIC3262_FREQ_38400000 38400000
/* Audio data word length = 16-bits (default setting) */
#define AIC3262_WORD_LEN_16BITS 0x00
#define AIC3262_WORD_LEN_20BITS 0x01
#define AIC3262_WORD_LEN_24BITS 0x02
#define AIC3262_WORD_LEN_32BITS 0x03
/* sink: name of target widget */
#define AIC3262_WIDGET_NAME 0
/* control: mixer control name */
#define AIC3262_CONTROL_NAME 1
/* source: name of source name */
#define AIC3262_SOURCE_NAME 2
/* D15..D8 aic3262 register offset */
#define AIC3262_REG_OFFSET_INDEX 0
/* D7...D0 register data */
#define AIC3262_REG_DATA_INDEX 1
/* Serial data bus uses I2S mode (Default mode) */
#define AIC3262_I2S_MODE 0x00
#define AIC3262_DSP_MODE 0x01
#define AIC3262_RIGHT_JUSTIFIED_MODE 0x02
#define AIC3262_LEFT_JUSTIFIED_MODE 0x03
/* 8 bit mask value */
#define AIC3262_8BITS_MASK 0xFF
/* shift value for CLK_REG_3 register */
#define CLK_REG_3_SHIFT 6
/* shift value for DAC_OSR_MSB register */
#define DAC_OSR_MSB_SHIFT 4
/* number of codec specific register for configuration */
#define NO_FEATURE_REGS 2
/* AIC3262 register space */
#define AIC3262_CACHEREGNUM 1024 /* Updated from 256 to support Page 3 registers */
/* ****************** Book 0 Registers **************************************/
/* ****************** Page 0 Registers **************************************/
#define PAGE_SEL_REG 0
#define RESET_REG 1
#define DAC_ADC_CLKIN_REG 4
#define PLL_CLKIN_REG 5
#define PLL_CLK_RANGE_REG 5
#define PLL_PR_POW_REG 6
#define PLL_J_REG 7
#define PLL_D_MSB 8
#define PLL_D_LSB 9
#define PLL_CKIN_DIV 10
#define NDAC_DIV_POW_REG 11
#define MDAC_DIV_POW_REG 12
#define DOSR_MSB_REG 13
#define DOSR_LSB_REG 14
#define NADC_DIV_POW_REG 18
#define MADC_DIV_POW_REG 19
#define AOSR_REG 20
#define CLKOUT_MUX 21
#define CLKOUT_MDIV_VAL 22
#define TIMER_REGISTER 23
#define LF_CLK_CNTL 24
#define HF_CLK_CNTL_R1 25
#define HF_CLK_CNTL_R2 26
#define HF_CLK_CNTL_R3 27
#define HF_CLK_CNTL_R4 28
#define HF_CLK_TRIM_R1 29
#define HF_CLK_TRIM_R2 30
#define HF_CLK_TRIM_R3 31
#define HF_CLK_TRIM_R4 32
#define STICKY_FLAG2 44
#define INT_FLAG2 46
#define INT1_CNTL 48
#define INT2_CNTL 49
#define INT_FMT 51
#define DAC_PRB 60
#define ADC_PRB 61
#define PASI_DAC_DP_SETUP 63
#define DAC_MVOL_CONF 64
#define DAC_LVOL 65
#define DAC_RVOL 66
#define HP_DETECT 67
#define DRC_CNTL_R1 68
#define DRC_CNTL_R2 69
#define DRC_CNTL_R3 70
#define BEEP_CNTL_R1 71
#define BEEP_CNTL_R2 72
#define ADC_CHANNEL_POW 81
#define ADC_FINE_GAIN 82
#define LADC_VOL 83
#define RADC_VOL 84
#define ADC_PHASE 85
#define LAGC_CNTL 86
#define LAGC_CNTL_R2 87
#define LAGC_CNTL_R3 88
#define LAGC_CNTL_R4 89
#define LAGC_CNTL_R5 90
#define LAGC_CNTL_R6 91
#define LAGC_CNTL_R7 92
#define LAGC_CNTL_R8 93
#define RAGC_CNTL 94
#define RAGC_CNTL_R2 95
#define RAGC_CNTL_R3 96
#define RAGC_CNTL_R4 97
#define RAGC_CNTL_R5 98
#define RAGC_CNTL_R6 99
#define RAGC_CNTL_R7 100
#define RAGC_CNTL_R8 101
#define MINIDSP_ACCESS_CTRL 121
/* ****************** Page 1 Registers **************************************/
#define PAGE_1 128
#define POWER_CONF (PAGE_1 + 1)
#define LDAC_PTM (PAGE_1 + 3)
#define RDAC_PTM (PAGE_1 + 4)
#define CM_REG (PAGE_1 + 8)
#define HP_CTL (PAGE_1 + 9)
#define HP_DEPOP (PAGE_1 + 11)
#define RECV_DEPOP (PAGE_1 + 12)
#define MA_CNTL (PAGE_1 + 17)
#define LADC_PGA_MAL_VOL (PAGE_1 + 18)
#define RADC_PGA_MAR_VOL (PAGE_1 + 19)
#define LINE_AMP_CNTL_R1 (PAGE_1 + 22)
#define LINE_AMP_CNTL_R2 (PAGE_1 + 23)
#define HP_AMP_CNTL_R1 (PAGE_1 + 27)
#define HP_AMP_CNTL_R2 (PAGE_1 + 28)
#define HP_AMP_CNTL_R3 (PAGE_1 + 29)
#define HPL_VOL (PAGE_1 + 31)
#define HPR_VOL (PAGE_1 + 32)
#define Charge_Pump_Control_1 (PAGE_1 + 33)
#define INT1_SEL_L (PAGE_1 + 34)
#define Charge_Pump_Control_3 (PAGE_1 + 35)
#define RAMP_CNTL_R1 (PAGE_1 + 36)
#define RAMP_CNTL_R2 (PAGE_1 + 37)
#define INT1_SEL_RM (PAGE_1 + 39)
#define REC_AMP_CNTL_R5 (PAGE_1 + 40)
#define RAMPR_VOL (PAGE_1 + 41)
#define RAMP_TIME_CNTL (PAGE_1 + 42)
#define SPK_AMP_CNTL_R1 (PAGE_1 + 45)
#define SPK_AMP_CNTL_R2 (PAGE_1 + 46)
#define SPK_AMP_CNTL_R3 (PAGE_1 + 47)
#define SPK_AMP_CNTL_R4 (PAGE_1 + 48)
#define MIC_BIAS_CNTL (PAGE_1 + 51)
#define LMIC_PGA_PIN (PAGE_1 + 52)
#define LMIC_PGA_PM_IN4 (PAGE_1 + 53)
#define LMIC_PGA_MIN (PAGE_1 + 54)
#define RMIC_PGA_PIN (PAGE_1 + 55)
#define RMIC_PGA_PM_IN4 (PAGE_1 + 56)
#define RMIC_PGA_MIN (PAGE_1 + 57)
/* MIC PGA Gain Registers */
#define MICL_PGA (PAGE_1 + 59)
#define MICR_PGA (PAGE_1 + 60)
#define PAGE1_82 (PAGE_1 + 82)
#define PAGE1_83 (PAGE_1 + 83)
#define MIC_PWR_DLY (PAGE_1 + 121)
#define REF_PWR_DLY (PAGE_1 + 122)
/* ****************** Page 4 Registers **************************************/
#define PAGE_4 512
#define ASI1_BUS_FMT (PAGE_4 + 1)
#define ASI1_LCH_OFFSET (PAGE_4 + 2)
#define ASI1_RCH_OFFSET (PAGE_4 + 3)
#define ASI1_CHNL_SETUP (PAGE_4 + 4)
#define ASI1_MULTI_CH_SETUP_R1 (PAGE_4 + 5)
#define ASI1_MULTI_CH_SETUP_R2 (PAGE_4 + 6)
#define ASI1_ADC_INPUT_CNTL (PAGE_4 + 7)
#define ASI1_DAC_OUT_CNTL (PAGE_4 + 8)
#define ASI1_ADC_OUT_TRISTATE (PAGE_4 + 9)
#define ASI1_BWCLK_CNTL_REG (PAGE_4 + 10)
#define ASI1_BCLK_N_CNTL (PAGE_4 + 11)
#define ASI1_BCLK_N (PAGE_4 + 12)
#define ASI1_WCLK_N (PAGE_4 + 13)
#define ASI1_BWCLK_OUT_CNTL (PAGE_4 + 14)
#define ASI2_BUS_FMT (PAGE_4 + 17)
#define ASI2_BWCLK_CNTL_REG (PAGE_4 + 26)
#define ASI2_BCLK_N_CNTL (PAGE_4 + 27)
#define ASI2_BCLK_N (PAGE_4 + 28)
#define ASI2_WCLK_N (PAGE_4 + 29)
#define ASI2_BWCLK_OUT_CNTL (PAGE_4 + 30)
#define GPIO1_IO_CNTL (PAGE_4 + 86)
#define GPIO2_IO_CNTL (PAGE_4 + 87)
#define GPI1_EN (PAGE_4 + 91)
#define GPO2_EN (PAGE_4 + 92)
#define GPO1_OUT_CNTL (PAGE_4 + 96)
/**************************** ************************************/
/*
*****************************************************************************
* Structures Definitions
*****************************************************************************
*/
/*
*----------------------------------------------------------------------------
* @struct aic3262_setup_data |
* i2c specific data setup for AIC3262.
* @field unsigned short |i2c_address |
* Unsigned short for i2c address.
*----------------------------------------------------------------------------
*/
struct aic3262_setup_data {
unsigned short i2c_address;
};
/*
*----------------------------------------------------------------------------
* @struct aic3262_priv |
* AIC3262 priviate data structure to set the system clock, mode and
* page number.
* @field u32 | sysclk |
* system clock
* @field s32 | master |
* master/slave mode setting for AIC3262
* @field u8 | book_no |
* book number.
* @field u8 | page_no |
* page number. Here, page 0 and page 1 are used.
*----------------------------------------------------------------------------
*/
struct aic3262_priv {
u32 sysclk;
s32 master;
u8 book_no;
u8 page_no;
u8 process_flow;
u8 mute_codec;
u8 stream_status;
int current_dac_config[2];
int current_adc_config[2];
};
/*
*----------------------------------------------------------------------------
* @struct aic3262_configs |
* AIC3262 initialization data which has register offset and register
* value.
* @field u8 | book_no |
* AIC3262 Book Number Offsets required for initialization..
* @field u16 | reg_offset |
* AIC3262 Register offsets required for initialization..
* @field u8 | reg_val |
* value to set the AIC3262 register to initialize the AIC3262.
*----------------------------------------------------------------------------
*/
struct aic3262_configs {
u8 book_no;
u16 reg_offset;
u8 reg_val;
};
struct aic3262_configs_read {
u8 book_no;
u16 reg_offset;
};
/*
*----------------------------------------------------------------------------
* @struct aic3262_rate_divs |
* Setting up the values to get different freqencies
*
* @field u32 | mclk |
* Master clock
* @field u32 | rate |
* sample rate
* @field u8 | p_val |
* value of p in PLL
* @field u32 | pll_j |
* value for pll_j
* @field u32 | pll_d |
* value for pll_d
* @field u32 | dosr |
* value to store dosr
* @field u32 | ndac |
* value for ndac
* @field u32 | mdac |
* value for mdac
* @field u32 | aosr |
* value for aosr
* @field u32 | nadc |
* value for nadc
* @field u32 | madc |
* value for madc
* @field u32 | blck_N |
* value for block N
* @field u32 | aic3262_configs |
* configurations for aic3262 register value
*----------------------------------------------------------------------------
*/
struct aic3262_rate_divs {
u32 mclk;
u32 rate;
u8 p_val;
u8 pll_j;
u16 pll_d;
u16 dosr;
u8 ndac;
u8 mdac;
u8 aosr;
u8 nadc;
u8 madc;
u8 blck_N;
struct aic3262_configs codec_specific_regs[NO_FEATURE_REGS];
};
/*
*----------------------------------------------------------------------------
* @struct snd_soc_codec_dai |
* It is SoC Codec DAI structure which has DAI capabilities viz.,
* playback and capture, DAI runtime information viz. state of DAI
* and pop wait state, and DAI private data.
*----------------------------------------------------------------------------
*/
extern struct snd_soc_dai tlv320aic3262_dai;
/*
*----------------------------------------------------------------------------
* @struct snd_soc_codec_device |
* This structure is soc audio codec device sturecute which pointer
* to basic functions aic3262_probe(), aic3262_remove(),
* aic3262_suspend() and aic3262_resume()
*
*/
extern struct snd_soc_codec_device soc_codec_dev_aic3262;
#endif /* _TLV320AIC3262_H */