Files
android_kernel_samsung_sm86…/asoc/codecs/rouleur/rouleur-regmap.c
Aditya Bavanari b4364f47ec asoc: codecs: Update sequence for HPH path in rouleur
Update HPHL and HPHR sequence to avoid clicks and pops
by setting the LDIV and RDIV values in HD2
coefficients and increasing ramp time.

Change-Id: Ib47d14255a098511393b4b75392854c8b34dc0d3
Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
2020-04-20 11:32:47 -07:00

161 lines
6.8 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2020, The Linux Foundation. All rights reserved.
*/
#include <linux/regmap.h>
#include <linux/device.h>
#include "rouleur-registers.h"
extern const u8 rouleur_reg_access_analog[
ROULEUR_REG(ROULEUR_ANALOG_REGISTERS_MAX_SIZE)];
extern const u8 rouleur_reg_access_digital[
ROULEUR_REG(ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)];
static const struct reg_default rouleur_defaults[] = {
{ ROULEUR_ANA_MICBIAS_MICB_1_2_EN, 0x01 },
{ ROULEUR_ANA_MICBIAS_MICB_3_EN, 0x00 },
{ ROULEUR_ANA_MICBIAS_LDO_1_SETTING, 0x21 },
{ ROULEUR_ANA_MICBIAS_LDO_1_CTRL, 0x01 },
{ ROULEUR_ANA_TX_AMIC1, 0x00 },
{ ROULEUR_ANA_TX_AMIC2, 0x00 },
{ ROULEUR_ANA_MBHC_MECH, 0x39 },
{ ROULEUR_ANA_MBHC_ELECT, 0x08 },
{ ROULEUR_ANA_MBHC_ZDET, 0x10 },
{ ROULEUR_ANA_MBHC_RESULT_1, 0x00 },
{ ROULEUR_ANA_MBHC_RESULT_2, 0x00 },
{ ROULEUR_ANA_MBHC_RESULT_3, 0x00 },
{ ROULEUR_ANA_MBHC_BTN0_ZDET_VREF1, 0x00 },
{ ROULEUR_ANA_MBHC_BTN1_ZDET_VREF2, 0x10 },
{ ROULEUR_ANA_MBHC_BTN2_ZDET_VREF3, 0x20 },
{ ROULEUR_ANA_MBHC_BTN3_ZDET_DBG_400, 0x30 },
{ ROULEUR_ANA_MBHC_BTN4_ZDET_DBG_1400, 0x40 },
{ ROULEUR_ANA_MBHC_MICB2_RAMP, 0x00 },
{ ROULEUR_ANA_MBHC_CTL_1, 0x02 },
{ ROULEUR_ANA_MBHC_CTL_2, 0x05 },
{ ROULEUR_ANA_MBHC_PLUG_DETECT_CTL, 0xE9 },
{ ROULEUR_ANA_MBHC_ZDET_ANA_CTL, 0x0F },
{ ROULEUR_ANA_MBHC_ZDET_RAMP_CTL, 0x00 },
{ ROULEUR_ANA_MBHC_FSM_STATUS, 0x00 },
{ ROULEUR_ANA_MBHC_ADC_RESULT, 0x00 },
{ ROULEUR_ANA_MBHC_MCLK, 0x30 },
{ ROULEUR_ANA_MBHC_ZDET_CALIB_RESULT, 0x00 },
{ ROULEUR_ANA_NCP_EN, 0x00 },
{ ROULEUR_ANA_HPHPA_CNP_CTL_1, 0x54 },
{ ROULEUR_ANA_HPHPA_CNP_CTL_2, 0x2B },
{ ROULEUR_ANA_HPHPA_PA_STATUS, 0x00 },
{ ROULEUR_ANA_HPHPA_FSM_CLK, 0x12 },
{ ROULEUR_SWR_HPHPA_HD2, 0x1B },
{ ROULEUR_ANA_HPHPA_SPARE_CTL, 0x02 },
{ ROULEUR_ANA_SURGE_EN, 0x38 },
{ ROULEUR_ANA_COMBOPA_CTL, 0x35 },
{ ROULEUR_ANA_RXLDO_CTL, 0x86 },
{ ROULEUR_ANA_MBIAS_EN, 0x00 },
{ ROULEUR_DIG_SWR_CHIP_ID0, 0x00 },
{ ROULEUR_DIG_SWR_CHIP_ID1, 0x00 },
{ ROULEUR_DIG_SWR_CHIP_ID2, 0x0C },
{ ROULEUR_DIG_SWR_CHIP_ID3, 0x01 },
{ ROULEUR_DIG_SWR_SWR_TX_CLK_RATE, 0x00 },
{ ROULEUR_DIG_SWR_CDC_RST_CTL, 0x03 },
{ ROULEUR_DIG_SWR_TOP_CLK_CFG, 0x00 },
{ ROULEUR_DIG_SWR_CDC_RX_CLK_CTL, 0x00 },
{ ROULEUR_DIG_SWR_CDC_TX_CLK_CTL, 0x33 },
{ ROULEUR_DIG_SWR_SWR_RST_EN, 0x00 },
{ ROULEUR_DIG_SWR_CDC_RX_RST, 0x00 },
{ ROULEUR_DIG_SWR_CDC_RX0_CTL, 0xFC },
{ ROULEUR_DIG_SWR_CDC_RX1_CTL, 0xFC },
{ ROULEUR_DIG_SWR_CDC_TX_ANA_MODE_0_1, 0x00 },
{ ROULEUR_DIG_SWR_CDC_COMP_CTL_0, 0x00 },
{ ROULEUR_DIG_SWR_CDC_RX_DELAY_CTL, 0x66 },
{ ROULEUR_DIG_SWR_CDC_RX_GAIN_0, 0x55 },
{ ROULEUR_DIG_SWR_CDC_RX_GAIN_1, 0xA9 },
{ ROULEUR_DIG_SWR_CDC_RX_GAIN_CTL, 0x00 },
{ ROULEUR_DIG_SWR_CDC_TX0_CTL, 0x68 },
{ ROULEUR_DIG_SWR_CDC_TX1_CTL, 0x68 },
{ ROULEUR_DIG_SWR_CDC_TX_RST, 0x00 },
{ ROULEUR_DIG_SWR_CDC_REQ0_CTL, 0x01 },
{ ROULEUR_DIG_SWR_CDC_REQ1_CTL, 0x01 },
{ ROULEUR_DIG_SWR_CDC_RST, 0x00 },
{ ROULEUR_DIG_SWR_CDC_AMIC_CTL, 0x02 },
{ ROULEUR_DIG_SWR_CDC_DMIC_CTL, 0x00 },
{ ROULEUR_DIG_SWR_CDC_DMIC1_CTL, 0x00 },
{ ROULEUR_DIG_SWR_CDC_DMIC1_RATE, 0x01 },
{ ROULEUR_DIG_SWR_PDM_WD_CTL0, 0x00 },
{ ROULEUR_DIG_SWR_PDM_WD_CTL1, 0x00 },
{ ROULEUR_DIG_SWR_INTR_MODE, 0x00 },
{ ROULEUR_DIG_SWR_INTR_MASK_0, 0xFF },
{ ROULEUR_DIG_SWR_INTR_MASK_1, 0x7F },
{ ROULEUR_DIG_SWR_INTR_MASK_2, 0x0C },
{ ROULEUR_DIG_SWR_INTR_STATUS_0, 0x00 },
{ ROULEUR_DIG_SWR_INTR_STATUS_1, 0x00 },
{ ROULEUR_DIG_SWR_INTR_STATUS_2, 0x00 },
{ ROULEUR_DIG_SWR_INTR_CLEAR_0, 0x00 },
{ ROULEUR_DIG_SWR_INTR_CLEAR_1, 0x00 },
{ ROULEUR_DIG_SWR_INTR_CLEAR_2, 0x00 },
{ ROULEUR_DIG_SWR_INTR_LEVEL_0, 0x00 },
{ ROULEUR_DIG_SWR_INTR_LEVEL_1, 0x2A },
{ ROULEUR_DIG_SWR_INTR_LEVEL_2, 0x00 },
{ ROULEUR_DIG_SWR_CDC_CONN_RX0_CTL, 0x00 },
{ ROULEUR_DIG_SWR_CDC_CONN_RX1_CTL, 0x00 },
{ ROULEUR_DIG_SWR_LOOP_BACK_MODE, 0x00 },
{ ROULEUR_DIG_SWR_DRIVE_STRENGTH_0, 0x00 },
{ ROULEUR_DIG_SWR_DIG_DEBUG_CTL, 0x00 },
{ ROULEUR_DIG_SWR_DIG_DEBUG_EN, 0x00 },
{ ROULEUR_DIG_SWR_DEM_BYPASS_DATA0, 0x55 },
{ ROULEUR_DIG_SWR_DEM_BYPASS_DATA1, 0x55 },
{ ROULEUR_DIG_SWR_DEM_BYPASS_DATA2, 0x55 },
{ ROULEUR_DIG_SWR_DEM_BYPASS_DATA3, 0x01 },
};
static bool rouleur_readable_register(struct device *dev, unsigned int reg)
{
if (reg > ROULEUR_ANA_BASE_ADDR && reg <
ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
return rouleur_reg_access_analog[ROULEUR_REG(reg)] & RD_REG;
if (reg > ROULEUR_DIG_BASE_ADDR && reg <
ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
return rouleur_reg_access_digital[ROULEUR_REG(reg)] & RD_REG;
return 0;
}
static bool rouleur_writeable_register(struct device *dev, unsigned int reg)
{
if (reg > ROULEUR_ANA_BASE_ADDR && reg <
ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
return rouleur_reg_access_analog[ROULEUR_REG(reg)] & WR_REG;
if (reg > ROULEUR_DIG_BASE_ADDR && reg <
ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
return rouleur_reg_access_digital[ROULEUR_REG(reg)] & WR_REG;
return 0;
}
static bool rouleur_volatile_register(struct device *dev, unsigned int reg)
{
if (reg > ROULEUR_ANA_BASE_ADDR && reg <
ROULEUR_ANALOG_REGISTERS_MAX_SIZE)
if ((rouleur_reg_access_analog[ROULEUR_REG(reg)] & RD_REG)
&& !(rouleur_reg_access_analog[ROULEUR_REG(reg)] & WR_REG))
return true;
if (reg > ROULEUR_DIG_BASE_ADDR && reg <
ROULEUR_DIGITAL_REGISTERS_MAX_SIZE)
if ((rouleur_reg_access_digital[ROULEUR_REG(reg)] & RD_REG)
&& !(rouleur_reg_access_digital[ROULEUR_REG(reg)] & WR_REG))
return true;
return 0;
}
struct regmap_config rouleur_regmap_config = {
.name = "rouleur_csr",
.reg_bits = 16,
.val_bits = 8,
.cache_type = REGCACHE_RBTREE,
.reg_defaults = rouleur_defaults,
.num_reg_defaults = ARRAY_SIZE(rouleur_defaults),
.max_register = ROULEUR_ANALOG_MAX_REGISTER +
ROULEUR_DIGITAL_MAX_REGISTER,
.readable_reg = rouleur_readable_register,
.writeable_reg = rouleur_writeable_register,
.volatile_reg = rouleur_volatile_register,
.can_multi_write = true,
};