| // 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_CTL_CLK, 0x30 }, |
| { ROULEUR_ANA_MBHC_ZDET_CALIB_RESULT, 0x00 }, |
| { ROULEUR_ANA_NCP_EN, 0x00 }, |
| { ROULEUR_ANA_NCP_VCTRL, 0xA7 }, |
| { 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_COMBOPA_CTL_4, 0x84 }, |
| { ROULEUR_ANA_COMBOPA_CTL_5, 0x05 }, |
| { 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, |
| }; |