Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit af0a66b7 authored by Sudheer Papothi's avatar Sudheer Papothi
Browse files

ASoC: wsa883x: Add support for wsa883x speaker amplifer



WSA883x is a speaker amplifier with soundwire interface and
enumerates as soundwire slave. WSA883x supports audio playback
on speakers and has temperature sensors for better speaker
protection and enhanced boost control support. Add software
driver support to enable WSA883x speaker amplifier.

Change-Id: Ib9cf2eebdda5ce331154bc786f059c5757f34fa2
Signed-off-by: default avatarSudheer Papothi <spapothi@codeaurora.org>
parent 63a3452c
Loading
Loading
Loading
Loading
+49 −0
Original line number Diff line number Diff line
# Android makefile for audio kernel modules

# Assume no targets will be supported

# Check if this driver needs be built for current target
ifeq ($(call is-board-platform,lahaina),true)
AUDIO_SELECT  := CONFIG_SND_SOC_LAHAINA=m
endif

AUDIO_CHIPSET := audio
# Build/Package only in case of supported target
ifeq ($(call is-board-platform-in-list,lahaina),true)

LOCAL_PATH := $(call my-dir)

# This makefile is only for DLKM
ifneq ($(findstring vendor,$(LOCAL_PATH)),)

ifneq ($(findstring opensource,$(LOCAL_PATH)),)
	AUDIO_BLD_DIR := $(shell pwd)/vendor/qcom/opensource/audio-kernel
endif # opensource

DLKM_DIR := $(TOP)/device/qcom/common/dlkm

# Build audio.ko as $(AUDIO_CHIPSET)_audio.ko
###########################################################
# This is set once per LOCAL_PATH, not per (kernel) module
KBUILD_OPTIONS := AUDIO_ROOT=$(AUDIO_BLD_DIR)

# We are actually building audio.ko here, as per the
# requirement we are specifying <chipset>_audio.ko as LOCAL_MODULE.
# This means we need to rename the module to <chipset>_audio.ko
# after audio.ko is built.
KBUILD_OPTIONS += MODNAME=wsa883x_dlkm
KBUILD_OPTIONS += BOARD_PLATFORM=$(TARGET_BOARD_PLATFORM)
KBUILD_OPTIONS += $(AUDIO_SELECT)

###########################################################
include $(CLEAR_VARS)
LOCAL_MODULE              := $(AUDIO_CHIPSET)_wsa883x.ko
LOCAL_MODULE_KBUILD_NAME  := wsa883x_dlkm.ko
LOCAL_MODULE_TAGS         := optional
LOCAL_MODULE_DEBUG_ENABLE := true
LOCAL_MODULE_PATH         := $(KERNEL_MODULES_OUT)
include $(DLKM_DIR)/AndroidKernelModule.mk
###########################################################

endif # DLKM check
endif # supported target check
+103 −0
Original line number Diff line number Diff line
# We can build either as part of a standalone Kernel build or as
# an external module.  Determine which mechanism is being used
ifeq ($(MODNAME),)
	KERNEL_BUILD := 1
else
	KERNEL_BUILD := 0
endif

ifeq ($(KERNEL_BUILD), 1)
	# These are configurable via Kconfig for kernel-based builds
	# Need to explicitly configure for Android-based builds
	AUDIO_BLD_DIR := $(shell pwd)/kernel/msm-4.19
	AUDIO_ROOT := $(AUDIO_BLD_DIR)/techpack/audio
endif

ifeq ($(KERNEL_BUILD), 0)
	ifeq ($(CONFIG_ARCH_LAHAINA), y)
		include $(AUDIO_ROOT)/config/lahainaauto.conf
		INCS    +=  -include $(AUDIO_ROOT)/config/lahainaautoconf.h
	endif
endif

