Fichiers
android_kernel_samsung_sm86…/asoc/codecs/rouleur/rouleur-regmap.c
Aditya Bavanari 9f50810d7f asoc: codecs: Update rouleur watchdog interrupt sequence
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>
2020-05-12 22:57:48 -07:00

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,
};