]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.2
authorSasha Levin <sashal@kernel.org>
Thu, 11 May 2023 15:48:33 +0000 (11:48 -0400)
committerSasha Levin <sashal@kernel.org>
Thu, 11 May 2023 15:48:33 +0000 (11:48 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
13 files changed:
queue-6.2/asoc-codecs-constify-static-sdw_slave_ops-struct.patch [new file with mode: 0644]
queue-6.2/asoc-codecs-wcd938x-fix-accessing-regmap-on-unattach.patch [new file with mode: 0644]
queue-6.2/crypto-ccp-clear-psp-interrupt-status-register-befor.patch [new file with mode: 0644]
queue-6.2/mailbox-zynq-switch-to-flexible-array-to-simplify-co.patch [new file with mode: 0644]
queue-6.2/mailbox-zynqmp-fix-counts-of-child-nodes.patch [new file with mode: 0644]
queue-6.2/mtd-spi-nor-add-a-rww-flag.patch [new file with mode: 0644]
queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch [new file with mode: 0644]
queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch-16651 [new file with mode: 0644]
queue-6.2/qcom-llcc-edac-support-polling-mode-for-ecc-handling.patch [new file with mode: 0644]
queue-6.2/series [new file with mode: 0644]
queue-6.2/soc-qcom-llcc-do-not-create-edac-platform-device-on-.patch [new file with mode: 0644]
queue-6.2/usb-dwc3-gadget-drop-dead-hibernation-code.patch [new file with mode: 0644]
queue-6.2/usb-dwc3-gadget-execute-gadget-stop-after-halting-th.patch [new file with mode: 0644]

diff --git a/queue-6.2/asoc-codecs-constify-static-sdw_slave_ops-struct.patch b/queue-6.2/asoc-codecs-constify-static-sdw_slave_ops-struct.patch
new file mode 100644 (file)
index 0000000..278679a
--- /dev/null
@@ -0,0 +1,121 @@
+From a6c0053c188cb05907be22b86b35aaa3453c5dab Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 24 Jan 2023 17:39:51 +0100
+Subject: ASoC: codecs: constify static sdw_slave_ops struct
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ Upstream commit 65b7b869da9bd3bd0b9fa60e6fe557bfbc0a75e8 ]
+
+The struct sdw_slave_ops is not modified and sdw_driver takes pointer to
+const, so make it a const for code safety.
+
+Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Link: https://lore.kernel.org/r/20230124163953.345949-1-krzysztof.kozlowski@linaro.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Stable-dep-of: 84822215acd1 ("ASoC: codecs: wcd938x: fix accessing regmap on unattached devices")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/rt1316-sdw.c     | 2 +-
+ sound/soc/codecs/rt1318-sdw.c     | 2 +-
+ sound/soc/codecs/rt711-sdca-sdw.c | 2 +-
+ sound/soc/codecs/rt715-sdca-sdw.c | 2 +-
+ sound/soc/codecs/wcd938x-sdw.c    | 2 +-
+ sound/soc/codecs/wsa881x.c        | 2 +-
+ sound/soc/codecs/wsa883x.c        | 2 +-
+ 7 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
+index e6294cc7a9954..45a3eff31915b 100644
+--- a/sound/soc/codecs/rt1316-sdw.c
++++ b/sound/soc/codecs/rt1316-sdw.c
+@@ -584,7 +584,7 @@ static int rt1316_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
+  * slave_ops: callbacks for get_clock_stop_mode, clock_stop and
+  * port_prep are not defined for now
+  */
+-static struct sdw_slave_ops rt1316_slave_ops = {
++static const struct sdw_slave_ops rt1316_slave_ops = {
+       .read_prop = rt1316_read_prop,
+       .update_status = rt1316_update_status,
+ };
+diff --git a/sound/soc/codecs/rt1318-sdw.c b/sound/soc/codecs/rt1318-sdw.c
+index f85f5ab2c6d04..c6ec86e97a6e7 100644
+--- a/sound/soc/codecs/rt1318-sdw.c
++++ b/sound/soc/codecs/rt1318-sdw.c
+@@ -697,7 +697,7 @@ static int rt1318_sdw_pcm_hw_free(struct snd_pcm_substream *substream,
+  * slave_ops: callbacks for get_clock_stop_mode, clock_stop and
+  * port_prep are not defined for now
+  */
+-static struct sdw_slave_ops rt1318_slave_ops = {
++static const struct sdw_slave_ops rt1318_slave_ops = {
+       .read_prop = rt1318_read_prop,
+       .update_status = rt1318_update_status,
+ };
+diff --git a/sound/soc/codecs/rt711-sdca-sdw.c b/sound/soc/codecs/rt711-sdca-sdw.c
+index 88a8392a58edb..e23cec4c457de 100644
+--- a/sound/soc/codecs/rt711-sdca-sdw.c
++++ b/sound/soc/codecs/rt711-sdca-sdw.c
+@@ -338,7 +338,7 @@ static int rt711_sdca_interrupt_callback(struct sdw_slave *slave,
+       return ret;
+ }
+-static struct sdw_slave_ops rt711_sdca_slave_ops = {
++static const struct sdw_slave_ops rt711_sdca_slave_ops = {
+       .read_prop = rt711_sdca_read_prop,
+       .interrupt_callback = rt711_sdca_interrupt_callback,
+       .update_status = rt711_sdca_update_status,
+diff --git a/sound/soc/codecs/rt715-sdca-sdw.c b/sound/soc/codecs/rt715-sdca-sdw.c
+index c54ecf3e69879..38a82e4e2f952 100644
+--- a/sound/soc/codecs/rt715-sdca-sdw.c
++++ b/sound/soc/codecs/rt715-sdca-sdw.c
+@@ -172,7 +172,7 @@ static int rt715_sdca_read_prop(struct sdw_slave *slave)
+       return 0;
+ }
+-static struct sdw_slave_ops rt715_sdca_slave_ops = {
++static const struct sdw_slave_ops rt715_sdca_slave_ops = {
+       .read_prop = rt715_sdca_read_prop,
+       .update_status = rt715_sdca_update_status,
+ };
+diff --git a/sound/soc/codecs/wcd938x-sdw.c b/sound/soc/codecs/wcd938x-sdw.c
+index 1bf3c06a2b622..33d1b5ffeaeba 100644
+--- a/sound/soc/codecs/wcd938x-sdw.c
++++ b/sound/soc/codecs/wcd938x-sdw.c
+@@ -191,7 +191,7 @@ static int wcd9380_interrupt_callback(struct sdw_slave *slave,
+       return IRQ_HANDLED;
+ }
+-static struct sdw_slave_ops wcd9380_slave_ops = {
++static const struct sdw_slave_ops wcd9380_slave_ops = {
+       .update_status = wcd9380_update_status,
+       .interrupt_callback = wcd9380_interrupt_callback,
+       .bus_config = wcd9380_bus_config,
+diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
+index 6c8b1db649b89..046843b57b038 100644
+--- a/sound/soc/codecs/wsa881x.c
++++ b/sound/soc/codecs/wsa881x.c
+@@ -1101,7 +1101,7 @@ static int wsa881x_bus_config(struct sdw_slave *slave,
+       return 0;
+ }
+-static struct sdw_slave_ops wsa881x_slave_ops = {
++static const struct sdw_slave_ops wsa881x_slave_ops = {
+       .update_status = wsa881x_update_status,
+       .bus_config = wsa881x_bus_config,
+       .port_prep = wsa881x_port_prep,
+diff --git a/sound/soc/codecs/wsa883x.c b/sound/soc/codecs/wsa883x.c
+index 58fdb4e9fd978..693e988f30c0f 100644
+--- a/sound/soc/codecs/wsa883x.c
++++ b/sound/soc/codecs/wsa883x.c
+@@ -1073,7 +1073,7 @@ static int wsa883x_port_prep(struct sdw_slave *slave,
+       return 0;
+ }
+-static struct sdw_slave_ops wsa883x_slave_ops = {
++static const struct sdw_slave_ops wsa883x_slave_ops = {
+       .update_status = wsa883x_update_status,
+       .port_prep = wsa883x_port_prep,
+ };
+-- 
+2.39.2
+
diff --git a/queue-6.2/asoc-codecs-wcd938x-fix-accessing-regmap-on-unattach.patch b/queue-6.2/asoc-codecs-wcd938x-fix-accessing-regmap-on-unattach.patch
new file mode 100644 (file)
index 0000000..6e5395f
--- /dev/null
@@ -0,0 +1,2168 @@
+From ecbec137f28fd24943b9a2482bd590e6905f634d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 May 2023 16:41:02 +0200
+Subject: ASoC: codecs: wcd938x: fix accessing regmap on unattached devices
+
+From: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+
+[ Upstream commit 84822215acd15bd86a7759a835271e63bba83a7b ]
+
+The WCD938x comes with three devices on two Linux drivers:
+1. RX Soundwire device (wcd938x-sdw.c driver),
+2. TX Soundwire device, which is used to access devices via regmap (also
+   wcd938x-sdw.c driver),
+3. platform device (wcd938x.c driver) - glue and component master,
+   actually having most of the code using TX Soundwire device regmap.
+
+When RX and TX Soundwire devices probe, the component master (platform
+device) bind tries to write micbias configuration via TX Soundwire
+regmap.  This might happen before TX Soundwire enumerates, so the regmap
+access fails.  On Qualcomm SM8550 board with WCD9385:
+
+  qcom-soundwire 6d30000.soundwire-controller: Qualcomm Soundwire controller v2.0.0 Registered
+  wcd938x_codec audio-codec: bound sdw:0:0217:010d:00:4 (ops wcd938x_sdw_component_ops)
+  wcd938x_codec audio-codec: bound sdw:0:0217:010d:00:3 (ops wcd938x_sdw_component_ops)
+  qcom-soundwire 6ad0000.soundwire-controller: swrm_wait_for_wr_fifo_avail err write overflow
+
+Fix the issue by:
+1. Moving the regmap creation from platform device to TX Soundwire
+   device.  The regmap settings are moved as-is with one difference:
+   making the wcd938x_regmap_config const.
+2. Using regmap in cache only mode till the actual TX Soundwire device
+   enumerates and then sync the regmap cache.
+
+Cc: <stable@vger.kernel.org> # v3.14+
+Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
+Message-Id: <20230503144102.242240-1-krzysztof.kozlowski@linaro.org>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/wcd938x-sdw.c | 1037 +++++++++++++++++++++++++++++++-
+ sound/soc/codecs/wcd938x.c     | 1003 +-----------------------------
+ sound/soc/codecs/wcd938x.h     |    1 +
+ 3 files changed, 1030 insertions(+), 1011 deletions(-)
+
+diff --git a/sound/soc/codecs/wcd938x-sdw.c b/sound/soc/codecs/wcd938x-sdw.c
+index 33d1b5ffeaeba..402286dfaea44 100644
+--- a/sound/soc/codecs/wcd938x-sdw.c
++++ b/sound/soc/codecs/wcd938x-sdw.c
+@@ -161,6 +161,14 @@ EXPORT_SYMBOL_GPL(wcd938x_sdw_set_sdw_stream);
+ static int wcd9380_update_status(struct sdw_slave *slave,
+                                enum sdw_slave_status status)
+ {
++      struct wcd938x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
++
++      if (wcd->regmap && (status == SDW_SLAVE_ATTACHED)) {
++              /* Write out any cached changes that happened between probe and attach */
++              regcache_cache_only(wcd->regmap, false);
++              return regcache_sync(wcd->regmap);
++      }
++
+       return 0;
+ }
+@@ -177,20 +185,1014 @@ static int wcd9380_interrupt_callback(struct sdw_slave *slave,
+ {
+       struct wcd938x_sdw_priv *wcd = dev_get_drvdata(&slave->dev);
+       struct irq_domain *slave_irq = wcd->slave_irq;
+-      struct regmap *regmap = dev_get_regmap(&slave->dev, NULL);
+       u32 sts1, sts2, sts3;
+       do {
+               handle_nested_irq(irq_find_mapping(slave_irq, 0));
+-              regmap_read(regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1);
+-              regmap_read(regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2);
+-              regmap_read(regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3);
++              regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1);
++              regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2);
++              regmap_read(wcd->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3);
+       } while (sts1 || sts2 || sts3);
+       return IRQ_HANDLED;
+ }
++static const struct reg_default wcd938x_defaults[] = {
++      {WCD938X_ANA_PAGE_REGISTER,                            0x00},
++      {WCD938X_ANA_BIAS,                                     0x00},
++      {WCD938X_ANA_RX_SUPPLIES,                              0x00},
++      {WCD938X_ANA_HPH,                                      0x0C},
++      {WCD938X_ANA_EAR,                                      0x00},
++      {WCD938X_ANA_EAR_COMPANDER_CTL,                        0x02},
++      {WCD938X_ANA_TX_CH1,                                   0x20},
++      {WCD938X_ANA_TX_CH2,                                   0x00},
++      {WCD938X_ANA_TX_CH3,                                   0x20},
++      {WCD938X_ANA_TX_CH4,                                   0x00},
++      {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC,                 0x00},
++      {WCD938X_ANA_MICB3_DSP_EN_LOGIC,                       0x00},
++      {WCD938X_ANA_MBHC_MECH,                                0x39},
++      {WCD938X_ANA_MBHC_ELECT,                               0x08},
++      {WCD938X_ANA_MBHC_ZDET,                                0x00},
++      {WCD938X_ANA_MBHC_RESULT_1,                            0x00},
++      {WCD938X_ANA_MBHC_RESULT_2,                            0x00},
++      {WCD938X_ANA_MBHC_RESULT_3,                            0x00},
++      {WCD938X_ANA_MBHC_BTN0,                                0x00},
++      {WCD938X_ANA_MBHC_BTN1,                                0x10},
++      {WCD938X_ANA_MBHC_BTN2,                                0x20},
++      {WCD938X_ANA_MBHC_BTN3,                                0x30},
++      {WCD938X_ANA_MBHC_BTN4,                                0x40},
++      {WCD938X_ANA_MBHC_BTN5,                                0x50},
++      {WCD938X_ANA_MBHC_BTN6,                                0x60},
++      {WCD938X_ANA_MBHC_BTN7,                                0x70},
++      {WCD938X_ANA_MICB1,                                    0x10},
++      {WCD938X_ANA_MICB2,                                    0x10},
++      {WCD938X_ANA_MICB2_RAMP,                               0x00},
++      {WCD938X_ANA_MICB3,                                    0x10},
++      {WCD938X_ANA_MICB4,                                    0x10},
++      {WCD938X_BIAS_CTL,                                     0x2A},
++      {WCD938X_BIAS_VBG_FINE_ADJ,                            0x55},
++      {WCD938X_LDOL_VDDCX_ADJUST,                            0x01},
++      {WCD938X_LDOL_DISABLE_LDOL,                            0x00},
++      {WCD938X_MBHC_CTL_CLK,                                 0x00},
++      {WCD938X_MBHC_CTL_ANA,                                 0x00},
++      {WCD938X_MBHC_CTL_SPARE_1,                             0x00},
++      {WCD938X_MBHC_CTL_SPARE_2,                             0x00},
++      {WCD938X_MBHC_CTL_BCS,                                 0x00},
++      {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS,                 0x00},
++      {WCD938X_MBHC_TEST_CTL,                                0x00},
++      {WCD938X_LDOH_MODE,                                    0x2B},
++      {WCD938X_LDOH_BIAS,                                    0x68},
++      {WCD938X_LDOH_STB_LOADS,                               0x00},
++      {WCD938X_LDOH_SLOWRAMP,                                0x50},
++      {WCD938X_MICB1_TEST_CTL_1,                             0x1A},
++      {WCD938X_MICB1_TEST_CTL_2,                             0x00},
++      {WCD938X_MICB1_TEST_CTL_3,                             0xA4},
++      {WCD938X_MICB2_TEST_CTL_1,                             0x1A},
++      {WCD938X_MICB2_TEST_CTL_2,                             0x00},
++      {WCD938X_MICB2_TEST_CTL_3,                             0x24},
++      {WCD938X_MICB3_TEST_CTL_1,                             0x1A},
++      {WCD938X_MICB3_TEST_CTL_2,                             0x00},
++      {WCD938X_MICB3_TEST_CTL_3,                             0xA4},
++      {WCD938X_MICB4_TEST_CTL_1,                             0x1A},
++      {WCD938X_MICB4_TEST_CTL_2,                             0x00},
++      {WCD938X_MICB4_TEST_CTL_3,                             0xA4},
++      {WCD938X_TX_COM_ADC_VCM,                               0x39},
++      {WCD938X_TX_COM_BIAS_ATEST,                            0xE0},
++      {WCD938X_TX_COM_SPARE1,                                0x00},
++      {WCD938X_TX_COM_SPARE2,                                0x00},
++      {WCD938X_TX_COM_TXFE_DIV_CTL,                          0x22},
++      {WCD938X_TX_COM_TXFE_DIV_START,                        0x00},
++      {WCD938X_TX_COM_SPARE3,                                0x00},
++      {WCD938X_TX_COM_SPARE4,                                0x00},
++      {WCD938X_TX_1_2_TEST_EN,                               0xCC},
++      {WCD938X_TX_1_2_ADC_IB,                                0xE9},
++      {WCD938X_TX_1_2_ATEST_REFCTL,                          0x0A},
++      {WCD938X_TX_1_2_TEST_CTL,                              0x38},
++      {WCD938X_TX_1_2_TEST_BLK_EN1,                          0xFF},
++      {WCD938X_TX_1_2_TXFE1_CLKDIV,                          0x00},
++      {WCD938X_TX_1_2_SAR2_ERR,                              0x00},
++      {WCD938X_TX_1_2_SAR1_ERR,                              0x00},
++      {WCD938X_TX_3_4_TEST_EN,                               0xCC},
++      {WCD938X_TX_3_4_ADC_IB,                                0xE9},
++      {WCD938X_TX_3_4_ATEST_REFCTL,                          0x0A},
++      {WCD938X_TX_3_4_TEST_CTL,                              0x38},
++      {WCD938X_TX_3_4_TEST_BLK_EN3,                          0xFF},
++      {WCD938X_TX_3_4_TXFE3_CLKDIV,                          0x00},
++      {WCD938X_TX_3_4_SAR4_ERR,                              0x00},
++      {WCD938X_TX_3_4_SAR3_ERR,                              0x00},
++      {WCD938X_TX_3_4_TEST_BLK_EN2,                          0xFB},
++      {WCD938X_TX_3_4_TXFE2_CLKDIV,                          0x00},
++      {WCD938X_TX_3_4_SPARE1,                                0x00},
++      {WCD938X_TX_3_4_TEST_BLK_EN4,                          0xFB},
++      {WCD938X_TX_3_4_TXFE4_CLKDIV,                          0x00},
++      {WCD938X_TX_3_4_SPARE2,                                0x00},
++      {WCD938X_CLASSH_MODE_1,                                0x40},
++      {WCD938X_CLASSH_MODE_2,                                0x3A},
++      {WCD938X_CLASSH_MODE_3,                                0x00},
++      {WCD938X_CLASSH_CTRL_VCL_1,                            0x70},
++      {WCD938X_CLASSH_CTRL_VCL_2,                            0x82},
++      {WCD938X_CLASSH_CTRL_CCL_1,                            0x31},
++      {WCD938X_CLASSH_CTRL_CCL_2,                            0x80},
++      {WCD938X_CLASSH_CTRL_CCL_3,                            0x80},
++      {WCD938X_CLASSH_CTRL_CCL_4,                            0x51},
++      {WCD938X_CLASSH_CTRL_CCL_5,                            0x00},
++      {WCD938X_CLASSH_BUCK_TMUX_A_D,                         0x00},
++      {WCD938X_CLASSH_BUCK_SW_DRV_CNTL,                      0x77},
++      {WCD938X_CLASSH_SPARE,                                 0x00},
++      {WCD938X_FLYBACK_EN,                                   0x4E},
++      {WCD938X_FLYBACK_VNEG_CTRL_1,                          0x0B},
++      {WCD938X_FLYBACK_VNEG_CTRL_2,                          0x45},
++      {WCD938X_FLYBACK_VNEG_CTRL_3,                          0x74},
++      {WCD938X_FLYBACK_VNEG_CTRL_4,                          0x7F},
++      {WCD938X_FLYBACK_VNEG_CTRL_5,                          0x83},
++      {WCD938X_FLYBACK_VNEG_CTRL_6,                          0x98},
++      {WCD938X_FLYBACK_VNEG_CTRL_7,                          0xA9},
++      {WCD938X_FLYBACK_VNEG_CTRL_8,                          0x68},
++      {WCD938X_FLYBACK_VNEG_CTRL_9,                          0x64},
++      {WCD938X_FLYBACK_VNEGDAC_CTRL_1,                       0xED},
++      {WCD938X_FLYBACK_VNEGDAC_CTRL_2,                       0xF0},
++      {WCD938X_FLYBACK_VNEGDAC_CTRL_3,                       0xA6},
++      {WCD938X_FLYBACK_CTRL_1,                               0x65},
++      {WCD938X_FLYBACK_TEST_CTL,                             0x00},
++      {WCD938X_RX_AUX_SW_CTL,                                0x00},
++      {WCD938X_RX_PA_AUX_IN_CONN,                            0x01},
++      {WCD938X_RX_TIMER_DIV,                                 0x32},
++      {WCD938X_RX_OCP_CTL,                                   0x1F},
++      {WCD938X_RX_OCP_COUNT,                                 0x77},
++      {WCD938X_RX_BIAS_EAR_DAC,                              0xA0},
++      {WCD938X_RX_BIAS_EAR_AMP,                              0xAA},
++      {WCD938X_RX_BIAS_HPH_LDO,                              0xA9},
++      {WCD938X_RX_BIAS_HPH_PA,                               0xAA},
++      {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2,                    0x8A},
++      {WCD938X_RX_BIAS_HPH_RDAC_LDO,                         0x88},
++      {WCD938X_RX_BIAS_HPH_CNP1,                             0x82},
++      {WCD938X_RX_BIAS_HPH_LOWPOWER,                         0x82},
++      {WCD938X_RX_BIAS_AUX_DAC,                              0xA0},
++      {WCD938X_RX_BIAS_AUX_AMP,                              0xAA},
++      {WCD938X_RX_BIAS_VNEGDAC_BLEEDER,                      0x50},
++      {WCD938X_RX_BIAS_MISC,                                 0x00},
++      {WCD938X_RX_BIAS_BUCK_RST,                             0x08},
++      {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP,                     0x44},
++      {WCD938X_RX_BIAS_FLYB_ERRAMP,                          0x40},
++      {WCD938X_RX_BIAS_FLYB_BUFF,                            0xAA},
++      {WCD938X_RX_BIAS_FLYB_MID_RST,                         0x14},
++      {WCD938X_HPH_L_STATUS,                                 0x04},
++      {WCD938X_HPH_R_STATUS,                                 0x04},
++      {WCD938X_HPH_CNP_EN,                                   0x80},
++      {WCD938X_HPH_CNP_WG_CTL,                               0x9A},
++      {WCD938X_HPH_CNP_WG_TIME,                              0x14},
++      {WCD938X_HPH_OCP_CTL,                                  0x28},
++      {WCD938X_HPH_AUTO_CHOP,                                0x16},
++      {WCD938X_HPH_CHOP_CTL,                                 0x83},
++      {WCD938X_HPH_PA_CTL1,                                  0x46},
++      {WCD938X_HPH_PA_CTL2,                                  0x50},
++      {WCD938X_HPH_L_EN,                                     0x80},
++      {WCD938X_HPH_L_TEST,                                   0xE0},
++      {WCD938X_HPH_L_ATEST,                                  0x50},
++      {WCD938X_HPH_R_EN,                                     0x80},
++      {WCD938X_HPH_R_TEST,                                   0xE0},
++      {WCD938X_HPH_R_ATEST,                                  0x54},
++      {WCD938X_HPH_RDAC_CLK_CTL1,                            0x99},
++      {WCD938X_HPH_RDAC_CLK_CTL2,                            0x9B},
++      {WCD938X_HPH_RDAC_LDO_CTL,                             0x33},
++      {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL,                     0x00},
++      {WCD938X_HPH_REFBUFF_UHQA_CTL,                         0x68},
++      {WCD938X_HPH_REFBUFF_LP_CTL,                           0x0E},
++      {WCD938X_HPH_L_DAC_CTL,                                0x20},
++      {WCD938X_HPH_R_DAC_CTL,                                0x20},
++      {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL,               0x55},
++      {WCD938X_HPH_SURGE_HPHLR_SURGE_EN,                     0x19},
++      {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1,                  0xA0},
++      {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS,                 0x00},
++      {WCD938X_EAR_EAR_EN_REG,                               0x22},
++      {WCD938X_EAR_EAR_PA_CON,                               0x44},
++      {WCD938X_EAR_EAR_SP_CON,                               0xDB},
++      {WCD938X_EAR_EAR_DAC_CON,                              0x80},
++      {WCD938X_EAR_EAR_CNP_FSM_CON,                          0xB2},
++      {WCD938X_EAR_TEST_CTL,                                 0x00},
++      {WCD938X_EAR_STATUS_REG_1,                             0x00},
++      {WCD938X_EAR_STATUS_REG_2,                             0x08},
++      {WCD938X_ANA_NEW_PAGE_REGISTER,                        0x00},
++      {WCD938X_HPH_NEW_ANA_HPH2,                             0x00},
++      {WCD938X_HPH_NEW_ANA_HPH3,                             0x00},
++      {WCD938X_SLEEP_CTL,                                    0x16},
++      {WCD938X_SLEEP_WATCHDOG_CTL,                           0x00},
++      {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL,                 0x00},
++      {WCD938X_MBHC_NEW_CTL_1,                               0x02},
++      {WCD938X_MBHC_NEW_CTL_2,                               0x05},
++      {WCD938X_MBHC_NEW_PLUG_DETECT_CTL,                     0xE9},
++      {WCD938X_MBHC_NEW_ZDET_ANA_CTL,                        0x0F},
++      {WCD938X_MBHC_NEW_ZDET_RAMP_CTL,                       0x00},
++      {WCD938X_MBHC_NEW_FSM_STATUS,                          0x00},
++      {WCD938X_MBHC_NEW_ADC_RESULT,                          0x00},
++      {WCD938X_TX_NEW_AMIC_MUX_CFG,                          0x00},
++      {WCD938X_AUX_AUXPA,                                    0x00},
++      {WCD938X_LDORXTX_MODE,                                 0x0C},
++      {WCD938X_LDORXTX_CONFIG,                               0x10},
++      {WCD938X_DIE_CRACK_DIE_CRK_DET_EN,                     0x00},
++      {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT,                    0x00},
++      {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL,                    0x40},
++      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L,                   0x81},
++      {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL,                    0x10},
++      {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL,                0x00},
++      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R,                   0x81},
++      {WCD938X_HPH_NEW_INT_PA_MISC1,                         0x22},
++      {WCD938X_HPH_NEW_INT_PA_MISC2,                         0x00},
++      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC,                     0x00},
++      {WCD938X_HPH_NEW_INT_HPH_TIMER1,                       0xFE},
++      {WCD938X_HPH_NEW_INT_HPH_TIMER2,                       0x02},
++      {WCD938X_HPH_NEW_INT_HPH_TIMER3,                       0x4E},
++      {WCD938X_HPH_NEW_INT_HPH_TIMER4,                       0x54},
++      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2,                    0x00},
++      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3,                    0x00},
++      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW,               0x90},
++      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW,               0x90},
++      {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI,              0x62},
++      {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP,                 0x01},
++      {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP,                   0x11},
++      {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL,            0x57},
++      {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL,       0x01},
++      {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT,                0x00},
++      {WCD938X_MBHC_NEW_INT_SPARE_2,                         0x00},
++      {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON,                  0xA8},
++      {WCD938X_EAR_INT_NEW_CNP_VCM_CON1,                     0x42},
++      {WCD938X_EAR_INT_NEW_CNP_VCM_CON2,                     0x22},
++      {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS,                 0x00},
++      {WCD938X_AUX_INT_EN_REG,                               0x00},
++      {WCD938X_AUX_INT_PA_CTRL,                              0x06},
++      {WCD938X_AUX_INT_SP_CTRL,                              0xD2},
++      {WCD938X_AUX_INT_DAC_CTRL,                             0x80},
++      {WCD938X_AUX_INT_CLK_CTRL,                             0x50},
++      {WCD938X_AUX_INT_TEST_CTRL,                            0x00},
++      {WCD938X_AUX_INT_STATUS_REG,                           0x00},
++      {WCD938X_AUX_INT_MISC,                                 0x00},
++      {WCD938X_LDORXTX_INT_BIAS,                             0x6E},
++      {WCD938X_LDORXTX_INT_STB_LOADS_DTEST,                  0x50},
++      {WCD938X_LDORXTX_INT_TEST0,                            0x1C},
++      {WCD938X_LDORXTX_INT_STARTUP_TIMER,                    0xFF},
++      {WCD938X_LDORXTX_INT_TEST1,                            0x1F},
++      {WCD938X_LDORXTX_INT_STATUS,                           0x00},
++      {WCD938X_SLEEP_INT_WATCHDOG_CTL_1,                     0x0A},
++      {WCD938X_SLEEP_INT_WATCHDOG_CTL_2,                     0x0A},
++      {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1,               0x02},
++      {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2,               0x60},
++      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2,               0xFF},
++      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1,               0x7F},
++      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0,               0x3F},
++      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M,          0x1F},
++      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M,          0x0F},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1,          0xD7},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0,            0xC8},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP,           0xC6},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1,      0xD5},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0,        0xCA},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP,       0x05},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0,    0xA5},
++      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP,       0x13},
++      {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1,             0x88},
++      {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP,            0x42},
++      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2,                  0xFF},
++      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1,                  0x64},
++      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0,                  0x64},
++      {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP,                 0x77},
++      {WCD938X_DIGITAL_PAGE_REGISTER,                        0x00},
++      {WCD938X_DIGITAL_CHIP_ID0,                             0x00},
++      {WCD938X_DIGITAL_CHIP_ID1,                             0x00},
++      {WCD938X_DIGITAL_CHIP_ID2,                             0x0D},
++      {WCD938X_DIGITAL_CHIP_ID3,                             0x01},
++      {WCD938X_DIGITAL_SWR_TX_CLK_RATE,                      0x00},
++      {WCD938X_DIGITAL_CDC_RST_CTL,                          0x03},
++      {WCD938X_DIGITAL_TOP_CLK_CFG,                          0x00},
++      {WCD938X_DIGITAL_CDC_ANA_CLK_CTL,                      0x00},
++      {WCD938X_DIGITAL_CDC_DIG_CLK_CTL,                      0xF0},
++      {WCD938X_DIGITAL_SWR_RST_EN,                           0x00},
++      {WCD938X_DIGITAL_CDC_PATH_MODE,                        0x55},
++      {WCD938X_DIGITAL_CDC_RX_RST,                           0x00},
++      {WCD938X_DIGITAL_CDC_RX0_CTL,                          0xFC},
++      {WCD938X_DIGITAL_CDC_RX1_CTL,                          0xFC},
++      {WCD938X_DIGITAL_CDC_RX2_CTL,                          0xFC},
++      {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1,                  0x00},
++      {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3,                  0x00},
++      {WCD938X_DIGITAL_CDC_COMP_CTL_0,                       0x00},
++      {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL,                   0x1E},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0,                     0x00},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1,                     0x01},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0,                     0x63},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1,                     0x04},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0,                     0xAC},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1,                     0x04},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0,                     0x1A},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1,                     0x03},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0,                     0xBC},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1,                     0x02},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0,                     0xC7},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0,                     0xF8},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_C_0,                      0x47},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_C_1,                      0x43},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_C_2,                      0xB1},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_C_3,                      0x17},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R1,                       0x4D},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R2,                       0x29},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R3,                       0x34},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R4,                       0x59},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R5,                       0x66},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R6,                       0x87},
++      {WCD938X_DIGITAL_CDC_HPH_DSM_R7,                       0x64},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0,                     0x00},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1,                     0x01},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0,                     0x96},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1,                     0x09},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0,                     0xAB},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1,                     0x05},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0,                     0x1C},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1,                     0x02},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0,                     0x17},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1,                     0x02},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0,                     0xAA},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0,                     0xE3},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_C_0,                      0x69},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_C_1,                      0x54},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_C_2,                      0x02},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_C_3,                      0x15},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R1,                       0xA4},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R2,                       0xB5},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R3,                       0x86},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R4,                       0x85},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R5,                       0xAA},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R6,                       0xE2},
++      {WCD938X_DIGITAL_CDC_AUX_DSM_R7,                       0x62},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0,                    0x55},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1,                    0xA9},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0,                   0x3D},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1,                   0x2E},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2,                   0x01},
++      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0,                   0x00},
++      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1,                   0xFC},
++      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2,                   0x01},
++      {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL,                     0x00},
++      {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL,                     0x00},
++      {WCD938X_DIGITAL_CDC_EAR_PATH_CTL,                     0x00},
++      {WCD938X_DIGITAL_CDC_SWR_CLH,                          0x00},
++      {WCD938X_DIGITAL_SWR_CLH_BYP,                          0x00},
++      {WCD938X_DIGITAL_CDC_TX0_CTL,                          0x68},
++      {WCD938X_DIGITAL_CDC_TX1_CTL,                          0x68},
++      {WCD938X_DIGITAL_CDC_TX2_CTL,                          0x68},
++      {WCD938X_DIGITAL_CDC_TX_RST,                           0x00},
++      {WCD938X_DIGITAL_CDC_REQ_CTL,                          0x01},
++      {WCD938X_DIGITAL_CDC_RST,                              0x00},
++      {WCD938X_DIGITAL_CDC_AMIC_CTL,                         0x0F},
++      {WCD938X_DIGITAL_CDC_DMIC_CTL,                         0x04},
++      {WCD938X_DIGITAL_CDC_DMIC1_CTL,                        0x01},
++      {WCD938X_DIGITAL_CDC_DMIC2_CTL,                        0x01},
++      {WCD938X_DIGITAL_CDC_DMIC3_CTL,                        0x01},
++      {WCD938X_DIGITAL_CDC_DMIC4_CTL,                        0x01},
++      {WCD938X_DIGITAL_EFUSE_PRG_CTL,                        0x00},
++      {WCD938X_DIGITAL_EFUSE_CTL,                            0x2B},
++      {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2,                    0x11},
++      {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4,                    0x11},
++      {WCD938X_DIGITAL_PDM_WD_CTL0,                          0x00},
++      {WCD938X_DIGITAL_PDM_WD_CTL1,                          0x00},
++      {WCD938X_DIGITAL_PDM_WD_CTL2,                          0x00},
++      {WCD938X_DIGITAL_INTR_MODE,                            0x00},
++      {WCD938X_DIGITAL_INTR_MASK_0,                          0xFF},
++      {WCD938X_DIGITAL_INTR_MASK_1,                          0xFF},
++      {WCD938X_DIGITAL_INTR_MASK_2,                          0x3F},
++      {WCD938X_DIGITAL_INTR_STATUS_0,                        0x00},
++      {WCD938X_DIGITAL_INTR_STATUS_1,                        0x00},
++      {WCD938X_DIGITAL_INTR_STATUS_2,                        0x00},
++      {WCD938X_DIGITAL_INTR_CLEAR_0,                         0x00},
++      {WCD938X_DIGITAL_INTR_CLEAR_1,                         0x00},
++      {WCD938X_DIGITAL_INTR_CLEAR_2,                         0x00},
++      {WCD938X_DIGITAL_INTR_LEVEL_0,                         0x00},
++      {WCD938X_DIGITAL_INTR_LEVEL_1,                         0x00},
++      {WCD938X_DIGITAL_INTR_LEVEL_2,                         0x00},
++      {WCD938X_DIGITAL_INTR_SET_0,                           0x00},
++      {WCD938X_DIGITAL_INTR_SET_1,                           0x00},
++      {WCD938X_DIGITAL_INTR_SET_2,                           0x00},
++      {WCD938X_DIGITAL_INTR_TEST_0,                          0x00},
++      {WCD938X_DIGITAL_INTR_TEST_1,                          0x00},
++      {WCD938X_DIGITAL_INTR_TEST_2,                          0x00},
++      {WCD938X_DIGITAL_TX_MODE_DBG_EN,                       0x00},
++      {WCD938X_DIGITAL_TX_MODE_DBG_0_1,                      0x00},
++      {WCD938X_DIGITAL_TX_MODE_DBG_2_3,                      0x00},
++      {WCD938X_DIGITAL_LB_IN_SEL_CTL,                        0x00},
++      {WCD938X_DIGITAL_LOOP_BACK_MODE,                       0x00},
++      {WCD938X_DIGITAL_SWR_DAC_TEST,                         0x00},
++      {WCD938X_DIGITAL_SWR_HM_TEST_RX_0,                     0x40},
++      {WCD938X_DIGITAL_SWR_HM_TEST_TX_0,                     0x40},
++      {WCD938X_DIGITAL_SWR_HM_TEST_RX_1,                     0x00},
++      {WCD938X_DIGITAL_SWR_HM_TEST_TX_1,                     0x00},
++      {WCD938X_DIGITAL_SWR_HM_TEST_TX_2,                     0x00},
++      {WCD938X_DIGITAL_SWR_HM_TEST_0,                        0x00},
++      {WCD938X_DIGITAL_SWR_HM_TEST_1,                        0x00},
++      {WCD938X_DIGITAL_PAD_CTL_SWR_0,                        0x8F},
++      {WCD938X_DIGITAL_PAD_CTL_SWR_1,                        0x06},
++      {WCD938X_DIGITAL_I2C_CTL,                              0x00},
++      {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE,                0x00},
++      {WCD938X_DIGITAL_EFUSE_TEST_CTL_0,                     0x00},
++      {WCD938X_DIGITAL_EFUSE_TEST_CTL_1,                     0x00},
++      {WCD938X_DIGITAL_EFUSE_T_DATA_0,                       0x00},
++      {WCD938X_DIGITAL_EFUSE_T_DATA_1,                       0x00},
++      {WCD938X_DIGITAL_PAD_CTL_PDM_RX0,                      0xF1},
++      {WCD938X_DIGITAL_PAD_CTL_PDM_RX1,                      0xF1},
++      {WCD938X_DIGITAL_PAD_CTL_PDM_TX0,                      0xF1},
++      {WCD938X_DIGITAL_PAD_CTL_PDM_TX1,                      0xF1},
++      {WCD938X_DIGITAL_PAD_CTL_PDM_TX2,                      0xF1},
++      {WCD938X_DIGITAL_PAD_INP_DIS_0,                        0x00},
++      {WCD938X_DIGITAL_PAD_INP_DIS_1,                        0x00},
++      {WCD938X_DIGITAL_DRIVE_STRENGTH_0,                     0x00},
++      {WCD938X_DIGITAL_DRIVE_STRENGTH_1,                     0x00},
++      {WCD938X_DIGITAL_DRIVE_STRENGTH_2,                     0x00},
++      {WCD938X_DIGITAL_RX_DATA_EDGE_CTL,                     0x1F},
++      {WCD938X_DIGITAL_TX_DATA_EDGE_CTL,                     0x80},
++      {WCD938X_DIGITAL_GPIO_MODE,                            0x00},
++      {WCD938X_DIGITAL_PIN_CTL_OE,                           0x00},
++      {WCD938X_DIGITAL_PIN_CTL_DATA_0,                       0x00},
++      {WCD938X_DIGITAL_PIN_CTL_DATA_1,                       0x00},
++      {WCD938X_DIGITAL_PIN_STATUS_0,                         0x00},
++      {WCD938X_DIGITAL_PIN_STATUS_1,                         0x00},
++      {WCD938X_DIGITAL_DIG_DEBUG_CTL,                        0x00},
++      {WCD938X_DIGITAL_DIG_DEBUG_EN,                         0x00},
++      {WCD938X_DIGITAL_ANA_CSR_DBG_ADD,                      0x00},
++      {WCD938X_DIGITAL_ANA_CSR_DBG_CTL,                      0x48},
++      {WCD938X_DIGITAL_SSP_DBG,                              0x00},
++      {WCD938X_DIGITAL_MODE_STATUS_0,                        0x00},
++      {WCD938X_DIGITAL_MODE_STATUS_1,                        0x00},
++      {WCD938X_DIGITAL_SPARE_0,                              0x00},
++      {WCD938X_DIGITAL_SPARE_1,                              0x00},
++      {WCD938X_DIGITAL_SPARE_2,                              0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_0,                          0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_1,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_2,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_3,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_4,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_5,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_6,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_7,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_8,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_9,                          0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_10,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_11,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_12,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_13,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_14,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_15,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_16,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_17,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_18,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_19,                         0xFF},
++      {WCD938X_DIGITAL_EFUSE_REG_20,                         0x0E},
++      {WCD938X_DIGITAL_EFUSE_REG_21,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_22,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_23,                         0xF8},
++      {WCD938X_DIGITAL_EFUSE_REG_24,                         0x16},
++      {WCD938X_DIGITAL_EFUSE_REG_25,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_26,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_27,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_28,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_29,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_30,                         0x00},
++      {WCD938X_DIGITAL_EFUSE_REG_31,                         0x00},
++      {WCD938X_DIGITAL_TX_REQ_FB_CTL_0,                      0x88},
++      {WCD938X_DIGITAL_TX_REQ_FB_CTL_1,                      0x88},
++      {WCD938X_DIGITAL_TX_REQ_FB_CTL_2,                      0x88},
++      {WCD938X_DIGITAL_TX_REQ_FB_CTL_3,                      0x88},
++      {WCD938X_DIGITAL_TX_REQ_FB_CTL_4,                      0x88},
++      {WCD938X_DIGITAL_DEM_BYPASS_DATA0,                     0x55},
++      {WCD938X_DIGITAL_DEM_BYPASS_DATA1,                     0x55},
++      {WCD938X_DIGITAL_DEM_BYPASS_DATA2,                     0x55},
++      {WCD938X_DIGITAL_DEM_BYPASS_DATA3,                     0x01},
++};
++
++static bool wcd938x_rdwr_register(struct device *dev, unsigned int reg)
++{
++      switch (reg) {
++      case WCD938X_ANA_PAGE_REGISTER:
++      case WCD938X_ANA_BIAS:
++      case WCD938X_ANA_RX_SUPPLIES:
++      case WCD938X_ANA_HPH:
++      case WCD938X_ANA_EAR:
++      case WCD938X_ANA_EAR_COMPANDER_CTL:
++      case WCD938X_ANA_TX_CH1:
++      case WCD938X_ANA_TX_CH2:
++      case WCD938X_ANA_TX_CH3:
++      case WCD938X_ANA_TX_CH4:
++      case WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC:
++      case WCD938X_ANA_MICB3_DSP_EN_LOGIC:
++      case WCD938X_ANA_MBHC_MECH:
++      case WCD938X_ANA_MBHC_ELECT:
++      case WCD938X_ANA_MBHC_ZDET:
++      case WCD938X_ANA_MBHC_BTN0:
++      case WCD938X_ANA_MBHC_BTN1:
++      case WCD938X_ANA_MBHC_BTN2:
++      case WCD938X_ANA_MBHC_BTN3:
++      case WCD938X_ANA_MBHC_BTN4:
++      case WCD938X_ANA_MBHC_BTN5:
++      case WCD938X_ANA_MBHC_BTN6:
++      case WCD938X_ANA_MBHC_BTN7:
++      case WCD938X_ANA_MICB1:
++      case WCD938X_ANA_MICB2:
++      case WCD938X_ANA_MICB2_RAMP:
++      case WCD938X_ANA_MICB3:
++      case WCD938X_ANA_MICB4:
++      case WCD938X_BIAS_CTL:
++      case WCD938X_BIAS_VBG_FINE_ADJ:
++      case WCD938X_LDOL_VDDCX_ADJUST:
++      case WCD938X_LDOL_DISABLE_LDOL:
++      case WCD938X_MBHC_CTL_CLK:
++      case WCD938X_MBHC_CTL_ANA:
++      case WCD938X_MBHC_CTL_SPARE_1:
++      case WCD938X_MBHC_CTL_SPARE_2:
++      case WCD938X_MBHC_CTL_BCS:
++      case WCD938X_MBHC_TEST_CTL:
++      case WCD938X_LDOH_MODE:
++      case WCD938X_LDOH_BIAS:
++      case WCD938X_LDOH_STB_LOADS:
++      case WCD938X_LDOH_SLOWRAMP:
++      case WCD938X_MICB1_TEST_CTL_1:
++      case WCD938X_MICB1_TEST_CTL_2:
++      case WCD938X_MICB1_TEST_CTL_3:
++      case WCD938X_MICB2_TEST_CTL_1:
++      case WCD938X_MICB2_TEST_CTL_2:
++      case WCD938X_MICB2_TEST_CTL_3:
++      case WCD938X_MICB3_TEST_CTL_1:
++      case WCD938X_MICB3_TEST_CTL_2:
++      case WCD938X_MICB3_TEST_CTL_3:
++      case WCD938X_MICB4_TEST_CTL_1:
++      case WCD938X_MICB4_TEST_CTL_2:
++      case WCD938X_MICB4_TEST_CTL_3:
++      case WCD938X_TX_COM_ADC_VCM:
++      case WCD938X_TX_COM_BIAS_ATEST:
++      case WCD938X_TX_COM_SPARE1:
++      case WCD938X_TX_COM_SPARE2:
++      case WCD938X_TX_COM_TXFE_DIV_CTL:
++      case WCD938X_TX_COM_TXFE_DIV_START:
++      case WCD938X_TX_COM_SPARE3:
++      case WCD938X_TX_COM_SPARE4:
++      case WCD938X_TX_1_2_TEST_EN:
++      case WCD938X_TX_1_2_ADC_IB:
++      case WCD938X_TX_1_2_ATEST_REFCTL:
++      case WCD938X_TX_1_2_TEST_CTL:
++      case WCD938X_TX_1_2_TEST_BLK_EN1:
++      case WCD938X_TX_1_2_TXFE1_CLKDIV:
++      case WCD938X_TX_3_4_TEST_EN:
++      case WCD938X_TX_3_4_ADC_IB:
++      case WCD938X_TX_3_4_ATEST_REFCTL:
++      case WCD938X_TX_3_4_TEST_CTL:
++      case WCD938X_TX_3_4_TEST_BLK_EN3:
++      case WCD938X_TX_3_4_TXFE3_CLKDIV:
++      case WCD938X_TX_3_4_TEST_BLK_EN2:
++      case WCD938X_TX_3_4_TXFE2_CLKDIV:
++      case WCD938X_TX_3_4_SPARE1:
++      case WCD938X_TX_3_4_TEST_BLK_EN4:
++      case WCD938X_TX_3_4_TXFE4_CLKDIV:
++      case WCD938X_TX_3_4_SPARE2:
++      case WCD938X_CLASSH_MODE_1:
++      case WCD938X_CLASSH_MODE_2:
++      case WCD938X_CLASSH_MODE_3:
++      case WCD938X_CLASSH_CTRL_VCL_1:
++      case WCD938X_CLASSH_CTRL_VCL_2:
++      case WCD938X_CLASSH_CTRL_CCL_1:
++      case WCD938X_CLASSH_CTRL_CCL_2:
++      case WCD938X_CLASSH_CTRL_CCL_3:
++      case WCD938X_CLASSH_CTRL_CCL_4:
++      case WCD938X_CLASSH_CTRL_CCL_5:
++      case WCD938X_CLASSH_BUCK_TMUX_A_D:
++      case WCD938X_CLASSH_BUCK_SW_DRV_CNTL:
++      case WCD938X_CLASSH_SPARE:
++      case WCD938X_FLYBACK_EN:
++      case WCD938X_FLYBACK_VNEG_CTRL_1:
++      case WCD938X_FLYBACK_VNEG_CTRL_2:
++      case WCD938X_FLYBACK_VNEG_CTRL_3:
++      case WCD938X_FLYBACK_VNEG_CTRL_4:
++      case WCD938X_FLYBACK_VNEG_CTRL_5:
++      case WCD938X_FLYBACK_VNEG_CTRL_6:
++      case WCD938X_FLYBACK_VNEG_CTRL_7:
++      case WCD938X_FLYBACK_VNEG_CTRL_8:
++      case WCD938X_FLYBACK_VNEG_CTRL_9:
++      case WCD938X_FLYBACK_VNEGDAC_CTRL_1:
++      case WCD938X_FLYBACK_VNEGDAC_CTRL_2:
++      case WCD938X_FLYBACK_VNEGDAC_CTRL_3:
++      case WCD938X_FLYBACK_CTRL_1:
++      case WCD938X_FLYBACK_TEST_CTL:
++      case WCD938X_RX_AUX_SW_CTL:
++      case WCD938X_RX_PA_AUX_IN_CONN:
++      case WCD938X_RX_TIMER_DIV:
++      case WCD938X_RX_OCP_CTL:
++      case WCD938X_RX_OCP_COUNT:
++      case WCD938X_RX_BIAS_EAR_DAC:
++      case WCD938X_RX_BIAS_EAR_AMP:
++      case WCD938X_RX_BIAS_HPH_LDO:
++      case WCD938X_RX_BIAS_HPH_PA:
++      case WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2:
++      case WCD938X_RX_BIAS_HPH_RDAC_LDO:
++      case WCD938X_RX_BIAS_HPH_CNP1:
++      case WCD938X_RX_BIAS_HPH_LOWPOWER:
++      case WCD938X_RX_BIAS_AUX_DAC:
++      case WCD938X_RX_BIAS_AUX_AMP:
++      case WCD938X_RX_BIAS_VNEGDAC_BLEEDER:
++      case WCD938X_RX_BIAS_MISC:
++      case WCD938X_RX_BIAS_BUCK_RST:
++      case WCD938X_RX_BIAS_BUCK_VREF_ERRAMP:
++      case WCD938X_RX_BIAS_FLYB_ERRAMP:
++      case WCD938X_RX_BIAS_FLYB_BUFF:
++      case WCD938X_RX_BIAS_FLYB_MID_RST:
++      case WCD938X_HPH_CNP_EN:
++      case WCD938X_HPH_CNP_WG_CTL:
++      case WCD938X_HPH_CNP_WG_TIME:
++      case WCD938X_HPH_OCP_CTL:
++      case WCD938X_HPH_AUTO_CHOP:
++      case WCD938X_HPH_CHOP_CTL:
++      case WCD938X_HPH_PA_CTL1:
++      case WCD938X_HPH_PA_CTL2:
++      case WCD938X_HPH_L_EN:
++      case WCD938X_HPH_L_TEST:
++      case WCD938X_HPH_L_ATEST:
++      case WCD938X_HPH_R_EN:
++      case WCD938X_HPH_R_TEST:
++      case WCD938X_HPH_R_ATEST:
++      case WCD938X_HPH_RDAC_CLK_CTL1:
++      case WCD938X_HPH_RDAC_CLK_CTL2:
++      case WCD938X_HPH_RDAC_LDO_CTL:
++      case WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL:
++      case WCD938X_HPH_REFBUFF_UHQA_CTL:
++      case WCD938X_HPH_REFBUFF_LP_CTL:
++      case WCD938X_HPH_L_DAC_CTL:
++      case WCD938X_HPH_R_DAC_CTL:
++      case WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL:
++      case WCD938X_HPH_SURGE_HPHLR_SURGE_EN:
++      case WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1:
++      case WCD938X_EAR_EAR_EN_REG:
++      case WCD938X_EAR_EAR_PA_CON:
++      case WCD938X_EAR_EAR_SP_CON:
++      case WCD938X_EAR_EAR_DAC_CON:
++      case WCD938X_EAR_EAR_CNP_FSM_CON:
++      case WCD938X_EAR_TEST_CTL:
++      case WCD938X_ANA_NEW_PAGE_REGISTER:
++      case WCD938X_HPH_NEW_ANA_HPH2:
++      case WCD938X_HPH_NEW_ANA_HPH3:
++      case WCD938X_SLEEP_CTL:
++      case WCD938X_SLEEP_WATCHDOG_CTL:
++      case WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL:
++      case WCD938X_MBHC_NEW_CTL_1:
++      case WCD938X_MBHC_NEW_CTL_2:
++      case WCD938X_MBHC_NEW_PLUG_DETECT_CTL:
++      case WCD938X_MBHC_NEW_ZDET_ANA_CTL:
++      case WCD938X_MBHC_NEW_ZDET_RAMP_CTL:
++      case WCD938X_TX_NEW_AMIC_MUX_CFG:
++      case WCD938X_AUX_AUXPA:
++      case WCD938X_LDORXTX_MODE:
++      case WCD938X_LDORXTX_CONFIG:
++      case WCD938X_DIE_CRACK_DIE_CRK_DET_EN:
++      case WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL:
++      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L:
++      case WCD938X_HPH_NEW_INT_RDAC_VREF_CTL:
++      case WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL:
++      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R:
++      case WCD938X_HPH_NEW_INT_PA_MISC1:
++      case WCD938X_HPH_NEW_INT_PA_MISC2:
++      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC:
++      case WCD938X_HPH_NEW_INT_HPH_TIMER1:
++      case WCD938X_HPH_NEW_INT_HPH_TIMER2:
++      case WCD938X_HPH_NEW_INT_HPH_TIMER3:
++      case WCD938X_HPH_NEW_INT_HPH_TIMER4:
++      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC2:
++      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC3:
++      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW:
++      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW:
++      case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI:
++      case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP:
++      case WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP:
++      case WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL:
++      case WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL:
++      case WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT:
++      case WCD938X_MBHC_NEW_INT_SPARE_2:
++      case WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON:
++      case WCD938X_EAR_INT_NEW_CNP_VCM_CON1:
++      case WCD938X_EAR_INT_NEW_CNP_VCM_CON2:
++      case WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS:
++      case WCD938X_AUX_INT_EN_REG:
++      case WCD938X_AUX_INT_PA_CTRL:
++      case WCD938X_AUX_INT_SP_CTRL:
++      case WCD938X_AUX_INT_DAC_CTRL:
++      case WCD938X_AUX_INT_CLK_CTRL:
++      case WCD938X_AUX_INT_TEST_CTRL:
++      case WCD938X_AUX_INT_MISC:
++      case WCD938X_LDORXTX_INT_BIAS:
++      case WCD938X_LDORXTX_INT_STB_LOADS_DTEST:
++      case WCD938X_LDORXTX_INT_TEST0:
++      case WCD938X_LDORXTX_INT_STARTUP_TIMER:
++      case WCD938X_LDORXTX_INT_TEST1:
++      case WCD938X_SLEEP_INT_WATCHDOG_CTL_1:
++      case WCD938X_SLEEP_INT_WATCHDOG_CTL_2:
++      case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1:
++      case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2:
++      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2:
++      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1:
++      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0:
++      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M:
++      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0:
++      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP:
++      case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1:
++      case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP:
++      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L2:
++      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L1:
++      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L0:
++      case WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP:
++      case WCD938X_DIGITAL_PAGE_REGISTER:
++      case WCD938X_DIGITAL_SWR_TX_CLK_RATE:
++      case WCD938X_DIGITAL_CDC_RST_CTL:
++      case WCD938X_DIGITAL_TOP_CLK_CFG:
++      case WCD938X_DIGITAL_CDC_ANA_CLK_CTL:
++      case WCD938X_DIGITAL_CDC_DIG_CLK_CTL:
++      case WCD938X_DIGITAL_SWR_RST_EN:
++      case WCD938X_DIGITAL_CDC_PATH_MODE:
++      case WCD938X_DIGITAL_CDC_RX_RST:
++      case WCD938X_DIGITAL_CDC_RX0_CTL:
++      case WCD938X_DIGITAL_CDC_RX1_CTL:
++      case WCD938X_DIGITAL_CDC_RX2_CTL:
++      case WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1:
++      case WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3:
++      case WCD938X_DIGITAL_CDC_COMP_CTL_0:
++      case WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A1_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A1_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A2_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A2_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A3_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A3_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A4_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A4_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A5_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A5_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A6_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_A7_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_C_0:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_C_1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_C_2:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_C_3:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R1:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R2:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R3:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R4:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R5:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R6:
++      case WCD938X_DIGITAL_CDC_HPH_DSM_R7:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A1_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A1_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A2_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A2_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A3_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A3_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A4_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A4_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A5_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A5_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A6_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_A7_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_C_0:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_C_1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_C_2:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_C_3:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R1:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R2:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R3:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R4:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R5:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R6:
++      case WCD938X_DIGITAL_CDC_AUX_DSM_R7:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2:
++      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0:
++      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1:
++      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2:
++      case WCD938X_DIGITAL_CDC_HPH_GAIN_CTL:
++      case WCD938X_DIGITAL_CDC_AUX_GAIN_CTL:
++      case WCD938X_DIGITAL_CDC_EAR_PATH_CTL:
++      case WCD938X_DIGITAL_CDC_SWR_CLH:
++      case WCD938X_DIGITAL_SWR_CLH_BYP:
++      case WCD938X_DIGITAL_CDC_TX0_CTL:
++      case WCD938X_DIGITAL_CDC_TX1_CTL:
++      case WCD938X_DIGITAL_CDC_TX2_CTL:
++      case WCD938X_DIGITAL_CDC_TX_RST:
++      case WCD938X_DIGITAL_CDC_REQ_CTL:
++      case WCD938X_DIGITAL_CDC_RST:
++      case WCD938X_DIGITAL_CDC_AMIC_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC1_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC2_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC3_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC4_CTL:
++      case WCD938X_DIGITAL_EFUSE_PRG_CTL:
++      case WCD938X_DIGITAL_EFUSE_CTL:
++      case WCD938X_DIGITAL_CDC_DMIC_RATE_1_2:
++      case WCD938X_DIGITAL_CDC_DMIC_RATE_3_4:
++      case WCD938X_DIGITAL_PDM_WD_CTL0:
++      case WCD938X_DIGITAL_PDM_WD_CTL1:
++      case WCD938X_DIGITAL_PDM_WD_CTL2:
++      case WCD938X_DIGITAL_INTR_MODE:
++      case WCD938X_DIGITAL_INTR_MASK_0:
++      case WCD938X_DIGITAL_INTR_MASK_1:
++      case WCD938X_DIGITAL_INTR_MASK_2:
++      case WCD938X_DIGITAL_INTR_CLEAR_0:
++      case WCD938X_DIGITAL_INTR_CLEAR_1:
++      case WCD938X_DIGITAL_INTR_CLEAR_2:
++      case WCD938X_DIGITAL_INTR_LEVEL_0:
++      case WCD938X_DIGITAL_INTR_LEVEL_1:
++      case WCD938X_DIGITAL_INTR_LEVEL_2:
++      case WCD938X_DIGITAL_INTR_SET_0:
++      case WCD938X_DIGITAL_INTR_SET_1:
++      case WCD938X_DIGITAL_INTR_SET_2:
++      case WCD938X_DIGITAL_INTR_TEST_0:
++      case WCD938X_DIGITAL_INTR_TEST_1:
++      case WCD938X_DIGITAL_INTR_TEST_2:
++      case WCD938X_DIGITAL_TX_MODE_DBG_EN:
++      case WCD938X_DIGITAL_TX_MODE_DBG_0_1:
++      case WCD938X_DIGITAL_TX_MODE_DBG_2_3:
++      case WCD938X_DIGITAL_LB_IN_SEL_CTL:
++      case WCD938X_DIGITAL_LOOP_BACK_MODE:
++      case WCD938X_DIGITAL_SWR_DAC_TEST:
++      case WCD938X_DIGITAL_SWR_HM_TEST_RX_0:
++      case WCD938X_DIGITAL_SWR_HM_TEST_TX_0:
++      case WCD938X_DIGITAL_SWR_HM_TEST_RX_1:
++      case WCD938X_DIGITAL_SWR_HM_TEST_TX_1:
++      case WCD938X_DIGITAL_SWR_HM_TEST_TX_2:
++      case WCD938X_DIGITAL_PAD_CTL_SWR_0:
++      case WCD938X_DIGITAL_PAD_CTL_SWR_1:
++      case WCD938X_DIGITAL_I2C_CTL:
++      case WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE:
++      case WCD938X_DIGITAL_EFUSE_TEST_CTL_0:
++      case WCD938X_DIGITAL_EFUSE_TEST_CTL_1:
++      case WCD938X_DIGITAL_PAD_CTL_PDM_RX0:
++      case WCD938X_DIGITAL_PAD_CTL_PDM_RX1:
++      case WCD938X_DIGITAL_PAD_CTL_PDM_TX0:
++      case WCD938X_DIGITAL_PAD_CTL_PDM_TX1:
++      case WCD938X_DIGITAL_PAD_CTL_PDM_TX2:
++      case WCD938X_DIGITAL_PAD_INP_DIS_0:
++      case WCD938X_DIGITAL_PAD_INP_DIS_1:
++      case WCD938X_DIGITAL_DRIVE_STRENGTH_0:
++      case WCD938X_DIGITAL_DRIVE_STRENGTH_1:
++      case WCD938X_DIGITAL_DRIVE_STRENGTH_2:
++      case WCD938X_DIGITAL_RX_DATA_EDGE_CTL:
++      case WCD938X_DIGITAL_TX_DATA_EDGE_CTL:
++      case WCD938X_DIGITAL_GPIO_MODE:
++      case WCD938X_DIGITAL_PIN_CTL_OE:
++      case WCD938X_DIGITAL_PIN_CTL_DATA_0:
++      case WCD938X_DIGITAL_PIN_CTL_DATA_1:
++      case WCD938X_DIGITAL_DIG_DEBUG_CTL:
++      case WCD938X_DIGITAL_DIG_DEBUG_EN:
++      case WCD938X_DIGITAL_ANA_CSR_DBG_ADD:
++      case WCD938X_DIGITAL_ANA_CSR_DBG_CTL:
++      case WCD938X_DIGITAL_SSP_DBG:
++      case WCD938X_DIGITAL_SPARE_0:
++      case WCD938X_DIGITAL_SPARE_1:
++      case WCD938X_DIGITAL_SPARE_2:
++      case WCD938X_DIGITAL_TX_REQ_FB_CTL_0:
++      case WCD938X_DIGITAL_TX_REQ_FB_CTL_1:
++      case WCD938X_DIGITAL_TX_REQ_FB_CTL_2:
++      case WCD938X_DIGITAL_TX_REQ_FB_CTL_3:
++      case WCD938X_DIGITAL_TX_REQ_FB_CTL_4:
++      case WCD938X_DIGITAL_DEM_BYPASS_DATA0:
++      case WCD938X_DIGITAL_DEM_BYPASS_DATA1:
++      case WCD938X_DIGITAL_DEM_BYPASS_DATA2:
++      case WCD938X_DIGITAL_DEM_BYPASS_DATA3:
++              return true;
++      }
++
++      return false;
++}
++
++static bool wcd938x_readonly_register(struct device *dev, unsigned int reg)
++{
++      switch (reg) {
++      case WCD938X_ANA_MBHC_RESULT_1:
++      case WCD938X_ANA_MBHC_RESULT_2:
++      case WCD938X_ANA_MBHC_RESULT_3:
++      case WCD938X_MBHC_MOISTURE_DET_FSM_STATUS:
++      case WCD938X_TX_1_2_SAR2_ERR:
++      case WCD938X_TX_1_2_SAR1_ERR:
++      case WCD938X_TX_3_4_SAR4_ERR:
++      case WCD938X_TX_3_4_SAR3_ERR:
++      case WCD938X_HPH_L_STATUS:
++      case WCD938X_HPH_R_STATUS:
++      case WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS:
++      case WCD938X_EAR_STATUS_REG_1:
++      case WCD938X_EAR_STATUS_REG_2:
++      case WCD938X_MBHC_NEW_FSM_STATUS:
++      case WCD938X_MBHC_NEW_ADC_RESULT:
++      case WCD938X_DIE_CRACK_DIE_CRK_DET_OUT:
++      case WCD938X_AUX_INT_STATUS_REG:
++      case WCD938X_LDORXTX_INT_STATUS:
++      case WCD938X_DIGITAL_CHIP_ID0:
++      case WCD938X_DIGITAL_CHIP_ID1:
++      case WCD938X_DIGITAL_CHIP_ID2:
++      case WCD938X_DIGITAL_CHIP_ID3:
++      case WCD938X_DIGITAL_INTR_STATUS_0:
++      case WCD938X_DIGITAL_INTR_STATUS_1:
++      case WCD938X_DIGITAL_INTR_STATUS_2:
++      case WCD938X_DIGITAL_INTR_CLEAR_0:
++      case WCD938X_DIGITAL_INTR_CLEAR_1:
++      case WCD938X_DIGITAL_INTR_CLEAR_2:
++      case WCD938X_DIGITAL_SWR_HM_TEST_0:
++      case WCD938X_DIGITAL_SWR_HM_TEST_1:
++      case WCD938X_DIGITAL_EFUSE_T_DATA_0:
++      case WCD938X_DIGITAL_EFUSE_T_DATA_1:
++      case WCD938X_DIGITAL_PIN_STATUS_0:
++      case WCD938X_DIGITAL_PIN_STATUS_1:
++      case WCD938X_DIGITAL_MODE_STATUS_0:
++      case WCD938X_DIGITAL_MODE_STATUS_1:
++      case WCD938X_DIGITAL_EFUSE_REG_0:
++      case WCD938X_DIGITAL_EFUSE_REG_1:
++      case WCD938X_DIGITAL_EFUSE_REG_2:
++      case WCD938X_DIGITAL_EFUSE_REG_3:
++      case WCD938X_DIGITAL_EFUSE_REG_4:
++      case WCD938X_DIGITAL_EFUSE_REG_5:
++      case WCD938X_DIGITAL_EFUSE_REG_6:
++      case WCD938X_DIGITAL_EFUSE_REG_7:
++      case WCD938X_DIGITAL_EFUSE_REG_8:
++      case WCD938X_DIGITAL_EFUSE_REG_9:
++      case WCD938X_DIGITAL_EFUSE_REG_10:
++      case WCD938X_DIGITAL_EFUSE_REG_11:
++      case WCD938X_DIGITAL_EFUSE_REG_12:
++      case WCD938X_DIGITAL_EFUSE_REG_13:
++      case WCD938X_DIGITAL_EFUSE_REG_14:
++      case WCD938X_DIGITAL_EFUSE_REG_15:
++      case WCD938X_DIGITAL_EFUSE_REG_16:
++      case WCD938X_DIGITAL_EFUSE_REG_17:
++      case WCD938X_DIGITAL_EFUSE_REG_18:
++      case WCD938X_DIGITAL_EFUSE_REG_19:
++      case WCD938X_DIGITAL_EFUSE_REG_20:
++      case WCD938X_DIGITAL_EFUSE_REG_21:
++      case WCD938X_DIGITAL_EFUSE_REG_22:
++      case WCD938X_DIGITAL_EFUSE_REG_23:
++      case WCD938X_DIGITAL_EFUSE_REG_24:
++      case WCD938X_DIGITAL_EFUSE_REG_25:
++      case WCD938X_DIGITAL_EFUSE_REG_26:
++      case WCD938X_DIGITAL_EFUSE_REG_27:
++      case WCD938X_DIGITAL_EFUSE_REG_28:
++      case WCD938X_DIGITAL_EFUSE_REG_29:
++      case WCD938X_DIGITAL_EFUSE_REG_30:
++      case WCD938X_DIGITAL_EFUSE_REG_31:
++              return true;
++      }
++      return false;
++}
++
++static bool wcd938x_readable_register(struct device *dev, unsigned int reg)
++{
++      bool ret;
++
++      ret = wcd938x_readonly_register(dev, reg);
++      if (!ret)
++              return wcd938x_rdwr_register(dev, reg);
++
++      return ret;
++}
++
++static bool wcd938x_writeable_register(struct device *dev, unsigned int reg)
++{
++      return wcd938x_rdwr_register(dev, reg);
++}
++
++static bool wcd938x_volatile_register(struct device *dev, unsigned int reg)
++{
++      if (reg <= WCD938X_BASE_ADDRESS)
++              return false;
++
++      if (reg == WCD938X_DIGITAL_SWR_TX_CLK_RATE)
++              return true;
++
++      if (wcd938x_readonly_register(dev, reg))
++              return true;
++
++      return false;
++}
++
++static const struct regmap_config wcd938x_regmap_config = {
++      .name = "wcd938x_csr",
++      .reg_bits = 32,
++      .val_bits = 8,
++      .cache_type = REGCACHE_RBTREE,
++      .reg_defaults = wcd938x_defaults,
++      .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults),
++      .max_register = WCD938X_MAX_REGISTER,
++      .readable_reg = wcd938x_readable_register,
++      .writeable_reg = wcd938x_writeable_register,
++      .volatile_reg = wcd938x_volatile_register,
++      .can_multi_write = true,
++};
++
+ static const struct sdw_slave_ops wcd9380_slave_ops = {
+       .update_status = wcd9380_update_status,
+       .interrupt_callback = wcd9380_interrupt_callback,
+@@ -261,6 +1263,16 @@ static int wcd9380_probe(struct sdw_slave *pdev,
+               wcd->ch_info = &wcd938x_sdw_rx_ch_info[0];
+       }
++      if (wcd->is_tx) {
++              wcd->regmap = devm_regmap_init_sdw(pdev, &wcd938x_regmap_config);
++              if (IS_ERR(wcd->regmap))
++                      return dev_err_probe(dev, PTR_ERR(wcd->regmap),
++                                           "Regmap init failed\n");
++
++              /* Start in cache-only until device is enumerated */
++              regcache_cache_only(wcd->regmap, true);
++      };
++
+       pm_runtime_set_autosuspend_delay(dev, 3000);
+       pm_runtime_use_autosuspend(dev);
+       pm_runtime_mark_last_busy(dev);
+@@ -278,22 +1290,23 @@ MODULE_DEVICE_TABLE(sdw, wcd9380_slave_id);
+ static int __maybe_unused wcd938x_sdw_runtime_suspend(struct device *dev)
+ {
+-      struct regmap *regmap = dev_get_regmap(dev, NULL);
++      struct wcd938x_sdw_priv *wcd = dev_get_drvdata(dev);
+-      if (regmap) {
+-              regcache_cache_only(regmap, true);
+-              regcache_mark_dirty(regmap);
++      if (wcd->regmap) {
++              regcache_cache_only(wcd->regmap, true);
++              regcache_mark_dirty(wcd->regmap);
+       }
++
+       return 0;
+ }
+ static int __maybe_unused wcd938x_sdw_runtime_resume(struct device *dev)
+ {
+-      struct regmap *regmap = dev_get_regmap(dev, NULL);
++      struct wcd938x_sdw_priv *wcd = dev_get_drvdata(dev);
+-      if (regmap) {
+-              regcache_cache_only(regmap, false);
+-              regcache_sync(regmap);
++      if (wcd->regmap) {
++              regcache_cache_only(wcd->regmap, false);
++              regcache_sync(wcd->regmap);
+       }
+       pm_runtime_mark_last_busy(dev);
+diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
+index fcac763b04d1b..d34f13758aca0 100644
+--- a/sound/soc/codecs/wcd938x.c
++++ b/sound/soc/codecs/wcd938x.c
+@@ -273,1001 +273,6 @@ static struct wcd_mbhc_field wcd_mbhc_fields[WCD_MBHC_REG_FUNC_MAX] = {
+       WCD_MBHC_FIELD(WCD_MBHC_ELECT_ISRC_EN, WCD938X_ANA_MBHC_ZDET, 0x02),
+ };
+-static const struct reg_default wcd938x_defaults[] = {
+-      {WCD938X_ANA_PAGE_REGISTER,                            0x00},
+-      {WCD938X_ANA_BIAS,                                     0x00},
+-      {WCD938X_ANA_RX_SUPPLIES,                              0x00},
+-      {WCD938X_ANA_HPH,                                      0x0C},
+-      {WCD938X_ANA_EAR,                                      0x00},
+-      {WCD938X_ANA_EAR_COMPANDER_CTL,                        0x02},
+-      {WCD938X_ANA_TX_CH1,                                   0x20},
+-      {WCD938X_ANA_TX_CH2,                                   0x00},
+-      {WCD938X_ANA_TX_CH3,                                   0x20},
+-      {WCD938X_ANA_TX_CH4,                                   0x00},
+-      {WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC,                 0x00},
+-      {WCD938X_ANA_MICB3_DSP_EN_LOGIC,                       0x00},
+-      {WCD938X_ANA_MBHC_MECH,                                0x39},
+-      {WCD938X_ANA_MBHC_ELECT,                               0x08},
+-      {WCD938X_ANA_MBHC_ZDET,                                0x00},
+-      {WCD938X_ANA_MBHC_RESULT_1,                            0x00},
+-      {WCD938X_ANA_MBHC_RESULT_2,                            0x00},
+-      {WCD938X_ANA_MBHC_RESULT_3,                            0x00},
+-      {WCD938X_ANA_MBHC_BTN0,                                0x00},
+-      {WCD938X_ANA_MBHC_BTN1,                                0x10},
+-      {WCD938X_ANA_MBHC_BTN2,                                0x20},
+-      {WCD938X_ANA_MBHC_BTN3,                                0x30},
+-      {WCD938X_ANA_MBHC_BTN4,                                0x40},
+-      {WCD938X_ANA_MBHC_BTN5,                                0x50},
+-      {WCD938X_ANA_MBHC_BTN6,                                0x60},
+-      {WCD938X_ANA_MBHC_BTN7,                                0x70},
+-      {WCD938X_ANA_MICB1,                                    0x10},
+-      {WCD938X_ANA_MICB2,                                    0x10},
+-      {WCD938X_ANA_MICB2_RAMP,                               0x00},
+-      {WCD938X_ANA_MICB3,                                    0x10},
+-      {WCD938X_ANA_MICB4,                                    0x10},
+-      {WCD938X_BIAS_CTL,                                     0x2A},
+-      {WCD938X_BIAS_VBG_FINE_ADJ,                            0x55},
+-      {WCD938X_LDOL_VDDCX_ADJUST,                            0x01},
+-      {WCD938X_LDOL_DISABLE_LDOL,                            0x00},
+-      {WCD938X_MBHC_CTL_CLK,                                 0x00},
+-      {WCD938X_MBHC_CTL_ANA,                                 0x00},
+-      {WCD938X_MBHC_CTL_SPARE_1,                             0x00},
+-      {WCD938X_MBHC_CTL_SPARE_2,                             0x00},
+-      {WCD938X_MBHC_CTL_BCS,                                 0x00},
+-      {WCD938X_MBHC_MOISTURE_DET_FSM_STATUS,                 0x00},
+-      {WCD938X_MBHC_TEST_CTL,                                0x00},
+-      {WCD938X_LDOH_MODE,                                    0x2B},
+-      {WCD938X_LDOH_BIAS,                                    0x68},
+-      {WCD938X_LDOH_STB_LOADS,                               0x00},
+-      {WCD938X_LDOH_SLOWRAMP,                                0x50},
+-      {WCD938X_MICB1_TEST_CTL_1,                             0x1A},
+-      {WCD938X_MICB1_TEST_CTL_2,                             0x00},
+-      {WCD938X_MICB1_TEST_CTL_3,                             0xA4},
+-      {WCD938X_MICB2_TEST_CTL_1,                             0x1A},
+-      {WCD938X_MICB2_TEST_CTL_2,                             0x00},
+-      {WCD938X_MICB2_TEST_CTL_3,                             0x24},
+-      {WCD938X_MICB3_TEST_CTL_1,                             0x1A},
+-      {WCD938X_MICB3_TEST_CTL_2,                             0x00},
+-      {WCD938X_MICB3_TEST_CTL_3,                             0xA4},
+-      {WCD938X_MICB4_TEST_CTL_1,                             0x1A},
+-      {WCD938X_MICB4_TEST_CTL_2,                             0x00},
+-      {WCD938X_MICB4_TEST_CTL_3,                             0xA4},
+-      {WCD938X_TX_COM_ADC_VCM,                               0x39},
+-      {WCD938X_TX_COM_BIAS_ATEST,                            0xE0},
+-      {WCD938X_TX_COM_SPARE1,                                0x00},
+-      {WCD938X_TX_COM_SPARE2,                                0x00},
+-      {WCD938X_TX_COM_TXFE_DIV_CTL,                          0x22},
+-      {WCD938X_TX_COM_TXFE_DIV_START,                        0x00},
+-      {WCD938X_TX_COM_SPARE3,                                0x00},
+-      {WCD938X_TX_COM_SPARE4,                                0x00},
+-      {WCD938X_TX_1_2_TEST_EN,                               0xCC},
+-      {WCD938X_TX_1_2_ADC_IB,                                0xE9},
+-      {WCD938X_TX_1_2_ATEST_REFCTL,                          0x0A},
+-      {WCD938X_TX_1_2_TEST_CTL,                              0x38},
+-      {WCD938X_TX_1_2_TEST_BLK_EN1,                          0xFF},
+-      {WCD938X_TX_1_2_TXFE1_CLKDIV,                          0x00},
+-      {WCD938X_TX_1_2_SAR2_ERR,                              0x00},
+-      {WCD938X_TX_1_2_SAR1_ERR,                              0x00},
+-      {WCD938X_TX_3_4_TEST_EN,                               0xCC},
+-      {WCD938X_TX_3_4_ADC_IB,                                0xE9},
+-      {WCD938X_TX_3_4_ATEST_REFCTL,                          0x0A},
+-      {WCD938X_TX_3_4_TEST_CTL,                              0x38},
+-      {WCD938X_TX_3_4_TEST_BLK_EN3,                          0xFF},
+-      {WCD938X_TX_3_4_TXFE3_CLKDIV,                          0x00},
+-      {WCD938X_TX_3_4_SAR4_ERR,                              0x00},
+-      {WCD938X_TX_3_4_SAR3_ERR,                              0x00},
+-      {WCD938X_TX_3_4_TEST_BLK_EN2,                          0xFB},
+-      {WCD938X_TX_3_4_TXFE2_CLKDIV,                          0x00},
+-      {WCD938X_TX_3_4_SPARE1,                                0x00},
+-      {WCD938X_TX_3_4_TEST_BLK_EN4,                          0xFB},
+-      {WCD938X_TX_3_4_TXFE4_CLKDIV,                          0x00},
+-      {WCD938X_TX_3_4_SPARE2,                                0x00},
+-      {WCD938X_CLASSH_MODE_1,                                0x40},
+-      {WCD938X_CLASSH_MODE_2,                                0x3A},
+-      {WCD938X_CLASSH_MODE_3,                                0x00},
+-      {WCD938X_CLASSH_CTRL_VCL_1,                            0x70},
+-      {WCD938X_CLASSH_CTRL_VCL_2,                            0x82},
+-      {WCD938X_CLASSH_CTRL_CCL_1,                            0x31},
+-      {WCD938X_CLASSH_CTRL_CCL_2,                            0x80},
+-      {WCD938X_CLASSH_CTRL_CCL_3,                            0x80},
+-      {WCD938X_CLASSH_CTRL_CCL_4,                            0x51},
+-      {WCD938X_CLASSH_CTRL_CCL_5,                            0x00},
+-      {WCD938X_CLASSH_BUCK_TMUX_A_D,                         0x00},
+-      {WCD938X_CLASSH_BUCK_SW_DRV_CNTL,                      0x77},
+-      {WCD938X_CLASSH_SPARE,                                 0x00},
+-      {WCD938X_FLYBACK_EN,                                   0x4E},
+-      {WCD938X_FLYBACK_VNEG_CTRL_1,                          0x0B},
+-      {WCD938X_FLYBACK_VNEG_CTRL_2,                          0x45},
+-      {WCD938X_FLYBACK_VNEG_CTRL_3,                          0x74},
+-      {WCD938X_FLYBACK_VNEG_CTRL_4,                          0x7F},
+-      {WCD938X_FLYBACK_VNEG_CTRL_5,                          0x83},
+-      {WCD938X_FLYBACK_VNEG_CTRL_6,                          0x98},
+-      {WCD938X_FLYBACK_VNEG_CTRL_7,                          0xA9},
+-      {WCD938X_FLYBACK_VNEG_CTRL_8,                          0x68},
+-      {WCD938X_FLYBACK_VNEG_CTRL_9,                          0x64},
+-      {WCD938X_FLYBACK_VNEGDAC_CTRL_1,                       0xED},
+-      {WCD938X_FLYBACK_VNEGDAC_CTRL_2,                       0xF0},
+-      {WCD938X_FLYBACK_VNEGDAC_CTRL_3,                       0xA6},
+-      {WCD938X_FLYBACK_CTRL_1,                               0x65},
+-      {WCD938X_FLYBACK_TEST_CTL,                             0x00},
+-      {WCD938X_RX_AUX_SW_CTL,                                0x00},
+-      {WCD938X_RX_PA_AUX_IN_CONN,                            0x01},
+-      {WCD938X_RX_TIMER_DIV,                                 0x32},
+-      {WCD938X_RX_OCP_CTL,                                   0x1F},
+-      {WCD938X_RX_OCP_COUNT,                                 0x77},
+-      {WCD938X_RX_BIAS_EAR_DAC,                              0xA0},
+-      {WCD938X_RX_BIAS_EAR_AMP,                              0xAA},
+-      {WCD938X_RX_BIAS_HPH_LDO,                              0xA9},
+-      {WCD938X_RX_BIAS_HPH_PA,                               0xAA},
+-      {WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2,                    0x8A},
+-      {WCD938X_RX_BIAS_HPH_RDAC_LDO,                         0x88},
+-      {WCD938X_RX_BIAS_HPH_CNP1,                             0x82},
+-      {WCD938X_RX_BIAS_HPH_LOWPOWER,                         0x82},
+-      {WCD938X_RX_BIAS_AUX_DAC,                              0xA0},
+-      {WCD938X_RX_BIAS_AUX_AMP,                              0xAA},
+-      {WCD938X_RX_BIAS_VNEGDAC_BLEEDER,                      0x50},
+-      {WCD938X_RX_BIAS_MISC,                                 0x00},
+-      {WCD938X_RX_BIAS_BUCK_RST,                             0x08},
+-      {WCD938X_RX_BIAS_BUCK_VREF_ERRAMP,                     0x44},
+-      {WCD938X_RX_BIAS_FLYB_ERRAMP,                          0x40},
+-      {WCD938X_RX_BIAS_FLYB_BUFF,                            0xAA},
+-      {WCD938X_RX_BIAS_FLYB_MID_RST,                         0x14},
+-      {WCD938X_HPH_L_STATUS,                                 0x04},
+-      {WCD938X_HPH_R_STATUS,                                 0x04},
+-      {WCD938X_HPH_CNP_EN,                                   0x80},
+-      {WCD938X_HPH_CNP_WG_CTL,                               0x9A},
+-      {WCD938X_HPH_CNP_WG_TIME,                              0x14},
+-      {WCD938X_HPH_OCP_CTL,                                  0x28},
+-      {WCD938X_HPH_AUTO_CHOP,                                0x16},
+-      {WCD938X_HPH_CHOP_CTL,                                 0x83},
+-      {WCD938X_HPH_PA_CTL1,                                  0x46},
+-      {WCD938X_HPH_PA_CTL2,                                  0x50},
+-      {WCD938X_HPH_L_EN,                                     0x80},
+-      {WCD938X_HPH_L_TEST,                                   0xE0},
+-      {WCD938X_HPH_L_ATEST,                                  0x50},
+-      {WCD938X_HPH_R_EN,                                     0x80},
+-      {WCD938X_HPH_R_TEST,                                   0xE0},
+-      {WCD938X_HPH_R_ATEST,                                  0x54},
+-      {WCD938X_HPH_RDAC_CLK_CTL1,                            0x99},
+-      {WCD938X_HPH_RDAC_CLK_CTL2,                            0x9B},
+-      {WCD938X_HPH_RDAC_LDO_CTL,                             0x33},
+-      {WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL,                     0x00},
+-      {WCD938X_HPH_REFBUFF_UHQA_CTL,                         0x68},
+-      {WCD938X_HPH_REFBUFF_LP_CTL,                           0x0E},
+-      {WCD938X_HPH_L_DAC_CTL,                                0x20},
+-      {WCD938X_HPH_R_DAC_CTL,                                0x20},
+-      {WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL,               0x55},
+-      {WCD938X_HPH_SURGE_HPHLR_SURGE_EN,                     0x19},
+-      {WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1,                  0xA0},
+-      {WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS,                 0x00},
+-      {WCD938X_EAR_EAR_EN_REG,                               0x22},
+-      {WCD938X_EAR_EAR_PA_CON,                               0x44},
+-      {WCD938X_EAR_EAR_SP_CON,                               0xDB},
+-      {WCD938X_EAR_EAR_DAC_CON,                              0x80},
+-      {WCD938X_EAR_EAR_CNP_FSM_CON,                          0xB2},
+-      {WCD938X_EAR_TEST_CTL,                                 0x00},
+-      {WCD938X_EAR_STATUS_REG_1,                             0x00},
+-      {WCD938X_EAR_STATUS_REG_2,                             0x08},
+-      {WCD938X_ANA_NEW_PAGE_REGISTER,                        0x00},
+-      {WCD938X_HPH_NEW_ANA_HPH2,                             0x00},
+-      {WCD938X_HPH_NEW_ANA_HPH3,                             0x00},
+-      {WCD938X_SLEEP_CTL,                                    0x16},
+-      {WCD938X_SLEEP_WATCHDOG_CTL,                           0x00},
+-      {WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL,                 0x00},
+-      {WCD938X_MBHC_NEW_CTL_1,                               0x02},
+-      {WCD938X_MBHC_NEW_CTL_2,                               0x05},
+-      {WCD938X_MBHC_NEW_PLUG_DETECT_CTL,                     0xE9},
+-      {WCD938X_MBHC_NEW_ZDET_ANA_CTL,                        0x0F},
+-      {WCD938X_MBHC_NEW_ZDET_RAMP_CTL,                       0x00},
+-      {WCD938X_MBHC_NEW_FSM_STATUS,                          0x00},
+-      {WCD938X_MBHC_NEW_ADC_RESULT,                          0x00},
+-      {WCD938X_TX_NEW_AMIC_MUX_CFG,                          0x00},
+-      {WCD938X_AUX_AUXPA,                                    0x00},
+-      {WCD938X_LDORXTX_MODE,                                 0x0C},
+-      {WCD938X_LDORXTX_CONFIG,                               0x10},
+-      {WCD938X_DIE_CRACK_DIE_CRK_DET_EN,                     0x00},
+-      {WCD938X_DIE_CRACK_DIE_CRK_DET_OUT,                    0x00},
+-      {WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL,                    0x40},
+-      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L,                   0x81},
+-      {WCD938X_HPH_NEW_INT_RDAC_VREF_CTL,                    0x10},
+-      {WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL,                0x00},
+-      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R,                   0x81},
+-      {WCD938X_HPH_NEW_INT_PA_MISC1,                         0x22},
+-      {WCD938X_HPH_NEW_INT_PA_MISC2,                         0x00},
+-      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC,                     0x00},
+-      {WCD938X_HPH_NEW_INT_HPH_TIMER1,                       0xFE},
+-      {WCD938X_HPH_NEW_INT_HPH_TIMER2,                       0x02},
+-      {WCD938X_HPH_NEW_INT_HPH_TIMER3,                       0x4E},
+-      {WCD938X_HPH_NEW_INT_HPH_TIMER4,                       0x54},
+-      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC2,                    0x00},
+-      {WCD938X_HPH_NEW_INT_PA_RDAC_MISC3,                    0x00},
+-      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW,               0x90},
+-      {WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW,               0x90},
+-      {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI,              0x62},
+-      {WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP,                 0x01},
+-      {WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP,                   0x11},
+-      {WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL,            0x57},
+-      {WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL,       0x01},
+-      {WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT,                0x00},
+-      {WCD938X_MBHC_NEW_INT_SPARE_2,                         0x00},
+-      {WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON,                  0xA8},
+-      {WCD938X_EAR_INT_NEW_CNP_VCM_CON1,                     0x42},
+-      {WCD938X_EAR_INT_NEW_CNP_VCM_CON2,                     0x22},
+-      {WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS,                 0x00},
+-      {WCD938X_AUX_INT_EN_REG,                               0x00},
+-      {WCD938X_AUX_INT_PA_CTRL,                              0x06},
+-      {WCD938X_AUX_INT_SP_CTRL,                              0xD2},
+-      {WCD938X_AUX_INT_DAC_CTRL,                             0x80},
+-      {WCD938X_AUX_INT_CLK_CTRL,                             0x50},
+-      {WCD938X_AUX_INT_TEST_CTRL,                            0x00},
+-      {WCD938X_AUX_INT_STATUS_REG,                           0x00},
+-      {WCD938X_AUX_INT_MISC,                                 0x00},
+-      {WCD938X_LDORXTX_INT_BIAS,                             0x6E},
+-      {WCD938X_LDORXTX_INT_STB_LOADS_DTEST,                  0x50},
+-      {WCD938X_LDORXTX_INT_TEST0,                            0x1C},
+-      {WCD938X_LDORXTX_INT_STARTUP_TIMER,                    0xFF},
+-      {WCD938X_LDORXTX_INT_TEST1,                            0x1F},
+-      {WCD938X_LDORXTX_INT_STATUS,                           0x00},
+-      {WCD938X_SLEEP_INT_WATCHDOG_CTL_1,                     0x0A},
+-      {WCD938X_SLEEP_INT_WATCHDOG_CTL_2,                     0x0A},
+-      {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1,               0x02},
+-      {WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2,               0x60},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2,               0xFF},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1,               0x7F},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0,               0x3F},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M,          0x1F},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M,          0x0F},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1,          0xD7},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0,            0xC8},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP,           0xC6},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1,      0xD5},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0,        0xCA},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP,       0x05},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0,    0xA5},
+-      {WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP,       0x13},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1,             0x88},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP,            0x42},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L2,                  0xFF},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L1,                  0x64},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_INT_L0,                  0x64},
+-      {WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP,                 0x77},
+-      {WCD938X_DIGITAL_PAGE_REGISTER,                        0x00},
+-      {WCD938X_DIGITAL_CHIP_ID0,                             0x00},
+-      {WCD938X_DIGITAL_CHIP_ID1,                             0x00},
+-      {WCD938X_DIGITAL_CHIP_ID2,                             0x0D},
+-      {WCD938X_DIGITAL_CHIP_ID3,                             0x01},
+-      {WCD938X_DIGITAL_SWR_TX_CLK_RATE,                      0x00},
+-      {WCD938X_DIGITAL_CDC_RST_CTL,                          0x03},
+-      {WCD938X_DIGITAL_TOP_CLK_CFG,                          0x00},
+-      {WCD938X_DIGITAL_CDC_ANA_CLK_CTL,                      0x00},
+-      {WCD938X_DIGITAL_CDC_DIG_CLK_CTL,                      0xF0},
+-      {WCD938X_DIGITAL_SWR_RST_EN,                           0x00},
+-      {WCD938X_DIGITAL_CDC_PATH_MODE,                        0x55},
+-      {WCD938X_DIGITAL_CDC_RX_RST,                           0x00},
+-      {WCD938X_DIGITAL_CDC_RX0_CTL,                          0xFC},
+-      {WCD938X_DIGITAL_CDC_RX1_CTL,                          0xFC},
+-      {WCD938X_DIGITAL_CDC_RX2_CTL,                          0xFC},
+-      {WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1,                  0x00},
+-      {WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3,                  0x00},
+-      {WCD938X_DIGITAL_CDC_COMP_CTL_0,                       0x00},
+-      {WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL,                   0x1E},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A1_0,                     0x00},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A1_1,                     0x01},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A2_0,                     0x63},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A2_1,                     0x04},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A3_0,                     0xAC},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A3_1,                     0x04},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A4_0,                     0x1A},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A4_1,                     0x03},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A5_0,                     0xBC},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A5_1,                     0x02},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A6_0,                     0xC7},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_A7_0,                     0xF8},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_C_0,                      0x47},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_C_1,                      0x43},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_C_2,                      0xB1},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_C_3,                      0x17},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R1,                       0x4D},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R2,                       0x29},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R3,                       0x34},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R4,                       0x59},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R5,                       0x66},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R6,                       0x87},
+-      {WCD938X_DIGITAL_CDC_HPH_DSM_R7,                       0x64},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A1_0,                     0x00},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A1_1,                     0x01},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A2_0,                     0x96},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A2_1,                     0x09},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A3_0,                     0xAB},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A3_1,                     0x05},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A4_0,                     0x1C},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A4_1,                     0x02},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A5_0,                     0x17},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A5_1,                     0x02},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A6_0,                     0xAA},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_A7_0,                     0xE3},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_C_0,                      0x69},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_C_1,                      0x54},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_C_2,                      0x02},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_C_3,                      0x15},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R1,                       0xA4},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R2,                       0xB5},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R3,                       0x86},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R4,                       0x85},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R5,                       0xAA},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R6,                       0xE2},
+-      {WCD938X_DIGITAL_CDC_AUX_DSM_R7,                       0x62},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0,                    0x55},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1,                    0xA9},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0,                   0x3D},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1,                   0x2E},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2,                   0x01},
+-      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0,                   0x00},
+-      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1,                   0xFC},
+-      {WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2,                   0x01},
+-      {WCD938X_DIGITAL_CDC_HPH_GAIN_CTL,                     0x00},
+-      {WCD938X_DIGITAL_CDC_AUX_GAIN_CTL,                     0x00},
+-      {WCD938X_DIGITAL_CDC_EAR_PATH_CTL,                     0x00},
+-      {WCD938X_DIGITAL_CDC_SWR_CLH,                          0x00},
+-      {WCD938X_DIGITAL_SWR_CLH_BYP,                          0x00},
+-      {WCD938X_DIGITAL_CDC_TX0_CTL,                          0x68},
+-      {WCD938X_DIGITAL_CDC_TX1_CTL,                          0x68},
+-      {WCD938X_DIGITAL_CDC_TX2_CTL,                          0x68},
+-      {WCD938X_DIGITAL_CDC_TX_RST,                           0x00},
+-      {WCD938X_DIGITAL_CDC_REQ_CTL,                          0x01},
+-      {WCD938X_DIGITAL_CDC_RST,                              0x00},
+-      {WCD938X_DIGITAL_CDC_AMIC_CTL,                         0x0F},
+-      {WCD938X_DIGITAL_CDC_DMIC_CTL,                         0x04},
+-      {WCD938X_DIGITAL_CDC_DMIC1_CTL,                        0x01},
+-      {WCD938X_DIGITAL_CDC_DMIC2_CTL,                        0x01},
+-      {WCD938X_DIGITAL_CDC_DMIC3_CTL,                        0x01},
+-      {WCD938X_DIGITAL_CDC_DMIC4_CTL,                        0x01},
+-      {WCD938X_DIGITAL_EFUSE_PRG_CTL,                        0x00},
+-      {WCD938X_DIGITAL_EFUSE_CTL,                            0x2B},
+-      {WCD938X_DIGITAL_CDC_DMIC_RATE_1_2,                    0x11},
+-      {WCD938X_DIGITAL_CDC_DMIC_RATE_3_4,                    0x11},
+-      {WCD938X_DIGITAL_PDM_WD_CTL0,                          0x00},
+-      {WCD938X_DIGITAL_PDM_WD_CTL1,                          0x00},
+-      {WCD938X_DIGITAL_PDM_WD_CTL2,                          0x00},
+-      {WCD938X_DIGITAL_INTR_MODE,                            0x00},
+-      {WCD938X_DIGITAL_INTR_MASK_0,                          0xFF},
+-      {WCD938X_DIGITAL_INTR_MASK_1,                          0xFF},
+-      {WCD938X_DIGITAL_INTR_MASK_2,                          0x3F},
+-      {WCD938X_DIGITAL_INTR_STATUS_0,                        0x00},
+-      {WCD938X_DIGITAL_INTR_STATUS_1,                        0x00},
+-      {WCD938X_DIGITAL_INTR_STATUS_2,                        0x00},
+-      {WCD938X_DIGITAL_INTR_CLEAR_0,                         0x00},
+-      {WCD938X_DIGITAL_INTR_CLEAR_1,                         0x00},
+-      {WCD938X_DIGITAL_INTR_CLEAR_2,                         0x00},
+-      {WCD938X_DIGITAL_INTR_LEVEL_0,                         0x00},
+-      {WCD938X_DIGITAL_INTR_LEVEL_1,                         0x00},
+-      {WCD938X_DIGITAL_INTR_LEVEL_2,                         0x00},
+-      {WCD938X_DIGITAL_INTR_SET_0,                           0x00},
+-      {WCD938X_DIGITAL_INTR_SET_1,                           0x00},
+-      {WCD938X_DIGITAL_INTR_SET_2,                           0x00},
+-      {WCD938X_DIGITAL_INTR_TEST_0,                          0x00},
+-      {WCD938X_DIGITAL_INTR_TEST_1,                          0x00},
+-      {WCD938X_DIGITAL_INTR_TEST_2,                          0x00},
+-      {WCD938X_DIGITAL_TX_MODE_DBG_EN,                       0x00},
+-      {WCD938X_DIGITAL_TX_MODE_DBG_0_1,                      0x00},
+-      {WCD938X_DIGITAL_TX_MODE_DBG_2_3,                      0x00},
+-      {WCD938X_DIGITAL_LB_IN_SEL_CTL,                        0x00},
+-      {WCD938X_DIGITAL_LOOP_BACK_MODE,                       0x00},
+-      {WCD938X_DIGITAL_SWR_DAC_TEST,                         0x00},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_RX_0,                     0x40},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_TX_0,                     0x40},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_RX_1,                     0x00},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_TX_1,                     0x00},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_TX_2,                     0x00},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_0,                        0x00},
+-      {WCD938X_DIGITAL_SWR_HM_TEST_1,                        0x00},
+-      {WCD938X_DIGITAL_PAD_CTL_SWR_0,                        0x8F},
+-      {WCD938X_DIGITAL_PAD_CTL_SWR_1,                        0x06},
+-      {WCD938X_DIGITAL_I2C_CTL,                              0x00},
+-      {WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE,                0x00},
+-      {WCD938X_DIGITAL_EFUSE_TEST_CTL_0,                     0x00},
+-      {WCD938X_DIGITAL_EFUSE_TEST_CTL_1,                     0x00},
+-      {WCD938X_DIGITAL_EFUSE_T_DATA_0,                       0x00},
+-      {WCD938X_DIGITAL_EFUSE_T_DATA_1,                       0x00},
+-      {WCD938X_DIGITAL_PAD_CTL_PDM_RX0,                      0xF1},
+-      {WCD938X_DIGITAL_PAD_CTL_PDM_RX1,                      0xF1},
+-      {WCD938X_DIGITAL_PAD_CTL_PDM_TX0,                      0xF1},
+-      {WCD938X_DIGITAL_PAD_CTL_PDM_TX1,                      0xF1},
+-      {WCD938X_DIGITAL_PAD_CTL_PDM_TX2,                      0xF1},
+-      {WCD938X_DIGITAL_PAD_INP_DIS_0,                        0x00},
+-      {WCD938X_DIGITAL_PAD_INP_DIS_1,                        0x00},
+-      {WCD938X_DIGITAL_DRIVE_STRENGTH_0,                     0x00},
+-      {WCD938X_DIGITAL_DRIVE_STRENGTH_1,                     0x00},
+-      {WCD938X_DIGITAL_DRIVE_STRENGTH_2,                     0x00},
+-      {WCD938X_DIGITAL_RX_DATA_EDGE_CTL,                     0x1F},
+-      {WCD938X_DIGITAL_TX_DATA_EDGE_CTL,                     0x80},
+-      {WCD938X_DIGITAL_GPIO_MODE,                            0x00},
+-      {WCD938X_DIGITAL_PIN_CTL_OE,                           0x00},
+-      {WCD938X_DIGITAL_PIN_CTL_DATA_0,                       0x00},
+-      {WCD938X_DIGITAL_PIN_CTL_DATA_1,                       0x00},
+-      {WCD938X_DIGITAL_PIN_STATUS_0,                         0x00},
+-      {WCD938X_DIGITAL_PIN_STATUS_1,                         0x00},
+-      {WCD938X_DIGITAL_DIG_DEBUG_CTL,                        0x00},
+-      {WCD938X_DIGITAL_DIG_DEBUG_EN,                         0x00},
+-      {WCD938X_DIGITAL_ANA_CSR_DBG_ADD,                      0x00},
+-      {WCD938X_DIGITAL_ANA_CSR_DBG_CTL,                      0x48},
+-      {WCD938X_DIGITAL_SSP_DBG,                              0x00},
+-      {WCD938X_DIGITAL_MODE_STATUS_0,                        0x00},
+-      {WCD938X_DIGITAL_MODE_STATUS_1,                        0x00},
+-      {WCD938X_DIGITAL_SPARE_0,                              0x00},
+-      {WCD938X_DIGITAL_SPARE_1,                              0x00},
+-      {WCD938X_DIGITAL_SPARE_2,                              0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_0,                          0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_1,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_2,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_3,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_4,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_5,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_6,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_7,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_8,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_9,                          0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_10,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_11,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_12,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_13,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_14,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_15,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_16,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_17,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_18,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_19,                         0xFF},
+-      {WCD938X_DIGITAL_EFUSE_REG_20,                         0x0E},
+-      {WCD938X_DIGITAL_EFUSE_REG_21,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_22,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_23,                         0xF8},
+-      {WCD938X_DIGITAL_EFUSE_REG_24,                         0x16},
+-      {WCD938X_DIGITAL_EFUSE_REG_25,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_26,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_27,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_28,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_29,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_30,                         0x00},
+-      {WCD938X_DIGITAL_EFUSE_REG_31,                         0x00},
+-      {WCD938X_DIGITAL_TX_REQ_FB_CTL_0,                      0x88},
+-      {WCD938X_DIGITAL_TX_REQ_FB_CTL_1,                      0x88},
+-      {WCD938X_DIGITAL_TX_REQ_FB_CTL_2,                      0x88},
+-      {WCD938X_DIGITAL_TX_REQ_FB_CTL_3,                      0x88},
+-      {WCD938X_DIGITAL_TX_REQ_FB_CTL_4,                      0x88},
+-      {WCD938X_DIGITAL_DEM_BYPASS_DATA0,                     0x55},
+-      {WCD938X_DIGITAL_DEM_BYPASS_DATA1,                     0x55},
+-      {WCD938X_DIGITAL_DEM_BYPASS_DATA2,                     0x55},
+-      {WCD938X_DIGITAL_DEM_BYPASS_DATA3,                     0x01},
+-};
+-
+-static bool wcd938x_rdwr_register(struct device *dev, unsigned int reg)
+-{
+-      switch (reg) {
+-      case WCD938X_ANA_PAGE_REGISTER:
+-      case WCD938X_ANA_BIAS:
+-      case WCD938X_ANA_RX_SUPPLIES:
+-      case WCD938X_ANA_HPH:
+-      case WCD938X_ANA_EAR:
+-      case WCD938X_ANA_EAR_COMPANDER_CTL:
+-      case WCD938X_ANA_TX_CH1:
+-      case WCD938X_ANA_TX_CH2:
+-      case WCD938X_ANA_TX_CH3:
+-      case WCD938X_ANA_TX_CH4:
+-      case WCD938X_ANA_MICB1_MICB2_DSP_EN_LOGIC:
+-      case WCD938X_ANA_MICB3_DSP_EN_LOGIC:
+-      case WCD938X_ANA_MBHC_MECH:
+-      case WCD938X_ANA_MBHC_ELECT:
+-      case WCD938X_ANA_MBHC_ZDET:
+-      case WCD938X_ANA_MBHC_BTN0:
+-      case WCD938X_ANA_MBHC_BTN1:
+-      case WCD938X_ANA_MBHC_BTN2:
+-      case WCD938X_ANA_MBHC_BTN3:
+-      case WCD938X_ANA_MBHC_BTN4:
+-      case WCD938X_ANA_MBHC_BTN5:
+-      case WCD938X_ANA_MBHC_BTN6:
+-      case WCD938X_ANA_MBHC_BTN7:
+-      case WCD938X_ANA_MICB1:
+-      case WCD938X_ANA_MICB2:
+-      case WCD938X_ANA_MICB2_RAMP:
+-      case WCD938X_ANA_MICB3:
+-      case WCD938X_ANA_MICB4:
+-      case WCD938X_BIAS_CTL:
+-      case WCD938X_BIAS_VBG_FINE_ADJ:
+-      case WCD938X_LDOL_VDDCX_ADJUST:
+-      case WCD938X_LDOL_DISABLE_LDOL:
+-      case WCD938X_MBHC_CTL_CLK:
+-      case WCD938X_MBHC_CTL_ANA:
+-      case WCD938X_MBHC_CTL_SPARE_1:
+-      case WCD938X_MBHC_CTL_SPARE_2:
+-      case WCD938X_MBHC_CTL_BCS:
+-      case WCD938X_MBHC_TEST_CTL:
+-      case WCD938X_LDOH_MODE:
+-      case WCD938X_LDOH_BIAS:
+-      case WCD938X_LDOH_STB_LOADS:
+-      case WCD938X_LDOH_SLOWRAMP:
+-      case WCD938X_MICB1_TEST_CTL_1:
+-      case WCD938X_MICB1_TEST_CTL_2:
+-      case WCD938X_MICB1_TEST_CTL_3:
+-      case WCD938X_MICB2_TEST_CTL_1:
+-      case WCD938X_MICB2_TEST_CTL_2:
+-      case WCD938X_MICB2_TEST_CTL_3:
+-      case WCD938X_MICB3_TEST_CTL_1:
+-      case WCD938X_MICB3_TEST_CTL_2:
+-      case WCD938X_MICB3_TEST_CTL_3:
+-      case WCD938X_MICB4_TEST_CTL_1:
+-      case WCD938X_MICB4_TEST_CTL_2:
+-      case WCD938X_MICB4_TEST_CTL_3:
+-      case WCD938X_TX_COM_ADC_VCM:
+-      case WCD938X_TX_COM_BIAS_ATEST:
+-      case WCD938X_TX_COM_SPARE1:
+-      case WCD938X_TX_COM_SPARE2:
+-      case WCD938X_TX_COM_TXFE_DIV_CTL:
+-      case WCD938X_TX_COM_TXFE_DIV_START:
+-      case WCD938X_TX_COM_SPARE3:
+-      case WCD938X_TX_COM_SPARE4:
+-      case WCD938X_TX_1_2_TEST_EN:
+-      case WCD938X_TX_1_2_ADC_IB:
+-      case WCD938X_TX_1_2_ATEST_REFCTL:
+-      case WCD938X_TX_1_2_TEST_CTL:
+-      case WCD938X_TX_1_2_TEST_BLK_EN1:
+-      case WCD938X_TX_1_2_TXFE1_CLKDIV:
+-      case WCD938X_TX_3_4_TEST_EN:
+-      case WCD938X_TX_3_4_ADC_IB:
+-      case WCD938X_TX_3_4_ATEST_REFCTL:
+-      case WCD938X_TX_3_4_TEST_CTL:
+-      case WCD938X_TX_3_4_TEST_BLK_EN3:
+-      case WCD938X_TX_3_4_TXFE3_CLKDIV:
+-      case WCD938X_TX_3_4_TEST_BLK_EN2:
+-      case WCD938X_TX_3_4_TXFE2_CLKDIV:
+-      case WCD938X_TX_3_4_SPARE1:
+-      case WCD938X_TX_3_4_TEST_BLK_EN4:
+-      case WCD938X_TX_3_4_TXFE4_CLKDIV:
+-      case WCD938X_TX_3_4_SPARE2:
+-      case WCD938X_CLASSH_MODE_1:
+-      case WCD938X_CLASSH_MODE_2:
+-      case WCD938X_CLASSH_MODE_3:
+-      case WCD938X_CLASSH_CTRL_VCL_1:
+-      case WCD938X_CLASSH_CTRL_VCL_2:
+-      case WCD938X_CLASSH_CTRL_CCL_1:
+-      case WCD938X_CLASSH_CTRL_CCL_2:
+-      case WCD938X_CLASSH_CTRL_CCL_3:
+-      case WCD938X_CLASSH_CTRL_CCL_4:
+-      case WCD938X_CLASSH_CTRL_CCL_5:
+-      case WCD938X_CLASSH_BUCK_TMUX_A_D:
+-      case WCD938X_CLASSH_BUCK_SW_DRV_CNTL:
+-      case WCD938X_CLASSH_SPARE:
+-      case WCD938X_FLYBACK_EN:
+-      case WCD938X_FLYBACK_VNEG_CTRL_1:
+-      case WCD938X_FLYBACK_VNEG_CTRL_2:
+-      case WCD938X_FLYBACK_VNEG_CTRL_3:
+-      case WCD938X_FLYBACK_VNEG_CTRL_4:
+-      case WCD938X_FLYBACK_VNEG_CTRL_5:
+-      case WCD938X_FLYBACK_VNEG_CTRL_6:
+-      case WCD938X_FLYBACK_VNEG_CTRL_7:
+-      case WCD938X_FLYBACK_VNEG_CTRL_8:
+-      case WCD938X_FLYBACK_VNEG_CTRL_9:
+-      case WCD938X_FLYBACK_VNEGDAC_CTRL_1:
+-      case WCD938X_FLYBACK_VNEGDAC_CTRL_2:
+-      case WCD938X_FLYBACK_VNEGDAC_CTRL_3:
+-      case WCD938X_FLYBACK_CTRL_1:
+-      case WCD938X_FLYBACK_TEST_CTL:
+-      case WCD938X_RX_AUX_SW_CTL:
+-      case WCD938X_RX_PA_AUX_IN_CONN:
+-      case WCD938X_RX_TIMER_DIV:
+-      case WCD938X_RX_OCP_CTL:
+-      case WCD938X_RX_OCP_COUNT:
+-      case WCD938X_RX_BIAS_EAR_DAC:
+-      case WCD938X_RX_BIAS_EAR_AMP:
+-      case WCD938X_RX_BIAS_HPH_LDO:
+-      case WCD938X_RX_BIAS_HPH_PA:
+-      case WCD938X_RX_BIAS_HPH_RDACBUFF_CNP2:
+-      case WCD938X_RX_BIAS_HPH_RDAC_LDO:
+-      case WCD938X_RX_BIAS_HPH_CNP1:
+-      case WCD938X_RX_BIAS_HPH_LOWPOWER:
+-      case WCD938X_RX_BIAS_AUX_DAC:
+-      case WCD938X_RX_BIAS_AUX_AMP:
+-      case WCD938X_RX_BIAS_VNEGDAC_BLEEDER:
+-      case WCD938X_RX_BIAS_MISC:
+-      case WCD938X_RX_BIAS_BUCK_RST:
+-      case WCD938X_RX_BIAS_BUCK_VREF_ERRAMP:
+-      case WCD938X_RX_BIAS_FLYB_ERRAMP:
+-      case WCD938X_RX_BIAS_FLYB_BUFF:
+-      case WCD938X_RX_BIAS_FLYB_MID_RST:
+-      case WCD938X_HPH_CNP_EN:
+-      case WCD938X_HPH_CNP_WG_CTL:
+-      case WCD938X_HPH_CNP_WG_TIME:
+-      case WCD938X_HPH_OCP_CTL:
+-      case WCD938X_HPH_AUTO_CHOP:
+-      case WCD938X_HPH_CHOP_CTL:
+-      case WCD938X_HPH_PA_CTL1:
+-      case WCD938X_HPH_PA_CTL2:
+-      case WCD938X_HPH_L_EN:
+-      case WCD938X_HPH_L_TEST:
+-      case WCD938X_HPH_L_ATEST:
+-      case WCD938X_HPH_R_EN:
+-      case WCD938X_HPH_R_TEST:
+-      case WCD938X_HPH_R_ATEST:
+-      case WCD938X_HPH_RDAC_CLK_CTL1:
+-      case WCD938X_HPH_RDAC_CLK_CTL2:
+-      case WCD938X_HPH_RDAC_LDO_CTL:
+-      case WCD938X_HPH_RDAC_CHOP_CLK_LP_CTL:
+-      case WCD938X_HPH_REFBUFF_UHQA_CTL:
+-      case WCD938X_HPH_REFBUFF_LP_CTL:
+-      case WCD938X_HPH_L_DAC_CTL:
+-      case WCD938X_HPH_R_DAC_CTL:
+-      case WCD938X_HPH_SURGE_HPHLR_SURGE_COMP_SEL:
+-      case WCD938X_HPH_SURGE_HPHLR_SURGE_EN:
+-      case WCD938X_HPH_SURGE_HPHLR_SURGE_MISC1:
+-      case WCD938X_EAR_EAR_EN_REG:
+-      case WCD938X_EAR_EAR_PA_CON:
+-      case WCD938X_EAR_EAR_SP_CON:
+-      case WCD938X_EAR_EAR_DAC_CON:
+-      case WCD938X_EAR_EAR_CNP_FSM_CON:
+-      case WCD938X_EAR_TEST_CTL:
+-      case WCD938X_ANA_NEW_PAGE_REGISTER:
+-      case WCD938X_HPH_NEW_ANA_HPH2:
+-      case WCD938X_HPH_NEW_ANA_HPH3:
+-      case WCD938X_SLEEP_CTL:
+-      case WCD938X_SLEEP_WATCHDOG_CTL:
+-      case WCD938X_MBHC_NEW_ELECT_REM_CLAMP_CTL:
+-      case WCD938X_MBHC_NEW_CTL_1:
+-      case WCD938X_MBHC_NEW_CTL_2:
+-      case WCD938X_MBHC_NEW_PLUG_DETECT_CTL:
+-      case WCD938X_MBHC_NEW_ZDET_ANA_CTL:
+-      case WCD938X_MBHC_NEW_ZDET_RAMP_CTL:
+-      case WCD938X_TX_NEW_AMIC_MUX_CFG:
+-      case WCD938X_AUX_AUXPA:
+-      case WCD938X_LDORXTX_MODE:
+-      case WCD938X_LDORXTX_CONFIG:
+-      case WCD938X_DIE_CRACK_DIE_CRK_DET_EN:
+-      case WCD938X_HPH_NEW_INT_RDAC_GAIN_CTL:
+-      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L:
+-      case WCD938X_HPH_NEW_INT_RDAC_VREF_CTL:
+-      case WCD938X_HPH_NEW_INT_RDAC_OVERRIDE_CTL:
+-      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R:
+-      case WCD938X_HPH_NEW_INT_PA_MISC1:
+-      case WCD938X_HPH_NEW_INT_PA_MISC2:
+-      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC:
+-      case WCD938X_HPH_NEW_INT_HPH_TIMER1:
+-      case WCD938X_HPH_NEW_INT_HPH_TIMER2:
+-      case WCD938X_HPH_NEW_INT_HPH_TIMER3:
+-      case WCD938X_HPH_NEW_INT_HPH_TIMER4:
+-      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC2:
+-      case WCD938X_HPH_NEW_INT_PA_RDAC_MISC3:
+-      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_L_NEW:
+-      case WCD938X_HPH_NEW_INT_RDAC_HD2_CTL_R_NEW:
+-      case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_LOHIFI:
+-      case WCD938X_RX_NEW_INT_HPH_RDAC_BIAS_ULP:
+-      case WCD938X_RX_NEW_INT_HPH_RDAC_LDO_LP:
+-      case WCD938X_MBHC_NEW_INT_MOISTURE_DET_DC_CTRL:
+-      case WCD938X_MBHC_NEW_INT_MOISTURE_DET_POLLING_CTRL:
+-      case WCD938X_MBHC_NEW_INT_MECH_DET_CURRENT:
+-      case WCD938X_MBHC_NEW_INT_SPARE_2:
+-      case WCD938X_EAR_INT_NEW_EAR_CHOPPER_CON:
+-      case WCD938X_EAR_INT_NEW_CNP_VCM_CON1:
+-      case WCD938X_EAR_INT_NEW_CNP_VCM_CON2:
+-      case WCD938X_EAR_INT_NEW_EAR_DYNAMIC_BIAS:
+-      case WCD938X_AUX_INT_EN_REG:
+-      case WCD938X_AUX_INT_PA_CTRL:
+-      case WCD938X_AUX_INT_SP_CTRL:
+-      case WCD938X_AUX_INT_DAC_CTRL:
+-      case WCD938X_AUX_INT_CLK_CTRL:
+-      case WCD938X_AUX_INT_TEST_CTRL:
+-      case WCD938X_AUX_INT_MISC:
+-      case WCD938X_LDORXTX_INT_BIAS:
+-      case WCD938X_LDORXTX_INT_STB_LOADS_DTEST:
+-      case WCD938X_LDORXTX_INT_TEST0:
+-      case WCD938X_LDORXTX_INT_STARTUP_TIMER:
+-      case WCD938X_LDORXTX_INT_TEST1:
+-      case WCD938X_SLEEP_INT_WATCHDOG_CTL_1:
+-      case WCD938X_SLEEP_INT_WATCHDOG_CTL_2:
+-      case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT1:
+-      case WCD938X_DIE_CRACK_INT_DIE_CRK_DET_INT2:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L2:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L1:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_L0:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP1P2M:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_DIVSTOP_ULP0P6M:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L2L1:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_L0:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG1_ULP:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L2L1:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_L0:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2MAIN_ULP:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_L2L1L0:
+-      case WCD938X_TX_COM_NEW_INT_TXFE_ICTRL_STG2CASC_ULP:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L2L1:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_SCBIAS_L0ULP:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L2:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L1:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_INT_L0:
+-      case WCD938X_TX_COM_NEW_INT_TXADC_INT_ULP:
+-      case WCD938X_DIGITAL_PAGE_REGISTER:
+-      case WCD938X_DIGITAL_SWR_TX_CLK_RATE:
+-      case WCD938X_DIGITAL_CDC_RST_CTL:
+-      case WCD938X_DIGITAL_TOP_CLK_CFG:
+-      case WCD938X_DIGITAL_CDC_ANA_CLK_CTL:
+-      case WCD938X_DIGITAL_CDC_DIG_CLK_CTL:
+-      case WCD938X_DIGITAL_SWR_RST_EN:
+-      case WCD938X_DIGITAL_CDC_PATH_MODE:
+-      case WCD938X_DIGITAL_CDC_RX_RST:
+-      case WCD938X_DIGITAL_CDC_RX0_CTL:
+-      case WCD938X_DIGITAL_CDC_RX1_CTL:
+-      case WCD938X_DIGITAL_CDC_RX2_CTL:
+-      case WCD938X_DIGITAL_CDC_TX_ANA_MODE_0_1:
+-      case WCD938X_DIGITAL_CDC_TX_ANA_MODE_2_3:
+-      case WCD938X_DIGITAL_CDC_COMP_CTL_0:
+-      case WCD938X_DIGITAL_CDC_ANA_TX_CLK_CTL:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A1_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A1_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A2_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A2_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A3_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A3_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A4_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A4_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A5_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A5_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A6_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_A7_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_C_0:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_C_1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_C_2:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_C_3:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R1:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R2:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R3:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R4:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R5:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R6:
+-      case WCD938X_DIGITAL_CDC_HPH_DSM_R7:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A1_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A1_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A2_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A2_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A3_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A3_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A4_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A4_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A5_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A5_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A6_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_A7_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_C_0:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_C_1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_C_2:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_C_3:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R1:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R2:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R3:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R4:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R5:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R6:
+-      case WCD938X_DIGITAL_CDC_AUX_DSM_R7:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_0:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_RX_1:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_0:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_1:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_DSD_2:
+-      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_0:
+-      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_1:
+-      case WCD938X_DIGITAL_CDC_AUX_GAIN_DSD_2:
+-      case WCD938X_DIGITAL_CDC_HPH_GAIN_CTL:
+-      case WCD938X_DIGITAL_CDC_AUX_GAIN_CTL:
+-      case WCD938X_DIGITAL_CDC_EAR_PATH_CTL:
+-      case WCD938X_DIGITAL_CDC_SWR_CLH:
+-      case WCD938X_DIGITAL_SWR_CLH_BYP:
+-      case WCD938X_DIGITAL_CDC_TX0_CTL:
+-      case WCD938X_DIGITAL_CDC_TX1_CTL:
+-      case WCD938X_DIGITAL_CDC_TX2_CTL:
+-      case WCD938X_DIGITAL_CDC_TX_RST:
+-      case WCD938X_DIGITAL_CDC_REQ_CTL:
+-      case WCD938X_DIGITAL_CDC_RST:
+-      case WCD938X_DIGITAL_CDC_AMIC_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC1_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC2_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC3_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC4_CTL:
+-      case WCD938X_DIGITAL_EFUSE_PRG_CTL:
+-      case WCD938X_DIGITAL_EFUSE_CTL:
+-      case WCD938X_DIGITAL_CDC_DMIC_RATE_1_2:
+-      case WCD938X_DIGITAL_CDC_DMIC_RATE_3_4:
+-      case WCD938X_DIGITAL_PDM_WD_CTL0:
+-      case WCD938X_DIGITAL_PDM_WD_CTL1:
+-      case WCD938X_DIGITAL_PDM_WD_CTL2:
+-      case WCD938X_DIGITAL_INTR_MODE:
+-      case WCD938X_DIGITAL_INTR_MASK_0:
+-      case WCD938X_DIGITAL_INTR_MASK_1:
+-      case WCD938X_DIGITAL_INTR_MASK_2:
+-      case WCD938X_DIGITAL_INTR_CLEAR_0:
+-      case WCD938X_DIGITAL_INTR_CLEAR_1:
+-      case WCD938X_DIGITAL_INTR_CLEAR_2:
+-      case WCD938X_DIGITAL_INTR_LEVEL_0:
+-      case WCD938X_DIGITAL_INTR_LEVEL_1:
+-      case WCD938X_DIGITAL_INTR_LEVEL_2:
+-      case WCD938X_DIGITAL_INTR_SET_0:
+-      case WCD938X_DIGITAL_INTR_SET_1:
+-      case WCD938X_DIGITAL_INTR_SET_2:
+-      case WCD938X_DIGITAL_INTR_TEST_0:
+-      case WCD938X_DIGITAL_INTR_TEST_1:
+-      case WCD938X_DIGITAL_INTR_TEST_2:
+-      case WCD938X_DIGITAL_TX_MODE_DBG_EN:
+-      case WCD938X_DIGITAL_TX_MODE_DBG_0_1:
+-      case WCD938X_DIGITAL_TX_MODE_DBG_2_3:
+-      case WCD938X_DIGITAL_LB_IN_SEL_CTL:
+-      case WCD938X_DIGITAL_LOOP_BACK_MODE:
+-      case WCD938X_DIGITAL_SWR_DAC_TEST:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_RX_0:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_TX_0:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_RX_1:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_TX_1:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_TX_2:
+-      case WCD938X_DIGITAL_PAD_CTL_SWR_0:
+-      case WCD938X_DIGITAL_PAD_CTL_SWR_1:
+-      case WCD938X_DIGITAL_I2C_CTL:
+-      case WCD938X_DIGITAL_CDC_TX_TANGGU_SW_MODE:
+-      case WCD938X_DIGITAL_EFUSE_TEST_CTL_0:
+-      case WCD938X_DIGITAL_EFUSE_TEST_CTL_1:
+-      case WCD938X_DIGITAL_PAD_CTL_PDM_RX0:
+-      case WCD938X_DIGITAL_PAD_CTL_PDM_RX1:
+-      case WCD938X_DIGITAL_PAD_CTL_PDM_TX0:
+-      case WCD938X_DIGITAL_PAD_CTL_PDM_TX1:
+-      case WCD938X_DIGITAL_PAD_CTL_PDM_TX2:
+-      case WCD938X_DIGITAL_PAD_INP_DIS_0:
+-      case WCD938X_DIGITAL_PAD_INP_DIS_1:
+-      case WCD938X_DIGITAL_DRIVE_STRENGTH_0:
+-      case WCD938X_DIGITAL_DRIVE_STRENGTH_1:
+-      case WCD938X_DIGITAL_DRIVE_STRENGTH_2:
+-      case WCD938X_DIGITAL_RX_DATA_EDGE_CTL:
+-      case WCD938X_DIGITAL_TX_DATA_EDGE_CTL:
+-      case WCD938X_DIGITAL_GPIO_MODE:
+-      case WCD938X_DIGITAL_PIN_CTL_OE:
+-      case WCD938X_DIGITAL_PIN_CTL_DATA_0:
+-      case WCD938X_DIGITAL_PIN_CTL_DATA_1:
+-      case WCD938X_DIGITAL_DIG_DEBUG_CTL:
+-      case WCD938X_DIGITAL_DIG_DEBUG_EN:
+-      case WCD938X_DIGITAL_ANA_CSR_DBG_ADD:
+-      case WCD938X_DIGITAL_ANA_CSR_DBG_CTL:
+-      case WCD938X_DIGITAL_SSP_DBG:
+-      case WCD938X_DIGITAL_SPARE_0:
+-      case WCD938X_DIGITAL_SPARE_1:
+-      case WCD938X_DIGITAL_SPARE_2:
+-      case WCD938X_DIGITAL_TX_REQ_FB_CTL_0:
+-      case WCD938X_DIGITAL_TX_REQ_FB_CTL_1:
+-      case WCD938X_DIGITAL_TX_REQ_FB_CTL_2:
+-      case WCD938X_DIGITAL_TX_REQ_FB_CTL_3:
+-      case WCD938X_DIGITAL_TX_REQ_FB_CTL_4:
+-      case WCD938X_DIGITAL_DEM_BYPASS_DATA0:
+-      case WCD938X_DIGITAL_DEM_BYPASS_DATA1:
+-      case WCD938X_DIGITAL_DEM_BYPASS_DATA2:
+-      case WCD938X_DIGITAL_DEM_BYPASS_DATA3:
+-              return true;
+-      }
+-
+-      return false;
+-}
+-
+-static bool wcd938x_readonly_register(struct device *dev, unsigned int reg)
+-{
+-      switch (reg) {
+-      case WCD938X_ANA_MBHC_RESULT_1:
+-      case WCD938X_ANA_MBHC_RESULT_2:
+-      case WCD938X_ANA_MBHC_RESULT_3:
+-      case WCD938X_MBHC_MOISTURE_DET_FSM_STATUS:
+-      case WCD938X_TX_1_2_SAR2_ERR:
+-      case WCD938X_TX_1_2_SAR1_ERR:
+-      case WCD938X_TX_3_4_SAR4_ERR:
+-      case WCD938X_TX_3_4_SAR3_ERR:
+-      case WCD938X_HPH_L_STATUS:
+-      case WCD938X_HPH_R_STATUS:
+-      case WCD938X_HPH_SURGE_HPHLR_SURGE_STATUS:
+-      case WCD938X_EAR_STATUS_REG_1:
+-      case WCD938X_EAR_STATUS_REG_2:
+-      case WCD938X_MBHC_NEW_FSM_STATUS:
+-      case WCD938X_MBHC_NEW_ADC_RESULT:
+-      case WCD938X_DIE_CRACK_DIE_CRK_DET_OUT:
+-      case WCD938X_AUX_INT_STATUS_REG:
+-      case WCD938X_LDORXTX_INT_STATUS:
+-      case WCD938X_DIGITAL_CHIP_ID0:
+-      case WCD938X_DIGITAL_CHIP_ID1:
+-      case WCD938X_DIGITAL_CHIP_ID2:
+-      case WCD938X_DIGITAL_CHIP_ID3:
+-      case WCD938X_DIGITAL_INTR_STATUS_0:
+-      case WCD938X_DIGITAL_INTR_STATUS_1:
+-      case WCD938X_DIGITAL_INTR_STATUS_2:
+-      case WCD938X_DIGITAL_INTR_CLEAR_0:
+-      case WCD938X_DIGITAL_INTR_CLEAR_1:
+-      case WCD938X_DIGITAL_INTR_CLEAR_2:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_0:
+-      case WCD938X_DIGITAL_SWR_HM_TEST_1:
+-      case WCD938X_DIGITAL_EFUSE_T_DATA_0:
+-      case WCD938X_DIGITAL_EFUSE_T_DATA_1:
+-      case WCD938X_DIGITAL_PIN_STATUS_0:
+-      case WCD938X_DIGITAL_PIN_STATUS_1:
+-      case WCD938X_DIGITAL_MODE_STATUS_0:
+-      case WCD938X_DIGITAL_MODE_STATUS_1:
+-      case WCD938X_DIGITAL_EFUSE_REG_0:
+-      case WCD938X_DIGITAL_EFUSE_REG_1:
+-      case WCD938X_DIGITAL_EFUSE_REG_2:
+-      case WCD938X_DIGITAL_EFUSE_REG_3:
+-      case WCD938X_DIGITAL_EFUSE_REG_4:
+-      case WCD938X_DIGITAL_EFUSE_REG_5:
+-      case WCD938X_DIGITAL_EFUSE_REG_6:
+-      case WCD938X_DIGITAL_EFUSE_REG_7:
+-      case WCD938X_DIGITAL_EFUSE_REG_8:
+-      case WCD938X_DIGITAL_EFUSE_REG_9:
+-      case WCD938X_DIGITAL_EFUSE_REG_10:
+-      case WCD938X_DIGITAL_EFUSE_REG_11:
+-      case WCD938X_DIGITAL_EFUSE_REG_12:
+-      case WCD938X_DIGITAL_EFUSE_REG_13:
+-      case WCD938X_DIGITAL_EFUSE_REG_14:
+-      case WCD938X_DIGITAL_EFUSE_REG_15:
+-      case WCD938X_DIGITAL_EFUSE_REG_16:
+-      case WCD938X_DIGITAL_EFUSE_REG_17:
+-      case WCD938X_DIGITAL_EFUSE_REG_18:
+-      case WCD938X_DIGITAL_EFUSE_REG_19:
+-      case WCD938X_DIGITAL_EFUSE_REG_20:
+-      case WCD938X_DIGITAL_EFUSE_REG_21:
+-      case WCD938X_DIGITAL_EFUSE_REG_22:
+-      case WCD938X_DIGITAL_EFUSE_REG_23:
+-      case WCD938X_DIGITAL_EFUSE_REG_24:
+-      case WCD938X_DIGITAL_EFUSE_REG_25:
+-      case WCD938X_DIGITAL_EFUSE_REG_26:
+-      case WCD938X_DIGITAL_EFUSE_REG_27:
+-      case WCD938X_DIGITAL_EFUSE_REG_28:
+-      case WCD938X_DIGITAL_EFUSE_REG_29:
+-      case WCD938X_DIGITAL_EFUSE_REG_30:
+-      case WCD938X_DIGITAL_EFUSE_REG_31:
+-              return true;
+-      }
+-      return false;
+-}
+-
+-static bool wcd938x_readable_register(struct device *dev, unsigned int reg)
+-{
+-      bool ret;
+-
+-      ret = wcd938x_readonly_register(dev, reg);
+-      if (!ret)
+-              return wcd938x_rdwr_register(dev, reg);
+-
+-      return ret;
+-}
+-
+-static bool wcd938x_writeable_register(struct device *dev, unsigned int reg)
+-{
+-      return wcd938x_rdwr_register(dev, reg);
+-}
+-
+-static bool wcd938x_volatile_register(struct device *dev, unsigned int reg)
+-{
+-      if (reg <= WCD938X_BASE_ADDRESS)
+-              return false;
+-
+-      if (reg == WCD938X_DIGITAL_SWR_TX_CLK_RATE)
+-              return true;
+-
+-      if (wcd938x_readonly_register(dev, reg))
+-              return true;
+-
+-      return false;
+-}
+-
+-static struct regmap_config wcd938x_regmap_config = {
+-      .name = "wcd938x_csr",
+-      .reg_bits = 32,
+-      .val_bits = 8,
+-      .cache_type = REGCACHE_RBTREE,
+-      .reg_defaults = wcd938x_defaults,
+-      .num_reg_defaults = ARRAY_SIZE(wcd938x_defaults),
+-      .max_register = WCD938X_MAX_REGISTER,
+-      .readable_reg = wcd938x_readable_register,
+-      .writeable_reg = wcd938x_writeable_register,
+-      .volatile_reg = wcd938x_volatile_register,
+-      .can_multi_write = true,
+-};
+-
+ static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = {
+       REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01),
+       REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_RELEASE_DET, 0, 0x02),
+@@ -4412,10 +3417,10 @@ static int wcd938x_bind(struct device *dev)
+               return -EINVAL;
+       }
+-      wcd938x->regmap = devm_regmap_init_sdw(wcd938x->tx_sdw_dev, &wcd938x_regmap_config);
+-      if (IS_ERR(wcd938x->regmap)) {
+-              dev_err(dev, "%s: tx csr regmap not found\n", __func__);
+-              return PTR_ERR(wcd938x->regmap);
++      wcd938x->regmap = dev_get_regmap(&wcd938x->tx_sdw_dev->dev, NULL);
++      if (!wcd938x->regmap) {
++              dev_err(dev, "could not get TX device regmap\n");
++              return -EINVAL;
+       }
+       ret = wcd938x_irq_init(wcd938x, dev);
+diff --git a/sound/soc/codecs/wcd938x.h b/sound/soc/codecs/wcd938x.h
+index ea82039e78435..74b1498fec38b 100644
+--- a/sound/soc/codecs/wcd938x.h
++++ b/sound/soc/codecs/wcd938x.h
+@@ -663,6 +663,7 @@ struct wcd938x_sdw_priv {
+       bool is_tx;
+       struct wcd938x_priv *wcd938x;
+       struct irq_domain *slave_irq;
++      struct regmap *regmap;
+ };
+ #if IS_ENABLED(CONFIG_SND_SOC_WCD938X_SDW)
+-- 
+2.39.2
+
diff --git a/queue-6.2/crypto-ccp-clear-psp-interrupt-status-register-befor.patch b/queue-6.2/crypto-ccp-clear-psp-interrupt-status-register-befor.patch
new file mode 100644 (file)
index 0000000..e37ef04
--- /dev/null
@@ -0,0 +1,74 @@
+From f54accbb98817b36bcea364e830364b251618317 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Mar 2023 15:16:36 +0000
+Subject: crypto: ccp - Clear PSP interrupt status register before calling
+ handler
+
+From: Jeremi Piotrowski <jpiotrowski@linux.microsoft.com>
+
+[ Upstream commit 45121ad4a1750ca47ce3f32bd434bdb0cdbf0043 ]
+
+The PSP IRQ is edge-triggered (MSI or MSI-X) in all cases supported by
+the psp module so clear the interrupt status register early in the
+handler to prevent missed interrupts. sev_irq_handler() calls wake_up()
+on a wait queue, which can result in a new command being submitted from
+a different CPU. This then races with the clearing of isr and can result
+in missed interrupts. A missed interrupt results in a command waiting
+until it times out, which results in the psp being declared dead.
+
+This is unlikely on bare metal, but has been observed when running
+virtualized. In the cases where this is observed, sev->cmdresp_reg has
+PSP_CMDRESP_RESP set which indicates that the command was processed
+correctly but no interrupt was asserted.
+
+The full sequence of events looks like this:
+
+CPU 1: submits SEV cmd #1
+CPU 1: calls wait_event_timeout()
+CPU 0: enters psp_irq_handler()
+CPU 0: calls sev_handler()->wake_up()
+CPU 1: wakes up; finishes processing cmd #1
+CPU 1: submits SEV cmd #2
+CPU 1: calls wait_event_timeout()
+PSP:   finishes processing cmd #2; interrupt status is still set; no interrupt
+CPU 0: clears intsts
+CPU 0: exits psp_irq_handler()
+CPU 1: wait_event_timeout() times out; psp_dead=true
+
+Fixes: 200664d5237f ("crypto: ccp: Add Secure Encrypted Virtualization (SEV) command support")
+Cc: stable@vger.kernel.org
+Signed-off-by: Jeremi Piotrowski <jpiotrowski@linux.microsoft.com>
+Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/ccp/psp-dev.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
+index c9c741ac84421..949a3fa0b94a9 100644
+--- a/drivers/crypto/ccp/psp-dev.c
++++ b/drivers/crypto/ccp/psp-dev.c
+@@ -42,6 +42,9 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
+       /* Read the interrupt status: */
+       status = ioread32(psp->io_regs + psp->vdata->intsts_reg);
++      /* Clear the interrupt status by writing the same value we read. */
++      iowrite32(status, psp->io_regs + psp->vdata->intsts_reg);
++
+       /* invoke subdevice interrupt handlers */
+       if (status) {
+               if (psp->sev_irq_handler)
+@@ -51,9 +54,6 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
+                       psp->tee_irq_handler(irq, psp->tee_irq_data, status);
+       }
+-      /* Clear the interrupt status by writing the same value we read. */
+-      iowrite32(status, psp->io_regs + psp->vdata->intsts_reg);
+-
+       return IRQ_HANDLED;
+ }
+-- 
+2.39.2
+
diff --git a/queue-6.2/mailbox-zynq-switch-to-flexible-array-to-simplify-co.patch b/queue-6.2/mailbox-zynq-switch-to-flexible-array-to-simplify-co.patch
new file mode 100644 (file)
index 0000000..ee94bc5
--- /dev/null
@@ -0,0 +1,56 @@
+From 2d42d695e234ad2b809503a8e1e2a32582a64842 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 20 Nov 2022 09:25:54 +0100
+Subject: mailbox: zynq: Switch to flexible array to simplify code
+
+From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+
+[ Upstream commit 043f85ce81cb1714e14d31c322c5646513dde3fb ]
+
+Using flexible array is more straight forward. It
+  - saves 1 pointer in the 'zynqmp_ipi_pdata' structure
+  - saves an indirection when using this array
+  - saves some LoC and avoids some always spurious pointer arithmetic
+
+Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
+Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>
+Stable-dep-of: f72f805e7288 ("mailbox: zynqmp: Fix counts of child nodes")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mailbox/zynqmp-ipi-mailbox.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/mailbox/zynqmp-ipi-mailbox.c b/drivers/mailbox/zynqmp-ipi-mailbox.c
+index e02a4a18e8c29..29f09ded6e739 100644
+--- a/drivers/mailbox/zynqmp-ipi-mailbox.c
++++ b/drivers/mailbox/zynqmp-ipi-mailbox.c
+@@ -110,7 +110,7 @@ struct zynqmp_ipi_pdata {
+       unsigned int method;
+       u32 local_id;
+       int num_mboxes;
+-      struct zynqmp_ipi_mbox *ipi_mboxes;
++      struct zynqmp_ipi_mbox ipi_mboxes[];
+ };
+ static struct device_driver zynqmp_ipi_mbox_driver = {
+@@ -635,7 +635,7 @@ static int zynqmp_ipi_probe(struct platform_device *pdev)
+       int num_mboxes, ret = -EINVAL;
+       num_mboxes = of_get_child_count(np);
+-      pdata = devm_kzalloc(dev, sizeof(*pdata) + (num_mboxes * sizeof(*mbox)),
++      pdata = devm_kzalloc(dev, struct_size(pdata, ipi_mboxes, num_mboxes),
+                            GFP_KERNEL);
+       if (!pdata)
+               return -ENOMEM;
+@@ -649,8 +649,6 @@ static int zynqmp_ipi_probe(struct platform_device *pdev)
+       }
+       pdata->num_mboxes = num_mboxes;
+-      pdata->ipi_mboxes = (struct zynqmp_ipi_mbox *)
+-                          ((char *)pdata + sizeof(*pdata));
+       mbox = pdata->ipi_mboxes;
+       for_each_available_child_of_node(np, nc) {
+-- 
+2.39.2
+
diff --git a/queue-6.2/mailbox-zynqmp-fix-counts-of-child-nodes.patch b/queue-6.2/mailbox-zynqmp-fix-counts-of-child-nodes.patch
new file mode 100644 (file)
index 0000000..7b7e408
--- /dev/null
@@ -0,0 +1,45 @@
+From 3b273ff9061413ab741049f7125461c5c3cec205 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Mar 2023 17:24:04 -0800
+Subject: mailbox: zynqmp: Fix counts of child nodes
+
+From: Tanmay Shah <tanmay.shah@amd.com>
+
+[ Upstream commit f72f805e72882c361e2a612c64a6e549f3da7152 ]
+
+If child mailbox node status is disabled it causes
+crash in interrupt handler. Fix this by assigning
+only available child node during driver probe.
+
+Fixes: 4981b82ba2ff ("mailbox: ZynqMP IPI mailbox controller")
+Signed-off-by: Tanmay Shah <tanmay.shah@amd.com>
+Acked-by: Michal Simek <michal.simek@amd.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/20230311012407.1292118-2-tanmay.shah@amd.com
+Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mailbox/zynqmp-ipi-mailbox.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/mailbox/zynqmp-ipi-mailbox.c b/drivers/mailbox/zynqmp-ipi-mailbox.c
+index 29f09ded6e739..d097f45b0e5f5 100644
+--- a/drivers/mailbox/zynqmp-ipi-mailbox.c
++++ b/drivers/mailbox/zynqmp-ipi-mailbox.c
+@@ -634,7 +634,12 @@ static int zynqmp_ipi_probe(struct platform_device *pdev)
+       struct zynqmp_ipi_mbox *mbox;
+       int num_mboxes, ret = -EINVAL;
+-      num_mboxes = of_get_child_count(np);
++      num_mboxes = of_get_available_child_count(np);
++      if (num_mboxes == 0) {
++              dev_err(dev, "mailbox nodes not available\n");
++              return -EINVAL;
++      }
++
+       pdata = devm_kzalloc(dev, struct_size(pdata, ipi_mboxes, num_mboxes),
+                            GFP_KERNEL);
+       if (!pdata)
+-- 
+2.39.2
+
diff --git a/queue-6.2/mtd-spi-nor-add-a-rww-flag.patch b/queue-6.2/mtd-spi-nor-add-a-rww-flag.patch
new file mode 100644 (file)
index 0000000..2539576
--- /dev/null
@@ -0,0 +1,83 @@
+From da8c9c15055e70bddf11b9581a77c0547ed8d2fa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Mar 2023 17:41:03 +0200
+Subject: mtd: spi-nor: Add a RWW flag
+
+From: Miquel Raynal <miquel.raynal@bootlin.com>
+
+[ Upstream commit 4eddee70140b3ae183398b246a609756546c51f1 ]
+
+Introduce a new (no SFDP) flag for the feature that we are about to
+support: Read While Write. This means, if the chip has several banks and
+supports RWW, once a page of data to write has been transferred into the
+chip's internal SRAM, another read operation happening on a different
+bank can be performed during the tPROG delay.
+
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/r/20230328154105.448540-7-miquel.raynal@bootlin.com
+Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Stable-dep-of: 9fd0945fe6fa ("mtd: spi-nor: spansion: Enable JFFS2 write buffer for Infineon s28hx SEMPER flash")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/spi-nor/core.c    | 3 +++
+ drivers/mtd/spi-nor/core.h    | 3 +++
+ drivers/mtd/spi-nor/debugfs.c | 1 +
+ 3 files changed, 7 insertions(+)
+
+diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
+index bf50a35db711e..767b1faa32b0e 100644
+--- a/drivers/mtd/spi-nor/core.c
++++ b/drivers/mtd/spi-nor/core.c
+@@ -2471,6 +2471,9 @@ static void spi_nor_init_flags(struct spi_nor *nor)
+       if (flags & NO_CHIP_ERASE)
+               nor->flags |= SNOR_F_NO_OP_CHIP_ERASE;
++
++      if (flags & SPI_NOR_RWW)
++              nor->flags |= SNOR_F_RWW;
+ }
+ /**
+diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
+index f4246c52a1def..57e8916965ea8 100644
+--- a/drivers/mtd/spi-nor/core.h
++++ b/drivers/mtd/spi-nor/core.h
+@@ -130,6 +130,7 @@ enum spi_nor_option_flags {
+       SNOR_F_IO_MODE_EN_VOLATILE = BIT(11),
+       SNOR_F_SOFT_RESET       = BIT(12),
+       SNOR_F_SWP_IS_VOLATILE  = BIT(13),
++      SNOR_F_RWW              = BIT(14),
+ };
+ struct spi_nor_read_command {
+@@ -459,6 +460,7 @@ struct spi_nor_fixups {
+  *   NO_CHIP_ERASE:           chip does not support chip erase.
+  *   SPI_NOR_NO_FR:           can't do fastread.
+  *   SPI_NOR_QUAD_PP:         flash supports Quad Input Page Program.
++ *   SPI_NOR_RWW:             flash supports reads while write.
+  *
+  * @no_sfdp_flags:  flags that indicate support that can be discovered via SFDP.
+  *                  Used when SFDP tables are not defined in the flash. These
+@@ -509,6 +511,7 @@ struct flash_info {
+ #define NO_CHIP_ERASE                 BIT(7)
+ #define SPI_NOR_NO_FR                 BIT(8)
+ #define SPI_NOR_QUAD_PP                       BIT(9)
++#define SPI_NOR_RWW                   BIT(10)
+       u8 no_sfdp_flags;
+ #define SPI_NOR_SKIP_SFDP             BIT(0)
+diff --git a/drivers/mtd/spi-nor/debugfs.c b/drivers/mtd/spi-nor/debugfs.c
+index 558ffecf8ae6d..bd8a18da49c04 100644
+--- a/drivers/mtd/spi-nor/debugfs.c
++++ b/drivers/mtd/spi-nor/debugfs.c
+@@ -25,6 +25,7 @@ static const char *const snor_f_names[] = {
+       SNOR_F_NAME(IO_MODE_EN_VOLATILE),
+       SNOR_F_NAME(SOFT_RESET),
+       SNOR_F_NAME(SWP_IS_VOLATILE),
++      SNOR_F_NAME(RWW),
+ };
+ #undef SNOR_F_NAME
+-- 
+2.39.2
+
diff --git a/queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch b/queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch
new file mode 100644 (file)
index 0000000..5609f12
--- /dev/null
@@ -0,0 +1,108 @@
+From 6ee574e6b5c9c6b189f578def9ebd1b465d39f84 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Apr 2023 15:17:44 +0900
+Subject: mtd: spi-nor: spansion: Enable JFFS2 write buffer for Infineon s28hx
+ SEMPER flash
+
+From: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
+
+[ Upstream commit 9fd0945fe6fadfb6b54a9cd73be101c02b3e8134 ]
+
+Infineon(Cypress) SEMPER NOR flash family has on-die ECC and its program
+granularity is 16-byte ECC data unit size. JFFS2 supports write buffer
+mode for ECC'd NOR flash. Provide a way to clear the MTD_BIT_WRITEABLE
+flag in order to enable JFFS2 write buffer mode support.
+
+A new SNOR_F_ECC flag is introduced to determine if the part has on-die
+ECC and if it has, MTD_BIT_WRITEABLE is unset.
+
+In vendor specific driver, a common cypress_nor_ecc_init() helper is
+added. This helper takes care for ECC related initialization for SEMPER
+flash family by setting up params->writesize and SNOR_F_ECC.
+
+Fixes: c3266af101f2 ("mtd: spi-nor: spansion: add support for Cypress Semper flash")
+Suggested-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/d586723f6f12aaff44fbcd7b51e674b47ed554ed.1680760742.git.Takahiro.Kuwano@infineon.com
+Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/spi-nor/core.c     |  3 +++
+ drivers/mtd/spi-nor/core.h     |  1 +
+ drivers/mtd/spi-nor/debugfs.c  |  1 +
+ drivers/mtd/spi-nor/spansion.c | 13 ++++++++++++-
+ 4 files changed, 17 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/spi-nor/core.c b/drivers/mtd/spi-nor/core.c
+index 767b1faa32b0e..d75db50767938 100644
+--- a/drivers/mtd/spi-nor/core.c
++++ b/drivers/mtd/spi-nor/core.c
+@@ -2983,6 +2983,9 @@ static void spi_nor_set_mtd_info(struct spi_nor *nor)
+               mtd->name = dev_name(dev);
+       mtd->type = MTD_NORFLASH;
+       mtd->flags = MTD_CAP_NORFLASH;
++      /* Unset BIT_WRITEABLE to enable JFFS2 write buffer for ECC'd NOR */
++      if (nor->flags & SNOR_F_ECC)
++              mtd->flags &= ~MTD_BIT_WRITEABLE;
+       if (nor->info->flags & SPI_NOR_NO_ERASE)
+               mtd->flags |= MTD_NO_ERASE;
+       else
+diff --git a/drivers/mtd/spi-nor/core.h b/drivers/mtd/spi-nor/core.h
+index 57e8916965ea8..75ec2e5604247 100644
+--- a/drivers/mtd/spi-nor/core.h
++++ b/drivers/mtd/spi-nor/core.h
+@@ -131,6 +131,7 @@ enum spi_nor_option_flags {
+       SNOR_F_SOFT_RESET       = BIT(12),
+       SNOR_F_SWP_IS_VOLATILE  = BIT(13),
+       SNOR_F_RWW              = BIT(14),
++      SNOR_F_ECC              = BIT(15),
+ };
+ struct spi_nor_read_command {
+diff --git a/drivers/mtd/spi-nor/debugfs.c b/drivers/mtd/spi-nor/debugfs.c
+index bd8a18da49c04..285bdcbaa1134 100644
+--- a/drivers/mtd/spi-nor/debugfs.c
++++ b/drivers/mtd/spi-nor/debugfs.c
+@@ -26,6 +26,7 @@ static const char *const snor_f_names[] = {
+       SNOR_F_NAME(SOFT_RESET),
+       SNOR_F_NAME(SWP_IS_VOLATILE),
+       SNOR_F_NAME(RWW),
++      SNOR_F_NAME(ECC),
+ };
+ #undef SNOR_F_NAME
+diff --git a/drivers/mtd/spi-nor/spansion.c b/drivers/mtd/spi-nor/spansion.c
+index 07fe0f6fdfe3e..f4e9a1738234a 100644
+--- a/drivers/mtd/spi-nor/spansion.c
++++ b/drivers/mtd/spi-nor/spansion.c
+@@ -218,6 +218,17 @@ static int cypress_nor_set_page_size(struct spi_nor *nor)
+       return 0;
+ }
++static void cypress_nor_ecc_init(struct spi_nor *nor)
++{
++      /*
++       * Programming is supported only in 16-byte ECC data unit granularity.
++       * Byte-programming, bit-walking, or multiple program operations to the
++       * same ECC data unit without an erase are not allowed.
++       */
++      nor->params->writesize = 16;
++      nor->flags |= SNOR_F_ECC;
++}
++
+ static int
+ s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
+                       const struct sfdp_parameter_header *bfpt_header,
+@@ -324,7 +335,7 @@ static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,
+ static void s28hx_t_late_init(struct spi_nor *nor)
+ {
+       nor->params->octal_dtr_enable = cypress_nor_octal_dtr_enable;
+-      nor->params->writesize = 16;
++      cypress_nor_ecc_init(nor);
+ }
+ static const struct spi_nor_fixups s28hx_t_fixups = {
+-- 
+2.39.2
+
diff --git a/queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch-16651 b/queue-6.2/mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch-16651
new file mode 100644 (file)
index 0000000..a238c9b
--- /dev/null
@@ -0,0 +1,49 @@
+From 4c746d12b5b0f4a3bf077ddb54bbba4925a74187 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Apr 2023 15:17:45 +0900
+Subject: mtd: spi-nor: spansion: Enable JFFS2 write buffer for Infineon s25hx
+ SEMPER flash
+
+From: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
+
+[ Upstream commit 4199c1719e24e73be0acc8b0146fc31ad8af9771 ]
+
+Infineon(Cypress) SEMPER NOR flash family has on-die ECC and its program
+granularity is 16-byte ECC data unit size. JFFS2 supports write buffer
+mode for ECC'd NOR flash. Provide a way to clear the MTD_BIT_WRITEABLE
+flag in order to enable JFFS2 write buffer mode support.
+
+Fixes: b6b23833fc42 ("mtd: spi-nor: spansion: Add s25hl-t/s25hs-t IDs and fixups")
+Suggested-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Signed-off-by: Takahiro Kuwano <Takahiro.Kuwano@infineon.com>
+Cc: stable@vger.kernel.org
+Link: https://lore.kernel.org/r/a1cc128e094db4ec141f85bd380127598dfef17e.1680760742.git.Takahiro.Kuwano@infineon.com
+Signed-off-by: Tudor Ambarus <tudor.ambarus@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/spi-nor/spansion.c | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/mtd/spi-nor/spansion.c b/drivers/mtd/spi-nor/spansion.c
+index f4e9a1738234a..aef085b476deb 100644
+--- a/drivers/mtd/spi-nor/spansion.c
++++ b/drivers/mtd/spi-nor/spansion.c
+@@ -266,13 +266,10 @@ static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
+ static void s25hx_t_late_init(struct spi_nor *nor)
+ {
+-      struct spi_nor_flash_parameter *params = nor->params;
+-
+       /* Fast Read 4B requires mode cycles */
+-      params->reads[SNOR_CMD_READ_FAST].num_mode_clocks = 8;
++      nor->params->reads[SNOR_CMD_READ_FAST].num_mode_clocks = 8;
+-      /* The writesize should be ECC data unit size */
+-      params->writesize = 16;
++      cypress_nor_ecc_init(nor);
+ }
+ static struct spi_nor_fixups s25hx_t_fixups = {
+-- 
+2.39.2
+
diff --git a/queue-6.2/qcom-llcc-edac-support-polling-mode-for-ecc-handling.patch b/queue-6.2/qcom-llcc-edac-support-polling-mode-for-ecc-handling.patch
new file mode 100644 (file)
index 0000000..650c6d5
--- /dev/null
@@ -0,0 +1,147 @@
+From 57dc36bc77a96be796b350628030089990eef2af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Mar 2023 13:34:42 +0530
+Subject: qcom: llcc/edac: Support polling mode for ECC handling
+
+From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+
+[ Upstream commit 721d3e91bfc93975c5e1a76c7d588dd8df5d82da ]
+
+Not all Qcom platforms support IRQ mode for ECC handling. For those
+platforms, the current EDAC driver will not be probed due to missing ECC
+IRQ in devicetree.
+
+So add support for polling mode so that the EDAC driver can be used on all
+Qcom platforms supporting LLCC.
+
+The polling delay of 5000ms is chosen based on Qcom downstream/vendor
+driver.
+
+Reported-by: Luca Weiss <luca.weiss@fairphone.com>
+Tested-by: Luca Weiss <luca.weiss@fairphone.com>
+Tested-by: Steev Klimaszewski <steev@kali.org> # Thinkpad X13s
+Tested-by: Andrew Halaney <ahalaney@redhat.com> # sa8540p-ride
+Reviewed-by: Borislav Petkov (AMD) <bp@alien8.de>
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Link: https://lore.kernel.org/r/20230314080443.64635-14-manivannan.sadhasivam@linaro.org
+Stable-dep-of: cca94f1dd6d0 ("soc: qcom: llcc: Do not create EDAC platform device on SDM845")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/edac/qcom_edac.c     | 50 +++++++++++++++++++++---------------
+ drivers/soc/qcom/llcc-qcom.c | 13 +++++-----
+ 2 files changed, 35 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/edac/qcom_edac.c b/drivers/edac/qcom_edac.c
+index c45519f59dc11..2c91ceff8a9ca 100644
+--- a/drivers/edac/qcom_edac.c
++++ b/drivers/edac/qcom_edac.c
+@@ -76,6 +76,8 @@
+ #define DRP0_INTERRUPT_ENABLE           BIT(6)
+ #define SB_DB_DRP_INTERRUPT_ENABLE      0x3
++#define ECC_POLL_MSEC                 5000
++
+ enum {
+       LLCC_DRAM_CE = 0,
+       LLCC_DRAM_UE,
+@@ -285,8 +287,7 @@ dump_syn_reg(struct edac_device_ctl_info *edev_ctl, int err_type, u32 bank)
+       return ret;
+ }
+-static irqreturn_t
+-llcc_ecc_irq_handler(int irq, void *edev_ctl)
++static irqreturn_t llcc_ecc_irq_handler(int irq, void *edev_ctl)
+ {
+       struct edac_device_ctl_info *edac_dev_ctl = edev_ctl;
+       struct llcc_drv_data *drv = edac_dev_ctl->dev->platform_data;
+@@ -332,6 +333,11 @@ llcc_ecc_irq_handler(int irq, void *edev_ctl)
+       return irq_rc;
+ }
++static void llcc_ecc_check(struct edac_device_ctl_info *edev_ctl)
++{
++      llcc_ecc_irq_handler(0, edev_ctl);
++}
++
+ static int qcom_llcc_edac_probe(struct platform_device *pdev)
+ {
+       struct llcc_drv_data *llcc_driv_data = pdev->dev.platform_data;
+@@ -359,29 +365,31 @@ static int qcom_llcc_edac_probe(struct platform_device *pdev)
+       edev_ctl->ctl_name = "llcc";
+       edev_ctl->panic_on_ue = LLCC_ERP_PANIC_ON_UE;
+-      rc = edac_device_add_device(edev_ctl);
+-      if (rc)
+-              goto out_mem;
+-
+-      platform_set_drvdata(pdev, edev_ctl);
+-
+-      /* Request for ecc irq */
++      /* Check if LLCC driver has passed ECC IRQ */
+       ecc_irq = llcc_driv_data->ecc_irq;
+-      if (ecc_irq < 0) {
+-              rc = -ENODEV;
+-              goto out_dev;
+-      }
+-      rc = devm_request_irq(dev, ecc_irq, llcc_ecc_irq_handler,
++      if (ecc_irq > 0) {
++              /* Use interrupt mode if IRQ is available */
++              rc = devm_request_irq(dev, ecc_irq, llcc_ecc_irq_handler,
+                             IRQF_TRIGGER_HIGH, "llcc_ecc", edev_ctl);
+-      if (rc)
+-              goto out_dev;
++              if (!rc) {
++                      edac_op_state = EDAC_OPSTATE_INT;
++                      goto irq_done;
++              }
++      }
+-      return rc;
++      /* Fall back to polling mode otherwise */
++      edev_ctl->poll_msec = ECC_POLL_MSEC;
++      edev_ctl->edac_check = llcc_ecc_check;
++      edac_op_state = EDAC_OPSTATE_POLL;
+-out_dev:
+-      edac_device_del_device(edev_ctl->dev);
+-out_mem:
+-      edac_device_free_ctl_info(edev_ctl);
++irq_done:
++      rc = edac_device_add_device(edev_ctl);
++      if (rc) {
++              edac_device_free_ctl_info(edev_ctl);
++              return rc;
++      }
++
++      platform_set_drvdata(pdev, edev_ctl);
+       return rc;
+ }
+diff --git a/drivers/soc/qcom/llcc-qcom.c b/drivers/soc/qcom/llcc-qcom.c
+index 26efe12012a0d..e417bd285d9db 100644
+--- a/drivers/soc/qcom/llcc-qcom.c
++++ b/drivers/soc/qcom/llcc-qcom.c
+@@ -1001,13 +1001,12 @@ static int qcom_llcc_probe(struct platform_device *pdev)
+               goto err;
+       drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
+-      if (drv_data->ecc_irq >= 0) {
+-              llcc_edac = platform_device_register_data(&pdev->dev,
+-                                              "qcom_llcc_edac", -1, drv_data,
+-                                              sizeof(*drv_data));
+-              if (IS_ERR(llcc_edac))
+-                      dev_err(dev, "Failed to register llcc edac driver\n");
+-      }
++
++      llcc_edac = platform_device_register_data(&pdev->dev,
++                                      "qcom_llcc_edac", -1, drv_data,
++                                      sizeof(*drv_data));
++      if (IS_ERR(llcc_edac))
++              dev_err(dev, "Failed to register llcc edac driver\n");
+       return 0;
+ err:
+-- 
+2.39.2
+
diff --git a/queue-6.2/series b/queue-6.2/series
new file mode 100644 (file)
index 0000000..8c753e7
--- /dev/null
@@ -0,0 +1,12 @@
+usb-dwc3-gadget-drop-dead-hibernation-code.patch
+usb-dwc3-gadget-execute-gadget-stop-after-halting-th.patch
+crypto-ccp-clear-psp-interrupt-status-register-befor.patch
+asoc-codecs-constify-static-sdw_slave_ops-struct.patch
+asoc-codecs-wcd938x-fix-accessing-regmap-on-unattach.patch
+mtd-spi-nor-add-a-rww-flag.patch
+mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch
+qcom-llcc-edac-support-polling-mode-for-ecc-handling.patch
+soc-qcom-llcc-do-not-create-edac-platform-device-on-.patch
+mailbox-zynq-switch-to-flexible-array-to-simplify-co.patch
+mailbox-zynqmp-fix-counts-of-child-nodes.patch
+mtd-spi-nor-spansion-enable-jffs2-write-buffer-for-i.patch-16651
diff --git a/queue-6.2/soc-qcom-llcc-do-not-create-edac-platform-device-on-.patch b/queue-6.2/soc-qcom-llcc-do-not-create-edac-platform-device-on-.patch
new file mode 100644 (file)
index 0000000..51fae97
--- /dev/null
@@ -0,0 +1,82 @@
+From 868df0d9dd3a3e36f775fb9269243a2734052bae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Mar 2023 13:34:43 +0530
+Subject: soc: qcom: llcc: Do not create EDAC platform device on SDM845
+
+From: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+
+[ Upstream commit cca94f1dd6d0a4c7e5c8190672f5747e3c00ddde ]
+
+The platforms based on SDM845 SoC locks the access to EDAC registers in the
+bootloader. So probing the EDAC driver will result in a crash. Hence,
+disable the creation of EDAC platform device on all SDM845 devices.
+
+The issue has been observed on Lenovo Yoga C630 and DB845c.
+
+While at it, also sort the members of `struct qcom_llcc_config` to avoid
+any holes in-between.
+
+Cc: <stable@vger.kernel.org> # 5.10
+Reported-by: Steev Klimaszewski <steev@kali.org>
+Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Link: https://lore.kernel.org/r/20230314080443.64635-15-manivannan.sadhasivam@linaro.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/soc/qcom/llcc-qcom.c | 24 +++++++++++++++++-------
+ 1 file changed, 17 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/soc/qcom/llcc-qcom.c b/drivers/soc/qcom/llcc-qcom.c
+index e417bd285d9db..d4d3eced52f35 100644
+--- a/drivers/soc/qcom/llcc-qcom.c
++++ b/drivers/soc/qcom/llcc-qcom.c
+@@ -122,10 +122,11 @@ struct llcc_slice_config {
+ struct qcom_llcc_config {
+       const struct llcc_slice_config *sct_data;
+-      int size;
+-      bool need_llcc_cfg;
+       const u32 *reg_offset;
+       const struct llcc_edac_reg_offset *edac_reg_offset;
++      int size;
++      bool need_llcc_cfg;
++      bool no_edac;
+ };
+ enum llcc_reg_offset {
+@@ -454,6 +455,7 @@ static const struct qcom_llcc_config sdm845_cfg = {
+       .need_llcc_cfg  = false,
+       .reg_offset     = llcc_v1_reg_offset,
+       .edac_reg_offset = &llcc_v1_edac_reg_offset,
++      .no_edac        = true,
+ };
+ static const struct qcom_llcc_config sm6350_cfg = {
+@@ -1002,11 +1004,19 @@ static int qcom_llcc_probe(struct platform_device *pdev)
+       drv_data->ecc_irq = platform_get_irq_optional(pdev, 0);
+-      llcc_edac = platform_device_register_data(&pdev->dev,
+-                                      "qcom_llcc_edac", -1, drv_data,
+-                                      sizeof(*drv_data));
+-      if (IS_ERR(llcc_edac))
+-              dev_err(dev, "Failed to register llcc edac driver\n");
++      /*
++       * On some platforms, the access to EDAC registers will be locked by
++       * the bootloader. So probing the EDAC driver will result in a crash.
++       * Hence, disable the creation of EDAC platform device for the
++       * problematic platforms.
++       */
++      if (!cfg->no_edac) {
++              llcc_edac = platform_device_register_data(&pdev->dev,
++                                              "qcom_llcc_edac", -1, drv_data,
++                                              sizeof(*drv_data));
++              if (IS_ERR(llcc_edac))
++                      dev_err(dev, "Failed to register llcc edac driver\n");
++      }
+       return 0;
+ err:
+-- 
+2.39.2
+
diff --git a/queue-6.2/usb-dwc3-gadget-drop-dead-hibernation-code.patch b/queue-6.2/usb-dwc3-gadget-drop-dead-hibernation-code.patch
new file mode 100644 (file)
index 0000000..df9bda3
--- /dev/null
@@ -0,0 +1,141 @@
+From 37f79fcc817c4db34064109a33f4a9cb7ec2a8d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Apr 2023 09:25:17 +0200
+Subject: USB: dwc3: gadget: drop dead hibernation code
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ Upstream commit bdb19d01026a5cccfa437be8adcf2df472c5889e ]
+
+The hibernation code is broken and has never been enabled in mainline
+and should thus be dropped.
+
+Remove the hibernation bits from the gadget code, which effectively
+reverts commits e1dadd3b0f27 ("usb: dwc3: workaround: bogus hibernation
+events") and 7b2a0368bbc9 ("usb: dwc3: gadget: set KEEP_CONNECT in case
+of hibernation") except for the spurious interrupt warning.
+
+Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20230404072524.19014-5-johan+linaro@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: 39674be56fba ("usb: dwc3: gadget: Execute gadget stop after halting the controller")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 46 +++++----------------------------------
+ 1 file changed, 6 insertions(+), 40 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index 3faac3244c7db..a995e3f4df37f 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -2478,7 +2478,7 @@ static void __dwc3_gadget_set_speed(struct dwc3 *dwc)
+       dwc3_writel(dwc->regs, DWC3_DCFG, reg);
+ }
+-static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
++static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on)
+ {
+       u32                     reg;
+       u32                     timeout = 2000;
+@@ -2497,17 +2497,11 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend)
+                       reg &= ~DWC3_DCTL_KEEP_CONNECT;
+               reg |= DWC3_DCTL_RUN_STOP;
+-              if (dwc->has_hibernation)
+-                      reg |= DWC3_DCTL_KEEP_CONNECT;
+-
+               __dwc3_gadget_set_speed(dwc);
+               dwc->pullups_connected = true;
+       } else {
+               reg &= ~DWC3_DCTL_RUN_STOP;
+-              if (dwc->has_hibernation && !suspend)
+-                      reg &= ~DWC3_DCTL_KEEP_CONNECT;
+-
+               dwc->pullups_connected = false;
+       }
+@@ -2589,7 +2583,7 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
+        * remaining event generated by the controller while polling for
+        * DSTS.DEVCTLHLT.
+        */
+-      return dwc3_gadget_run_stop(dwc, false, false);
++      return dwc3_gadget_run_stop(dwc, false);
+ }
+ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
+@@ -2643,7 +2637,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
+               dwc3_event_buffers_setup(dwc);
+               __dwc3_gadget_start(dwc);
+-              ret = dwc3_gadget_run_stop(dwc, true, false);
++              ret = dwc3_gadget_run_stop(dwc, true);
+       }
+       pm_runtime_put(dwc->dev);
+@@ -4210,30 +4204,6 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,
+       dwc->link_state = next;
+ }
+-static void dwc3_gadget_hibernation_interrupt(struct dwc3 *dwc,
+-              unsigned int evtinfo)
+-{
+-      unsigned int is_ss = evtinfo & BIT(4);
+-
+-      /*
+-       * WORKAROUND: DWC3 revision 2.20a with hibernation support
+-       * have a known issue which can cause USB CV TD.9.23 to fail
+-       * randomly.
+-       *
+-       * Because of this issue, core could generate bogus hibernation
+-       * events which SW needs to ignore.
+-       *
+-       * Refers to:
+-       *
+-       * STAR#9000546576: Device Mode Hibernation: Issue in USB 2.0
+-       * Device Fallback from SuperSpeed
+-       */
+-      if (is_ss ^ (dwc->speed == USB_SPEED_SUPER))
+-              return;
+-
+-      /* enter hibernation here */
+-}
+-
+ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
+               const struct dwc3_event_devt *event)
+ {
+@@ -4251,11 +4221,7 @@ static void dwc3_gadget_interrupt(struct dwc3 *dwc,
+               dwc3_gadget_wakeup_interrupt(dwc);
+               break;
+       case DWC3_DEVICE_EVENT_HIBER_REQ:
+-              if (dev_WARN_ONCE(dwc->dev, !dwc->has_hibernation,
+-                                      "unexpected hibernation event\n"))
+-                      break;
+-
+-              dwc3_gadget_hibernation_interrupt(dwc, event->event_info);
++              dev_WARN_ONCE(dwc->dev, true, "unexpected hibernation event\n");
+               break;
+       case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
+               dwc3_gadget_linksts_change_interrupt(dwc, event->event_info);
+@@ -4592,7 +4558,7 @@ int dwc3_gadget_suspend(struct dwc3 *dwc)
+       if (!dwc->gadget_driver)
+               return 0;
+-      dwc3_gadget_run_stop(dwc, false, false);
++      dwc3_gadget_run_stop(dwc, false);
+       spin_lock_irqsave(&dwc->lock, flags);
+       dwc3_disconnect_gadget(dwc);
+@@ -4613,7 +4579,7 @@ int dwc3_gadget_resume(struct dwc3 *dwc)
+       if (ret < 0)
+               goto err0;
+-      ret = dwc3_gadget_run_stop(dwc, true, false);
++      ret = dwc3_gadget_run_stop(dwc, true);
+       if (ret < 0)
+               goto err1;
+-- 
+2.39.2
+
diff --git a/queue-6.2/usb-dwc3-gadget-execute-gadget-stop-after-halting-th.patch b/queue-6.2/usb-dwc3-gadget-execute-gadget-stop-after-halting-th.patch
new file mode 100644 (file)
index 0000000..ed10c06
--- /dev/null
@@ -0,0 +1,61 @@
+From 890269ad580371588bd0f399fedaf8429b2b3879 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Apr 2023 14:27:58 -0700
+Subject: usb: dwc3: gadget: Execute gadget stop after halting the controller
+
+From: Wesley Cheng <quic_wcheng@quicinc.com>
+
+[ Upstream commit 39674be56fba1cd3a03bf4617f523a35f85fd2c1 ]
+
+Do not call gadget stop until the poll for controller halt is
+completed.  DEVTEN is cleared as part of gadget stop, so the intention to
+allow ep0 events to continue while waiting for controller halt is not
+happening.
+
+Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage")
+Cc: stable@vger.kernel.org
+Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
+Signed-off-by: Wesley Cheng <quic_wcheng@quicinc.com>
+Link: https://lore.kernel.org/r/20230420212759.29429-2-quic_wcheng@quicinc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/dwc3/gadget.c | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
+index a995e3f4df37f..e63700937ba8c 100644
+--- a/drivers/usb/dwc3/gadget.c
++++ b/drivers/usb/dwc3/gadget.c
+@@ -2546,7 +2546,6 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
+        * bit.
+        */
+       dwc3_stop_active_transfers(dwc);
+-      __dwc3_gadget_stop(dwc);
+       spin_unlock_irqrestore(&dwc->lock, flags);
+       /*
+@@ -2583,7 +2582,19 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
+        * remaining event generated by the controller while polling for
+        * DSTS.DEVCTLHLT.
+        */
+-      return dwc3_gadget_run_stop(dwc, false);
++      ret = dwc3_gadget_run_stop(dwc, false);
++
++      /*
++       * Stop the gadget after controller is halted, so that if needed, the
++       * events to update EP0 state can still occur while the run/stop
++       * routine polls for the halted state.  DEVTEN is cleared as part of
++       * gadget stop.
++       */
++      spin_lock_irqsave(&dwc->lock, flags);
++      __dwc3_gadget_stop(dwc);
++      spin_unlock_irqrestore(&dwc->lock, flags);
++
++      return ret;
+ }
+ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
+-- 
+2.39.2
+