# As per target team, build is done as follows:
# Defconfig : build with default flags
# Slub      : defconfig  + CONFIG_SLUB_DEBUG := y +
#	      CONFIG_SLUB_DEBUG_ON := y + CONFIG_PAGE_POISONING := y
# Perf      : Using appropriate msmXXXX-perf_defconfig
#
# Shipment builds (user variants) should not have any debug feature
# enabled. This is identified using 'TARGET_BUILD_VARIANT'. Slub builds
# are identified using the CONFIG_SLUB_DEBUG_ON configuration. Since
# there is no other way to identify defconfig builds, QTI internal
# representation of perf builds (identified using the string 'perf'),
# is used to identify if the build is a slub or defconfig one. This
# way no critical debug feature will be enabled for perf and shipment
# builds. Other OEMs are also protected using the TARGET_BUILD_VARIANT
# config.

############ UAPI ############
UAPI_DIR :=	uapi
UAPI_INC :=	-I$(AUDIO_ROOT)/include/$(UAPI_DIR)

############ COMMON ############
COMMON_DIR :=	include
COMMON_INC :=	-I$(AUDIO_ROOT)/$(COMMON_DIR)

############ WSA883X ############

# for WSA883X Codec
ifdef CONFIG_SND_SOC_WSA883X
	WSA883X_OBJS += wsa883x.o
	WSA883X_OBJS += wsa883x-regmap.o
	WSA883X_OBJS += wsa883x-tables.o
	WSA883X_OBJS += wsa883x-temp-sensor.o
endif

LINUX_INC +=	-Iinclude/linux

INCS +=		$(COMMON_INC) \
		$(UAPI_INC)

EXTRA_CFLAGS += $(INCS)


CDEFINES +=	-DANI_LITTLE_BYTE_ENDIAN \
		-DANI_LITTLE_BIT_ENDIAN \
		-DDOT11F_LITTLE_ENDIAN_HOST \
		-DANI_COMPILER_TYPE_GCC \
		-DANI_OS_TYPE_ANDROID=6 \
		-DPTT_SOCK_SVC_ENABLE \
		-Wall\
		-Werror\
		-D__linux__

KBUILD_CPPFLAGS += $(CDEFINES)

# Currently, for versions of gcc which support it, the kernel Makefile
# is disabling the maybe-uninitialized warning.  Re-enable it for the
# AUDIO driver.  Note that we must use EXTRA_CFLAGS here so that it
# will override the kernel settings.
ifeq ($(call cc-option-yn, -Wmaybe-uninitialized),y)
EXTRA_CFLAGS += -Wmaybe-uninitialized
endif
#EXTRA_CFLAGS += -Wmissing-prototypes

ifeq ($(call cc-option-yn, -Wheader-guard),y)
EXTRA_CFLAGS += -Wheader-guard
endif

ifeq ($(KERNEL_BUILD), 0)
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/ipc/Module.symvers
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/dsp/Module.symvers
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/Module.symvers
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/asoc/codecs/Module.symvers
KBUILD_EXTRA_SYMBOLS +=$(OUT)/obj/vendor/qcom/opensource/audio-kernel/soc/Module.symvers
endif

# Module information used by KBuild framework
obj-$(CONFIG_SND_SOC_WSA883X) += wsa883x_dlkm.o
wsa883x_dlkm-y := $(WSA883X_OBJS)

# inject some build related information
DEFINES += -DBUILD_TIMESTAMP=\"$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')\"
+113 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2019, The Linux Foundation. All rights reserved.
 */

#ifndef WSA883X_INTERNAL_H
#define WSA883X_INTERNAL_H

#include "wsa883x.h"
#include "wsa883x-registers.h"

#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
#include <linux/uaccess.h>

#define SWR_SLV_MAX_REG_ADDR	0x2009
#define SWR_SLV_START_REG_ADDR	0x40
#define SWR_SLV_MAX_BUF_LEN	20
#define BYTES_PER_LINE		12
#define SWR_SLV_RD_BUF_LEN	8
#define SWR_SLV_WR_BUF_LEN	32
#define SWR_SLV_MAX_DEVICES	2
#endif /* CONFIG_DEBUG_FS */

#define WSA883X_DRV_NAME "wsa883x-codec"
#define WSA883X_NUM_RETRY	5

#define WSA883X_VERSION_ENTRY_SIZE 27

enum {
	G_18DB = 0,
	G_16P5DB,
	G_15DB,
	G_13P5DB,
	G_12DB,
	G_10P5DB,
	G_9DB,
	G_7P5DB,
	G_6DB,
	G_4P5DB,
	G_3DB,
	G_1P5DB,
	G_0DB,
};

