#include <linux/component.h>
 #include <sound/soc.h>
 #include <linux/pm_runtime.h>
+#include <linux/irq.h>
 #include <linux/irqdomain.h>
 #include <linux/of.h>
 #include <linux/soundwire/sdw.h>
                                      struct sdw_slave_intr_status *status)
 {
        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;
 
-       return wcd938x_handle_sdw_irq(wcd);
+       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);
+
+       } while (sts1 || sts2 || sts3);
+
+       return IRQ_HANDLED;
 }
 
 static struct sdw_slave_ops wcd9380_slave_ops = {
                                        SDW_SCP_INT1_PARITY;
        pdev->prop.lane_control_support = true;
        if (wcd->is_tx) {
-               struct regmap *rm;
-
                pdev->prop.source_ports = GENMASK(WCD938X_MAX_SWR_PORTS, 0);
                pdev->prop.src_dpn_prop = wcd938x_dpn_prop;
                wcd->ch_info = &wcd938x_sdw_tx_ch_info[0];
                pdev->prop.wake_capable = true;
-
-               rm = devm_regmap_init_sdw(pdev, &wcd938x_regmap_config);
-               if (IS_ERR(rm))
-                       return PTR_ERR(rm);
        } else {
                pdev->prop.sink_ports = GENMASK(WCD938X_MAX_SWR_PORTS, 0);
                pdev->prop.sink_dpn_prop = wcd938x_dpn_prop;
 
        return false;
 }
 
-struct regmap_config wcd938x_regmap_config = {
+static struct regmap_config wcd938x_regmap_config = {
        .name = "wcd938x_csr",
        .reg_bits = 32,
        .val_bits = 8,
        .volatile_reg = wcd938x_volatile_register,
        .can_multi_write = true,
 };
-EXPORT_SYMBOL_GPL(wcd938x_regmap_config);
 
 static const struct regmap_irq wcd938x_irqs[WCD938X_NUM_IRQS] = {
        REGMAP_IRQ_REG(WCD938X_IRQ_MBHC_BUTTON_PRESS_DET, 0, 0x01),
        return 0;
 }
 
-int wcd938x_handle_sdw_irq(struct wcd938x_sdw_priv *wcd)
-{
-       struct wcd938x_priv *wcd938x = wcd->wcd938x;
-       struct irq_domain *slave_irq = wcd938x->virq;
-       u32 sts1, sts2, sts3;
-
-       do {
-               handle_nested_irq(irq_find_mapping(slave_irq, 0));
-               regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_0, &sts1);
-               regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_1, &sts2);
-               regmap_read(wcd938x->regmap, WCD938X_DIGITAL_INTR_STATUS_2, &sts3);
-
-       } while (sts1 || sts2 || sts3);
-
-       return IRQ_HANDLED;
-}
-EXPORT_SYMBOL_GPL(wcd938x_handle_sdw_irq);
-
 static int wcd938x_codec_hw_params(struct snd_pcm_substream *substream,
                                struct snd_pcm_hw_params *params,
                                struct snd_soc_dai *dai)
        }
        wcd938x->sdw_priv[AIF1_PB] = dev_get_drvdata(wcd938x->rxdev);
        wcd938x->sdw_priv[AIF1_PB]->wcd938x = wcd938x;
+       wcd938x->sdw_priv[AIF1_PB]->slave_irq = wcd938x->virq;
 
        wcd938x->txdev = wcd938x_sdw_device_get(wcd938x->txnode);
        if (!wcd938x->txdev) {
        }
        wcd938x->sdw_priv[AIF1_CAP] = dev_get_drvdata(wcd938x->txdev);
        wcd938x->sdw_priv[AIF1_CAP]->wcd938x = wcd938x;
+       wcd938x->sdw_priv[AIF1_CAP]->slave_irq = wcd938x->virq;
        wcd938x->tx_sdw_dev = dev_to_sdw_dev(wcd938x->txdev);
        if (!wcd938x->tx_sdw_dev) {
                dev_err(dev, "could not get txslave with matching of dev\n");
                return -EINVAL;
        }
 
-       wcd938x->regmap = dev_get_regmap(wcd938x->txdev, NULL);
-       if (!wcd938x->regmap) {
+       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);
        }
 
        int num_ports;
        bool is_tx;
        struct wcd938x_priv *wcd938x;
+       struct irq_domain *slave_irq;
 };
 
-extern struct regmap_config wcd938x_regmap_config;
-int wcd938x_handle_sdw_irq(struct wcd938x_sdw_priv *priv);
-
 #if IS_ENABLED(CONFIG_SND_SOC_WCD938X_SDW)
 int wcd938x_sdw_free(struct wcd938x_sdw_priv *wcd,
                     struct snd_pcm_substream *substream,