#include "wm_adsp.h"
 
 #define adsp_crit(_dsp, fmt, ...) \
-       dev_crit(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
+       dev_crit(_dsp->cs_dsp.dev, "%s: " fmt, _dsp->cs_dsp.name, ##__VA_ARGS__)
 #define adsp_err(_dsp, fmt, ...) \
-       dev_err(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
+       dev_err(_dsp->cs_dsp.dev, "%s: " fmt, _dsp->cs_dsp.name, ##__VA_ARGS__)
 #define adsp_warn(_dsp, fmt, ...) \
-       dev_warn(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
+       dev_warn(_dsp->cs_dsp.dev, "%s: " fmt, _dsp->cs_dsp.name, ##__VA_ARGS__)
 #define adsp_info(_dsp, fmt, ...) \
-       dev_info(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
+       dev_info(_dsp->cs_dsp.dev, "%s: " fmt, _dsp->cs_dsp.name, ##__VA_ARGS__)
 #define adsp_dbg(_dsp, fmt, ...) \
-       dev_dbg(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
+       dev_dbg(_dsp->cs_dsp.dev, "%s: " fmt, _dsp->cs_dsp.name, ##__VA_ARGS__)
 
 #define cs_dsp_err(_dsp, fmt, ...) \
        dev_err(_dsp->dev, "%s: " fmt, _dsp->name, ##__VA_ARGS__)
 }
 
 #ifdef CONFIG_DEBUG_FS
-static void cs_dsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s)
+static void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp, const char *s)
 {
        char *tmp = kasprintf(GFP_KERNEL, "%s\n", s);
 
        dsp->wmfw_file_name = tmp;
 }
 
-static void cs_dsp_debugfs_save_binname(struct wm_adsp *dsp, const char *s)
+static void cs_dsp_debugfs_save_binname(struct cs_dsp *dsp, const char *s)
 {
        char *tmp = kasprintf(GFP_KERNEL, "%s\n", s);
 
        dsp->bin_file_name = tmp;
 }
 
-static void cs_dsp_debugfs_clear(struct wm_adsp *dsp)
+static void cs_dsp_debugfs_clear(struct cs_dsp *dsp)
 {
        kfree(dsp->wmfw_file_name);
        kfree(dsp->bin_file_name);
                                        char __user *user_buf,
                                        size_t count, loff_t *ppos)
 {
-       struct wm_adsp *dsp = file->private_data;
+       struct cs_dsp *dsp = file->private_data;
        ssize_t ret;
 
        mutex_lock(&dsp->pwr_lock);
                                       char __user *user_buf,
                                       size_t count, loff_t *ppos)
 {
-       struct wm_adsp *dsp = file->private_data;
+       struct cs_dsp *dsp = file->private_data;
        ssize_t ret;
 
        mutex_lock(&dsp->pwr_lock);
        },
 };
 
-static void cs_dsp_init_debugfs(struct wm_adsp *dsp,
-                               struct snd_soc_component *component)
+static void cs_dsp_init_debugfs(struct cs_dsp *dsp,
+                               struct dentry *debugfs_root)
 {
        struct dentry *root = NULL;
        int i;
 
-       root = debugfs_create_dir(dsp->name, component->debugfs_root);
+       root = debugfs_create_dir(dsp->name, debugfs_root);
 
        debugfs_create_bool("booted", 0444, root, &dsp->booted);
        debugfs_create_bool("running", 0444, root, &dsp->running);
        dsp->debugfs_root = root;
 }
 
-static void cs_dsp_cleanup_debugfs(struct wm_adsp *dsp)
+static void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)
 {
        cs_dsp_debugfs_clear(dsp);
        debugfs_remove_recursive(dsp->debugfs_root);
        dsp->debugfs_root = NULL;
 }
 #else
-static inline void cs_dsp_init_debugfs(struct wm_adsp *dsp,
-                                      struct snd_soc_component *component)
+static inline void cs_dsp_init_debugfs(struct cs_dsp *dsp,
+                                      struct dentry *debugfs_root)
 {
 }
 
-static inline void cs_dsp_cleanup_debugfs(struct wm_adsp *dsp)
+static inline void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp)
 {
 }
 
-static inline void cs_dsp_debugfs_save_wmfwname(struct wm_adsp *dsp,
-                                                const char *s)
+static inline void cs_dsp_debugfs_save_wmfwname(struct cs_dsp *dsp,
+                                               const char *s)
 {
 }
 
-static inline void cs_dsp_debugfs_save_binname(struct wm_adsp *dsp,
-                                               const char *s)
+static inline void cs_dsp_debugfs_save_binname(struct cs_dsp *dsp,
+                                              const char *s)
 {
 }
 
-static inline void cs_dsp_debugfs_clear(struct wm_adsp *dsp)
+static inline void cs_dsp_debugfs_clear(struct cs_dsp *dsp)
 {
 }
 #endif
        if (ucontrol->value.enumerated.item[0] >= WM_ADSP_NUM_FW)
                return -EINVAL;
 
-       mutex_lock(&dsp[e->shift_l].pwr_lock);
+       mutex_lock(&dsp[e->shift_l].cs_dsp.pwr_lock);
 
-       if (dsp[e->shift_l].booted || !list_empty(&dsp[e->shift_l].compr_list))
+       if (dsp[e->shift_l].cs_dsp.booted || !list_empty(&dsp[e->shift_l].compr_list))
                ret = -EBUSY;
        else
                dsp[e->shift_l].fw = ucontrol->value.enumerated.item[0];
 
-       mutex_unlock(&dsp[e->shift_l].pwr_lock);
+       mutex_unlock(&dsp[e->shift_l].cs_dsp.pwr_lock);
 
        return ret;
 }
 };
 EXPORT_SYMBOL_GPL(wm_adsp_fw_enum);
 
-static const struct cs_dsp_region *cs_dsp_find_region(struct wm_adsp *dsp,
+static const struct cs_dsp_region *cs_dsp_find_region(struct cs_dsp *dsp,
                                                      int type)
 {
        int i;
        }
 }
 
-static void cs_dsp_read_fw_status(struct wm_adsp *dsp,
+static void cs_dsp_read_fw_status(struct cs_dsp *dsp,
                                  int noffs, unsigned int *offs)
 {
        unsigned int i;
        }
 }
 
-static void cs_dsp_adsp2_show_fw_status(struct wm_adsp *dsp)
+static void cs_dsp_adsp2_show_fw_status(struct cs_dsp *dsp)
 {
        unsigned int offs[] = {
                ADSP2_SCRATCH0, ADSP2_SCRATCH1, ADSP2_SCRATCH2, ADSP2_SCRATCH3,
                   offs[0], offs[1], offs[2], offs[3]);
 }
 
-static void cs_dsp_adsp2v2_show_fw_status(struct wm_adsp *dsp)
+static void cs_dsp_adsp2v2_show_fw_status(struct cs_dsp *dsp)
 {
        unsigned int offs[] = { ADSP2V2_SCRATCH0_1, ADSP2V2_SCRATCH2_3 };
 
                   offs[1] & 0xFFFF, offs[1] >> 16);
 }
 
-static void cs_dsp_halo_show_fw_status(struct wm_adsp *dsp)
+static void cs_dsp_halo_show_fw_status(struct cs_dsp *dsp)
 {
        unsigned int offs[] = {
                HALO_SCRATCH1, HALO_SCRATCH2, HALO_SCRATCH3, HALO_SCRATCH4,
 static int cs_dsp_coeff_base_reg(struct cs_dsp_coeff_ctl *ctl, unsigned int *reg)
 {
        const struct cs_dsp_alg_region *alg_region = &ctl->alg_region;
-       struct wm_adsp *dsp = ctl->dsp;
+       struct cs_dsp *dsp = ctl->dsp;
        const struct cs_dsp_region *mem;
 
        mem = cs_dsp_find_region(dsp, alg_region->type);
 static int cs_dsp_coeff_write_acked_control(struct cs_dsp_coeff_ctl *ctl,
                                            unsigned int event_id)
 {
-       struct wm_adsp *dsp = ctl->dsp;
+       struct cs_dsp *dsp = ctl->dsp;
        __be32 val = cpu_to_be32(event_id);
        unsigned int reg;
        int i, ret;
 static int cs_dsp_coeff_write_ctrl_raw(struct cs_dsp_coeff_ctl *ctl,
                                       const void *buf, size_t len)
 {
-       struct wm_adsp *dsp = ctl->dsp;
+       struct cs_dsp *dsp = ctl->dsp;
        void *scratch;
        int ret;
        unsigned int reg;
 static int cs_dsp_coeff_read_ctrl_raw(struct cs_dsp_coeff_ctl *ctl,
                                      void *buf, size_t len)
 {
-       struct wm_adsp *dsp = ctl->dsp;
+       struct cs_dsp *dsp = ctl->dsp;
        void *scratch;
        int ret;
        unsigned int reg;
        return ret;
 }
 
-static int cs_dsp_coeff_init_control_caches(struct wm_adsp *dsp)
+static int cs_dsp_coeff_init_control_caches(struct cs_dsp *dsp)
 {
        struct cs_dsp_coeff_ctl *ctl;
        int ret;
        return 0;
 }
 
-static int cs_dsp_coeff_sync_controls(struct wm_adsp *dsp)
+static int cs_dsp_coeff_sync_controls(struct cs_dsp *dsp)
 {
        struct cs_dsp_coeff_ctl *ctl;
        int ret;
        return 0;
 }
 
-static void cs_dsp_signal_event_controls(struct wm_adsp *dsp,
-                                         unsigned int event)
+static void cs_dsp_signal_event_controls(struct cs_dsp *dsp,
+                                        unsigned int event)
 {
        struct cs_dsp_coeff_ctl *ctl;
        int ret;
        struct wm_coeff_ctl *ctl = container_of(work,
                                                struct wm_coeff_ctl,
                                                work);
-       wmfw_add_ctl(ctl->cs_ctl->dsp, ctl);
+       struct wm_adsp *dsp = container_of(ctl->cs_ctl->dsp,
+                                          struct wm_adsp,
+                                          cs_dsp);
+
+       wmfw_add_ctl(dsp, ctl);
 }
 
 static void cs_dsp_free_ctl_blk(struct cs_dsp_coeff_ctl *ctl)
 
 static int wm_adsp_control_add(struct cs_dsp_coeff_ctl *cs_ctl)
 {
-       struct wm_adsp *dsp = cs_ctl->dsp;
+       struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
+       struct cs_dsp *cs_dsp = &dsp->cs_dsp;
        struct wm_coeff_ctl *ctl;
        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        const char *region_name;
                return -EINVAL;
        }
 
-       switch (dsp->fw_ver) {
+       switch (cs_dsp->fw_ver) {
        case 0:
        case 1:
                snprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN, "%s %s %x",
-                        dsp->name, region_name, cs_ctl->alg_region.alg);
+                        cs_dsp->name, region_name, cs_ctl->alg_region.alg);
                break;
        case 2:
                ret = scnprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
-                               "%s%c %.12s %x", dsp->name, *region_name,
+                               "%s%c %.12s %x", cs_dsp->name, *region_name,
                                wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
                break;
        default:
                ret = scnprintf(name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN,
-                               "%s %.12s %x", dsp->name,
+                               "%s %.12s %x", cs_dsp->name,
                                wm_adsp_fw_text[dsp->fw], cs_ctl->alg_region.alg);
                break;
        }
        kfree(ctl);
 }
 
-static int cs_dsp_create_control(struct wm_adsp *dsp,
+static int cs_dsp_create_control(struct cs_dsp *dsp,
                                 const struct cs_dsp_alg_region *alg_region,
                                 unsigned int offset, unsigned int len,
                                 const char *subname, unsigned int subname_len,
        return val;
 }
 
-static inline void cs_dsp_coeff_parse_alg(struct wm_adsp *dsp, const u8 **data,
+static inline void cs_dsp_coeff_parse_alg(struct cs_dsp *dsp, const u8 **data,
                                          struct cs_dsp_coeff_parsed_alg *blk)
 {
        const struct wmfw_adsp_alg_data *raw;
        cs_dsp_dbg(dsp, "# of coefficient descriptors: %#x\n", blk->ncoeff);
 }
 
-static inline void cs_dsp_coeff_parse_coeff(struct wm_adsp *dsp, const u8 **data,
+static inline void cs_dsp_coeff_parse_coeff(struct cs_dsp *dsp, const u8 **data,
                                            struct cs_dsp_coeff_parsed_coeff *blk)
 {
        const struct wmfw_adsp_coeff_data *raw;
        cs_dsp_dbg(dsp, "\tALSA control len: %#x\n", blk->len);
 }
 
-static int cs_dsp_check_coeff_flags(struct wm_adsp *dsp,
+static int cs_dsp_check_coeff_flags(struct cs_dsp *dsp,
                                    const struct cs_dsp_coeff_parsed_coeff *coeff_blk,
                                    unsigned int f_required,
                                    unsigned int f_illegal)
        return 0;
 }
 
-static int cs_dsp_parse_coeff(struct wm_adsp *dsp,
+static int cs_dsp_parse_coeff(struct cs_dsp *dsp,
                              const struct wmfw_region *region)
 {
        struct cs_dsp_alg_region alg_region = {};
        return 0;
 }
 
-static unsigned int cs_dsp_adsp1_parse_sizes(struct wm_adsp *dsp,
+static unsigned int cs_dsp_adsp1_parse_sizes(struct cs_dsp *dsp,
                                             const char * const file,
                                             unsigned int pos,
                                             const struct firmware *firmware)
                                         char **filename,
                                         char *suffix)
 {
+       struct cs_dsp *cs_dsp = &dsp->cs_dsp;
        int ret = 0;
 
        *filename = kasprintf(GFP_KERNEL, "%s-%s-%s.%s", dsp->part, dsp->fwf_name,
        if (*filename == NULL)
                return -ENOMEM;
 
-       ret = request_firmware(firmware, *filename, dsp->dev);
+       ret = request_firmware(firmware, *filename, cs_dsp->dev);
        if (ret != 0) {
                adsp_err(dsp, "Failed to request '%s'\n", *filename);
                kfree(*filename);
        return 0;
 }
 
-static unsigned int cs_dsp_adsp2_parse_sizes(struct wm_adsp *dsp,
+static unsigned int cs_dsp_adsp2_parse_sizes(struct cs_dsp *dsp,
                                             const char * const file,
                                             unsigned int pos,
                                             const struct firmware *firmware)
        return pos + sizeof(*adsp2_sizes);
 }
 
-static bool cs_dsp_validate_version(struct wm_adsp *dsp, unsigned int version)
+static bool cs_dsp_validate_version(struct cs_dsp *dsp, unsigned int version)
 {
        switch (version) {
        case 0:
        }
 }
 
-static bool cs_dsp_halo_validate_version(struct wm_adsp *dsp, unsigned int version)
+static bool cs_dsp_halo_validate_version(struct cs_dsp *dsp, unsigned int version)
 {
        switch (version) {
        case 3:
        }
 }
 
-static int cs_dsp_load(struct wm_adsp *dsp, const struct firmware *firmware,
+static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware,
                       const char *file)
 {
        LIST_HEAD(buf_list);
  * Find cs_dsp_coeff_ctl with input name as its subname
  * If not found, return NULL
  */
-static struct cs_dsp_coeff_ctl *cs_dsp_get_ctl(struct wm_adsp *dsp,
+static struct cs_dsp_coeff_ctl *cs_dsp_get_ctl(struct cs_dsp *dsp,
                                               const char *name, int type,
                                               unsigned int alg)
 {
        char ctl_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        int ret;
 
-       cs_ctl = cs_dsp_get_ctl(dsp, name, type, alg);
+       cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
        if (!cs_ctl)
                return -EINVAL;
 
 {
        struct cs_dsp_coeff_ctl *cs_ctl;
 
-       cs_ctl = cs_dsp_get_ctl(dsp, name, type, alg);
+       cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
        if (!cs_ctl)
                return -EINVAL;
 
 }
 EXPORT_SYMBOL_GPL(wm_adsp_read_ctl);
 
-static void cs_dsp_ctl_fixup_base(struct wm_adsp *dsp,
+static void cs_dsp_ctl_fixup_base(struct cs_dsp *dsp,
                                  const struct cs_dsp_alg_region *alg_region)
 {
        struct cs_dsp_coeff_ctl *ctl;
        }
 }
 
-static void *cs_dsp_read_algs(struct wm_adsp *dsp, size_t n_algs,
+static void *cs_dsp_read_algs(struct cs_dsp *dsp, size_t n_algs,
                              const struct cs_dsp_region *mem,
                              unsigned int pos, unsigned int len)
 {
 }
 
 static struct cs_dsp_alg_region *
-       cs_dsp_find_alg_region(struct wm_adsp *dsp, int type, unsigned int id)
+       cs_dsp_find_alg_region(struct cs_dsp *dsp, int type, unsigned int id)
 {
        struct cs_dsp_alg_region *alg_region;
 
        return NULL;
 }
 
-static struct cs_dsp_alg_region *cs_dsp_create_region(struct wm_adsp *dsp,
+static struct cs_dsp_alg_region *cs_dsp_create_region(struct cs_dsp *dsp,
                                                      int type, __be32 id,
                                                      __be32 base)
 {
        return alg_region;
 }
 
-static void cs_dsp_free_alg_regions(struct wm_adsp *dsp)
+static void cs_dsp_free_alg_regions(struct cs_dsp *dsp)
 {
        struct cs_dsp_alg_region *alg_region;
 
        }
 }
 
-static void cs_dsp_parse_wmfw_id_header(struct wm_adsp *dsp,
+static void cs_dsp_parse_wmfw_id_header(struct cs_dsp *dsp,
                                        struct wmfw_id_hdr *fw, int nalgs)
 {
        dsp->fw_id = be32_to_cpu(fw->id);
                    nalgs);
 }
 
-static void cs_dsp_parse_wmfw_v3_id_header(struct wm_adsp *dsp,
+static void cs_dsp_parse_wmfw_v3_id_header(struct cs_dsp *dsp,
                                           struct wmfw_v3_id_hdr *fw, int nalgs)
 {
        dsp->fw_id = be32_to_cpu(fw->id);
                    nalgs);
 }
 
-static int cs_dsp_create_regions(struct wm_adsp *dsp, __be32 id, int nregions,
+static int cs_dsp_create_regions(struct cs_dsp *dsp, __be32 id, int nregions,
                                 const int *type, __be32 *base)
 {
        struct cs_dsp_alg_region *alg_region;
        return 0;
 }
 
-static int cs_dsp_adsp1_setup_algs(struct wm_adsp *dsp)
+static int cs_dsp_adsp1_setup_algs(struct cs_dsp *dsp)
 {
        struct wmfw_adsp1_id_hdr adsp1_id;
        struct wmfw_adsp1_alg_hdr *adsp1_alg;
        return ret;
 }
 
-static int cs_dsp_adsp2_setup_algs(struct wm_adsp *dsp)
+static int cs_dsp_adsp2_setup_algs(struct cs_dsp *dsp)
 {
        struct wmfw_adsp2_id_hdr adsp2_id;
        struct wmfw_adsp2_alg_hdr *adsp2_alg;
        return ret;
 }
 
-static int cs_dsp_halo_create_regions(struct wm_adsp *dsp, __be32 id,
+static int cs_dsp_halo_create_regions(struct cs_dsp *dsp, __be32 id,
                                      __be32 xm_base, __be32 ym_base)
 {
        static const int types[] = {
        return cs_dsp_create_regions(dsp, id, ARRAY_SIZE(types), types, bases);
 }
 
-static int cs_dsp_halo_setup_algs(struct wm_adsp *dsp)
+static int cs_dsp_halo_setup_algs(struct cs_dsp *dsp)
 {
        struct wmfw_halo_id_hdr halo_id;
        struct wmfw_halo_alg_hdr *halo_alg;
        return ret;
 }
 
-static int cs_dsp_load_coeff(struct wm_adsp *dsp, const struct firmware *firmware,
+static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware,
                             const char *file)
 {
        LIST_HEAD(buf_list);
        return ret;
 }
 
-static int cs_dsp_create_name(struct wm_adsp *dsp)
+static int cs_dsp_create_name(struct cs_dsp *dsp)
 {
-       char *p;
-
        if (!dsp->name) {
                dsp->name = devm_kasprintf(dsp->dev, GFP_KERNEL, "DSP%d",
                                           dsp->num);
                        return -ENOMEM;
        }
 
-       if (!dsp->fwf_name) {
-               p = devm_kstrdup(dsp->dev, dsp->name, GFP_KERNEL);
-               if (!p)
-                       return -ENOMEM;
-
-               dsp->fwf_name = p;
-               for (; *p != 0; ++p)
-                       *p = tolower(*p);
-       }
-
        return 0;
 }
 
-static int cs_dsp_common_init(struct wm_adsp *dsp)
+static int cs_dsp_common_init(struct cs_dsp *dsp)
 {
        int ret;
 
        return 0;
 }
 
-static void wm_adsp_common_init(struct wm_adsp *dsp)
+static int wm_adsp_common_init(struct wm_adsp *dsp)
 {
+       char *p;
+
        INIT_LIST_HEAD(&dsp->compr_list);
        INIT_LIST_HEAD(&dsp->buffer_list);
+
+       if (!dsp->fwf_name) {
+               p = devm_kstrdup(dsp->cs_dsp.dev, dsp->cs_dsp.name, GFP_KERNEL);
+               if (!p)
+                       return -ENOMEM;
+
+               dsp->fwf_name = p;
+               for (; *p != 0; ++p)
+                       *p = tolower(*p);
+       }
+
+       return 0;
 }
 
-static int cs_dsp_adsp1_init(struct wm_adsp *dsp)
+static int cs_dsp_adsp1_init(struct cs_dsp *dsp)
 {
        dsp->ops = &cs_dsp_adsp1_ops;
 
 
 int wm_adsp1_init(struct wm_adsp *dsp)
 {
-       wm_adsp_common_init(dsp);
+       int ret;
 
-       return cs_dsp_adsp1_init(dsp);
+       ret = cs_dsp_adsp1_init(&dsp->cs_dsp);
+       if (ret)
+               return ret;
+
+       return wm_adsp_common_init(dsp);
 }
 EXPORT_SYMBOL_GPL(wm_adsp1_init);
 
-static int cs_dsp_adsp1_power_up(struct wm_adsp *dsp,
+static int cs_dsp_adsp1_power_up(struct cs_dsp *dsp,
                                 const struct firmware *wmfw_firmware, char *wmfw_filename,
                                 const struct firmware *coeff_firmware, char *coeff_filename,
                                 const char *fw_name)
        return ret;
 }
 
-static void cs_dsp_adsp1_power_down(struct wm_adsp *dsp)
+static void cs_dsp_adsp1_power_down(struct cs_dsp *dsp)
 {
        struct cs_dsp_coeff_ctl *ctl;
 
                if (ret)
                        break;
 
-               ret = cs_dsp_adsp1_power_up(dsp,
+               ret = cs_dsp_adsp1_power_up(&dsp->cs_dsp,
                                            wmfw_firmware, wmfw_filename,
                                            coeff_firmware, coeff_filename,
                                            wm_adsp_fw_text[dsp->fw]);
                                               coeff_firmware, coeff_filename);
                break;
        case SND_SOC_DAPM_PRE_PMD:
-               cs_dsp_adsp1_power_down(dsp);
+               cs_dsp_adsp1_power_down(&dsp->cs_dsp);
                break;
        default:
                break;
 }
 EXPORT_SYMBOL_GPL(wm_adsp1_event);
 
-static int cs_dsp_adsp2v2_enable_core(struct wm_adsp *dsp)
+static int cs_dsp_adsp2v2_enable_core(struct cs_dsp *dsp)
 {
        unsigned int val;
        int ret, count;
        return 0;
 }
 
-static int cs_dsp_adsp2_enable_core(struct wm_adsp *dsp)
+static int cs_dsp_adsp2_enable_core(struct cs_dsp *dsp)
 {
        int ret;
 
        return cs_dsp_adsp2v2_enable_core(dsp);
 }
 
-static int cs_dsp_adsp2_lock(struct wm_adsp *dsp, unsigned int lock_regions)
+static int cs_dsp_adsp2_lock(struct cs_dsp *dsp, unsigned int lock_regions)
 {
        struct regmap *regmap = dsp->regmap;
        unsigned int code0, code1, lock_reg;
        return 0;
 }
 
-static int cs_dsp_adsp2_enable_memory(struct wm_adsp *dsp)
+static int cs_dsp_adsp2_enable_memory(struct cs_dsp *dsp)
 {
        return regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
                                  ADSP2_MEM_ENA, ADSP2_MEM_ENA);
 }
 
-static void cs_dsp_adsp2_disable_memory(struct wm_adsp *dsp)
+static void cs_dsp_adsp2_disable_memory(struct cs_dsp *dsp)
 {
        regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
                           ADSP2_MEM_ENA, 0);
 }
 
-static void cs_dsp_adsp2_disable_core(struct wm_adsp *dsp)
+static void cs_dsp_adsp2_disable_core(struct cs_dsp *dsp)
 {
        regmap_write(dsp->regmap, dsp->base + ADSP2_RDMA_CONFIG_1, 0);
        regmap_write(dsp->regmap, dsp->base + ADSP2_WDMA_CONFIG_1, 0);
                           ADSP2_SYS_ENA, 0);
 }
 
-static void cs_dsp_adsp2v2_disable_core(struct wm_adsp *dsp)
+static void cs_dsp_adsp2v2_disable_core(struct cs_dsp *dsp)
 {
        regmap_write(dsp->regmap, dsp->base + ADSP2_RDMA_CONFIG_1, 0);
        regmap_write(dsp->regmap, dsp->base + ADSP2_WDMA_CONFIG_1, 0);
        regmap_write(dsp->regmap, dsp->base + ADSP2V2_WDMA_CONFIG_2, 0);
 }
 
-static int cs_dsp_halo_configure_mpu(struct wm_adsp *dsp, unsigned int lock_regions)
+static int cs_dsp_halo_configure_mpu(struct cs_dsp *dsp, unsigned int lock_regions)
 {
        struct reg_sequence config[] = {
                { dsp->base + HALO_MPU_LOCK_CONFIG,     0x5555 },
        return regmap_multi_reg_write(dsp->regmap, config, ARRAY_SIZE(config));
 }
 
-static int cs_dsp_set_dspclk(struct wm_adsp *dsp, unsigned int freq)
+static int cs_dsp_set_dspclk(struct cs_dsp *dsp, unsigned int freq)
 {
        int ret;
 
        struct wm_adsp *dsps = snd_soc_component_get_drvdata(component);
        struct wm_adsp *dsp = &dsps[w->shift];
 
-       return cs_dsp_set_dspclk(dsp, freq);
+       return cs_dsp_set_dspclk(&dsp->cs_dsp, freq);
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_set_dspclk);
 
        struct wm_adsp *dsp = &dsps[mc->shift - 1];
        char preload[32];
 
-       snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->name);
+       snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
 
        dsp->preloaded = ucontrol->value.integer.value[0];
 
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_preloader_put);
 
-static void cs_dsp_stop_watchdog(struct wm_adsp *dsp)
+static void cs_dsp_stop_watchdog(struct cs_dsp *dsp)
 {
        regmap_update_bits(dsp->regmap, dsp->base + ADSP2_WATCHDOG,
                           ADSP2_WDT_ENA_MASK, 0);
 }
 
-static void cs_dsp_halo_stop_watchdog(struct wm_adsp *dsp)
+static void cs_dsp_halo_stop_watchdog(struct cs_dsp *dsp)
 {
        regmap_update_bits(dsp->regmap, dsp->base + HALO_WDT_CONTROL,
                           HALO_WDT_EN_MASK, 0);
 }
 
-static int cs_dsp_power_up(struct wm_adsp *dsp,
+static int cs_dsp_power_up(struct cs_dsp *dsp,
                           const struct firmware *wmfw_firmware, char *wmfw_filename,
                           const struct firmware *coeff_firmware, char *coeff_filename,
                           const char *fw_name)
        return ret;
 }
 
-static void cs_dsp_power_down(struct wm_adsp *dsp)
+static void cs_dsp_power_down(struct cs_dsp *dsp)
 {
        struct cs_dsp_coeff_ctl *ctl;
 
        if (ret)
                return;
 
-       cs_dsp_power_up(dsp,
+       cs_dsp_power_up(&dsp->cs_dsp,
                        wmfw_firmware, wmfw_filename,
                        coeff_firmware, coeff_filename,
                        wm_adsp_fw_text[dsp->fw]);
                queue_work(system_unbound_wq, &dsp->boot_work);
                break;
        case SND_SOC_DAPM_PRE_PMD:
-               cs_dsp_power_down(dsp);
+               cs_dsp_power_down(&dsp->cs_dsp);
                break;
        default:
                break;
 }
 EXPORT_SYMBOL_GPL(wm_adsp_early_event);
 
-static int cs_dsp_adsp2_start_core(struct wm_adsp *dsp)
+static int cs_dsp_adsp2_start_core(struct cs_dsp *dsp)
 {
        return regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
                                 ADSP2_CORE_ENA | ADSP2_START,
                                 ADSP2_CORE_ENA | ADSP2_START);
 }
 
-static void cs_dsp_adsp2_stop_core(struct wm_adsp *dsp)
+static void cs_dsp_adsp2_stop_core(struct cs_dsp *dsp)
 {
        regmap_update_bits(dsp->regmap, dsp->base + ADSP2_CONTROL,
                           ADSP2_CORE_ENA | ADSP2_START, 0);
 }
 
-static int wm_adsp_event_post_run(struct wm_adsp *dsp)
+static int wm_adsp_event_post_run(struct cs_dsp *cs_dsp)
 {
+       struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
+
        if (wm_adsp_fw[dsp->fw].num_caps != 0)
                return wm_adsp_buffer_init(dsp);
 
        return 0;
 }
 
-static void wm_adsp_event_post_stop(struct wm_adsp *dsp)
+static void wm_adsp_event_post_stop(struct cs_dsp *cs_dsp)
 {
+       struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
+
        if (wm_adsp_fw[dsp->fw].num_caps != 0)
                wm_adsp_buffer_free(dsp);
 
        dsp->fatal_error = false;
 }
 
-static int cs_dsp_run(struct wm_adsp *dsp)
+static int cs_dsp_run(struct cs_dsp *dsp)
 {
        int ret;
 
        return ret;
 }
 
-static void cs_dsp_stop(struct wm_adsp *dsp)
+static void cs_dsp_stop(struct cs_dsp *dsp)
 {
        /* Tell the firmware to cleanup */
        cs_dsp_signal_event_controls(dsp, CS_DSP_FW_EVENT_SHUTDOWN);
        switch (event) {
        case SND_SOC_DAPM_POST_PMU:
                flush_work(&dsp->boot_work);
-               ret = cs_dsp_run(dsp);
+               ret = cs_dsp_run(&dsp->cs_dsp);
                break;
        case SND_SOC_DAPM_PRE_PMD:
-               cs_dsp_stop(dsp);
+               cs_dsp_stop(&dsp->cs_dsp);
                break;
        default:
                break;
 }
 EXPORT_SYMBOL_GPL(wm_adsp_event);
 
-static int cs_dsp_halo_start_core(struct wm_adsp *dsp)
+static int cs_dsp_halo_start_core(struct cs_dsp *dsp)
 {
        return regmap_update_bits(dsp->regmap,
                                  dsp->base + HALO_CCM_CORE_CONTROL,
                                  HALO_CORE_RESET | HALO_CORE_EN);
 }
 
-static void cs_dsp_halo_stop_core(struct wm_adsp *dsp)
+static void cs_dsp_halo_stop_core(struct cs_dsp *dsp)
 {
        regmap_update_bits(dsp->regmap, dsp->base + HALO_CCM_CORE_CONTROL,
                           HALO_CORE_EN, 0);
 {
        char preload[32];
 
-       snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->name);
+       snprintf(preload, ARRAY_SIZE(preload), "%s Preload", dsp->cs_dsp.name);
        snd_soc_component_disable_pin(component, preload);
 
-       cs_dsp_init_debugfs(dsp, component);
+       cs_dsp_init_debugfs(&dsp->cs_dsp, component->debugfs_root);
 
        dsp->component = component;
 
 
 int wm_adsp2_component_remove(struct wm_adsp *dsp, struct snd_soc_component *component)
 {
-       cs_dsp_cleanup_debugfs(dsp);
+       cs_dsp_cleanup_debugfs(&dsp->cs_dsp);
 
        return 0;
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_component_remove);
 
-static int cs_dsp_adsp2_init(struct wm_adsp *dsp)
+static int cs_dsp_adsp2_init(struct cs_dsp *dsp)
 {
        int ret;
 
 
 int wm_adsp2_init(struct wm_adsp *dsp)
 {
+       int ret;
+
        INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
 
        dsp->sys_config_size = sizeof(struct wm_adsp_system_config_xm_hdr);
 
-       wm_adsp_common_init(dsp);
+       ret = cs_dsp_adsp2_init(&dsp->cs_dsp);
+       if (ret)
+               return ret;
 
-       return cs_dsp_adsp2_init(dsp);
+       return wm_adsp_common_init(dsp);
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_init);
 
-static int cs_dsp_halo_init(struct wm_adsp *dsp)
+static int cs_dsp_halo_init(struct cs_dsp *dsp)
 {
        dsp->ops = &cs_dsp_halo_ops;
 
 
 int wm_halo_init(struct wm_adsp *dsp)
 {
+       int ret;
+
        INIT_WORK(&dsp->boot_work, wm_adsp_boot_work);
 
        dsp->sys_config_size = sizeof(struct wm_halo_system_config_xm_hdr);
 
-       wm_adsp_common_init(dsp);
+       ret = cs_dsp_halo_init(&dsp->cs_dsp);
+       if (ret)
+               return ret;
 
-       return cs_dsp_halo_init(dsp);
+       return wm_adsp_common_init(dsp);
 }
 EXPORT_SYMBOL_GPL(wm_halo_init);
 
-static void cs_dsp_remove(struct wm_adsp *dsp)
+static void cs_dsp_remove(struct cs_dsp *dsp)
 {
        struct cs_dsp_coeff_ctl *ctl;
 
 
 void wm_adsp2_remove(struct wm_adsp *dsp)
 {
-       cs_dsp_remove(dsp);
+       cs_dsp_remove(&dsp->cs_dsp);
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_remove);
 
        struct snd_soc_pcm_runtime *rtd = stream->private_data;
        int ret = 0;
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        if (wm_adsp_fw[dsp->fw].num_caps == 0) {
                adsp_err(dsp, "%s: Firmware does not support compressed API\n",
        stream->runtime->private_data = compr;
 
 out:
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return ret;
 }
        struct wm_adsp_compr *compr = stream->runtime->private_data;
        struct wm_adsp *dsp = compr->dsp;
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        wm_adsp_compr_detach(compr);
        list_del(&compr->list);
        kfree(compr->raw_buf);
        kfree(compr);
 
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return 0;
 }
 }
 EXPORT_SYMBOL_GPL(wm_adsp_compr_get_caps);
 
-static int cs_dsp_read_raw_data_block(struct wm_adsp *dsp, int mem_type,
+static int cs_dsp_read_raw_data_block(struct cs_dsp *dsp, int mem_type,
                                      unsigned int mem_addr,
                                      unsigned int num_words, __be32 *data)
 {
        return 0;
 }
 
-static inline int cs_dsp_read_data_word(struct wm_adsp *dsp, int mem_type,
-                                       unsigned int mem_addr, u32 *data)
+static int cs_dsp_read_data_word(struct cs_dsp *dsp, int mem_type,
+                                unsigned int mem_addr, u32 *data)
 {
        __be32 raw;
        int ret;
        return 0;
 }
 
-static int cs_dsp_write_data_word(struct wm_adsp *dsp, int mem_type,
+static int cs_dsp_write_data_word(struct cs_dsp *dsp, int mem_type,
                                  unsigned int mem_addr, u32 data)
 {
        struct cs_dsp_region const *mem = cs_dsp_find_region(dsp, mem_type);
 static inline int wm_adsp_buffer_read(struct wm_adsp_compr_buf *buf,
                                      unsigned int field_offset, u32 *data)
 {
-       return cs_dsp_read_data_word(buf->dsp, buf->host_buf_mem_type,
+       return cs_dsp_read_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
                                     buf->host_buf_ptr + field_offset, data);
 }
 
 static inline int wm_adsp_buffer_write(struct wm_adsp_compr_buf *buf,
                                       unsigned int field_offset, u32 data)
 {
-       return cs_dsp_write_data_word(buf->dsp, buf->host_buf_mem_type,
-                                     buf->host_buf_ptr + field_offset, data);
+       return cs_dsp_write_data_word(&buf->dsp->cs_dsp, buf->host_buf_mem_type,
+                                     buf->host_buf_ptr + field_offset,
+                                     data);
 }
 
 static void cs_dsp_remove_padding(u32 *buf, int nwords)
        u32 xmalg, addr, magic;
        int i, ret;
 
-       alg_region = cs_dsp_find_alg_region(dsp, WMFW_ADSP2_XM, dsp->fw_id);
+       alg_region = cs_dsp_find_alg_region(&dsp->cs_dsp, WMFW_ADSP2_XM, dsp->cs_dsp.fw_id);
        if (!alg_region) {
                adsp_err(dsp, "No algorithm region found\n");
                return -EINVAL;
        xmalg = dsp->sys_config_size / sizeof(__be32);
 
        addr = alg_region->base + xmalg + ALG_XM_FIELD(magic);
-       ret = cs_dsp_read_data_word(dsp, WMFW_ADSP2_XM, addr, &magic);
+       ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr, &magic);
        if (ret < 0)
                return ret;
 
 
        addr = alg_region->base + xmalg + ALG_XM_FIELD(host_buf_ptr);
        for (i = 0; i < 5; ++i) {
-               ret = cs_dsp_read_data_word(dsp, WMFW_ADSP2_XM, addr,
+               ret = cs_dsp_read_data_word(&dsp->cs_dsp, WMFW_ADSP2_XM, addr,
                                            &buf->host_buf_ptr);
                if (ret < 0)
                        return ret;
 {
        struct wm_adsp_host_buf_coeff_v1 coeff_v1;
        struct wm_adsp_compr_buf *buf;
-       struct wm_adsp *dsp = cs_ctl->dsp;
+       struct wm_adsp *dsp = container_of(cs_ctl->dsp, struct wm_adsp, cs_dsp);
        unsigned int version;
        int ret, i;
 
        struct cs_dsp_coeff_ctl *cs_ctl;
        int ret;
 
-       list_for_each_entry(cs_ctl, &dsp->ctl_list, list) {
+       list_for_each_entry(cs_ctl, &dsp->cs_dsp.ctl_list, list) {
                if (cs_ctl->type != WMFW_CTL_TYPE_HOST_BUFFER)
                        continue;
 
 
        compr_dbg(compr, "Trigger: %d\n", cmd);
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
                break;
        }
 
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return ret;
 }
        struct wm_adsp_compr *compr;
        int ret = 0;
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        if (list_empty(&dsp->buffer_list)) {
                ret = -ENODEV;
        }
 
 out:
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return ret;
 }
 
        compr_dbg(compr, "Pointer request\n");
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        buf = compr->buf;
 
        tstamp->sampling_rate = compr->sample_rate;
 
 out:
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return ret;
 }
                return 0;
 
        /* Read data from DSP */
-       ret = cs_dsp_read_raw_data_block(buf->dsp, mem_type, adsp_addr,
+       ret = cs_dsp_read_raw_data_block(&buf->dsp->cs_dsp, mem_type, adsp_addr,
                                         nwords, (__be32 *)compr->raw_buf);
        if (ret < 0)
                return ret;
        struct wm_adsp *dsp = compr->dsp;
        int ret;
 
-       mutex_lock(&dsp->pwr_lock);
+       mutex_lock(&dsp->cs_dsp.pwr_lock);
 
        if (stream->direction == SND_COMPRESS_CAPTURE)
                ret = wm_adsp_compr_read(compr, buf, count);
        else
                ret = -ENOTSUPP;
 
-       mutex_unlock(&dsp->pwr_lock);
+       mutex_unlock(&dsp->cs_dsp.pwr_lock);
 
        return ret;
 }
 EXPORT_SYMBOL_GPL(wm_adsp_compr_copy);
 
-static void wm_adsp_fatal_error(struct wm_adsp *dsp)
+static void wm_adsp_fatal_error(struct cs_dsp *cs_dsp)
 {
+       struct wm_adsp *dsp = container_of(cs_dsp, struct wm_adsp, cs_dsp);
        struct wm_adsp_compr *compr;
 
        dsp->fatal_error = true;
        }
 }
 
-static void cs_dsp_adsp2_bus_error(struct wm_adsp *dsp)
+static void cs_dsp_adsp2_bus_error(struct cs_dsp *dsp)
 {
        unsigned int val;
        struct regmap *regmap = dsp->regmap;
 {
        struct wm_adsp *dsp = (struct wm_adsp *)data;
 
-       cs_dsp_adsp2_bus_error(dsp);
+       cs_dsp_adsp2_bus_error(&dsp->cs_dsp);
 
        return IRQ_HANDLED;
 }
 EXPORT_SYMBOL_GPL(wm_adsp2_bus_error);
 
-static void cs_dsp_halo_bus_error(struct wm_adsp *dsp)
+static void cs_dsp_halo_bus_error(struct cs_dsp *dsp)
 {
        struct regmap *regmap = dsp->regmap;
        unsigned int fault[6];
 {
        struct wm_adsp *dsp = (struct wm_adsp *)data;
 
-       cs_dsp_halo_bus_error(dsp);
+       cs_dsp_halo_bus_error(&dsp->cs_dsp);
 
        return IRQ_HANDLED;
 }
 EXPORT_SYMBOL_GPL(wm_halo_bus_error);
 
-static void cs_dsp_halo_wdt_expire(struct wm_adsp *dsp)
+static void cs_dsp_halo_wdt_expire(struct cs_dsp *dsp)
 {
        mutex_lock(&dsp->pwr_lock);
 
 {
        struct wm_adsp *dsp = data;
 
-       cs_dsp_halo_wdt_expire(dsp);
+       cs_dsp_halo_wdt_expire(&dsp->cs_dsp);
 
        return IRQ_HANDLED;
 }