enum {
	DISABLE = 0,
	ENABLE,
};

enum {
	SWR_DAC_PORT,
	SWR_COMP_PORT,
	SWR_BOOST_PORT,
	SWR_VISENSE_PORT,
};

struct swr_port {
	u8 port_id;
	u8 ch_mask;
	u32 ch_rate;
	u8 num_ch;
	u8 port_type;
};

enum {
	WSA883X_DEV_DOWN,
	WSA883X_DEV_UP,
	WSA883X_DEV_READY,
};

extern struct regmap_config wsa883x_regmap_config;

/*
 * Private data Structure for wsa883x. All parameters related to
 * WSA883X codec needs to be defined here.
 */
struct wsa883x_priv {
	struct regmap *regmap;
	struct device *dev;
	struct swr_device *swr_slave;
	struct snd_soc_component *component;
	bool comp_enable;
	bool boost_enable;
	bool visense_enable;
	u8 pa_gain;
	struct swr_port port[WSA883X_MAX_SWR_PORTS];
	int pd_gpio;
	struct wsa883x_tz_priv tz_pdata;
	int bg_cnt;
	int clk_cnt;
	int version;
	struct mutex bg_lock;
	struct mutex res_lock;
	struct mutex temp_lock;
	struct snd_info_entry *entry;
	struct snd_info_entry *version_entry;
	int state;
	struct delayed_work ocp_ctl_work;
	struct device_node *wsa_rst_np;
	int pa_mute;
#ifdef CONFIG_DEBUG_FS
	struct dentry *debugfs_dent;
	struct dentry *debugfs_peek;
	struct dentry *debugfs_poke;
	struct dentry *debugfs_reg_dump;
	unsigned int read_data;
#endif
};

static int32_t wsa883x_resource_acquire(struct snd_soc_component *component,
						bool enable);
#endif /* WSA883X_INTERNAL_H */
+376 −0

File added.

Preview size limit exceeded, changes collapsed.

+393 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2015-2016, 2019, The Linux Foundation. All rights reserved.
 */

#include <linux/regmap.h>
#include <linux/device.h>
#include "wsa883x-registers.h"
#include "wsa883x.h"

extern const u8 wsa883x_reg_access[WSA883X_NUM_REGISTERS];

