// SPDX-License-Identifier: GPL-2.0-or-later
/*
* max98390.c -- MAX98390 ALSA Soc Audio driver
*
* Copyright (C) 2020 Maxim Integrated Products
*
*/
#include <linux/acpi.h>
#include <linux/cdev.h>
#include <linux/dmi.h>
#include <linux/firmware.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/time.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/tlv.h>
#include "max98390.h"
static struct reg_default max98390_reg_defaults[] = {
{MAX98390_INT_EN1, 0xf0},
{MAX98390_INT_EN2, 0x00},
{MAX98390_INT_EN3, 0x00},
{MAX98390_INT_FLAG_CLR1, 0x00},
{MAX98390_INT_FLAG_CLR2, 0x00},
{MAX98390_INT_FLAG_CLR3, 0x00},
{MAX98390_IRQ_CTRL, 0x01},
{MAX98390_CLK_MON, 0x6d},
{MAX98390_DAT_MON, 0x03},
{MAX98390_WDOG_CTRL, 0x00},
{MAX98390_WDOG_RST, 0x00},
{MAX98390_MEAS_ADC_THERM_WARN_THRESH, 0x75},
{MAX98390_MEAS_ADC_THERM_SHDN_THRESH, 0x8c},
{MAX98390_MEAS_ADC_THERM_HYSTERESIS, 0x08},
{MAX98390_PIN_CFG, 0x55},
{MAX98390_PCM_RX_EN_A, 0x00},
{MAX98390_PCM_RX_EN_B, 0x00},
{MAX98390_PCM_TX_EN_A, 0x00},
{MAX98390_PCM_TX_EN_B, 0x00},
{MAX98390_PCM_TX_HIZ_CTRL_A, 0xff},
{MAX98390_PCM_TX_HIZ_CTRL_B, 0xff},
{MAX98390_PCM_CH_SRC_1, 0x00},
{MAX98390_PCM_CH_SRC_2, 0x00},
{MAX98390_PCM_CH_SRC_3, 0x00},
{MAX98390_PCM_MODE_CFG, 0xc0},
{MAX98390_PCM_MASTER_MODE, 0x1c},
{MAX98390_PCM_CLK_SETUP, 0x44},
{MAX98390_PCM_SR_SETUP, 0x08},
{MAX98390_ICC_RX_EN_A, 0x00},
{MAX98390_ICC_RX_EN_B, 0x00},
{MAX98390_ICC_TX_EN_A, 0x00},
{MAX98390_ICC_TX_EN_B, 0x00},
{MAX98390_ICC_HIZ_MANUAL_MODE, 0x00},
{MAX98390_ICC_TX_HIZ_EN_A, 0x00},
{MAX98390_ICC_TX_HIZ_EN_B, 0x00},
{MAX98390_ICC_LNK_EN, 0x00},
{MAX98390_R2039_AMP_DSP_CFG, 0x0f},
{MAX98390_R203A_AMP_EN, 0x81},
{MAX98390_TONE_GEN_DC_CFG, 0x00},
{MAX98390_SPK_SRC_SEL, 0x00},
{MAX98390_SSM_CFG, 0x85},
{MAX98390_MEAS_EN, 0x03},
{MAX98390_MEAS_DSP_CFG, 0x0f},
{MAX98390_BOOST_CTRL0, 0x1c},
{MAX98390_BOOST_CTRL3, 0x01},
{MAX98390_BOOST_CTRL1, 0x40},
{MAX98390_MEAS_ADC_CFG, 0x07},
{MAX98390_MEAS_ADC_BASE_MSB, 0x00},
{MAX98390_MEAS_ADC_BASE_LSB, 0x23},
{MAX98390_ADC_CH0_DIVIDE, 0x00},
{MAX98390_ADC_CH1_DIVIDE, 0x00},
{MAX98390_ADC_CH2_DIVIDE, 0x00},
{MAX98390_ADC_CH0_FILT_CFG, 0x00},
{MAX98390_ADC_CH1_FILT_CFG, 0x00},
{MAX98390_ADC_CH2_FILT_CFG, 0x00},
{MAX98390_PWR_GATE_CTL, 0x2c},
{MAX98390_BROWNOUT_EN, 0x00},
{MAX98390_BROWNOUT_INFINITE_HOLD, 0x00},
{MAX98390_BROWNOUT_INFINITE_HOLD_CLR, 0x00},
{MAX98390_BROWNOUT_LVL_HOLD, 0x00},
{MAX98390_BROWNOUT_LVL1_THRESH, 0x00},
{MAX98390_BROWNOUT_LVL2_THRESH, 0x00},
{MAX98390_BROWNOUT_LVL3_THRESH, 0x00},
{MAX98390_BROWNOUT_LVL4_THRESH, 0x00},
{MAX98390_BROWNOUT_THRESH_HYSTERYSIS, 0x00},
{MAX98390_BROWNOUT_AMP_LIMITER_ATK_REL, 0x1f},
{MAX98390_BROWNOUT_AMP_GAIN_ATK_REL, 0x00},
{MAX98390_BROWNOUT_AMP1_CLIP_MODE, 0x00},
{MAX98390_BROWNOUT_LVL1_CUR_LIMIT, 0x00},
{MAX98390_BROWNOUT_LVL1_AMP1_CTRL1, 0x00},
{MAX98390_BROWNOUT_LVL1_AMP1_CTRL2, 0x00},
{MAX98390_BROWNOUT_LVL1_AMP1_CTRL3, 0x00},
{MAX98390_BROWNOUT_LVL2_CUR_LIMIT, 0x00},
{MAX98390_BROWNOUT_LVL2_AMP1_CTRL1, 0x00},
{MAX98390_BROWNOUT_LVL2_AMP1_CTRL2, 0x00},
{MAX98390_BROWNOUT_LVL2_AMP1_CTRL3, 0x00},
{MAX98390_BROWNOUT_LVL3_CUR_LIMIT, 0x00},
{MAX98390_BROWNOUT_LVL3_AMP1_CTRL1, 0x00},
{MAX98390_BROWNOUT_LVL3_AMP1_CTRL2, 0x00},
{MAX98390_BROWNOUT_LVL3_AMP1_CTRL3, 0x00},
{MAX98390_BROWNOUT_LVL4_CUR_LIMIT, 0x00},
{MAX98390_BROWNOUT_LVL4_AMP1_CTRL1, 0x00},
{MAX98390_BROWNOUT_LVL4_AMP1_CTRL2, 0x00},
{MAX98390_BROWNOUT_LVL4_AMP1_CTRL3, 0x00},
{MAX98390_BROWNOUT_ILIM_HLD, 0x00},
{MAX98390_BROWNOUT_LIM_HLD, 0x00},
{MAX98390_BROWNOUT_CLIP_HLD, 0x00},
{MAX98390_BROWNOUT_GAIN_HLD, 0x00},
{MAX98390_ENV_TRACK_VOUT_HEADROOM, 0x0f},
{MAX98390_ENV_TRACK_BOOST_VOUT_DELAY, 0x80},
{MAX98390_ENV_TRACK_REL_RATE, 0x07},
{MAX98390_ENV_TRACK_HOLD_RATE, 0x07},
{MAX98390_ENV_TRACK_CTRL, 0x01},
{MAX98390_BOOST_BYPASS1, 0x49},