
Update PDM watchdog interrupt sequence for rouleur codec. Add HPH PA gain registers in regmap and update defaults. Update mic bias register bits and rouleur version for ADIE RTC to work. Change-Id: I1bbb41efcdd9a0a8b38fcd4beadbd5d639a4b858 Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
163 lignes
6.9 KiB
C
163 lignes
6.9 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_ANA_HPHPA_L_GAIN, 0x00 },
|
|
{ ROULEUR_ANA_HPHPA_R_GAIN, 0x00 },
|
|
{ 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,
|
|
};
|