static struct reg_default wsa883x_defaults[] = {
	{WSA883X_REF_CTRL,                   0x6C},
	{WSA883X_TEST_CTL_0,                 0x06},
	{WSA883X_BIAS_0,                     0xD2},
	{WSA883X_OP_CTL,                     0xE0},
	{WSA883X_IREF_CTL,                   0x58},
	{WSA883X_ISENS_CTL,                  0x47},
	{WSA883X_CLK_CTL,                    0x87},
	{WSA883X_TEST_CTL_1,                 0x00},
	{WSA883X_BIAS_1,                     0x51},
	{WSA883X_ADC_CTL,                    0x03},
	{WSA883X_DOUT_MSB,                   0x00},
	{WSA883X_DOUT_LSB,                   0x00},
	{WSA883X_VBAT_SNS,                   0x00},
	{WSA883X_ITRIM_CODE,                 0x1F},
	{WSA883X_EN,                         0x00},
	{WSA883X_OVERRIDE1,                  0x00},
	{WSA883X_OVERRIDE2,                  0x08},
	{WSA883X_VSENSE1,                    0xD3},
	{WSA883X_ISENSE1,                    0xD4},
	{WSA883X_ISENSE2,                    0x20},
	{WSA883X_ISENSE_CAL,                 0x00},
	{WSA883X_MISC,                       0x00},
	{WSA883X_ADC_0,                      0x00},
	{WSA883X_ADC_1,                      0x00},
	{WSA883X_ADC_2,                      0x00},
	{WSA883X_ADC_3,                      0x00},
	{WSA883X_ADC_4,                      0x45},
	{WSA883X_ADC_5,                      0x20},
	{WSA883X_ADC_6,                      0x10},
	{WSA883X_ADC_7,                      0x00},
	{WSA883X_STATUS,                     0x00},
	{WSA883X_DAC_CTRL_REG,               0x41},
	{WSA883X_DAC_EN_DEBUG_REG,           0x00},
	{WSA883X_DAC_OPAMP_BIAS1_REG,        0x48},
	{WSA883X_DAC_OPAMP_BIAS2_REG,        0x48},
	{WSA883X_DAC_VCM_CTRL_REG,           0x0B},
	{WSA883X_DAC_VOLTAGE_CTRL_REG,       0x05},
	{WSA883X_ATEST1_REG,                 0x00},
	{WSA883X_ATEST2_REG,                 0x00},
	{WSA883X_SPKR_TOP_BIAS_REG1,         0x4A},
	{WSA883X_SPKR_TOP_BIAS_REG2,         0x65},
	{WSA883X_SPKR_TOP_BIAS_REG3,         0x55},
	{WSA883X_SPKR_TOP_BIAS_REG4,         0xA9},
	{WSA883X_SPKR_CLIP_DET_REG,          0x00},
	{WSA883X_SPKR_DRV_LF_BLK_EN,         0x0F},
	{WSA883X_SPKR_DRV_LF_EN,             0x0A},
	{WSA883X_SPKR_DRV_LF_MASK_DCC_CTL,   0x00},
	{WSA883X_SPKR_DRV_LF_MISC_CTL,       0x32},
	{WSA883X_SPKR_DRV_LF_REG_GAIN,       0x00},
	{WSA883X_SPKR_DRV_LF_OS_CAL_CTL1,    0x90},
	{WSA883X_SPKR_DRV_LF_OS_CAL_CTL,     0x00},
	{WSA883X_SPKR_PWM_CLK_CTL,           0x00},
	{WSA883X_SPKR_PDRV_HS_CTL,           0x50},
	{WSA883X_SPKR_PDRV_LS_CTL,           0x48},
	{WSA883X_SPKR_PWRSTG_DBG,            0x00},
	{WSA883X_SPKR_OCP_CTL,               0x00},
	{WSA883X_SPKR_BBM_CTL,               0x90},
	{WSA883X_PA_STATUS0,                 0x00},
	{WSA883X_PA_STATUS1,                 0x00},
	{WSA883X_PA_STATUS2,                 0x00},
	{WSA883X_EN_CTRL,                    0x54},
	{WSA883X_CURRENT_LIMIT,              0x90},
	{WSA883X_IBIAS1,                     0x00},
	{WSA883X_IBIAS2,                     0x00},
	{WSA883X_IBIAS3,                     0x00},
	{WSA883X_LDO_PROG,                   0x2A},
	{WSA883X_STABILITY_CTRL1,            0x8E},
	{WSA883X_STABILITY_CTRL2,            0x00},
	{WSA883X_PWRSTAGE_CTRL1,             0x00},
	{WSA883X_PWRSTAGE_CTRL2,             0x40},
	{WSA883X_UVLO,                       0xE9},
	{WSA883X_SEQUENCE_CTRL,              0x11},
	{WSA883X_ZX_CTRL_1,                  0xF0},
	{WSA883X_ZX_CTRL_2,                  0x06},
	{WSA883X_MISC1,                      0x02},
	{WSA883X_MISC2,                      0x81},
	{WSA883X_GMAMP_SUP1,                 0x84},
	{WSA883X_PWRSTAGE_CTRL3,             0x14},
	{WSA883X_PRSTAGE_CTRL4,              0x5F},
	{WSA883X_SPARE1,                     0x00},
	{WSA883X_PON_CTL_0,                  0xE3},
	{WSA883X_PON_CLT_1,                  0x70},
	{WSA883X_PON_CTL_2,                  0x00},
	{WSA883X_PON_CTL_3,                  0x00},
	{WSA883X_PON_CTL_4,                  0x00},
	{WSA883X_CKWD_CTL_0,                 0x34},
	{WSA883X_CKWD_CTL_1,                 0x80},
	{WSA883X_CKWD_CTL_2,                 0x00},
	{WSA883X_CKSK_CTL_0,                 0x0A},
	{WSA883X_TEST_0,                     0x00},
	{WSA883X_TEST_1,                     0x00},
	{WSA883X_STATUS_0,                   0x00},
	{WSA883X_STATUS_1,                   0x00},
	{WSA883X_PAGE_REGISTER,              0x00},
	{WSA883X_CHIP_ID0,                   0x00},
	{WSA883X_CHIP_ID1,                   0x00},
	{WSA883X_CHIP_ID2,                   0x02},
	{WSA883X_CHIP_ID3,                   0x02},
	{WSA883X_BUS_ID,                     0x00},
	{WSA883X_CDC_RST_CTL,                0x01},
	{WSA883X_TOP_CLK_CFG,                0x00},
	{WSA883X_CDC_PATH_MODE,              0x00},
	{WSA883X_CDC_CLK_CTL,                0xFF},
	{WSA883X_SWR_RESET_EN,               0x00},
	{WSA883X_PA_FSM_CTL,                 0x00},
	{WSA883X_PA_FSM_TIMER0,              0x80},
	{WSA883X_PA_FSM_TIMER1,              0x80},
	{WSA883X_PA_FSM_STA,                 0x00},
	{WSA883X_PA_FSM_ERR_COND,            0x00},
	{WSA883X_PA_FSM_MSK,                 0x00},
	{WSA883X_PA_FSM_BYP,                 0x00},
	{WSA883X_TADC_VALUE_CTL,             0x03},
	{WSA883X_TEMP_DETECT_CTL,            0x01},
	{WSA883X_TEMP_MSB,                   0x00},
	{WSA883X_TEMP_LSB,                   0x00},
	{WSA883X_TEMP_CONFIG0,               0x00},
	{WSA883X_TEMP_CONFIG1,               0x00},
	{WSA883X_VBAT_ADC_FLT_CTL,           0x00},
	{WSA883X_VBAT_DIN_MSB,               0x00},
	{WSA883X_VBAT_DIN_LSB,               0x00},
	{WSA883X_VBAT_DOUT,                  0x00},
	{WSA883X_SDM_PDM9_LSB,               0x00},
	{WSA883X_SDM_PDM9_MSB,               0x00},
	{WSA883X_CDC_RX_CTL,                 0xFE},
	{WSA883X_CDC_SPK_DSM_A1_0,           0x00},
	{WSA883X_CDC_SPK_DSM_A1_1,           0x01},
	{WSA883X_CDC_SPK_DSM_A2_0,           0x96},
	{WSA883X_CDC_SPK_DSM_A2_1,           0x09},
	{WSA883X_CDC_SPK_DSM_A3_0,           0xAB},
	{WSA883X_CDC_SPK_DSM_A3_1,           0x05},
	{WSA883X_CDC_SPK_DSM_A4_0,           0x1C},
	{WSA883X_CDC_SPK_DSM_A4_1,           0x02},
	{WSA883X_CDC_SPK_DSM_A5_0,           0x17},
	{WSA883X_CDC_SPK_DSM_A5_1,           0x02},
	{WSA883X_CDC_SPK_DSM_A6_0,           0xAA},
	{WSA883X_CDC_SPK_DSM_A7_0,           0xE3},
	{WSA883X_CDC_SPK_DSM_C_0,            0x69},
	{WSA883X_CDC_SPK_DSM_C_1,            0x54},
	{WSA883X_CDC_SPK_DSM_C_2,            0x02},
	{WSA883X_CDC_SPK_DSM_C_3,            0x15},
	{WSA883X_CDC_SPK_DSM_R1,             0xA4},
	{WSA883X_CDC_SPK_DSM_R2,             0xB5},
	{WSA883X_CDC_SPK_DSM_R3,             0x86},
	{WSA883X_CDC_SPK_DSM_R4,             0x85},
	{WSA883X_CDC_SPK_DSM_R5,             0xAA},
	{WSA883X_CDC_SPK_DSM_R6,             0xE2},
	{WSA883X_CDC_SPK_DSM_R7,             0x62},
	{WSA883X_CDC_SPK_GAIN_PDM_0,         0x00},
	{WSA883X_CDC_SPK_GAIN_PDM_1,         0xFC},
	{WSA883X_CDC_SPK_GAIN_PDM_2,         0x05},
	{WSA883X_PDM_WD_CTL,                 0x00},
	{WSA883X_DEM_BYPASS_DATA0,           0x00},
	{WSA883X_DEM_BYPASS_DATA1,           0x00},
	{WSA883X_DEM_BYPASS_DATA2,           0x00},
	{WSA883X_DEM_BYPASS_DATA3,           0x00},
	{WSA883X_WAVG_CTL,                   0x06},
	{WSA883X_WAVG_LRA_PER_0,             0xD1},
	{WSA883X_WAVG_LRA_PER_1,             0x00},
	{WSA883X_WAVG_DELTA_THETA_0,         0xE6},
	{WSA883X_WAVG_DELTA_THETA_1,         0x04},
	{WSA883X_WAVG_DIRECT_AMP_0,          0x50},
	{WSA883X_WAVG_DIRECT_AMP_1,          0x00},
	{WSA883X_WAVG_PTRN_AMP0_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP0_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP1_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP1_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP2_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP2_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP3_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP3_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP4_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP4_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP5_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP5_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP6_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP6_1,           0x00},
	{WSA883X_WAVG_PTRN_AMP7_0,           0x50},
	{WSA883X_WAVG_PTRN_AMP7_1,           0x00},
	{WSA883X_WAVG_PER_0_1,               0x88},
	{WSA883X_WAVG_PER_2_3,               0x88},
	{WSA883X_WAVG_PER_4_5,               0x88},
	{WSA883X_WAVG_PER_6_7,               0x88},
	{WSA883X_DRE_CTL_0,                  0x30},
	{WSA883X_DRE_CTL_1,                  0x20},
	{WSA883X_CLSH_CTL_0,                 0x37},
	{WSA883X_CLSH_CTL_1,                 0x81},
	{WSA883X_CLSH_V_HD_PA,               0x0F},
	{WSA883X_CLSH_V_PA_MIN,              0x00},
	{WSA883X_CLSH_OVRD_VAL,              0x00},
	{WSA883X_CLSH_HARD_MAX,              0xFF},
	{WSA883X_CLSH_SOFT_MAX,              0xFF},
	{WSA883X_CLSH_SIG_DP,                0x00},
	{WSA883X_TAGC_CTL,                   0x10},
	{WSA883X_TAGC_TIME,                  0x20},
	{WSA883X_TAGC_E2E_GAIN,              0x02},
	{WSA883X_TAGC_FORCE_VAL,             0x00},
	{WSA883X_VAGC_CTL,                   0x00},
	{WSA883X_VAGC_TIME,                  0x08},
	{WSA883X_VAGC_ATTN_LVL_1_2,          0x21},
	{WSA883X_VAGC_ATTN_LVL_3,            0x03},
	{WSA883X_INTR_MODE,                  0x00},
	{WSA883X_INTR_MASK0,                 0x1B},
	{WSA883X_INTR_MASK1,                 0x03},
	{WSA883X_INTR_STATUS0,               0x00},
	{WSA883X_INTR_STATUS1,               0x00},
	{WSA883X_INTR_CLEAR0,                0x00},
	{WSA883X_INTR_CLEAR1,                0x03},
	{WSA883X_INTR_LEVEL0,                0x00},
	{WSA883X_INTR_LEVEL1,                0x03},
	{WSA883X_INTR_SET0,                  0x00},
	{WSA883X_INTR_SET1,                  0x03},
	{WSA883X_INTR_TEST0,                 0x00},
	{WSA883X_INTR_TEST1,                 0x03},
	{WSA883X_OTP_CTRL0,                  0x00},
	{WSA883X_OTP_CTRL1,                  0x00},
	{WSA883X_HDRIVE_CTL_GROUP1,          0x00},
	{WSA883X_PIN_CTL,                    0x04},
	{WSA883X_PIN_CTL_OE,                 0x00},
	{WSA883X_PIN_WDATA_IOPAD,            0x00},
	{WSA883X_PIN_STATUS,                 0x00},
	{WSA883X_I2C_SLAVE_CTL,              0x00},
	{WSA883X_PDM_TEST_MODE,              0x00},
	{WSA883X_ATE_TEST_MODE,              0x00},
	{WSA883X_DRE_TEST,                   0x00},
	{WSA883X_DIG_DEBUG_MODE,             0x00},
	{WSA883X_DIG_DEBUG_SEL,              0x00},
	{WSA883X_DIG_DEBUG_EN,               0x00},
	{WSA883X_SWR_HM_TEST0,               0x08},
	{WSA883X_SWR_HM_TEST1,               0x00},
	{WSA883X_SWR_PAD_CTL,                0x45},
	{WSA883X_TEMP_DETECT_DBG_CTL,        0x00},
	{WSA883X_TEMP_DEBUG_MSB,             0x00},
	{WSA883X_TEMP_DEBUG_LSB,             0x00},
	{WSA883X_SAMPLE_EDGE_SEL,            0x7F},
	{WSA883X_TEST_MODE_CTL,              0x00},
	{WSA883X_IOPAD_CTL,                  0x00},
	{WSA883X_SPARE_0,                    0x00},
	{WSA883X_SPARE_1,                    0x00},
	{WSA883X_SPARE_2,                    0x00},
	{WSA883X_SCODE,                      0x00},
	{WSA883X_PAGE_REGISTER,              0x00},
	{WSA883X_OTP_REG_0,                  0x01},
	{WSA883X_OTP_REG_1,                  0xFF},
	{WSA883X_OTP_REG_2,                  0xC0},
	{WSA883X_OTP_REG_3,                  0xFF},
	{WSA883X_OTP_REG_4,                  0xC0},
	{WSA883X_OTP_REG_5,                  0xFF},
	{WSA883X_OTP_REG_6,                  0xFF},
	{WSA883X_OTP_REG_7,                  0xFF},
	{WSA883X_OTP_REG_8,                  0xFF},
	{WSA883X_OTP_REG_9,                  0xFF},
	{WSA883X_OTP_REG_10,                 0xFF},
	{WSA883X_OTP_REG_11,                 0xFF},
	{WSA883X_OTP_REG_12,                 0xFF},
	{WSA883X_OTP_REG_13,                 0xFF},
	{WSA883X_OTP_REG_14,                 0xFF},
	{WSA883X_OTP_REG_15,                 0xFF},
	{WSA883X_OTP_REG_16,                 0xFF},
	{WSA883X_OTP_REG_17,                 0xFF},
	{WSA883X_OTP_REG_18,                 0xFF},
	{WSA883X_OTP_REG_19,                 0xFF},
	{WSA883X_OTP_REG_20,                 0xFF},
	{WSA883X_OTP_REG_21,                 0xFF},
	{WSA883X_OTP_REG_22,                 0xFF},
	{WSA883X_OTP_REG_23,                 0xFF},
	{WSA883X_OTP_REG_24,                 0x03},
	{WSA883X_OTP_REG_25,                 0x01},
	{WSA883X_OTP_REG_26,                 0x03},
	{WSA883X_OTP_REG_27,                 0x11},
	{WSA883X_OTP_REG_28,                 0x3F},
	{WSA883X_OTP_REG_29,                 0x3F},
	{WSA883X_OTP_REG_30,                 0x01},
	{WSA883X_OTP_REG_31,                 0x01},
	{WSA883X_OTP_REG_SCODE,              0x00},
	{WSA883X_OTP_REG_63,                 0x40},
	{WSA883X_EMEM_0,                     0x00},
	{WSA883X_EMEM_1,                     0x00},
	{WSA883X_EMEM_2,                     0x00},
	{WSA883X_EMEM_3,                     0x00},
	{WSA883X_EMEM_4,                     0x00},
	{WSA883X_EMEM_5,                     0x00},
	{WSA883X_EMEM_6,                     0x00},
	{WSA883X_EMEM_7,                     0x00},
	{WSA883X_EMEM_8,                     0x00},
	{WSA883X_EMEM_9,                     0x00},
	{WSA883X_EMEM_10,                    0x00},
	{WSA883X_EMEM_11,                    0x00},
	{WSA883X_EMEM_12,                    0x00},
	{WSA883X_EMEM_13,                    0x00},
	{WSA883X_EMEM_14,                    0x00},
	{WSA883X_EMEM_15,                    0x00},
	{WSA883X_EMEM_16,                    0x00},
	{WSA883X_EMEM_17,                    0x00},
	{WSA883X_EMEM_18,                    0x00},
	{WSA883X_EMEM_19,                    0x00},
	{WSA883X_EMEM_20,                    0x00},
	{WSA883X_EMEM_21,                    0x00},
	{WSA883X_EMEM_22,                    0x00},
	{WSA883X_EMEM_23,                    0x00},
	{WSA883X_EMEM_24,                    0x00},
	{WSA883X_EMEM_25,                    0x00},
	{WSA883X_EMEM_26,                    0x00},
	{WSA883X_EMEM_27,                    0x00},
	{WSA883X_EMEM_28,                    0x00},
	{WSA883X_EMEM_29,                    0x00},
	{WSA883X_EMEM_30,                    0x00},
	{WSA883X_EMEM_31,                    0x00},
	{WSA883X_EMEM_32,                    0x00},
	{WSA883X_EMEM_33,                    0x00},
	{WSA883X_EMEM_34,                    0x00},
	{WSA883X_EMEM_35,                    0x00},
	{WSA883X_EMEM_36,                    0x00},
	{WSA883X_EMEM_37,                    0x00},
	{WSA883X_EMEM_38,                    0x00},
	{WSA883X_EMEM_39,                    0x00},
	{WSA883X_EMEM_40,                    0x00},
	{WSA883X_EMEM_41,                    0x00},
	{WSA883X_EMEM_42,                    0x00},
	{WSA883X_EMEM_43,                    0x00},
	{WSA883X_EMEM_44,                    0x00},
	{WSA883X_EMEM_45,                    0x00},
	{WSA883X_EMEM_46,                    0x00},
	{WSA883X_EMEM_47,                    0x00},
	{WSA883X_EMEM_48,                    0x00},
	{WSA883X_EMEM_49,                    0x00},
	{WSA883X_EMEM_50,                    0x00},
	{WSA883X_EMEM_51,                    0x00},
	{WSA883X_EMEM_52,                    0x00},
	{WSA883X_EMEM_53,                    0x00},
	{WSA883X_EMEM_54,                    0x00},
	{WSA883X_EMEM_55,                    0x00},
	{WSA883X_EMEM_56,                    0x00},
	{WSA883X_EMEM_57,                    0x00},
	{WSA883X_EMEM_58,                    0x00},
	{WSA883X_EMEM_59,                    0x00},
	{WSA883X_EMEM_60,                    0x00},
	{WSA883X_EMEM_61,                    0x00},
	{WSA883X_EMEM_62,                    0x00},
	{WSA883X_EMEM_63,                    0x00},
};

