
Add rouleur codec support in bengal machine driver to create codec entry and invoke mbhc hs detect functions for respective codecs. Correct the logic for headset detection pull up current and volatile registers for digital part of rouleur codec. Change-Id: I22545dc796c215c1501e883796546c97d8ca8698 Signed-off-by: Aditya Bavanari <abavanar@codeaurora.org>
159 lines
6.6 KiB
C
159 lines
6.6 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_2, 0x2B },
|
|
{ ROULEUR_ANA_HPHPA_PA_STATUS, 0x00 },
|
|
{ ROULEUR_ANA_HPHPA_FSM_CLK, 0x12 },
|
|
{ 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,
|
|
};
|