/*
* da732x.c --- Dialog DA732X ALSA SoC Audio Driver
*
* Copyright (C) 2012 Dialog Semiconductor GmbH
*
* Author: Michal Hajduk <Michal.Hajduk@diasemi.com>
*
* This program 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.
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-dapm.h>
#include <sound/initval.h>
#include <sound/tlv.h>
#include <asm/div64.h>
#include "da732x.h"
#include "da732x_reg.h"
struct da732x_priv {
struct regmap *regmap;
unsigned int sysclk;
bool pll_en;
};
/*
* da732x register cache - default settings
*/
static const struct reg_default da732x_reg_cache[] = {
{ DA732X_REG_REF1 , 0x02 },
{ DA732X_REG_BIAS_EN , 0x80 },
{ DA732X_REG_BIAS1 , 0x00 },
{ DA732X_REG_BIAS2 , 0x00 },
{ DA732X_REG_BIAS3 , 0x00 },
{ DA732X_REG_BIAS4 , 0x00 },
{ DA732X_REG_MICBIAS2 , 0x00 },
{ DA732X_REG_MICBIAS1 , 0x00 },
{ DA732X_REG_MICDET , 0x00 },
{ DA732X_REG_MIC1_PRE , 0x01 },
{ DA732X_REG_MIC1 , 0x40 },
{ DA732X_REG_MIC2_PRE , 0x01 },
{ DA732X_REG_MIC2 , 0x40 },
{ DA732X_REG_AUX1L , 0x75 },
{ DA732X_REG_AUX1R , 0x75 },
{ DA732X_REG_MIC3_PRE , 0x01 },
{ DA732X_REG_MIC3 , 0x40 },
{ DA732X_REG_INP_PINBIAS , 0x00 },
{ DA732X_REG_INP_ZC_EN , 0x00 },
{ DA732X_REG_INP_MUX , 0x50 },
{ DA732X_REG_HP_DET , 0x00 },
{ DA732X_REG_HPL_DAC_OFFSET , 0x00 },
{ DA732X_REG_HPL_DAC_OFF_CNTL , 0x00 },
{ DA732X_REG_HPL_OUT_OFFSET , 0x00 },
{ DA732X_REG_HPL , 0x40 },
{ DA732X_REG_HPL_VOL , 0x0F },
{ DA732X_REG_HPR_DAC_OFFSET , 0x00 },
{ DA732X_REG_HPR_DAC_OFF_CNTL , 0x00 },
{ DA732X_REG_HPR_OUT_OFFSET , 0x00 },
{ DA732X_REG_HPR , 0x40 },
{ DA732X_REG_HPR_VOL , 0x0F },
{ DA732X_REG_LIN2 , 0x4F },
{ DA732X_REG_LIN3 , 0x4F },
{ DA732X_REG_LIN4 , 0x4F },
{ DA732X_REG_OUT_ZC_EN , 0x00 },
{ DA732X_REG_HP_LIN1_GNDSEL , 0x00 },
{ DA732X_REG_CP_HP1 , 0x0C },
{ DA732X_REG_CP_HP2 , 0x03 },
{ DA732X_REG_CP_CTRL1 , 0x00 },
{ DA732X_REG_CP_CTRL2 , 0x99 },
{ DA732X_REG_CP_CTRL3 , 0x25 },
{ DA732X_REG_CP_LEVEL_MASK , 0x3F },
{ DA732X_REG_CP_DET , 0x00 },
{ DA732X_REG_CP_STATUS , 0x00 },
{ DA732X_REG_CP_THRESH1 , 0x00 },
{ DA732X_REG_CP_THRESH2 , 0x00 },
{ DA732X_REG_CP_THRESH3 , 0x00 },
{ DA732X_REG_CP_THRESH4 , 0x00 },
{ DA732X_REG_CP_THRESH5 , 0x00 },
{ DA732X_REG_CP_THRESH6 , 0x00 },
{ DA732X_REG_CP_THRESH7 , 0x00 },
{ DA732X_REG_CP_THRESH8 , 0x00 },
{ DA732X_REG_PLL_DIV_LO , 0x00 },
{ DA732X_REG_PLL_DIV_MID , 0x00 },
{ DA732X_REG_PLL_DIV_HI , 0x00 },
{ DA732X_REG_PLL_CTRL , 0x02 },
{ DA732X_REG_CLK_CTRL , 0xaa },
{ DA732X_REG_CLK_DSP , 0x07 },
{ DA732X_REG_CLK_EN1 , 0x00 },
{ DA732X_REG_CLK_EN2 , 0x00 },
{ DA732X_REG_CLK_EN3 , 0x00 },
{ DA732X_REG_CLK_EN4 , 0x00 },
{ DA732X_REG_CLK_EN5 , 0x00 },
{ DA732X_REG_AIF_MCLK , 0x00 },
{ DA732X_REG_AIFA1 , 0x02 },
{ DA732X_REG_AIFA2 , 0x00 },
{ DA732X_REG_AIFA3 , 0x08 },
{ DA732X_REG_AIFB1 , 0x02 },
{ DA732X_REG_AIFB2 , 0x00 },
{ DA732X_REG_AIFB3 , 0x08 },
{ DA732X_REG_PC_CTRL , 0xC0 },
{ DA732X_REG_DATA_ROUTE , 0x00 },
{ DA732X_REG_DSP_CTRL , 0x00 },
{ DA732X_REG_CIF_CTRL2 , 0x00 },
{ DA732X_REG_HANDSHAKE , 0x00 },
{ DA732X_REG_SPARE1_OUT , 0x00 },
{ DA732X_REG_SPARE2_OUT , 0x00 },
{ DA732X_REG_SPARE1_IN , 0x00 },
{ DA732X_REG_ADC1_PD , 0x00 },
{ DA732X_REG_ADC1_HPF , 0x00 },
{ DA732X_REG_ADC1_SEL , 0x00 },
{ DA732X_REG_ADC1_EQ12 , 0x00 },
{ DA732X_REG_ADC1_EQ34 , 0x00 },
{ DA732X_REG_ADC1_EQ5 , 0x00 },
{ DA732X_REG_ADC2_PD , 0x00 },
{ DA732X_REG_ADC2_HPF , 0x00 },
{ DA732X_REG_ADC2_SEL , 0x00 },
{ DA732X_REG_ADC2_EQ12 , 0x00 },
{ DA732X_REG_ADC2_EQ34 , 0x00 },
{ DA732X_REG_ADC2_EQ5 , 0x00 },
{ DA732X_REG_DAC1_HPF , 0x00 },
{ DA732X_REG_DAC1_L_VOL , 0x00 },
{ DA732X_REG_DAC1_R_VOL , 0x00 },
{ DA732X_REG_DAC1_SEL , 0x00 },
{ DA732X_REG_DAC1_SOFTMUTE , 0x00 },
{ DA732X_REG_DAC1_EQ12 , 0x00 },
{ DA732X_REG_DAC1_EQ34 , 0x00 },
{ DA732X_REG_DAC1_EQ5 , 0x00 },
{ DA732X_REG_DAC2_HPF , 0x00 },
{ DA732X_REG_DAC2_L_VOL , 0x00 },
{ DA732X_REG_DAC2_R_VOL , 0x00 },
{ DA732X_REG_DAC2_SEL , 0x00 },
{ DA732X_REG_DAC2_SOFTMUTE , 0x00 },
{ DA732X_REG_DAC2_EQ12 , 0x00 },
{ DA732X_REG_DAC2_EQ34 , 0x00 },
{ DA732X_REG_DAC2_EQ5 , 0x00 },
{ DA732X_REG_DAC3_HPF , 0x00 },
{ DA732X_REG_DAC3_VOL , 0x00 },
{ DA732X_REG_DAC3_SEL , 0x00 },
{ DA732X_REG_DAC3_SOFTMUTE , 0x00 },
{ DA732X_REG_DAC3_EQ12 , 0x00 },
{ DA732X_REG_DAC3_EQ34 , 0x00 },
{ DA732X_REG_DAC3_EQ5 , 0x00 },
{ DA732X_REG_BIQ_BYP , 0x00 },
{ DA732X_REG_DMA_CMD , 0x00 },
{ DA732X_REG_DMA_ADDR0 , 0x00 },
{ DA732X_REG_DMA_ADDR1 , 0x00 },
{ DA732X_REG_DMA_DATA0 , 0x00 },
{ DA732X_REG_DMA_DATA1 , 0x00 },
{ DA732X_REG_DMA_DATA2 , 0x00 },
{ DA732X_REG_DMA_DATA3 , 0x00 },
{ DA732X_REG_UNLOCK , 0x00 },
};
static inline int da732x_get_input_div(struct snd_soc_component *component, int sysclk)
{
int val;
int ret;
if (sysclk < DA732X_MCLK_10MHZ) {
val = DA732X_MCLK_RET_0_10MHZ;
ret = DA732X_MCLK_VAL_0_10MHZ;
}
|