static bool wsa883x_readable_register(struct device *dev, unsigned int reg)
{
	if (reg <= WSA883X_BASE)
		return 0;

	return wsa883x_reg_access[WSA883X_REG(reg)] & RD_REG;
}

static bool wsa883x_writeable_register(struct device *dev, unsigned int reg)
{
	if (reg <= WSA883X_BASE)
		return 0;

	return wsa883x_reg_access[WSA883X_REG(reg)] & WR_REG;
}

static bool wsa883x_volatile_register(struct device *dev, unsigned int reg)
{
	if (reg <= WSA883X_BASE)
		return 0;

	return ((wsa883x_reg_access[WSA883X_REG(reg)] & RD_REG) &&
		!(wsa883x_reg_access[WSA883X_REG(reg)] & WR_REG));
}

struct regmap_config wsa881x_regmap_config = {
	.reg_bits = 16,
	.val_bits = 8,
	.cache_type = REGCACHE_RBTREE,
	.reg_defaults = wsa883x_defaults,
	.num_reg_defaults = ARRAY_SIZE(wsa883x_defaults),
	.max_register = WSA883X_MAX_REGISTER,
	.volatile_reg = wsa883x_volatile_register,
	.readable_reg = wsa883x_readable_register,
	.writeable_reg = wsa883x_writeable_register,
	.reg_format_endian = REGMAP_ENDIAN_NATIVE,
	.val_format_endian = REGMAP_ENDIAN_NATIVE,
	.can_multi_write = true,
};
Loading